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

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

为什么我会看到:

btrfs replace "ERROR: target device smaller than source device"

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

btrfs filesystem resize <devid>:<small-size> /mountpoint

答案1

我在尝试用一个磁盘替换磁盘时遇到了这个问题轻微地较小。即使在调整源驱动器上的文件系统大小后,我仍然收到此错误。由于我使用的是整个磁盘,因此无法调整分区大小。事实证明,诀窍是传递源驱动器的设备而不是设备路径。这似乎导致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

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

尝试#1:

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

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

# blockdev --getsize64 /dev/sdg 
8001546444800

# btrfs fi res 5:8001546444800 /mnt/storage
Resize '/mnt/storage' of '5:8001546444800'

尝试#2:

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

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

这导致了尝试#3:

# btrfs replace start 5 /dev/sdg /mnt/storage

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

答案2

该错误消息指的是 Linux 块设备大小,而不是文件系统大小,因此包含源文件系统的分区需要缩小到小于(或等于)目标文件系统。

假设目标设备为200G,将源设备大小调整为199G:

btrfs filesystem resize <devid>:199g /mountpoint

然后将分区大小也调整为 199GiB。我曾经gdisk删除现有的源分区,然后创建一个具有相同起始扇区的新分区,但输入结束扇区大小为+199G.

partprobe /dev/hdd-device重新加载新分区后,replace工作正常。

答案3

虽然这两种方法似乎都有效,但 @rkjnsn 解决方案似乎风险较小,因为它不需要覆盖活动磁盘的分区表。那里的事情可能会变得非常错误。

相关内容