如何在 Linux 上使用 mdadm 创建软件 RAID-1 阵列
独立磁盘冗余阵列 (RAID) 是一种存储技术,它将多个硬盘组合成一个逻辑单元,以提供容错和/或提高磁盘 I/O 性能。根据数据在磁盘阵列中的存储方式(例如,条带化、镜像、奇偶校验或其任意组合),定义了不同的 RAID 级别(例如,RAID-0、RAID-1、RAID-5 等)。 RAID 可以通过软件或硬件RAID 卡来实现。在现代 Linux 上,默认情况下可以使用基本的软件 RAID 功能。
在这篇文章中,我们将讨论 RAID-1 阵列(也称为镜像阵列)的软件设置,其中相同的数据被写入形成阵列的两个设备。虽然可以在单个物理硬盘驱动器上使用分区来实施 RAID-1(与其他 RAID 级别一样),但如果该单个硬盘驱动器发生故障,它就没有多大用处。事实上,这就是大多数 RAID 级别通常使用多个物理驱动器来提供冗余的原因。如果发生任何单个驱动器故障,虚拟 RAID 块设备应继续正常运行,不会出现任何问题,并允许我们更换故障驱动器,而不会造成大量生产停机,更重要的是,不会丢失数据。但是,它并不能取代在外部存储中保存定期系统备份的需要。
由于 RAID-1 阵列的实际存储容量(大小)是最小驱动器的大小,因此通常(如果不是总是)您会在 RAID-1 设置中找到两个相同的物理驱动器。
在 Linux 上安装 mdadm
我们将用来创建、组装、管理和监控软件 RAID-1 的工具称为 mdadm
(multiple disks admin 的缩写)。在 Fedora、CentOS、RHEL 或 Arch Linux 等 Linux 发行版上,mdadm
默认可用。在基于 Debian 的发行版上,mdadm
可以与 aptitude
或 apt-get
一起安装。
Fedora、CentOS 或 RHEL:
由于 mdadm
已预先安装,您所要做的就是启动 RAID 监控服务,并将其配置为开机自动启动:
# systemctl start mdmonitor
# systemctl enable mdmonitor
对于 CentOS/RHEL 6 或更早版本,请改用以下命令:
# service mdmonitor start
# chkconfig mdmonitor on
Debian、Ubuntu 或 Linux Mint:
在 Debian 及其衍生版本上,mdadm
可以通过 aptitude
或 apt-get
进行安装:
# aptitude install mdadm
在 Ubuntu 上,系统会要求您配置 postfix
MTA 以发送电子邮件通知(作为 RAID 监控的一部分)。您现在可以跳过它。
在 Debian 上,安装将以以下解释性消息开始,以帮助我们决定是否要在 RAID 阵列上安装根文件系统。我们需要在下一个屏幕上输入的内容将取决于此决定。仔细阅读:

由于我们不会将 RAID-1 用于根文件系统,因此我们将答案留空:

当询问我们是否要在每次启动期间自动启动(重新组装)阵列时,请选择是
。请注意,稍后我们需要向 /etc/fstab 文件添加一个条目,以便在引导过程中也能正确安装阵列。

硬盘分区
现在是时候准备将在我们的阵列中使用的物理设备了。对于此设置,我插入了两个 8 GB USB 驱动器,它们在 dmesg
输出中被识别为 /dev/sdb
和 /dev/sdc
:
# dmesg | less
[ 60.014863] sd 3:0:0:0: [sdb] 15826944 512-byte logical blocks: (8.10 GB/7.54 GiB)
[ 75.066466] sd 4:0:0:0: [sdc] 15826944 512-byte logical blocks: (8.10 GB/7.54 GiB)
我们将使用 fdisk
在每个磁盘上创建一个主分区,该分区将占据其整个大小。以下步骤展示了如何在 /dev/sdb
上执行此任务,并假设该驱动器尚未分区(否则,我们可以删除现有分区以从干净的磁盘开始):
# fdisk /dev/sdb
按 p
打印当前分区表:

(如果发现一个或多个分区,可以使用d
选项删除它们。然后使用w
选项应用更改)。
由于没有找到分区,我们将创建一个新的主分区[n
]作为主分区[p
],为其分配分区号=[1
],然后指示其大小。您可以按 Enter 键接受建议的默认值,或输入您选择的值,如下图所示。

现在对 /dev/sdc
重复相同的过程。
如果我们有两个不同大小的驱动器,例如 750 GB 和 1 TB,我们应该在每个驱动器上创建一个 750 GB 的主分区,并将较大驱动器上的剩余空间用于其他目的,独立于 RAID 阵列。
创建 RAID-1 阵列
在每个驱动器上创建主分区后,请使用以下命令创建 RAID-1 阵列:
# mdadm -Cv /dev/md0 -l1 -n2 /dev/sdb1 /dev/sdc1
在哪里:
-Cv: 创建一个数组并生成详细输出。
/dev/md0:是数组的名称。
-l1(l 表示“级别”):表示这将是 RAID-1 阵列。
-n2:表示我们将向阵列添加两个分区,即/dev/sdb1和/dev/sdc1。
上面的命令相当于:
# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
或者,如果您想添加备用设备以便将来更换故障磁盘,可以将 --spare-devices=1 /dev/sdd1
添加到上述命令中。
如果提示您要继续创建数组,请回答y
,然后按 Enter:

