我正在将软件 RAID 1 阵列 ( /dev/md0
) 从 2TB 驱动器 (sda
和sdb
) 升级到 4TB (sdc
和sdd
)。简单直接;ext3
,单个分区,无 MBR,无 LVM。最后,我希望有两个/dev/mdX
设备,一个带有原始阵列,另一个带有新阵列,两个设备都具有相同的数据。据我所知,有两个选项:
选项1:
- 备份现有阵列
- 卸载现有阵列
- 插入一个 4TB 磁盘,并将其添加到阵列
mdadm --manage /dev/md0 --add /dev/sdc1
- 让其中一个 2TB 磁盘发生故障,然后等待阵列重建
mdadm --manage /dev/md0 --fail /dev/sda1 mdadm --manage /dev/md0 --remove /dev/sda1
- 插入剩余的 4TB 磁盘,并将其添加到阵列
mdadm --manage /dev/md0 --add /dev/sdd1
- 使剩余的 2TB 磁盘发生故障,等待阵列重建
mdadm --manage /dev/md0 --fail /dev/sdb1 mdadm --manage /dev/md0 --remove /dev/sdb1
- 我该怎么做才能在新号码下重新激活 2TB 阵列
/dev/mdX
?我可以简单地输入:mdadm create /dev/md1 --assume-clean /dev/sda1 /dev/sdb1
优点:保证数据镜像,mdX
可以卸载设备以避免不一致 缺点
:必须同步两次(慢)
选项 2:
- 使用 4TB 磁盘创建新阵列:
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
- 创建文件系统
/dev/md1
(与使用的相同/dev/md0
) - 山
/dev/md1
- 使用以下方式之一复制文件:
tar -C /mnt/md0 --atime-preserve -clSf - . | tar -C /mnt/md1 -xvf - --or-- rsync -avHhx --progress /mnt/md0 /mnt/md1
优点:只需同步一次
缺点:无法保证备份的准确性(除了用于 tar 或 rsync 的标志之外)
哪种方法更可取?为什么?有没有更好的方法[1]?
[1] 我已经阅读了有关使用的内容dd
,但mdX
复制后调整大小似乎是一个问题,而且我仍然需要/dev/mdX
为其中一个数组创建一个新的。
更新 最后我选择了方案 2,因为它无疑是最安全、最“干净”的方案。我还采纳了以下评论/建议,并附上了一些重要注意事项:
fdisk
(目前)对于超过 2TB 的分区无法可靠地工作,建议parted
使用分区表gpt
- 使用哈希来验证 rsync 传输是个好主意。不幸的是,
dd
这并不合适,因为它读取所有的卷,包括零。因此,根据定义,2TB 和 4TB 驱动器的哈希值将有所不同。此外,dd
必须读取所有 2TB 数据才能提供哈希值,并且无法处理目录,这排除了检查单个关键文件夹的可能性。有些程序(md5sumd
或md5deep
)会递归地对目录进行哈希处理,但这种彻底性不值得花费时间来读取和哈希 2TB 的数据。相反,我编写了一个粗略的脚本来diff
输出ls -lAR
两个卷(幸运的是,它们的块大小相同),并且只对报告大小不同的任何文件进行哈希处理。最后,检查 2TB 只花了几分钟。
答案1
选项1这确实不是一个好选择,在将新磁盘包含到 md0 后,您仍然必须扩展 ext3 文件系统,与使用 dd 时选项 2 相同。只不过它需要更长的时间,并且出错的可能性很大。
如果一定要走这条路,你应该大致做以下事情:
使用 fdisk 创建 raid 分区(0xDA 或 0xFD)
fdisk /dev/sdc
fdisk /dev/sdd
将新磁盘添加到阵列
mdadm --fail /dev/md0 /dev/sda1
mdadm --remove /dev/md0 /dev/sda1
mdadm --add /dev/md0 /dev/sdc1
等待重新同步完成,然后添加另一个
mdadm --fail /dev/md0 /dev/sdb1
mdadm --remove /dev/md0 /dev/sdb1
mdadm --add /dev/md0 /dev/sdd1
等待重新同步完成,然后增大 md0。请记住,重新同步期间磁盘很容易发生故障,这种情况比大多数人想象的更常见,因为磁盘承受着最大的压力。
mdadm --grow /dev/md0 --size=max --backup-file=/root/mnt/grow_md0.bak
mdadm --detail --scan >> /etc/mdadm.conf
您不需要备份文件选项,但它可以保护您免受意外故障的影响,例如操作期间断电。它需要位于不同的物理磁盘上(重新格式化 + 重新安装其中一个旧磁盘或闪存驱动器),否则会失去目的。
先对 md0 进行良好的检查,然后可以扩展 ext3 fs
umount /mount/point-md0
fsck /dev/md0
resize2fs /dev/md0
mount -t ext3 /dev/md0 /mount/point-md0
这种方法的唯一潜在优势是,如果您愿意承担一些风险,您可以在不让 md0 脱机的情况下做到这一点。resize2fs 实际上可以在线扩大您的 fs(但不会缩小),在这种情况下,您只需要在没有 umount-fsck-mount 序列的情况下执行操作。
要重新激活旧阵列,您必须使用--assemble,--create可能会破坏/销毁现有数据。
mdadm --assemble --force /dev/md1 /dev/sda1 /dev/sdb1
选项 2绝对是“更干净”的解决方案。出错的几率要小得多,因为你总是至少有一个完全冗余的阵列。
使用 fdisk 创建 raid 分区(0xDA 或 0xFD)
fdisk /dev/sdc
fdisk /dev/sdd
制作 md1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
创建文件系统并挂载
mkfs.ext3 -L some-label /dev/md1
mount -t ext3 /dev/md1 /mount/point-md1
使 md0 为只读,rsync 应该可以保证文件完整性,同时还能清理途中的所有碎片。
mount -o remount,r /dev/md0 /mount/point-md0
rsync -axHAXS --delete --progress /mount/point-md0 /mount/point-md1
更新 mdadm.conf
mdadm --detail --scan > /etc/mdadm.conf
别忘了更新 fstab!
与本主题相关的是:
rsync 将仅复制文件,而 mdadm resync 也将复制“空”的未定义空间。
除非您从 RAID1 启动(这种情况下您还必须更新引导加载程序),否则使用 RAID1 的理由很少,如果阵列中有两个以上的物理磁盘,RAID10 将为您提供相同的保护但性能更佳。
LVM 实际上可以帮助您进行迁移和备份。例如,在选项 2 中,您无需在复制文件之前将其挂载为只读,而这可能需要很长时间才能半脱机,您可以创建 LVM 快照,两次传递 rsync,然后只需几秒钟的停机时间即可完成迁移。
如果我可以将所有四个物理磁盘都放在盒子里,我会在每个磁盘上创建三个 RAID 分区。一个小型 RAID1 用于 /boot,一个大小合适的 LVM+RAID10 用于高性能部分(例如数据库),一个 LVM+RAID5/6 用于存储。