跳转至内容

RAID

来自 ArchWiki

Redundant Array of Independent Disks(RAID,独立磁盘冗余阵列)是一种存储技术,它将多个磁盘驱动器组件——通常是磁盘驱动器或其分区——组合成一个逻辑单元。根据 RAID 实现的不同,这个逻辑单元可以是一个文件系统,也可以是一个额外的透明层,用于容纳多个分区。

数据根据所需的冗余级别和性能,以几种称为 #RAID 级别 的方式分布在驱动器上。因此,选择的 RAID 级别可以在硬盘故障时防止数据丢失,提高性能,或者两者兼而有之。

本文档将介绍如何使用 mdadm(8) 创建和管理软件 RAID 阵列。

警告 在继续之前,请务必 备份 所有数据。

RAID 级别

尽管大多数 RAID 级别都包含冗余,但 RAID 并不能保证数据安全。RAID 无法保护数据免受火灾、计算机被盗或多个硬盘同时发生故障的影响。此外,安装具有 RAID 功能的系统是一个复杂的过程,可能会损坏数据。

标准 RAID 级别

有许多不同的 RAID 级别;以下列出的是最常见的。

RAID 0
使用条带化(striping)来组合磁盘。尽管它不提供冗余(实际上会降低可靠性),但仍被视为 RAID。然而,它确实提供了显著的速度提升。如果速度提升值得承担数据丢失的可能性(例如,用于 swap 分区),则选择此 RAID 级别。在服务器上,RAID 1 和 RAID 5 阵列更为合适。RAID 0 阵列块设备的大小是最小组件分区的大小乘以组件分区的数量。
RAID 1
最直接的 RAID 级别:直线镜像(straight mirroring)。与其他 RAID 级别一样,只有当分区位于不同的物理硬盘驱动器上时才有意义。如果其中一个驱动器发生故障,RAID 阵列提供的块设备将继续正常运行。示例将为除 swap 和临时数据之外的所有内容使用 RAID 1。请注意,在软件实现中,RAID 1 级别是引导分区的唯一选择,因为读取引导分区的引导加载程序无法理解 RAID,但 RAID 1 的组件分区可以被读取为普通分区。RAID 1 阵列块设备的大小是最小组件分区的大小。
RAID 5
需要 3 个或更多物理驱动器,并提供 RAID 1 的冗余以及 RAID 0 的速度和大小优势。RAID 5 使用条带化,就像 RAID 0 一样,但还存储分布在每个成员磁盘上的奇偶校验块。如果发生磁盘故障,这些奇偶校验块将用于在替换磁盘上重建数据。RAID 5 可以承受一个成员磁盘的丢失。
注意 RAID 5 因其速度和数据冗余的组合而成为常见的选择。但缺点是,如果一个驱动器发生故障,而在该驱动器被替换之前另一个驱动器也发生故障,所有数据都将丢失。此外,对于现代硬盘大小和消费级硬盘预期的不可恢复读取错误(URE)率,重建一个 4TiB 的阵列预期(即 50% 以上的几率)会至少出现一次 URE。因此,RAID 5 已不再被存储行业推荐。
RAID 6
需要 4 个或更多物理驱动器,并提供 RAID 5 的优势,但能抵抗两次驱动器故障。RAID 6 还使用条带化,就像 RAID 5 一样,但存储分布在每个成员磁盘上的两个不同的奇偶校验块。如果发生磁盘故障,这些奇偶校验块将用于在替换磁盘上重建数据。RAID 6 可以承受两次成员磁盘的丢失。其对不可恢复读取错误的稳健性有所改善,因为在从单个故障驱动器重建时,阵列仍然具有奇偶校验块。然而,考虑到开销,RAID 6 成本高昂,并且在大多数情况下,RAID 10 的 far2 布局(如下文所述)提供了更好的速度优势和稳健性,因此更受欢迎。

嵌套 RAID 级别

