具有 2 500 GB 硬盘的 BTRFS RAID1 阵列,无错误。这是根文件系统,因此每个驱动器上有 3 个分区:1 = /boot (ext4)、2 = / (btrfs)、3 (swap)
/boot 是 ext4,因为如果 /boot 是 btrfs 文件系统(安装了新内核,但 grub 配置未更新),则升级内核并不总是有效。
现在,该镜像已移至较小的驱动器,新驱动器为 120 GB,因此必须调整 btrfs 文件系统的大小。例如,可以使用 GParted 来调整两个 btrfs 分区的大小。调整大小后,可以将带有分区信息的 MBR 从旧的 500 GB 驱动器复制到新的 120 GB 驱动器 ( dd if=/dev/sda of=/dev/sdb bs=512 count=1
),以及 btrfs 分区 ( dd if=/dev/sda2 of=/dev/sdb2
)。 (忽略交换分区,必须将其移动到 120 GB 以内。)
尽管系统启动并且新的 120 GB 驱动器没有问题,但会记录一条错误消息 (dmesg):
BTRFS:无法获取 bytenr 274877906944 的超级缓冲区头
并且擦洗发现“超级”错误(但没有数据错误):
“错误详细信息:超级=1”
此错误是否存在数据损坏的风险?
如何解决这个问题?
由于 274877906944 是 256 GB,旧的 btrfs 分区 >256 GB,新的 btrfs 分区 <256 GB,看来系统正在寻找 256 GB 的超级块?
答案1
警告:请勿使用 GParted 调整多设备 BTRFS 文件系统的大小!
可能会发生数据丢失!
看来 GParted 是罪魁祸首。显然,它不知道如何调整多设备 btrfs 文件系统的大小,并且只是运行btrfs filesystem resize
,但不处理使用resize 1:49g
和 的每个设备resize 2:49g
。
是这样btrfs filesystem show
说的:
Total devices 2 FS bytes used 40.95GiB
devid 1 size 50.00GiB used 43.03GiB path /dev/sda2
devid 2 size 439.45GiB used 43.03GiB path /dev/sdb2
显然,GParted 尚未调整第二个设备上的文件系统大小,因此 Btrfs 仍然认为它是 500 GB 文件系统。
在某些时候,Btrfs 会尝试在磁盘外部读取/写入数据。这会导致损坏,甚至可能使整个文件系统变得无用。
使固定
首先,启动实时系统以降低系统在大于其所在分区的文件系统上运行时损坏的风险。
挂载文件系统:
mount /dev/sda2 /mnt/tmp
首先将第二个设备缩小到 50 GB - 1 GB = 49 GB 以避免舍入错误:
btrfs filesystem resize 2:49g /mnt/tmp
调整其大小以填充 50 GB 分区:
btrfs filesystem resize 2:max /mnt/tmp
检查btrfs filesystem show
,两个设备都应具有正确的尺寸:
devid 1 size 50.00GiB used 43.03GiB path /dev/sda2
devid 2 size 50.00GiB used 43.03GiB path /dev/sdb2
卸载,重新启动,错误应该消失。
如果系统在这种糟糕的状态下运行时没有任何损坏,那么文件系统现在应该是健康的。
(感谢黑灵帮我解决了这个问题。)