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


22

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缺少冗余。

有没有更好的办法?


5
不要忘记第0步。对所有内容进行良好的备份。
安东尼·刘易斯

我相信您的步骤是正确的。在将数据从一组复制到另一组期间,您失去了冗余。
凯文·库帕尔

是否可以创建降级的4disk RAID10?
pauska,2009年

1
是的,您只使用“ / dev / hda missing / dev / hdb missing”,因为否则,您将丢失一对完整的货币,而这一切都会崩溃。顺便提一句,这个问题的“可接受的答案”完全是错误的,并且行不通。
womble

我也在寻找一种实现此目的的好方法,并且我认为问题中描述的方法是迄今为止找到的最好的方法。马克·特纳(Mark Turner)的答案无济于事,因为它创建了一个2设备阵列,无法将其重塑为4设备(其他2设备只能作为备用设备添加)。苏雷什·库玛(Suresh Kumar)的答案与问题中所描述的相同,只是它不能完全那样工作。缺少的设备必须是第二和第四,而不是第三和第四。关于问题中的步骤:我认为步骤5具有完全冗余,而步骤6具有一半数据的冗余。我实际上看到步骤已重编号
aditsu'5

Answers:


8

使用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

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

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

mdadm -D /dev/md1

注意!您应该保存数组的布局:

# 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

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

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

rsync -arHx / /where/ever/you/mounted/the/RAID10

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

mdadm /dev/md0 --fail /dev/sda2 --remove /dev/sda2
mdadm /dev/md1 --add /dev/sda2

注意!这将清除中的数据sda2。它md0应该仍然可用,但前提是其他raid成员已完全运作。

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

# status of sync/recovery
cat /proc/mdstat
# details
mdadm -D /dev/md1

等待恢复完成。

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

6)启动新阵列。如果正确工作,请销毁旧阵列,然后将剩余的磁盘添加到新阵列中。

不可退回的要点

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

mdadm --stop /dev/md0
mdadm /dev/md0 --remove /dev/sdc1
mdadm /dev/md1 --add /dev/sdc1

再次- 等待恢复md1完成。

# status of sync/recovery
cat /proc/mdstat
# details
mdadm -D /dev/md1

7)更新mdadm配置

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

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

update-initramfs -u

1
四个磁盘放在哪里?
womble

嗯 我明确声明要用2个磁盘创建阵列,复制数据,通过删除一个磁盘使RAID 1失败,将该磁盘添加到RAID10,然后启动到RAID10,如果可以的话,销毁RAID1并将最后一个磁盘移动到新的RAID ....
马克·特纳

4
我发表评论后,您编辑了答案。此外,您的过程还提供了具有两个备用磁盘的两磁盘RAID-10 ...几乎没有四磁盘RAID-10。RAID-10卷也无法重塑。
womble

2
我按照您提供的命令运行了命令,最后得到了带有两个备用磁盘的两磁盘RAID-10,如/ proc / mdstat所示。这是在mdadm v2.6.7.2的内核2.6.30上。
womble

3
“ mdadm:raid10阵列/ dev / md1无法重塑。” mdadm联机帮助页中也提到了这一点。
womble

9

遵循与Mark Turner相同的步骤,但是在创建RAID阵列时,请提及2个丢失的磁盘

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda1 missing /dev/sdb2 missing

然后继续其他步骤。

简而言之,创建具有总共4个磁盘(其中2个缺失)的RAID10,重新同步,然后添加其他两个磁盘。


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

上面的代码给出了一个有用的阵列,其中缺少两个磁盘(如果不使用整个磁盘,则添加分区号)。一旦添加了第三个磁盘,它将开始同步。我在第三个磁盘完成同步之前添加了第四个磁盘。它显示为备用磁盘,直到第三个磁盘完成后才开始同步。

针对我的情况的步骤:

  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发生故障,则阵列上的数据将被烘烤。


+1,尤其是对于步骤3;)

