使用 GPT 分区的 mdadm RAID 实施

使用 GPT 分区的 mdadm RAID 实施

我当前的想法是创建一个软件阵列,RAID-6 类,具有 4 个成员驱动器,使用mdadm.

具体来说,驱动器将是小型服务器 Dell T20 中 SATA 上的 1 TB HDD。

操作系统是GNU/Linux Debian8.6(后来升级:杰西拉紧巴斯特

在我的例子中,这将产生 2 TB 的磁盘空间和 2 TB 的奇偶校验。


我还想将它与 GPT 分区表一起使用,为了使其工作,我不确定如何具体进行,假设我更愿意纯粹通过终端执行此操作。

由于我从未创建过 RAID 阵列,您能指导我如何进行吗?


笔记:

  • 该数组仅用于唯一的数据。其上没有启动或操作系统。

  • 由于此阵列的用途,我选择了 RAID-6。阵列必须能够承受两次驱动器故障。由于我的硬件限制为 4 个驱动器,据我所知,没有 RAID-6 的替代方案。 (无论 RAID-6 的速度减慢看起来有多糟糕,在这个阵列中都无关紧要。)

答案1

在此答案中,请明确所有阵列成员(驱动器)上的所有数据都将被销毁,因此请先备份!


打开终端并成为root(su);如果你有sudo启用后,您还可以执行以下操作sudo -i:看man sudo对于所有选项):

sudo -i

首先,我们应该擦除驱动器,如果之前有任何数据和文件系统的话。假设我们有 4 个成员:sdi, sdj, sdk, sdl。为了直观地获得此过程的反馈,pv(管道观察器在这里使用:

pv < /dev/zero > /dev/sdi
pv < /dev/zero > /dev/sdj
pv < /dev/zero > /dev/sdk
pv < /dev/zero > /dev/sdl

或者,要检查是否没有留下任何内容,您可以在所有驱动器上使用 GParted 进行查看,如果有任何分区带有或不带有任何文件系统,则擦除它就足够了,尽管我本人更喜欢上述将所有驱动器归零的方法所涉及的驱动器,请记住在执行此操作之前卸载所有分区,可以类似于这些单行代码完成:

umount /dev/sdi?; wipefs --all --force /dev/sdi?; wipefs --all --force /dev/sdi
umount /dev/sdj?; wipefs --all --force /dev/sdj?; wipefs --all --force /dev/sdj
umount /dev/sdk?; wipefs --all --force /dev/sdk?; wipefs --all --force /dev/sdk
umount /dev/sdl?; wipefs --all --force /dev/sdl?; wipefs --all --force /dev/sdl

然后,我们使用 GUID 分区表 (GPT) 初始化所有驱动器,并且需要对所有驱动器进行分区,但不要使用 GParted 执行此操作,因为它会在此过程中创建一个我们不希望的文件系统,使用gdisk

gdisk /dev/sdi
gdisk /dev/sdj
gdisk /dev/sdk
gdisk /dev/sdl

在所有情况下都使用以下内容:

o Enter对于新的空 GUID 分区表 (GPT),
y Enter以确认您的决定
n Enter对于新分区
Enter对于第一个分区的默认值
Enter对于第一个扇区的默认值
Enter对于最后一个扇区的默认值
fd00 Enter对于 Linux RAID 类型
w Enter进行写入更改
y Enter以确认您的决定


您现在可以检查驱动器:

mdadm --examine /dev/sdi /dev/sdj /dev/sdk /dev/sdl

应该说:

(type ee)

如果是,我们现在检查分区:

mdadm --examine /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1

应该说:

No md superblock detected

如果是的话,我们可以创建 RAID6 阵列:

mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1

我们应该等到数组完全创建,这个过程我们可以轻松地watch

watch cat /proc/mdstat

创建数组后,我们应该查看它的详细信息:

mdadm --detail /dev/md0

应该说:

          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

现在我们在阵列上创建一个文件系统,如果您使用ext4,则如下最好避免使用命令,因为ext4lazyinit在大型数组的情况下会花费大量时间,因此得名“惰性初始化”,因此我建议您避免这种情况:

mkfs.ext4 /dev/md0

相反,您应该强制执行完整的即时初始化(保留 0%,root因为它是数据数组):

mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md0

通过指定这些选项,索引节点和日志将在创建过程中立即初始化,这对于较大的数组很有用。

如果您选择采用快捷方式并ext4使用“更好避免的命令”创建文件系统,请注意,ext4lazyinit初始化所有索引节点将花费大量时间,您可以观察它直到完成,例如使用iotopnmon

无论选择哪种方式进行文件系统初始化,都应该在完成初始化后挂载它。


我们现在为此 RAID6 阵列创建一些目录:

mkdir -p /mnt/raid6

并简单地安装它:

mount /dev/md0 /mnt/raid6

既然我们基本上已经完成了,我们可以再次使用 GParted 来快速检查它是否显示linux-raid文件系统以及raid所有驱动器上的标志。

如果是这样,我们就正确创建了带有 GPT 分区的 RAID6 阵列,现在可以在其上复制文件。

查看文件系统的 UUID md

blkid /dev/md0

将 UUID 复制到剪贴板。

现在我们需要用fstab你最喜欢的文本编辑器进行编辑,我用过nano, 尽管sudoedit可能更好地使用:

nano /etc/fstab

并添加一个条目:

UUID=<the UUID you have in the clipboard>    /mnt/raid6    ext4    defaults    0 0

我本人不建议使用defaults一组标志,我只是希望该行不要过于复杂。

以下是我在 UPS 备份数据 RAID 上使用的挂载标志(而不是defaults): nofail,nosuid,nodev,noexec,nouser,noatime,auto,async,rw,data=journal,errors=remount-ro


保存后可以检查是否正确:

mount -av | grep raid6

应该说:

already mounted

如果是,我们保存阵列配置;如果您还没有md创建任何设备,您可以简单地执行以下操作:

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

如果数组已经存在,只需运行前面的命令而不重定向到配置文件:

mdadm --detail --scan

并手动将新数组添加到配置文件中。

最后,不要忘记更新您的initramfs,因为否则您的新数组将仅自动只读汇编,可能如下/dev/md127或类似:

update-initramfs -u -k all

检查您是否按照计划进行了所有操作,如果是,则可以重新启动:

reboot

答案2

如果您在 4 个原始块设备而不是 2 x 4 分区上创建 RAID 阵列,则意味着所有 RAID 恢复操作可能必须在整个设备上运行,反之亦然。

例如,如果您预计磁盘最终会在后半部分开始出现 I/O 错误,且阵列位于分区上,则意味着只有一个阵列会注意到,而另一个阵列将继续保持不变,至少直到伤害扩散到一半。这可能会为您提供一些临时的灵活性,或者不会出现 I/O 减慢的情况。

另一方面,一旦您开始干预,您就必须取出整个物理磁盘进行更换,因此您必须在某个时刻降低两个阵列的性能。此外,对于 SSD,整个磁盘发生故障的情况显然变得更加常见,因此两个阵列无论如何都可能受到此类事件的影响。

对于在典型的分区和 mdadm 文档中找不到的过程细节,没有什么可说的。

相关内容