我可以用一个设备创建软件RAID 1吗?


20

我只有一个磁盘要创建其镜像;我们称这个磁盘sda。我刚刚购买了另一个大小相同的磁盘,我们可以称之为sdbsdasdb有一个分区分别称为sda1sdb1

创建RAID时,我不想擦sda干净然后重新开始,我只希望它使用开始镜像sdb。我的思路是:

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=1 /dev/sda1

...创建没有sdb磁盘的阵列,然后运行类似的命令(我在想以下命令,因为我不确定如何实现此步骤)

mdadm /dev/md0 --add /dev/sdb1

sdb1假定注释的格式与sda1

这可能吗?


是的你可以。它不像那样简单--add,您需要小心,但是并不是复杂。请参阅如何在Ubuntu中设置磁盘镜像?(由于新规则,我不能将这个问题重复提出。)
吉尔斯(Gillles

Answers:


28

标题中问题的简单答案是“是”。但是,您真正想要做的是下一步,即镜像现有数据。

可以转换现有磁盘,但是如上所述,由于元数据位置的原因,这是有风险的。最好用新磁盘创建一个空的(损坏的)镜像并将现有数据复制到该镜像上。然后,如果它不起作用,则只需引导回未镜像的原始文件即可。

首先,使用缺少的驱动器将其初始化/dev/sdb1为新/dev/md0文件并初始化文件系统(我假设使用ext3,但选择是您自己的)

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 missing
mkfs -text3 /dev/md0

现在,/dev/sda1很可能是您的根文件系统(/),为了安全起见,您应该从可访问这两者的实时CD,应急磁盘或其他可引导系统中进行下一步/dev/sda1/dev/md0尽管我已经成功地通过进入单用户模式来做到了这一点。

将文件系统的全部内容复制/dev/sda1/dev/md0。例如:

mount /dev/sda1 /mnt/a       # only do this if /dev/sda1 isn't mounted as root
mount /dev/md0 /mnt/b
cd /mnt/a                    # or "cd /" if it's the root filesystem
cp -dpRxv . /mnt/b

编辑/etc/fstab或以其他方式确保在下次启动时/dev/md0挂载而不是/dev/sda1。您的系统可能已设置为从中引导,/dev/sda1并且引导参数可能将其指定为根设备,因此,在重新引导时,您应该手动更改它,以使根为/dev/md0(假设/dev/sda1为根)。重新启动后,检查/dev/md0是否已挂载(df)以及它是否作为降级镜像(cat /proc/mdstat)运行。添加/dev/sda1到数组:

mdadm /dev/md0 --add /dev/sda1

由于重建将覆盖/dev/sda1,因此您使用的元数据版本无关紧要。与往常一样,在进行重大更改时,请进行完整备份(如果可能),或者至少确保无法重新创建的任何内容都是安全的。

您将需要重新生成引导配置以/dev/md0用作root(如果/dev/sda1是root),并且可能需要重新生成mdadm.conf以确保/dev/md0始终启动。


完美地满足我的需求:D
whoami

2
不要cp用来复制文件系统,您会错过诸如硬链接,扩展属性...之类的东西。使用tarrsync带有适当的选项。引导Live CD时,请注意uid用户映射是不同的(请参阅tar / rsync的--numeric-owner选项)。另请参见clone2fs以克隆extx文件系统。
斯特凡Chazelas

1
该选项来cp处理保存链接(-d)模式,所有权和时间戳(-p),递归做(-R),并停留在一个文件系统(-x),但我想你可能是对硬链接和扩展属性。
StarNamer

rsync -aH --delete /mnt/olddisk/ /mnt/newarray/是个不错的选择。-vih --progress如果您真的想看看它在做什么,请添加。
rudolfbyker

4

当然,您可以指定第二个磁盘当前为创建它missing

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 missing /dev/sda1

谢谢,我很可能在这里是OCD,但是为什么在/ dev / sda1之前添加了缺失项,顺序很重要吗?
whoami

我认为顺序并不重要。
eppesuig

3
小心点!如果使用--metadata = 1.2(新的默认值),则会在开始处插入RAID元数据(1MB)(覆盖那里的内容)。md数组的开始将在/ dev / sda1内开始1MB(/ dev / md0比/ dev / sda1短1MB)。在元数据= 0.9(旧的默认值)的情况下,元数据(64kB)将插入到末尾,以覆盖那里的内容。因此,请使用--metadata = 0.9并首先调整FS的大小。无论您做什么,都请事先备份。
斯特凡Chazelas

3

你可以做到的。您需要小心一点,但这并不危险¹,如果您非常小心不要输错任何东西,并且不会在设置中留下任何麻烦。

我强烈建议不要在实时系统上进行任何操作。在某些情况下有可能,但需要格外小心。从liveCD / liveUSB(例如PartedSystemRescueCD)引导。

首先,您需要稍微缩小音量,以便为mdraid元数据(超级块)腾出空间。有几种元数据格式,您必须使用一种将元数据放在磁盘末尾的格式。(在某些设置中,您可能有足够的空间在开始时放置超级块,但这更加复杂且容易产生风险,因此我将其介绍。)

您必须确保未使用块设备中的最后128kB,以便为超级块腾出空间。因此,您需要在上缩小文件系统/dev/sda1。如果这是ext2 / ext3 / ext4文件系统,请使用来获取当前文件系统的大小tune2fs /dev/sda1,然后resize2fs /dev/sda1 NNN在NNN为该大小减去128kB的位置运行。您可以改为使用Parted。如果需要缩小extN文件系统,则需要先将其卸载;否则,请执行以下操作。btrfs文件系统可以实时压缩。

确保块设备的最后128kB可用后,调用mdadm --create创建RAID-1卷。除了超级块,这不会触及该卷的任何部分。最初,该卷将只有一个组件:所有其他组件都设置为失败。您必须通过--level=1(或等效地-n 1)(此方法仅适用于RAID-1)和--metadata=0.9--metadata=1.0(默认的超级块格式1.2将超级块放置在设备的开头附近,这可能会覆盖数据)。--raid-devices-n)的参数是RAID卷中组件的数量(包括缺少的组件)。

mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 missing

现在,您可以激活阵列并添加其他组件。

mdadm --add /dev/md0 /dev/sdb1

关于引导加载程序的注释:Grub2理解Linux RAID-1并可以从中引导。不了解RAID的引导加载程序(例如Grub1)可以从镜像卷中透明读取,但是如果从引导加载程序读取的驱动器发生故障,则系统将无法引导。如果RAID卷位于分区上,请确保在两个驱动器上都安装了Grub的引导扇区。

¹ 确保有备份。“不危险”表示“您可能不需要它们”,而不是“赌博数据”。

如何设置磁盘镜像(RAID-1)重新发布并稍作修改

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.