使用 GPT 分区的 mdadm RAID 实现

Lin*_*eak 2 software-raid mdadm gpt

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

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

操作系统是GNU/Linux Debian 8.6(后来升级:JessieStretchBuster

在我的情况下,这将使 2 TB 的磁盘空间具有 2 TB 的奇偶校验。


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

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


笔记:

  • 此数组将仅用于唯一数据。没有启动或操作系统。

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

Lin*_*eak 7

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


打开终端,变成root( su); 如果您已sudo启用,您也可以这样做sudo -i;查看man sudo所有选项):

sudo -i
Run Code Online (Sandbox Code Playgroud)

首先,我们应该擦除驱动器,如果之前有任何数据和文件系统,那就是。假设我们有 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
Run Code Online (Sandbox Code Playgroud)

或者,为了检查是否没有留下任何东西,您可以查看所有驱动器上的 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
Run Code Online (Sandbox Code Playgroud)

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

gdisk /dev/sdi
gdisk /dev/sdj
gdisk /dev/sdk
gdisk /dev/sdl
Run Code Online (Sandbox Code Playgroud)

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

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

它应该说:

(type ee)
Run Code Online (Sandbox Code Playgroud)

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

mdadm --examine /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
Run Code Online (Sandbox Code Playgroud)

它应该说:

No md superblock detected
Run Code Online (Sandbox Code Playgroud)

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

mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
Run Code Online (Sandbox Code Playgroud)

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

watch cat /proc/mdstat
Run Code Online (Sandbox Code Playgroud)

创建完数组后,我们应该看看它的细节:

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

它应该说:

          State : clean
Run Code Online (Sandbox Code Playgroud)
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0
Run Code Online (Sandbox Code Playgroud)

现在我们在数组上创建一个文件系统,如果你使用ext4,下面的隐藏命令最好避免,因为ext4lazyinit在大数组的情况下会花费大量的时间,因此名称为“ lazyinit ”,因此我推荐你避免这种情况:

mkfs.ext4 /dev/md0

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

mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md0
Run Code Online (Sandbox Code Playgroud)

通过指定这些选项,inode 和日志将在创建期间立即初始化,这对于较大的数组很有用。

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

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


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

mkdir -p /mnt/raid6
Run Code Online (Sandbox Code Playgroud)

并简单地安装它:

mount /dev/md0 /mnt/raid6
Run Code Online (Sandbox Code Playgroud)

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

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

查看md文件系统有什么 UUID :

blkid /dev/md0
Run Code Online (Sandbox Code Playgroud)

将 UUID 复制到剪贴板。

现在我们需要fstab使用您最喜欢的文本编辑器编辑 ,我使用了nano,但sudoedit可能更好地使用:

nano /etc/fstab
Run Code Online (Sandbox Code Playgroud)

并向其添加一个条目:

UUID=<the UUID you have in the clipboard>    /mnt/raid6    ext4    defaults    0 0
Run Code Online (Sandbox Code Playgroud)

我自己不建议使用一defaults组标志,我只是希望线条不要过于复杂。

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


您可以在保存更改后检查是否正确:

mount -av | grep raid6
Run Code Online (Sandbox Code Playgroud)

它应该说:

already mounted
Run Code Online (Sandbox Code Playgroud)

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

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Run Code Online (Sandbox Code Playgroud)

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

mdadm --detail --scan
Run Code Online (Sandbox Code Playgroud)

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

最后,不要忘记更新您的initramfs,否则您的新数组将只会自动只读组装,可能与此/dev/md127类似:

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

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

reboot
Run Code Online (Sandbox Code Playgroud)