设置软件 RAID 阵列

来自 Alpine Linux


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 的更多信息

这些资源可能会有所帮助