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

who*_*ami 22 raid mdadm disk

我有一个要为其创建镜像的磁盘;我们称之为磁盘sda。我刚买了另一个同样大小的磁盘,我们可以称之为sdb. sda并且sdb有一个称为一个分区sda1sdb1分别。

创建突袭时,我不想sda清理干净并重新开始,我只是希望它以sdb. 我的思路是这样做:

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=1 /dev/sda1
Run Code Online (Sandbox Code Playgroud)

...创建没有sdb磁盘的阵列,然后运行类似的东西(我正在大声思考以下命令,因为我不确定如何实现这一步)

mdadm /dev/md0 --add /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

sdb1假设Note 的格式类似于sda1

这可能吗?

Sta*_*mer 29

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

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

首先,初始化/dev/sdb1/dev/md0缺少驱动器的新驱动器并初始化文件系统(我假设是 ext3,但选择权在您手中)

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 missing
mkfs -text3 /dev/md0
Run Code Online (Sandbox Code Playgroud)

现在,/dev/sda1很可能是您的根文件系统 ( /),因此为了安全起见,您应该从 Live 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
Run Code Online (Sandbox Code Playgroud)

编辑/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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不要使用`cp`来复制文件系统,您将错过硬链接,扩展属性...使用`tar`或`rsync`使用正确的选项。启动 Live CD 时,请注意 uid-user 映射不同(请参阅 tar/rsync 的 --numeric-owner 选项)。另请参阅 clone2fs 以克隆 extx 文件系统。 (2认同)

小智 6

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

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 missing /dev/sda1
Run Code Online (Sandbox Code Playgroud)

  • 小心点!使用 --metadata=1.2(新的默认值),RAID 元数据 (1MB) 将在开始时插入(覆盖那里的内容)。并且 md 阵列的开头将在 /dev/sda1 中开始 1MB(/dev/md0 将比 /dev/sda1 短 1MB)。元数据=0.9(旧的默认值)时,元数据 (64kB) 将被插入到最后,覆盖那里的内容。因此,使用 --metadata=0.9 并首先调整 FS 的大小。无论你做什么,都要事先备份。 (3认同)

Gil*_*il' 6

你可以这么做。您需要小心一点,但是如果您非常小心,不要输错任何内容,并且不会在设置中留下任何陷阱,那么这并不危险\xc2\xb9。

\n\n

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

\n\n

首先,您需要稍微缩小体积,为 mdraid 元数据(超级块)腾出空间。元数据格式有多种,您必须使用一种将元数据放在磁盘末尾的格式。(在某些设置中,您可能有足够的空间将超级块放在开头,但这更复杂且更容易出现风险,因此我将对此进行介绍。)

\n\n

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

\n\n

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

\n\n
mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 missing\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
mdadm --add /dev/md0 /dev/sdb1\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于引导加载程序的注释:Grub2 理解 Linux RAID-1 并且可以从中引导。诸如 Grub1 等不支持 RAID 的引导加载程序会从镜像卷中透明地读取数据,但如果引导加载程序读取的驱动器出现故障,您的系统将无法启动。如果 RAID 卷位于分区上,请务必在两个驱动器上安装 Grub 的引导扇区。

\n\n

\xc2\xb9确保有备份。\xe2\x80\x9c不危险\xe2\x80\x9d意味着\xe2\x80\x9c你可能不需要它们\xe2\x80\x9d,而不是\xe2\x80\x9c赌博你的数据\xe2\x80\x9d。

\n\n

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

\n