btrfs 替换“错误:目标设备小于源设备”

Tom*_*ale 2 linux btrfs

为什么我看到:

btrfs replace "ERROR: target device smaller than source device"
Run Code Online (Sandbox Code Playgroud)

当我已经通过以下方式将源设备文件系统缩小到小于目标时:

btrfs filesystem resize <devid>:<small-size> /mountpoint
Run Code Online (Sandbox Code Playgroud)

rkj*_*nsn 7

我在尝试用稍微一点的磁盘替换磁盘时遇到了这个问题。即使在调整源驱动器上的文件系统大小后,我仍然收到此错误。由于我使用的是整个磁盘,因此无法调整分区大小。事实证明,诀窍是为源驱动器传递一个 devid 而不是设备路径。这似乎导致btrfs filesystem replace检查源设备上的实际文件系统大小,而不是设备本身的大小。

我的初始状态:

# btrfs fi show /mnt/storage
Label: 'Storage'  uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Total devices 5 FS bytes used 15.25TiB
    devid    1 size 7.28TiB used 3.84TiB path /dev/sdb
    devid    2 size 7.28TiB used 3.84TiB path /dev/sdc
    devid    3 size 7.28TiB used 3.84TiB path /dev/sdd
    devid    4 size 7.28TiB used 3.84TiB path /dev/sde
    devid    5 size 7.28TiB used 3.84TiB path /dev/sdf
Run Code Online (Sandbox Code Playgroud)

我想用 /dev/sdg 替换 /dev/sdf。

尝试#1:

# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
Run Code Online (Sandbox Code Playgroud)

在 /dev/sdf (devid 5) 上调整文件系统的大小:

# blockdev --getsize64 /dev/sdg 
8001546444800

# btrfs fi res 5:8001546444800 /mnt/storage
Resize '/mnt/storage' of '5:8001546444800'
Run Code Online (Sandbox Code Playgroud)

尝试#2:

# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
Run Code Online (Sandbox Code Playgroud)

没变。指定源为块设备时出现,replace只在检查目的上是否有足够空间时看块设备的大小。然而,仔细阅读源代码,我发现它replace以不同的方式处理源 devid,并且实际上从文件系统中检索了正确的大小。

这导致了尝试 #3:

# btrfs replace start 5 /dev/sdg /mnt/storage
Run Code Online (Sandbox Code Playgroud)

此公式与前面的调整大小相结合,使替换操作成功启动。