您可以使用以下命令检查进度:
# cat /proc/mdstat

获取有关 RAID 阵列的更多信息的另一种方法(在组装过程中和过程完成后)是:
# mdadm --query /dev/md0
# mdadm --detail /dev/md0 (or mdadm -D /dev/md0)

在“mdadm -D
”提供的信息中,最有用的可能是显示阵列状态的信息。 活动状态表示当前正在发生 I/O 活动。其他可能的状态包括干净(所有 I/O 活动已完成)、降级(其中一个设备出现故障或丢失)、重新同步(系统正在从非正常关机(例如断电)中恢复)或恢复(已将新驱动器添加到阵列中,并且正在将数据从另一个驱动器复制到该驱动器上),仅举出最常见的状态。
格式化并挂载 RAID 阵列
下一步是格式化(在本例中使用 ext4)数组:
# mkfs.ext4 /dev/md0

现在让我们安装阵列,并验证它是否已正确安装:
# mount /dev/md0 /mnt
# mount

监控 RAID 阵列
mdadm
工具内置了 RAID 监控功能。当 mdadm
设置为守护进程运行时(我们的 RAID 设置就是这种情况),它会定期轮询现有 RAID 阵列,并通过电子邮件通知或 syslog
日志记录检测到的任何事件。或者,它还可以配置为在检测到任何严重错误时调用应急命令(例如重试或删除磁盘)。
默认情况下,mdadm
扫描所有现有分区和 MD 阵列,并将检测到的任何事件记录到 /var/log/syslog
。或者,您可以在位于 /etc/mdadm/mdadm.conf
(基于 Debian)或 /etc/mdadm.conf
(基于 Red Hat)的 mdadm.conf
中指定要扫描的设备和 RAID 阵列,格式如下。如果 mdadm.conf
不存在,请创建一个。
DEVICE /dev/sd[bcde]1 /dev/sd[ab]1
ARRAY /dev/md0 devices=/dev/sdb1,/dev/sdc1
ARRAY /dev/md1 devices=/dev/sdd1,/dev/sde1
.....
# optional email address to notify events
MAILADDR [email
修改mdadm
配置后,重新启动mdadm
守护进程:
在 Debian、Ubuntu 或 Linux Mint 上:
# service mdadm restart
在 Fedora 15 或 CentOS/RHEL 7 及更高版本上:
# systemctl restart mdmonitor
在 Fedora 14 或 CentOS/RHEL 6 及更早版本上:
# service mdmonitor restart
自动挂载 RAID 阵列
现在我们将在 /etc/fstab
中添加一个条目,以在启动期间自动将阵列挂载到 /mnt
中(您可以指定任何其他挂载点):
# echo "/dev/md0 /mnt ext4 defaults 0 2" >> /etc/fstab
为了验证挂载是否正常,我们现在卸载阵列,重新启动 mdadm,然后重新挂载。我们可以看到 /dev/md0
已经根据我们刚刚添加到 /etc/fstab 的条目进行了挂载:
# umount /mnt
# service mdadm restart (on Debian, Ubuntu or Linux Mint)
or systemctl restart mdmonitor (on Fedora, CentOS/RHEL7)
or service mdmonitor restart (on CentOS/RHEL6)
# mount -a

现在我们准备通过 /mnt
挂载点访问 RAID 阵列。为了测试数组,我们将 /etc/passwd 文件(任何其他文件都可以)复制到 /mnt
中:

在 Debian 上,我们需要通过在 /etc/default/mdadm
文件中将 AUTOSTART
变量设置为 true 来告诉 mdadm
守护进程在引导期间自动启动 RAID 阵列:
AUTOSTART=true
模拟驱动器故障
我们将模拟一个有故障的驱动器并使用以下命令将其删除。请注意,在现实生活场景中,无需首先将设备标记为有故障,因为在发生故障时它已经处于该状态。
首先,卸载阵列:
# umount /mnt
现在,请注意 mdadm -D /dev/md0
的输出如何指示执行以下每个命令后的更改。
# mdadm /dev/md0 --fail /dev/sdb1 #Marks /dev/sdb1 as faulty
# mdadm --remove /dev/md0 /dev/sdb1 #Removes /dev/sdb1 from the array
之后,当您有新的驱动器需要更换时,请再次重新添加驱动器:
# mdadm /dev/md0 --add /dev/sdb1
然后立即开始将数据重建到 /dev/sdb1
上:

请注意,上述详细步骤适用于具有热插拔磁盘的系统。如果您没有此类技术,您还必须停止当前阵列,并首先关闭系统才能更换部件:
# mdadm --stop /dev/md0
# shutdown -h now
然后添加新驱动器并重新组装阵列:
# mdadm /dev/md0 --add /dev/sdb1
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1
希望这可以帮助。