RAID 1+0
RAID 1+0 是一种嵌套 RAID,它结合了两种标准 RAID 级别以获得性能和额外的冗余。它通常被称为RAID10,但 Linux MD RAID10 与简单的 RAID 层叠略有不同,请参见下文。
RAID 10
Linux 下的 RAID10 是在 RAID1+0 的概念基础上构建的,但它实现为一个单一的层,具有多种可能的布局。
near X 布局(在 Y 块磁盘上)将每个块重复 X 次在 Y/2 条带上,但不需要 X 能整除 Y。块放置在它们镜像到的每个磁盘上的几乎相同的位置,因此得名。它可以处理任意数量的磁盘,最少 2 个。Near 2 在 2 块磁盘上等同于 RAID1,Near 2 在 4 块磁盘上等同于 RAID1+0。
far X 布局(在 Y 块磁盘上)旨在提供镜像阵列上的条带化读取性能。它通过将每个磁盘分成两个部分,例如前部和后部来实现,写入磁盘 1 前部的部分会被镜像到磁盘 2 的后部,反之亦然。这样做的效果是能够对顺序读取进行条带化,而这正是 RAID0 和 RAID5 获得性能的方式。缺点是顺序写入会有非常轻微的性能损失,因为磁盘需要搜索到磁盘的另一部分来存储镜像。然而,在读取速度是关注点且可用性/冗余至关重要的情况下,far 2 布局的 RAID10 比分层 RAID1+0 RAID5 更受欢迎。但它仍然不能替代备份。更多信息请参见维基百科页面。
警告 mdadm 无法重塑far X 布局的阵列,这意味着一旦创建了阵列,您将无法使用 mdadm --grow 来调整它。例如,如果您有一个 4x1TB 的 RAID10 阵列,并且想切换到 2TB 的磁盘,您的可用容量仍将是 2TB。对于这类用途,请坚持使用near X 布局。

RAID 级别比较

RAID 级别 数据冗余 物理驱动器利用率 读取性能 写入性能 最少驱动器数
0 100% nX

最佳

nX

最佳

2
1 50% 最多 nX(如果多个进程读取),否则 1X 1X 2
5 67% - 94% (n−1)X

优越

(n−1)X

优越

3
6 50% - 88% (n−2)X (n−2)X 4
10,far2 50% nX

最佳;与 RAID0 相当但具有冗余

(n/2)X 2
10,near2 50% 最多 nX(如果多个进程读取),否则 1X (n/2)X 2

* 其中n代表专用磁盘的数量。

LINEAR

LINEAR 允许将两个或多个设备映射到一个设备,没有像RAID0那样的并行访问,但允许充分利用不同大小的磁盘。要使用此模式创建伪 RAID 而不使用mdadm,可以使用低级 dmsetup(8) 工具、高级 LVM 框架或 Btrfs 文件系统。

实现

RAID 设备可以通过不同的方式进行管理

软件 RAID
这是最简单的实现方式,因为它不依赖于晦涩专有的固件和软件。阵列由操作系统管理,通过以下方式之一:
  • 抽象层(例如 mdadm);
    注意 这是本指南稍后将使用的方法。
  • 逻辑卷管理器(例如 LVM);
  • 文件系统的组成部分(例如 ZFSBtrfs)。
硬件 RAID
阵列由安装在 PC 中的专用硬件卡直接管理,磁盘直接连接到该卡。RAID 逻辑运行在板载处理器上,独立于主机处理器(CPU)。虽然这种解决方案独立于任何操作系统,但后者需要驱动程序才能与硬件 RAID 控制器正常工作。RAID 阵列可以通过选项 ROM 接口配置,或者根据制造商的要求,在安装操作系统后使用专用应用程序进行配置。对于 Linux 内核来说,这种配置是透明的:它不会单独识别磁盘。
FakeRAID
这种 RAID 类型实际上被称为 BIOS 或板载 RAID,但却被错误地宣传为硬件 RAID。阵列由伪 RAID 控制器管理,其中 RAID 逻辑实现在选项 ROM 或固件本身中带有 EFI SataDriver(如果是 UEFI),但它们不是完全实现的具有所有 RAID 功能的硬件 RAID 控制器。因此,这种 RAID 类型有时被称为 FakeRAID。dmraid 将用于处理这些控制器。以下是一些 FakeRAID 控制器的示例:Intel Rapid Storage、JMicron JMB36x RAID ROM、AMD RAID、ASMedia 106x 和 NVIDIA MediaShield。

我拥有哪种 RAID 类型?

由于软件 RAID 是由用户实现的,因此 RAID 类型对用户来说是很容易知道的。

然而,区分 FakeRAID 和真正的硬件 RAID 可能更困难。如前所述,制造商经常错误地区分这两种 RAID 类型,并且虚假广告是普遍存在的。在这种情况下,最好的解决方案是运行 lspci 命令并查看输出以找到 RAID 控制器。然后进行搜索以查找有关 RAID 控制器的信息。硬件 RAID 控制器会出现在此列表中,而 FakeRAID 实现则不会。此外,真正的硬件 RAID 控制器通常价格昂贵,因此如果有人定制了系统,那么选择硬件 RAID 设置很可能会显著改变计算机的价格。

