将 Linux 软件 RAID 1 扩展到 RAID 10 的最佳方式

Han*_*rbe 24 linux mdadm software-raid

mdadm 似乎不支持将数组从级别 1 增长到级别 10。

我在 RAID 1 中有两个磁盘。我想添加两个新磁盘并将阵列转换为四磁盘 RAID 10 阵列。

我目前的策略:

  1. 做好备份。
  2. 创建一个降级的 4 磁盘 RAID 10 阵列,其中缺少两个磁盘。
  3. rsync the RAID 1 array with the RAID 10 array.
  4. fail and remove RAID 1 阵列中的一个磁盘。
  5. 将可用磁盘添加到 RAID 10 阵列并等待重新同步完成。
  6. 销毁 RAID 1 阵列并将最后一个磁盘添加到 RAID 10 阵列。

问题是第 5 步缺乏冗余。

有没有更好的办法?

小智 11

使用 linux softraid,您可以制作只有两个磁盘的 RAID 10 阵列。

下面使用的设备名称:

  • md0 是类型/级别 RAID1 的旧阵列。
  • md1 是类型/级别 RAID10 的新阵列。
  • sda1并且sdb2新的空分区(没有数据)。
  • sda2并且sdc1是旧分区(具有关键数据)。

替换名称以适合您的用例。使用例如lsblk查看您当前的布局。

0)备份,备份,备份,备份哦和备份

1)创建新阵列(4 个设备:2 个现有,2 个缺失):

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda1 missing /dev/sdb2 missing
Run Code Online (Sandbox Code Playgroud)

请注意,在此示例布局中,布局sda1缺少一个对应物,sdb2而另一个缺少对应物。您的数据此时md1并不安全(实际上它是 RAID0,直到您添加丢失的成员)。

要查看创建的阵列的布局和其他详细信息,请使用:

mdadm -D /dev/md1
Run Code Online (Sandbox Code Playgroud)

笔记!您应该保存数组的布局:

# View current mdadm config:
cat /etc/mdadm/mdadm.conf
# Add new layout (grep is to make sure you don't re-add md0):
mdadm --detail --scan | grep "/dev/md1" | tee -a /etc/mdadm/mdadm.conf
# Save config to initramfs (to be available after reboot)
update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

2)格式化和挂载。该/dev/md1应立即使用,但需要进行格式化,然后安装。

3)复制文件。使用例如 rsync 将数据从旧的 RAID 1 复制到新的 RAID 10。(这只是一个示例命令,请阅读 rsync 的手册页)

rsync -arHx / /where/ever/you/mounted/the/RAID10
Run Code Online (Sandbox Code Playgroud)

4)将旧 RAID1 (md0) 的第 1 部分失效,并将其添加到新 RAID10 (md1)

mdadm /dev/md0 --fail /dev/sda2 --remove /dev/sda2
mdadm /dev/md1 --add /dev/sda2
Run Code Online (Sandbox Code Playgroud)

笔记!这将从sda2. 该md0仍应使用,但只有在其他团队成员全面运作。

另请注意,这将在 上开始同步/恢复过程md1。要检查状态,请使用以下命令之一:

# status of sync/recovery
cat /proc/mdstat
# details
mdadm -D /dev/md1
Run Code Online (Sandbox Code Playgroud)

等待恢复完成。

5)在新阵列上安装 GRUB(假设您从它启动)。某些 Linux 救援/启动 CD 效果最佳。

6)在新阵列上启动。如果它正常工作,销毁旧阵列并将剩余的磁盘添加到新阵列。

不归路

此时,您将销毁旧 md0 数组的最后一个成员上的数据。绝对确保一切正常。

mdadm --stop /dev/md0
mdadm /dev/md0 --remove /dev/sdc1
mdadm /dev/md1 --add /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

再次 -等到恢复md1完成。

# status of sync/recovery
cat /proc/mdstat
# details
mdadm -D /dev/md1
Run Code Online (Sandbox Code Playgroud)

7)更新 mdadm 配置

记得更新/etc/mdadm/mdadm.conf(删除md0)。

并将配置保存到 initramfs(重启后可用)

update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

  • 您在我发表评论后编辑了您的答案。此外,您的程序提供了一个带有两个备用磁盘的两磁盘 RAID-10……几乎不是四磁盘 RAID-10。RAID-10 卷也无法重塑。 (4认同)
  • “mdadm:raid10 阵列 /dev/md1 无法重塑。” mdadm 联机帮助页中也提到了这一点。 (3认同)
  • 我按照您提供的命令运行了它们,最终得到了一个带有两个备用磁盘的两磁盘 RAID-10,如 /proc/mdstat 所示。这是在内核 2.6.30 上,使用 mdadm v2.6.7.2。 (2认同)

小智 9

遵循与 Mark Turner 相同的过程,但在创建 raid 阵列时,请提及 2 个丢失的磁盘

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda1 missing /dev/sdb2 missing
Run Code Online (Sandbox Code Playgroud)

然后继续其他步骤。

简而言之,创建 RAID10 总共 4 个磁盘(其中 2 个丢失),重新同步,然后添加另外两个磁盘。


小智 6

刚刚完成从两个 2TB 磁盘 mdadm RAID 1 上的 LVM 到四磁盘 RAID 10(两个原始磁盘 + 两个新磁盘)上的 LVM。

正如@aditsu 所指出的,在创建阵列时驱动器顺序很重要。

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda missing /dev/sdb missing
Run Code Online (Sandbox Code Playgroud)

上面的代码提供了一个缺少两个磁盘的可用阵列(如果您不使用整个磁盘,请添加分区号)。添加第三个磁盘后,它将开始同步。我在第三个完成同步之前添加了第四个磁盘。它显示为备用,直到第三个磁盘完成然后开始同步。

我的情况的步骤:

  1. 做好备份。

  2. 创建一个降级的 4 磁盘 RAID 10 阵列,其中缺少两个磁盘(我们将丢失的磁盘称为 #2 和 4)。

  3. 告诉妻子不要更改/添加她关心的任何文件

  4. 失败并从 RAID 1 阵列(磁盘 4)中移除一个磁盘。

  5. 将物理盘区从 RAID 1 阵列移动到 RAID 10 阵列,使磁盘 2 为空。

  6. 杀死活动的 RAID 1 阵列,将现在的空磁盘(磁盘 2)添加到 RAID 10 阵列,然后等待重新同步完成。

  7. 将从 RAID 1 中移除的第一个磁盘(磁盘 4)添加到 RAID 10 阵列。

  8. 给老婆去吧。

在第 7 步,我认为驱动器 1、2、4 可能会发生故障(在磁盘 4 的重新同步期间)而不会终止阵列。如果驱动器 3 出现故障,则阵列上的数据将被删除。