设置软件 RAID 阵列
RAID 有多种形式:通过硬件 RAID 控制器、“伪 RAID” 和使用 mdadm
的“软件 RAID”,后者仅适用于 Linux。这些说明仅讨论最后一种形式的 RAID。此处仅涵盖任意存储的 RAID。可以将系统的根目录 /、/var、swap 甚至 /boot 放在 RAID 阵列上。有关执行任何操作的更多详细信息,请参阅 手动设置磁盘。
RAID 级别
有几个 RAID “级别” 可供选择
- RAID0 本质上只是将两个设备粘合在一起,形成一个更大的虚拟驱动器。读取和写入在驱动器之间“条带化”,以提高速度。(也就是说,您的硬件可以并行地从多个设备读取或向其写入不同的数据。)此处的“设备”通常是硬盘驱动器的分区。
- RAID1 “镜像”写入到两个设备,以提高安全性。这样,如果其中一个设备发生故障,数据仍然可以在另一个设备上使用。
- RAID5 类似于 RAID1,但它使用三个设备,并提供其中两个设备的空间。只要三个设备中的任意两个继续工作,数据就会被保留。
还有其他 RAID 级别。这是对它们差异的解释。
建议
- 您的 /boot 分区应该不放在 RAID 上,或者放在 RAID1 阵列上,且没有进一步的加密或 LVM 层。(Alpine 的默认引导加载程序 extlinux 无法处理这两者。Grub2 可以处理 /boot 在 LVM 上。)通常的做法是为 /boot 创建一个小的(32--100 MB)分区。它可以是一个镜像(RAID1)卷,但这仅用于初始化后访问。这样,当您将新的内核或引导加载程序配置文件写入 /boot 时,它会被写入到多个物理分区。在预初始化引导加载程序阶段,只会使用其中一个分区(并且它将被挂载为只读)。
- 重要的是要注意,extlinux 无法从使用
mdadm
元数据版本 1.2 创建的分区引导,这是默认版本。为了安全起见,建议基于较旧的元数据版本创建分区,并为 /boot 分区使用--metadata=0.90
参数。 - 您可以将 swap 放在 RAID0 卷上,但似乎没有任何好的理由这样做。Linux 内核已经知道如何条带化多个 swap 分区。因此,您可以只将多个普通(非 RAID)分区专用于 swap,并获得相同的效果。这样做或做其中任何一件事的缺点是,当您的磁盘之一发生故障时,系统将崩溃。为了获得更好的可靠性,请创建一个镜像(RAID1)卷并将 swap 放在那里。如果其中一个磁盘发生故障,这将使您的系统保持运行。
- RAID 阵列中的所有分区都应大小相同。
- 永远不要只挂载 RAID1 阵列中的一个设备。如果您以 r/w 模式挂载它,那么,即使您没有显式地向设备写入任何内容,它也可能与未挂载的设备失去同步,例如,其文件系统日志已更新。如果您随后挂载另一个设备,或将它们两个一起挂载,您的数据很可能会损坏。如果您必须这样做,请确保以 r/o 模式挂载您的设备。更好的是,放弃您未挂载的设备。清零其 RAID 标头,并告诉
mdadm
该设备已发生故障。然后,如果您愿意,可以将其视为新磁盘,您可以将其添加为原始(现在已降级)RAID 阵列的替换。 - 镜像 RAID 阵列(级别 1 或 5)可以保护您免受硬件故障的影响。它不能防止
rm -rf /
、软件错误、漏洞利用、地震、火灾。不要将 RAID 作为备份策略。 - 运行镜像 RAID 仅提供了一道防御驱动器故障的防线。它不会让您停止考虑它们。如果 RAID 1 中的设备开始发生故障,而您没有意识到,那么您的数据最终会像您运行一个驱动器一样被静默地损坏。您必须查看您的日志。
本文档已针对 Alpine 2.4.6 更新。
加载所需模块
首先加载 raid1 内核模块
modprobe raid1
将其添加到 /etc/modules-load.d,以便在下次重启期间加载它
echo raid1 >> /etc/modules-load.d/raid1.conf
创建分区
请阅读有关 分区类型 的信息,以及为什么您应该考虑使用 0xda 而不是 0xfd。
在本文档中,我将使用 /dev/sda 和 /dev/sdb,但您的设备可能不同。要查找您可用的磁盘,请查看 /proc/partitions。
使用 fdisk 创建分区。
fdisk /dev/sda
我将创建一个类型为 Linux raid autodetect 的单个分区。在 fdisk 中使用 n 创建分区,使用 t 设置类型。逻辑卷将在稍后创建。我的分区表如下所示(“p”打印分区表)
Device Boot Start End Blocks Id System /dev/sda1 1 17753 8388261 fd Linux raid autodetect
使用 w 写入并退出。对您的第二个磁盘执行相同的操作。
fdisk /dev/sdb
我的看起来像这样
Device Boot Start End Blocks Id System /dev/sdb1 1 17753 8388261 fd Linux raid autodetect
或者,如果您的磁盘大小相同(它们应该是相同的,请参阅上面的 建议),您可以像这样将分区表从一个复制到另一个
apk add sfdisk sfdisk -d /dev/sda | sfdisk /dev/sdb
设置 RAID 阵列
安装 mdadm 以设置阵列。
apk add mdadm
创建阵列。
mdadm --create --level=1 --raid-devices=2 /dev/md0 /dev/sda1 /dev/sdb1
监控同步状态
您现在应该能够通过查看 /proc/mdstat 的内容来查看阵列同步。
~ # cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb1[1] sda1[0] 8388160 blocks [2/2] [UU] [=========>...........] resync = 45.3% (3800064/8388160) finish=0.3min speed=200003K/sec unused devices: <none>
您无需等到完全同步即可继续。
保存配置
创建 /etc/mdadm.conf 文件,以便 mdadm 知道您的 RAID 是如何设置的
mdadm --detail --scan > /etc/mdadm.conf
为了确保 raid 设备在下次重启期间启动,请运行
rc-update add mdadm-raid
要在启动时在 /etc/fstab 中使用 raid 阵列,mdadm 服务必须在启动时启动
rc-update add mdadm boot
rc-update add mdadm-raid boot
如果您不是从硬盘安装运行 Alpine,请使用
lbu commit
像往常一样将您的配置更改保存到您的可移动媒体。
raid 设备 /dev/md0 现在可以与 LVM 或 mkfs 一起使用。
在安装后添加 RAID
要将 softRAID 添加到已安装的 Alpine,您需要从以下 3 个步骤开始
3. 加载所需模块
4. 创建分区
5. 设置 RAID 阵列
然后您必须使用命令 mkinitfs 更新您的 initfs。
1. 确保 /etc/mkinitfs/mkinitfs.conf 包含 raid,它应如下所示
features="ata base ide scsi usb virtio ext4 lvm raid"
2. 使用此命令更新 initfs
mkinitfs -c /etc/mkinitfs/mkinitfs.conf -b /
关于 RAID 的更多信息
这些资源可能会有所帮助
- Arch wiki 关于 RAID 的页面
- Arch wiki 关于 RAID 和 LVM 的页面
- Arch wiki 关于将现有系统转换为 RAID 的页面 Gentoo wiki 关于相同内容的页面
- Gentoo Linux Wiki:RAID/Software(通过 archive.org)
- Gentoo Linux Wiki:Software RAID 安装(通过 archive.org)
- https://gentoolinux.cn/doc/en/gentoo-x86-tipsntricks.xml#software-raid
- Gentoo Linux x86 与软件 Raid 和 LVM2 快速安装指南(通过 archive.org)