安装

安装 mdadmmdadm 用于管理纯软件 RAID,使用普通块设备:底层硬件不提供任何 RAID 逻辑,只提供磁盘供应。mdadm 可以与任何块设备集合一起工作。例如,甚至可以从一组 U 盘创建 RAID 阵列。

准备设备

警告 这些步骤将擦除设备上的所有内容,请谨慎输入!

如果设备被重新使用或从现有阵列中重新配置,请擦除任何旧的 RAID 配置信息

# mdadm --misc --zero-superblock /dev/drive

或者,如果要删除硬盘上的某个分区

# mdadm --misc --zero-superblock /dev/partition
  • 擦除分区的超级块不应影响磁盘上的其他分区。
  • 由于 RAID 功能的性质,在运行中的阵列上完全安全擦除磁盘非常困难。在创建 RAID 之前,请考虑是否有必要执行此操作。
  • 您可以使用 GUI 工具 blivet-guiAUR 完成整个磁盘准备过程。

分区设备

强烈建议对将要用于阵列的磁盘进行分区。由于大多数 RAID 用户选择大于 2 TiB 的硬盘驱动器,因此需要并推荐使用 GPT。有关分区和可用分区工具的更多信息,请参阅分区

注意 也可以直接在原始磁盘(不分区)上创建 RAID,但不推荐这样做,因为它可能在更换故障磁盘时导致问题。
提示 更换 RAID 故障磁盘时,新磁盘的大小必须与故障磁盘相同或更大——否则阵列重建过程将无法进行。即使是同一制造商和型号的硬盘驱动器也可能存在细微的尺寸差异。通过在磁盘末尾留出一些未分配空间,可以补偿驱动器之间的尺寸差异,从而使选择替换驱动器型号更容易。因此,在磁盘末尾留出约 100 MiB 的未分配空间是一个好习惯。

GUID 分区表

  • 创建分区后,其分区类型 GUID 应为 A19D880F-05FC-4D3B-A006-743F0F84911E(可以在 fdisk 中选择分区类型 Linux RAID 或在 gdisk 中选择 FD00 来分配)。
  • 如果使用了更大的磁盘阵列,请考虑分配文件系统标签分区标签,以便以后更容易识别单个磁盘。
  • 建议在每个设备上创建相同大小的分区。

主引导记录

对于那些在具有 MBR 分区表的 HDD 上创建分区的人来说,可用的分区类型 ID 为:

  • 0xDA 用于非文件系统数据(fdisk 中的“Non-FS data”)。这是 Arch Linux 上 RAID 阵列的推荐 mdadm 分区类型。
  • 0xFD 用于 RAID 自动检测阵列(fdisk 中的“Linux RAID autodetect”)。此分区类型仅应在需要 RAID 自动检测时使用(非initramfs 系统,旧的 mdadm 元数据格式)。

有关更多信息,请参阅 Linux Raid Wiki:Partition Types

构建阵列

使用 mdadm 构建阵列。有关支持的选项,请参阅 mdadm(8)。下面提供了一些示例。

警告 不要简单地复制/粘贴下面的示例;请确保您替换了正确的选项和驱动器字母。
  • 如果这是一个打算从 Syslinux 引导的 RAID1 阵列,syslinux v4.07 中的一个限制要求元数据值为 1.0 而不是默认的 1.2。
  • Arch 安装介质创建阵列时,请使用选项 --homehost=yourhostname(或 --homehost=any 以始终拥有与主机无关的名称),以设置主机名,否则主机名 archiso 将写入阵列元数据。
提示 您可以使用选项 --name=MyRAIDName 指定自定义 RAID 设备名称,或者将 RAID 设备路径设置为 /dev/md/MyRAIDName。Udev 将在 /dev/md/ 中使用该名称创建指向 RAID 阵列的符号链接。如果 homehost 匹配当前主机名(或者如果 homehost 设置为 any),链接将是 /dev/md/name;如果主机名不匹配,链接将是 /dev/md/homehost:name

以下示例显示了构建一个 2 设备的 RAID1 阵列

# mdadm --create --verbose --level=1 --raid-devices=2 /dev/md/MyRAID1Array /dev/sdb1 /dev/sdc1

以下示例显示了构建一个具有 4 个活动设备和 1 个备用设备的 RAID5 阵列