-1,指令不清晰,没有妻子,丢失了我的数据
-ZAB

1

我现在已经将raid1移至raid10了,尽管此页面对我有所帮助,但上面的答案中有一些遗漏。特别是我的目的是保持ext4的出生时间。

设置是:

  • 2个raid1磁盘,每种类型为msdos和md0(带ext4分区),mbr类型为msdos
  • 2个新的新磁盘成为新的主磁盘(大小相同)
  • 导致4磁盘raid md127 ext4,但由于大小我不得不从mbr切换到gpt
  • 它是我的主磁盘,因此不需要或不需要进行引导管理器设置
  • 使用我的日常ubuntu(因此:不使用外部救援光盘)
  • 使用gparted,dd和mdadm

正如任何人之前所说:零步骤应该备份,并且过程中总会出现错误,从而导致极度数据丢失

  1. 备份

  2. 设置新团队

    1. 创建一个新的团队

      mdadm -v --create /dev/md127 --level=raid10 --raid-devices=4 /dev/sdb1 missing /dev/sde1 missing
      

      (我发现布局很重要..第二和第四似乎是默认'near'raid中的重复项)

    2. 设置RAID的分区,我在md127上使用gparted设置gpt,然后添加了一个旧分区或更大分区的新分区(ext4)
  3. 迁移

    1. 现在获取数据...我第一次尝试使用rsync wich工作,但未能保持出生时间...使用dd 从旧团队克隆到新团队

      dd if=/dev/md0 of=/dev/md127p1 bs=1M conv=notrunc,noerror,sync
      

      等待它,
      您可以向该进程发送USR1进行检查

      kill -s USR1 <pid>
      
    2. 修复
      rapart gparted是一个很棒的工具:您告诉它检查并修复分区,然后单击几次鼠标即可将其调整为该磁盘的完整大小;)

    3. 在该分区上设置新的uuid并使用它更新您的fstab(更改uuid)

    4. 将您的突袭存储在conf中

      mdadm --examine --scan  >> /etc/mdadm/mdadm.conf
      

      并删除旧的

      vim /etc/mdadm/mdadm.conf 
      
    5. 如果您不在救援系统上,请重新启动
  4. 摧毁旧的

    1. 失败第一个并将其添加到新团队

      mdadm /dev/md0 --fail /dev/sdc1 --remove /dev/sdc1
      

      然后在该设备上制作gpt并设置一个新的空分区

      mdadm /dev/md127 --add /dev/sdc1
      

      等待它,
      您可以检查

      cat /proc/mdstat
      
    2. 停止第二个

      mdadm --stop /dev/md0 
      

      然后在最后一个设备上使gpt并再次设置一个新的空分区

      mdadm /dev/md127 --add /dev/sdd1
      

      再次等待


0

我用LVM做到了。初始配置:-sda2,sdb2-并在顶部创建raid1 md1。sda1和sdb1用于/ boot分区的第二个raid1。-md1是卷组空间中的pv,上面带有一些lvm。

我添加了sdc和sdd磁盘,并在sda / sdb上创建了分区。

所以:

  1. 将md10创建为:

    mdadm --create / dev / md10 --level raid10 --raid-devices = 4 / dev / sdc2缺少/ dev / sdd2

  2. 在上面扩展vg:

    pvcreate / dev / md10 vgextend空间/ dev / md10

  3. 将卷从md1移动到md10:

    pvmove -v / dev / md1 / dev / md10

(等待完成)4.减少音量组:

vgreduce space /dev/md1
pvremove /dev/md1
  1. 停止数组md1:

    mdadm -S / dev / md1

  2. 将磁盘从旧的md1添加到md10:

    mdadm -a / dev / md10 / dev / sda2 / dev / sdb2

  3. 更新/etc/mdadm/mdadm.conf中的配置:

    mdadm -E --scan >> / dev / mdadm / mdadm.conf

(并删除那里的旧md1)

一切都在实时系统上完成,活动卷用于kvm;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.