我当前的想法是创建一个软件阵列,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
初始化所有索引节点将花费大量时间,您可以观察它直到完成,例如使用iotop
或nmon
。
无论选择哪种方式进行文件系统初始化,都应该在完成初始化后挂载它。
我们现在为此 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 文档中找不到的过程细节,没有什么可说的。