# mdadm --create --verbose --level=5 --raid-devices=4 /dev/md/MyRAID5Array /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1
提示 --chunk 用于更改默认值的块大小。有关块大小优化的更多信息,请参阅 Chunks: the hidden key to RAID performance

以下示例显示了构建一个具有 2 个设备的 RAID10,far2 阵列

# mdadm --create --verbose --level=10 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/sdb1 /dev/sdc1

该阵列在虚拟设备 /dev/mdX 下创建,组装并准备使用(处于降级模式)。您可以直接开始使用它,同时 mdadm 在后台重新同步阵列。恢复奇偶校验可能需要很长时间。使用以下命令检查进度:

$ cat /proc/mdstat

更新配置文件

默认情况下,mdadm.conf 的大部分内容被注释掉了,并且只包含以下内容:

/etc/mdadm.conf
...
DEVICE partitions
...

此指令告诉 mdadm 检查 /proc/partitions 中引用的设备,并尽可能多地组装阵列。如果您确实希望启动所有可用阵列,并且确信不会找到意外的超级块(例如,在安装新存储设备后),那么这样做是可以的。更精确的方法是将阵列显式添加到 /etc/mdadm.conf

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

这将产生类似以下内容的结果:

/etc/mdadm.conf
...
DEVICE partitions
...
ARRAY /dev/md/MyRAID1Array metadata=1.2 name=pine:MyRAID1Array UUID=27664f0d:111e493d:4d810213:9f291abe

这也会导致 mdadm 检查 /proc/partitions 中引用的设备。但是,只有具有 UUID 为 27664… 的超级块的设备才会被组装成活动阵列。

有关更多信息,请参阅 mdadm.conf(5)

组装阵列

更新配置文件后,可以使用 mdadm 组装阵列:

# mdadm --assemble --scan

格式化 RAID 文件系统

提示 要在 RAID 阵列内创建多个卷,请遵循 LVM on software RAID 文章。

现在可以将该阵列像任何其他分区一样格式化为文件系统,但请记住:

计算步长(stride)和条带宽度(stripe width)

为了优化文件系统结构以最佳地适应底层 RAID 结构,需要两个参数:步长(stride)条带宽度(stripe width)。这些参数源自 RAID 的块大小(chunk size)、文件系统的块大小(block size)以及“数据磁盘”的数量

块大小(chunk size)是 RAID 阵列的一个属性,在创建时决定。mdadm 当前的默认值为 512 KiB。可以通过 mdadm 找到它:

# mdadm --detail /dev/mdX | grep 'Chunk Size'

块大小(block size)是文件系统的一个属性,在创建时决定。许多文件系统(包括 ext4)的默认值为 4 KiB。有关 ext4 的详细信息,请参阅 /etc/mke2fs.conf

“数据磁盘”的数量是阵列中完全重建而不丢失数据的最小设备数。例如,对于 N 个设备的 raid0 阵列,此值为 N;对于 raid5,则为 N-1。

一旦有了这三个量,就可以使用以下公式计算步长和条带宽度:

stride = chunk size / block size
stripe width = number of data disks * stride
示例 1. RAID0

使用正确条带宽度和步长格式化为 ext4 的示例

  • 假设一个 RAID0 阵列由 2 个物理磁盘组成。
  • 块大小(chunk size)为 512 KiB。
  • 块大小(block size)为 4 KiB。

stride = chunk size / block size。在此示例中,计算为 512/4,因此 stride = 128。

stripe width = # of physical data disks * stride。在此示例中,计算为 2*128,因此 stripe width = 256。

# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0
示例 2. RAID5

使用正确条带宽度和步长格式化为 ext4 的示例

  • 假设一个 RAID5 阵列由 4 个物理磁盘组成;3 个数据磁盘和 1 个奇偶校验磁盘。
  • 块大小(chunk size)为 512 KiB。
  • 块大小(block size)为 4 KiB。

stride = chunk size / block size。在此示例中,计算为 512/4,因此 stride = 128。

stripe width = # of physical data disks * stride。在此示例中,计算为 3*128,因此 stripe width = 384。

# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=384 /dev/md0

有关 stride 和 stripe width 的更多信息,请参阅:RAID Math

示例 3. RAID10,far2

使用正确条带宽度和步长格式化为 ext4 的示例

  • 假设一个 RAID10 阵列由 2 个物理磁盘组成。由于 RAID10 far2 布局的特性,两者都算作数据磁盘。
  • 块大小(chunk size)为 512 KiB。
  • 块大小(block size)为 4 KiB。

