Tom Hale Asked: 2019-01-25 19:54:18 +0800 CST2019-01-25 19:54:18 +0800 CST 2019-01-25 19:54:18 +0800 CST btrfs 替换“错误:目标设备小于源设备” 772 为什么我看到: btrfs replace "ERROR: target device smaller than source device" 当我已经通过以下方式将源设备文件系统缩小为小于目标时: btrfs filesystem resize <devid>:<small-size> /mountpoint linux btrfs 3 个回答 Voted rkjnsn 2019-04-20T00:06:44+08:002019-04-20T00:06:44+08:00 我在尝试用稍微小一点的磁盘替换磁盘时遇到了这个问题。即使在调整源驱动器上的文件系统大小后,我也收到此错误。由于我使用的是整个磁盘,因此没有调整分区大小的选项。事实证明,诀窍是为源驱动器传递一个 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 我想用 /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 这个公式与前面的调整大小相结合,使替换操作成功启动。 Best Answer Tom Hale 2019-01-25T19:54:18+08:002019-01-25T19:54:18+08:00 错误消息指的是 Linux 块设备大小,而不是文件系统大小,因此包含源文件系统的分区需要缩小到小于(或与目标相同的大小)目标。 假设目标设备为 200G,将源设备调整为 199G: btrfs filesystem resize <devid>:199g /mountpoint 然后将分区大小调整为 199GiB。我曾经gdisk删除现有的源分区,然后创建一个具有相同起始扇区的新分区,但将结束扇区大小输入为+199G. 重新partprobe /dev/hdd-device加载新分区后,replace工作正常。 Jarppiko 2022-10-16T06:49:47+08:002022-10-16T06:49:47+08:00 虽然这两种方法似乎都有效,但@rkjnsn 解决方案的风险似乎较小,因为它不需要覆盖活动磁盘的分区表。那里的事情可能会变得非常错误。
我在尝试用稍微小一点的磁盘替换磁盘时遇到了这个问题。即使在调整源驱动器上的文件系统大小后,我也收到此错误。由于我使用的是整个磁盘,因此没有调整分区大小的选项。事实证明,诀窍是为源驱动器传递一个 devid 而不是设备路径。这似乎导致
btrfs filesystem replace
检查源设备上的实际文件系统大小,而不是设备本身的大小。我的初始状态:
我想用 /dev/sdg 替换 /dev/sdf。
尝试#1:
在 /dev/sdf (devid 5) 上调整文件系统的大小:
尝试#2:
没变。它在将源指定为块设备时出现,
replace
仅在检查目标上是否有足够空间时查看块设备的大小。然而,仔细阅读源代码,我发现replace
处理源代码的方式不同,并且实际上从文件系统中检索了正确的大小。这导致了尝试#3:
这个公式与前面的调整大小相结合,使替换操作成功启动。
错误消息指的是 Linux 块设备大小,而不是文件系统大小,因此包含源文件系统的分区需要缩小到小于(或与目标相同的大小)目标。
假设目标设备为 200G,将源设备调整为 199G:
然后将分区大小调整为 199GiB。我曾经
gdisk
删除现有的源分区,然后创建一个具有相同起始扇区的新分区,但将结束扇区大小输入为+199G
.重新
partprobe /dev/hdd-device
加载新分区后,replace
工作正常。虽然这两种方法似乎都有效,但@rkjnsn 解决方案的风险似乎较小,因为它不需要覆盖活动磁盘的分区表。那里的事情可能会变得非常错误。