为什么我会看到:
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 解决方案似乎风险较小,因为它不需要覆盖活动磁盘的分区表。那里的事情可能会变得非常错误。