stride = chunk size / block size。在此示例中,计算为 512/4,因此 stride = 128。

stripe width = # of physical data disks * stride。在此示例中,计算为 2*128,因此 stripe width = 256。

# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0

从 Live CD 挂载

想要从 Live CD 挂载 RAID 分区的用户,请使用:

# mdadm --assemble /dev/mdnumber /dev/disk1 /dev/disk2 /dev/disk3 /dev/disk4

如果您的 RAID 1 阵列丢失了一个磁盘,但被错误地自动检测为 RAID 1(根据 mdadm --detail /dev/mdnumber),并且被报告为非活动状态(根据 cat /proc/mdstat),请先停止阵列:

# mdadm --stop /dev/mdnumber

在 RAID 上安装 Arch Linux

注意 以下部分仅适用于根文件系统位于阵列上的情况。如果阵列包含数据分区,用户可以跳过此部分。

您应该在安装过程的分区格式化步骤之间创建 RAID 阵列。而不是直接格式化一个分区作为根文件系统,它将会在 RAID 阵列上创建。请遵循#安装部分来创建 RAID 阵列。然后继续安装过程,直到 pacstrap 步骤完成。使用UEFI 引导时,也请阅读EFI system partition#ESP on software RAID1

更新配置文件

注意 这应该在 chroot 环境之外完成,因此文件路径前带有 /mnt 前缀。

在安装好基础系统后,默认的配置文件 mdadm.conf 必须按如下方式更新:

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

运行此命令后,请务必使用文本编辑器检查 mdadm.conf 配置文件,以确保其内容看起来合理。

注意 为防止启动时 mdmonitor.service 失败(由 udev 激活),您需要在 mdadm.conf 的底部取消注释 MAILADDR 并提供一个电子邮件地址和/或应用程序来处理阵列问题的通知。请参阅 #Email notifications

继续安装过程,直到您到达安装指南#Initramfs步骤,然后按照下一节进行。

配置 mkinitcpio

注意 这应该在 chroot 环境中完成。

安装 mdadm 并将 mdadm_udev 添加到 mkinitcpio.confHOOKS 数组中,以便将 mdadm 支持添加到 initramfs 镜像中。

/etc/mkinitcpio.conf
...
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev filesystems fsck)
...

然后重新生成 initramfs

注意 每次更改 /etc/mdadm.conf 时,都需要重新生成 initramfs。

配置引导加载程序

根设备

root 参数指向映射的设备。例如:

root=/dev/md/MyRAIDArray

如果使用上述内核设备节点方法从软件 RAID 分区引导失败,另一种方法是使用持久块设备命名中的一种方法,例如:

root=LABEL=Root_Label

另请参阅 GRUB#RAID

RAID0 布局

注意 这也影响了从旧版 Linux 内核升级到 5.3.4 或更高版本的现有 mdraid RAID0 用户。

自 Linux 内核 5.3.4 版本起,您需要明确告知内核应使用哪个 RAID0 布局:RAID0_ORIG_LAYOUT (1) 或 RAID0_ALT_MULTIZONE_LAYOUT (2)。[1] 您可以通过提供以下内核参数来实现:

raid0.default_layout=2

正确的值取决于创建 RAID 阵列时使用的内核版本:如果使用 3.14 或更早版本的内核创建,则使用 1;如果使用更新版本的内核,则使用 2。检查此项的一种方法是查看 RAID 阵列的创建时间:

mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Thu Sep 24 10:17:41 2015
        Raid Level : raid0
        Array Size : 975859712 (930.65 GiB 999.28 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Thu Sep 24 10:17:41 2015
             State : clean
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 512K

Consistency Policy : none

              Name : archiso:root
              UUID : 028de718:20a81234:4db79a2c:e94fd560
            Events : 0

    Number   Major   Minor   RaidDevice State
       0     259        2        0      active sync   /dev/nvme0n1p1
       1     259        6        1      active sync   /dev/nvme2n1p1
       2     259        5        2      active sync   /dev/nvme1n1p2

在这里我们可以看到,此 RAID 阵列创建于 2015 年 9 月 24 日。Linux 内核 3.14 的发布日期是 2014 年 3 月 30 日,因此此 RAID 阵列很可能使用了多区布局(2)。

RAID 维护

擦除 (Scrubbing)

定期运行数据校验(scrubbing)以检查和修复错误是一个好习惯。根据阵列的大小/配置,校验可能需要数小时才能完成。

启动数据擦除:

# echo check > /sys/block/mdX/md/sync_action

或者,您可以启用包含的 mdcheck_start.timer,该定时器每周执行一次扫描。

检查操作会扫描驱动器中的坏扇区并自动修复它们。如果它发现包含坏数据的良好扇区(即,数据不匹配,某个扇区的数据与另一驱动器上的数据表明的应有的数据不符,例如奇偶校验块+其他数据块会导致我们认为该数据块是错误的),则不会采取任何操作,但事件会被记录(见下文)。这种“不执行任何操作”允许管理员检查扇区中的数据以及通过重建扇区产生的信息,并选择正确的数据保留。

与 mdadm 相关的许多任务/项目一样,可以通过读取 /proc/mdstat 来查询校验的状态。

示例

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid1 sdb1[0] sdc1[1]
      3906778112 blocks super 1.2 [2/2] [UU]
      [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec
      bitmap: 0/30 pages [0KB], 65536KB chunk

安全停止当前正在运行的数据擦除:

# echo idle > /sys/block/md0/md/sync_action
注意 如果系统在部分校验暂停后重启,校验将重新开始。

擦除完成后,管理员可以检查有多少个块(如果有)被标记为坏块:

# cat /sys/block/md0/md/mismatch_cnt

关于校验的一般说明

注意 用户也可以将 repair echo 到 /sys/block/md0/md/sync_action,但这是不明智的,因为如果遇到数据不匹配,它会自动更新以保持一致。危险在于,我们实际上不知道是奇偶校验还是数据块是正确的(或者在 RAID1 的情况下是哪个数据块)。操作是否获得正确数据而不是错误数据,纯属运气。

设置一个 root 用户的 cron 作业来安排定期校验是一个好主意。请参阅 raid-checkAUR,它可以帮助您完成这项工作。要使用 systemd 定时器而不是 cron 来执行定期校验,请参阅 raid-check-systemdAUR,其中包含与系统d 定时器单元文件相同的脚本。

注意 对于典型的盘式驱动器,校验大约需要每千兆字节六秒(即每太字节一小时四十五分钟),因此请妥善安排您的 cron 作业或定时器的开始时间。

RAID1 和 RAID10 关于校验的说明

由于 RAID1 和 RAID10 在内核中的写入是无缓冲的,因此即使阵列健康,也可能出现非零的失配计数。这些非零计数仅存在于瞬态数据区域,在那里它们不会造成问题。但是,我们无法区分是瞬态数据中的非零计数还是表明存在实际问题的非零计数。这一事实是 RAID1 和 RAID10 阵列的误报来源。不过,仍然建议定期进行扫描,以捕获和纠正设备中可能存在的任何坏扇区。

从阵列中移除设备

在将块设备标记为故障后,可以将其从阵列中移除。

# mdadm --fail /dev/md0 /dev/failing_array_member

现在将其从阵列中移除

# mdadm --remove /dev/md0 /dev/failing_array_member

如果设备尚未完全失效,但您想更换它,例如因为它看起来即将损坏,您可以通过先添加一个新驱动器,然后指示 mdadm 进行替换来更优雅地处理替换过程。

例如,假设 /dev/sdc1 是新的,而 /dev/sdb1 是即将失效的。

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdb1 --with /dev/sdc1

--with /dev/sdc1 部分是可选的,但更明确。有关更多详细信息,请参阅 [2]

要永久移除设备(例如,从现在开始单独使用它),请按照上述步骤(标记故障/移除或添加/替换),然后运行

# mdadm --zero-superblock /dev/failing_array_member
警告
  • 请勿在线性或 RAID0 阵列上执行此命令,否则将导致数据丢失!
  • 如果不清零超级块就重新使用已移除的磁盘,将在下次启动时导致所有数据丢失。(在 mdadm 尝试将其用作 RAID 阵列的一部分之后)。

停止使用阵列

  1. 卸载目标阵列
  2. 使用以下命令停止阵列:mdadm --stop /dev/md0
  3. 重复本节开头描述的三个命令,针对每个设备执行一次。
  4. /etc/mdadm.conf 中移除相应的行。

将新设备添加到阵列

可以使用 mdadm 在系统运行时(设备已挂载)添加新设备。使用与阵列中现有设备相同的布局对新设备进行分区,如上所述。

如果 RAID 阵列尚未组装,请组装它。

# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1

将新设备添加到阵列

# mdadm --add /dev/md0 /dev/sdc1

mdadm 完成此操作应该不会花费太长时间。

本文章或章节需要扩充。

原因: 应在 grow 之前创建 --backup-file (详见 Talk:RAID#Add a drive (RAID5, RAID6))。

根据 RAID 类型(例如,对于 RAID1),mdadm 可能会将设备添加为备用设备而不进行数据同步。您可以使用 --grow--raid-devices 选项来增加 RAID 使用的磁盘数量。例如,将阵列增加到四个磁盘

# mdadm --grow /dev/md0 --raid-devices=4

您可以通过以下方式检查进度:

# cat /proc/mdstat

使用以下命令检查设备是否已添加:

# mdadm --misc --detail /dev/md0
注意 对于 RAID0 阵列,您可能会收到以下错误消息:
mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument

这是因为上述命令会将新磁盘添加为“备用”设备,但 RAID0 没有备用设备。如果您想将设备添加到 RAID0 阵列,您需要在一个命令中同时“增长”和“添加”,如下所示:

# mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1

增加 RAID 卷的大小

如果 RAID 阵列中安装了更大的磁盘或增加了分区大小,则可能需要增加 RAID 卷的大小以填充更大的可用空间。此过程可以首先按照上述有关替换磁盘的部分进行。一旦 RAID 卷已重建到更大的磁盘上,就必须“增长”它以填充空间。

# mdadm --grow /dev/md0 --size=max

接下来,可能需要调整 RAID 卷 /dev/md0 上的分区大小。有关详细信息,请参阅 Partitioning。最后,需要调整上述分区上的文件系统大小。如果使用 gparted 进行分区,这将自动完成。如果使用了其他工具,请卸载并手动调整文件系统大小。

# umount /storage
# fsck.ext4 -f /dev/md0p1
# resize2fs /dev/md0p1

更改同步速度限制

同步可能需要一段时间。如果机器不需要用于其他任务,可以提高速度限制。

# cat /proc/mdstat
 Personalities : [raid10]
 md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0]
     31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU]
     [=>...................]  resync =  5.2% (1629533760/31251490816) finish=2071.7min speed=238293K/sec
     bitmap: 221/233 pages [884KB], 65536KB chunk

在上面的示例中,最大速度似乎限制在大约 238 MB/秒。

检查当前速度限制(以千字节/秒,KiB/s 为单位)

# sysctl dev.raid.speed_limit_min
dev.raid.speed_limit_min = 1000
# sysctl dev.raid.speed_limit_max
dev.raid.speed_limit_max = 200000

使用 sysctl 设置 RAID 重建操作的新最大速度

# sysctl -w dev.raid.speed_limit_min=600000
# sysctl -w dev.raid.speed_limit_max=600000

然后查看同步速度和预计完成时间。

# cat /proc/mdstat
 Personalities : [raid10]
 md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0]
     31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU]
     [=>...................]  resync =  5.3% (1657016448/31251490816) finish=1234.9min speed=399407K/sec
     bitmap: 221/233 pages [884KB], 65536KB chunk

