是否可以安全地缩小raid5软件阵列?

是否可以安全地缩小raid5软件阵列?

是否可以以安全的方式缩小 ext4 文件系统和底层 raid5 阵列?

我想缩小包含 ext4 文件系统的 15 TB / 6 驱动器 raid 阵列。

在实际系统上执行此操作之前,我决定在测试环境中尝试一下。我编写了一个模拟 raid+文件系统生命周期的脚本(assemble、mkfs、resize2fs、shrink 等),但在某些情况下它会损坏文件系统。该脚本在两个不同的发行版上运行(其中之一是 Centos-8)。

我试图理解这些失败,除非我遗漏了一些东西,否则 mdadm 在 raid 收缩过程(mdadm --grow)期间对 ext4 文件系统一无所知,并且似乎不可能帮助该工具正常运行。

在我的场景中,一个模拟流程的脚本:

  1. 选择一个随机数设备数量选择(5 到 10 之间) - 这决定了我们测试阵列中的设备数量
  2. 选择随机数设备大小(300 到 350 之间)- 单个设备的大小(以 MiB 为单位)
  3. 创建和组装/dev/md0- RAID 5 阵列(在我的例子中是 0.90 元数据) - 阵列的大小是array_size=($num_devices-1)*$device_size
  4. 创建 ext4 文件系统/dev/md0并将其安装到/mnt
  5. 复制参考文件(在我的例子中,它是 /boot 中的内核映像之一)$num_devices次到/mnt(有一些数据来验证文件系统的完整性) - 文件系统有大约 80% 的可用空间
  6. 文件系统被卸载,fscked ( e2fsck -f) 然后缩小(resize2fs -M最小大小或reisze2fs /dev/md0 {calculated_size}),然后再次 fscked

  7. 该脚本等待 mdadm 重建过程完成(通过查看 /proc/mdstat)

  8. 计算新数组大小:new_array_size=($num_devices-2)*$device_size
  9. 模拟硬盘故障,mdadm --manage /dev/md0 --fail /dev/loop3然后是 mdadm --manage /dev/md0 --remove /dev/loop3
  10. 等待重塑过程完成

一旦重塑过程完成,/dev/loop3 被标记为已删除,另一个循环设备(例如/dev/loop2)被标记为备用。

  1. 该过程确定备用,并将其重新添加到数组中(mdadm --manage /dev/md0 --remove /dev/loop2后跟mdadm --manage /dev/md0 --add /dev/loop2
  2. 脚本等待 raid 重建完成(观看 /proc/mdstat)

此时腐败发生:

  1. 文件系统再次挂载在 /mnt
  2. 参考文件与收缩文件系统上的副本之间的 md5 校验和比较对于 1-2 个文件要么成功,要么失败
  3. 文件系统被卸载、fscked ( e2fsck -f)、增长到最大值 (resize2fs) 并再次 fscked
  4. 腐败现象依然存在

我做错了什么或者raid5收缩过程真的不受支持吗?或者是 0.90 元数据的原因?

相关内容