是否可以以安全的方式缩小 ext4 文件系统和底层 raid5 阵列?
我想缩小包含 ext4 文件系统的 15 TB / 6 驱动器 raid 阵列。
在实际系统上执行此操作之前,我决定在测试环境中尝试一下。我编写了一个模拟 raid+文件系统生命周期的脚本(assemble、mkfs、resize2fs、shrink 等),但在某些情况下它会损坏文件系统。该脚本在两个不同的发行版上运行(其中之一是 Centos-8)。
我试图理解这些失败,除非我遗漏了一些东西,否则 mdadm 在 raid 收缩过程(mdadm --grow)期间对 ext4 文件系统一无所知,并且似乎不可能帮助该工具正常运行。
在我的场景中,一个模拟流程的脚本:
- 选择一个随机数设备数量选择(5 到 10 之间) - 这决定了我们测试阵列中的设备数量
- 选择随机数设备大小(300 到 350 之间)- 单个设备的大小(以 MiB 为单位)
- 创建和组装/dev/md0- RAID 5 阵列(在我的例子中是 0.90 元数据) - 阵列的大小是array_size=($num_devices-1)*$device_size
- 创建 ext4 文件系统/dev/md0并将其安装到/mnt
- 复制参考文件(在我的例子中,它是 /boot 中的内核映像之一)$num_devices次到/mnt(有一些数据来验证文件系统的完整性) - 文件系统有大约 80% 的可用空间
文件系统被卸载,fscked (
e2fsck -f
) 然后缩小(resize2fs -M
最小大小或reisze2fs /dev/md0 {calculated_size}
),然后再次 fscked该脚本等待 mdadm 重建过程完成(通过查看 /proc/mdstat)
- 计算新数组大小:new_array_size=($num_devices-2)*$device_size
- 模拟硬盘故障,
mdadm --manage /dev/md0 --fail /dev/loop3
然后是mdadm --manage /dev/md0 --remove /dev/loop3
- 等待重塑过程完成
一旦重塑过程完成,/dev/loop3 被标记为已删除,另一个循环设备(例如/dev/loop2)被标记为备用。
- 该过程确定备用,并将其重新添加到数组中(
mdadm --manage /dev/md0 --remove /dev/loop2
后跟mdadm --manage /dev/md0 --add /dev/loop2
) - 脚本等待 raid 重建完成(观看 /proc/mdstat)
此时腐败发生:
- 文件系统再次挂载在 /mnt
- 参考文件与收缩文件系统上的副本之间的 md5 校验和比较对于 1-2 个文件要么成功,要么失败
- 文件系统被卸载、fscked (
e2fsck -f
)、增长到最大值 (resize2fs) 并再次 fscked - 腐败现象依然存在
我做错了什么或者raid5收缩过程真的不受支持吗?或者是 0.90 元数据的原因?