RAID5 性能

为了提高 RAID5 对快速存储(例如 NVMe)的性能,请将 /sys/block/mdx/md/group_thread_cnt 增加到更多线程。例如,使用 8 个线程来操作 RAID5 设备

# echo 8 > /sys/block/md0/md/group_thread_cnt

有关更多信息,请参阅 git kernel commit 851c30c9badf

更新 RAID 超级块

要更新 RAID 超级块,您需要首先卸载阵列,然后使用以下命令停止阵列:

# mdadm --stop /dev/md0

然后,您可以重新组装阵列来更新某些参数。例如,更新 homehost

# mdadm --assemble --update=homehost --homehost=NAS /dev/md0 /dev/sda1 /dev/sdb1

有关详细信息,请参阅 --update 的参数。

监控

一个简单的单行命令,用于打印 RAID 设备的状态:

# awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
md1: [UU]
md0: [UU]

监视 mdstat

# watch -t 'cat /proc/mdstat'

或者最好使用 tmux

# tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"

使用 iotop 跟踪 IO

iotop 包显示进程的输入/输出统计信息。使用此命令查看 RAID 线程的 IO。

# iotop -a $(sed 's/^/-p /g' <<<`pgrep "_raid|_resync|jbd2"`)

使用 iostat 跟踪 IO

来自 sysstat 包的 iostat 工具显示设备和分区的输入/输出统计信息。

# iostat -dmy 1 /dev/md0
# iostat -dmy 1 # all

通过 systemd 的 mdadm

mdadm 提供了 mdmonitor.service systemd 服务,该服务可用于监控 RAID 阵列的运行状况并在出现问题时通知您。

此服务比较特殊,因为它不能像常规服务那样手动激活;mdadm 会在系统启动时组装您的阵列时通过 udev 负责激活它,但前提是已配置了电子邮件地址和/或程序用于通知(见下文),否则它将在这些配置完成后激活。

电子邮件通知

警告 未配置电子邮件地址将导致监控服务静默失败。
注意 要发送电子邮件,需要一个正确配置的 邮件传输代理

要启用此功能,请编辑 /etc/mdadm.conf 并定义电子邮件地址:

MAILADDR user@domain

然后,为了验证一切是否正常工作,请运行以下命令:

# mdadm --monitor --scan --oneshot --test

如果测试成功并且邮件已送达,那么您就完成了;下次重新组装阵列时,mdmonitor.service 将开始监控它们的错误。

程序通知

与上面的电子邮件通知一样,编辑 /etc/mdadm.conf 并编辑该行:

PROGRAM /usr/sbin/handle-mdadm-events

PROGRAM 的参数是要为任何事件运行的脚本。然后,该脚本与适当的网络监控代理进行交互。或者,对于家庭用户,还可以使用即时消息客户端或推送通知服务,如 ntfy.sh。

以与上面电子邮件通知相同的方式进行测试。

故障排除

如果您在重启时收到关于“invalid raid superblock magic”的错误,并且除了您安装的驱动器之外还有其他硬盘,请检查您的硬盘顺序是否正确。在安装过程中,您的 RAID 设备可能是 hdd、hde 和 hdf,但在启动时它们可能是 hda、hdb 和 hdc。相应地调整您的内核行。反正我遇到过这种情况。

错误:“kernel: ataX.00: revalidation failed”

如果您突然(在重启、更改 BIOS 设置后)遇到类似的错误消息:

Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)

这并不一定意味着驱动器已损坏。您经常会在网上找到指向最坏情况的恐慌链接。总之,不要恐慌。您可能只是在 BIOS 或内核参数中更改了 APIC 或 ACPI 设置。将它们改回,您应该就没问题了。通常,关闭 ACPI 和/或 APIC 应该会有帮助。

以只读模式启动阵列

当启动 md 阵列时,将写入超级块,并且可能开始同步。要以只读模式启动,请设置内核模块 md_mod 参数 start_ro。当设置此参数后,新阵列将获得“auto-ro”模式,该模式禁用所有内部 IO(超级块更新、同步、恢复),并在第一个写入请求到达时自动切换到“rw”。

注意 可以在第一个写入请求之前使用 mdadm --readonly 将阵列设置为真正的“ro”模式,或者在没有写入的情况下使用 mdadm --readwrite 启动同步。

要在启动时设置参数,请将 md_mod.start_ro=1 添加到您的内核行。

或者在模块加载时通过 Kernel module#Using modprobe.d 设置,或者直接从 /sys/ 设置。

# echo 1 > /sys/module/md_mod/parameters/start_ro

从 RAID 中损坏或丢失的驱动器恢复

当驱动器因任何原因损坏时,您也可能收到上述错误。在这种情况下,您将不得不强制 RAID 即使缺少一个磁盘也能启动。键入此命令(根据需要进行更改):

# mdadm --manage /dev/md0 --run

现在您应该可以再次挂载它了,例如(如果它在 fstab 中):

# mount /dev/md0

现在 RAID 应该可以正常工作并可用了,尽管缺少一个磁盘。所以,要添加那个磁盘,请像上面在 #Prepare the devices 中描述的那样进行分区。完成后,您可以通过执行以下操作将新磁盘添加到 RAID:

# mdadm --manage --add /dev/md0 /dev/sdd1

如果您输入

# cat /proc/mdstat

您可能会看到 RAID 现在是活动的并且正在重建。

您可能还想更新您的配置(参见:#Update configuration file)。

基准测试

有几种工具可以对 RAID 进行基准测试。最显著的改进是在多个线程从同一个 RAID 卷读取时的速度提升。

bonnie++ 测试对一个或多个文件的数据库类型访问,以及创建、读取和删除小文件,这可以模拟 Squid、INN 或 Maildir 格式电子邮件等程序的用法。包含的 ZCAV 程序可以在不向磁盘写入任何数据的情况下测试硬盘不同区域的性能。

hdparm 不应用于 RAID 的基准测试,因为它会产生非常不一致的结果。

参见

邮件列表

mdadm

论坛帖子

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.