如何在 Ubuntu 22.04 上使用 mdadm 管理 RAID 阵列

介绍

RAID 数组通过将单个磁盘合并到特定配置的虚拟存储设备来提高性能和冗余性,在 Linux 中,mdadm 工具创建和管理软件 RAID 数组。

在之前的指南中,我们涵盖了 如何在Ubuntu 22.04上使用mdadm创建RAID阵列

前提条件

要遵循本指南,您需要访问非rootsudo用户,您可以遵循我们的 Ubuntu 22.04初始服务器设置指南来设置合适的用户。

如前所述,本指南将涵盖 RAID 数组管理。 遵循我们的指南 如何在 Ubuntu 22.04 上使用 `mdadm 创建 RAID 数组在启动本指南之前创建一个或多个数组。

<$>[info] Info: 由于虚拟私人服务器上的RAID设置效率低下,我们不建议在DigitalOcean滴滴上部署RAID设置。数据中心磁盘复制的效率使RAID的优点与baremetal硬件的设置相比是微不足道的。

寻找有关 RAID 设备的信息

适当管理的最基本要求之一是能够找到有关组件结构、组件装置和当前状态的信息。

有关 RAID 设备的详细信息,请将 RAID 设备与 -D--detail 选项传输到 mdadm:

1sudo mdadm -D /dev/md0

将显示有关数组的重要信息:

 1[secondary_label Output]
 2/dev/md0:
 3           Version : 1.2
 4     Creation Time : Thu Sep 29 17:07:10 2022
 5        Raid Level : raid10
 6        Array Size : 209582080 (199.87 GiB 214.61 GB)
 7     Used Dev Size : 104791040 (99.94 GiB 107.31 GB)
 8      Raid Devices : 4
 9     Total Devices : 4
10       Persistence : Superblock is persistent
11
12       Update Time : Thu Sep 29 17:08:24 2022
13             State : clean, resyncing
14    Active Devices : 4
15   Working Devices : 4
16    Failed Devices : 0
17     Spare Devices : 0
18
19            Layout : near=2
20        Chunk Size : 512K
21
22Consistency Policy : resync
23
24              Name : raid2:0  (local to host raid2)
25              UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0
26            Events : 35
27
28    Number Major Minor RaidDevice State
29       0 8 0 0 active sync set-A   /dev/sda
30       1 8 16 1 active sync set-B   /dev/sdb
31       2 8 32 2 active sync set-A   /dev/sdc
32       3 8 48 3 active sync set-B   /dev/sdd

输出显示了RAID级别、数组大小、个别部件的健康状况、数组的UUID,以及组件设备及其角色。

对于适用于在 /dev/mdadm/mdadm.conf 文件中添加的数组的缩短细节,您可以通过 --brief-b` 旗帜的详细视图:

1sudo mdadm -Db /dev/md0
1[secondary_label Output]
2ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=8069bcc7:72e7b49f:fba1c780:560a85e0

要获得一个RAID设备的快速可读概述,请使用-Q选项来查询它:

1sudo mdadm -Q /dev/md0
1[secondary_label Output]
2/dev/md0: 199.88GiB raid10 4 devices, 0 spares. Use mdadm --detail for more detail.

这可以用来快速找到有关 RAID 设备的关键信息。

获取有关组件设备的信息

您还可以使用mdadm来查询单个组件设备。

-Q选项,当与组件设备一起使用时,会告诉您它是组件的一部分及其作用:

1sudo mdadm -Q /dev/sdc
1[secondary_label Output]
2/dev/sdc: is not an md array
3/dev/sdc: device 2 in 4 device active raid10 /dev/md0. Use mdadm --examine for more detail.

您可以通过使用-E-examine选项获取更详细的信息:

1sudo mdadm -E /dev/sdc
 1[secondary_label Output]
 2/dev/sdc:
 3          Magic : a92b4efc
 4        Version : 1.2
 5    Feature Map : 0x0
 6     Array UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0
 7           Name : RAID2204:0  (local to host RAID2204)
 8  Creation Time : Wed Oct 5 15:56:03 2022
 9     Raid Level : raid10
10   Raid Devices : 4
11
12 Avail Dev Size : 209582080 sectors (99.94 GiB 107.31 GB)
13     Array Size : 209582080 KiB (199.87 GiB 214.61 GB)
14    Data Offset : 133120 sectors
15   Super Offset : 8 sectors
16   Unused Space : before=132968 sectors, after=0 sectors
17          State : clean
18    Device UUID : 027f74c5:6d488509:64844c7a:add75d88
19
20    Update Time : Wed Oct 5 16:13:57 2022
21  Bad Block Log : 512 entries available at offset 136 sectors
22       Checksum : 98edf3ae - correct
23         Events : 35
24
25         Layout : near=2
26     Chunk Size : 512K
27
28   Device Role : Active device 2
29   Array State : AAAA ('A' == active, '.' == missing, 'R' == replacing)

此信息类似于在使用-D选项与数组设备时显示的信息,但侧重于组件设备与数组的关系。

阅读/proc/mdstat信息

有关您服务器上的每个组合数组的详细信息,请检查 /proc/mdstat 文件,这通常是查找系统上活跃数组的当前状态的最佳方法:

1cat /proc/mdstat
1[secondary_label Output]
2Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
3md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
4      209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
5
6unused devices: <none>

这里的输出非常密集,在一个小空间中提供大量信息:

1[label /proc/mdstat]
2Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
3. . .

个性行描述了内核目前支持的不同 RAID 级别和配置。

md0开头的行描述了RAID设备描述的开始。

1[label /proc/mdstat]
2. . .
3md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
4. . .

第一行表示,数组是活跃的,不是故障的,并配置为RAID 10. 之后,用于构建数组的组件设备列出。

1[label /proc/mdstat]
2. . .
3      209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
4. . .

在本示例中显示的第二行显示了提供的虚拟设备的块数、元数据版本(本示例中为 1.2)和数组的块大小. 由于这是一个 RAID 10 数组,它还包含有关数组布局的信息。

方位支架中的最后一个元素都代表了健康集中的现有设备,数字支架中的第一个数字表示健康数组的大小,而第二个数字代表了现有设备的数量,其他支架是数组健康的视觉指标,U代表健康设备,_代表故障设备。

如果您的数组目前正在组装或恢复,则可能有另一个显示进度的行:

1[label /proc/mdstat]
2. . .
3      [>....................]  resync =  0.9% (2032768/209584128) finish=15.3min speed=225863K/sec
4. . .

它以多种不同的方式描述正在应用的操作和当前的进展,还提供当前的速度和预期完成时间。

在您对当前在您的系统上运行的数组有一个很好的想法之后,您可以采取一系列行动。

停止一个 Array

要阻止一个数组,第一步是卸载它。

使用cd ~命令走出安装目录:

1cd ~

然后将设备卸载:

1sudo umount /mnt/md0

您可以通过运行来阻止所有活跃的数组:

1sudo mdadm --stop --scan

如果您想阻止特定数组,请将其传输到mdadm --stop命令:

1sudo mdadm --stop /dev/md0

这将阻止数组. 您将不得不重新组装数组才能再次访问它。

开始一个 Array

要启动配置文件或 /proc/mdstat 中定义的所有数组,请执行以下操作:

1sudo mdadm --assemble --scan

要开始一个特定的数组,您可以将其作为一个参数传输到‘mdadm --assemble’:

1sudo mdadm --assemble /dev/md0

如果在配置文件中定义了数组,则此功能可用。

如果配置文件中缺少对数组的正确定义,则可以通过在组件设备中传输开始数组:

1sudo mdadm --assemble /dev/md0 /dev/sda /dev/sdb /dev/sdc /dev/sdd

一旦组装,它可以像往常一样安装:

1sudo mount /dev/md0 /mnt/md0

该阵列现在将在山点上可用。

将备份设备添加到一个 Array

可以将备份设备添加到任何提供冗余的数组中,例如 RAID 1, 5, 6 或 10. 除非一个活跃的设备故障,否则数组将不会主动使用备份。

若要添加一个备份,请将数组和新设备传入 mdadm --add 命令:

1sudo mdadm /dev/md0 --add /dev/sde

如果数组不处于降级状态,则将新设备添加为备用设备,如果设备目前处于降级状态,则重新同步操作将立即开始使用备用设备来替换故障驱动器。

添加备份后,更新配置文件以反映您的新设备定位:

1sudo nano /etc/mdadm/mdadm.conf

删除或评论与您的数组定义相符的当前行:

1[label /etc/mdadm/mdadm.conf]
2. . .
3# ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=d81c843b:4d96d9fc:5f3f499c:6ee99294

接下来,添加您的当前配置:

1sudo mdadm --detail --brief /dev/md0 | sudo tee -a /etc/mdadm/mdadm.conf

新的信息将被mdadm实用程序用于组装数组。

在一个 Array 中增加活跃设备的数量

可以通过增加组合内活跃设备的数量来扩展组合,具体程序略有取决于您正在使用的 RAID 级别。

使用 RAID 1 或 10

首先,将新设备添加为备用设备,正如上一节所示:

1sudo mdadm /dev/md0 --add /dev/sde

查找阵列中当前 RAID 设备的数量:

1sudo mdadm --detail /dev/md0
 1[secondary_label Output]
 2/dev/md0:
 3        Version : 1.2
 4  Creation Time : Wed Aug 10 15:29:26 2016
 5     Raid Level : raid1
 6     Array Size : 104792064 (99.94 GiB 107.31 GB)
 7  Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
 8   Raid Devices : 2
 9  Total Devices : 3
10    Persistence : Superblock is persistent
11
12    . . .

在本示例中,数组被配置为积极使用两个设备,但它确实显示,由于备用,数组可用的设备总数为三。

现在,重新配置数组以获得额外的活跃设备。备份将用于满足额外的驱动器需求。请记住,在这个命令中更换你的目标攻击设备数量。在这里,我们将攻击1与2设备增加到3。如果你在攻击10与4设备,并且有额外的驱动器,将其增加到5:

1sudo mdadm --grow --raid-devices=3 /dev/md0

数组将开始重新配置一个额外的活跃磁盘. 若要查看数据同步的进展,请执行以下操作:

1cat /proc/mdstat

您可以继续使用该设备,因为过程完成。

使用 RAID 5 或 6

首先,将新设备添加为备用设备,如上一节所示:

1sudo mdadm /dev/md0 --add /dev/sde

查找阵列中当前 RAID 设备的数量:

1sudo mdadm --detail /dev/md0
 1[secondary_label Output]
 2/dev/md0:
 3        Version : 1.2
 4  Creation Time : Wed Oct 5 18:38:51 2022
 5     Raid Level : raid5
 6     Array Size : 209584128 (199.88 GiB 214.61 GB)
 7  Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
 8   Raid Devices : 3
 9  Total Devices : 4
10    Persistence : Superblock is persistent
11
12    . . .

在本示例中,数组被配置为积极使用三个设备,并且由于添加的备用设备,数组可用的设备总数为四。

现在,重新配置数组以获得额外的活跃设备。备份将用于满足额外的驱动器需求。当 RAID 5 或 RAID 6 数组生长时,重要的是包括一个名为--backup-file的额外选项。

<$>[注] 注: 备份文件在这个过程中只使用了很短但关键的时间,之后会自动删除,因为需要的时间很短,你可能永远不会看到磁盘上的文件,但如果有什么不对劲,它可以用来重建数组。

1sudo mdadm --grow --raid-devices=4 --backup-file=/root/md0_grow.bak /dev/md0

以下输出表示将备份关键部分:

1[secondary_label Output]
2mdadm: Need to backup 3072K of critical section..

数组将开始与另一个活跃的磁盘重新配置. 若要查看数据同步的进展,请运行:

1cat /proc/mdstat

您可以继续使用该设备,因为这个过程完成。

重塑完成后,您需要扩展数组上的文件系统以利用额外的空间:

1sudo resize2fs /dev/md0

您的数组现在将有一个匹配其容量的文件系统。

关于 RAID 0

RAID 0 数组不能有备用驱动器,因为没有备用驱动器重建损坏的 RAID 0 数组的机会。

首先,找出阵列中当前 RAID 设备的数量:

1sudo mdadm --detail /dev/md0
 1[secondary_label Output]
 2/dev/md0:
 3        Version : 1.2
 4  Creation Time : Wed Aug 10 19:17:14 2020
 5     Raid Level : raid0
 6     Array Size : 209584128 (199.88 GiB 214.61 GB)
 7   Raid Devices : 2
 8  Total Devices : 2
 9    Persistence : Superblock is persistent
10
11    . . .

您现在可以增加与新驱动器添加相同的操作中 RAID 设备的数量:

1sudo mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc

您将收到输出,表示数组已更改为RAID 4:

1[secondary_label Output]
2mdadm: level of /dev/md0 changed to raid4
3mdadm: added /dev/sdc

這是正常的和預期的,當資料重新分配到所有現有磁碟時,數組將重新轉移到RAID 0。

您可以查看行动的进展:

1cat /proc/mdstat

一旦同步完成,重新调整文件系统大小以使用额外的空间:

1sudo resize2fs /dev/md0

您的数组现在将有一个匹配其容量的文件系统。

从一个 Array 删除一个设备

从 RAID 阵列中删除一个驱动器有时是必要的,如果有故障或需要关闭磁盘。

要删除一个设备,它必须首先在数组中标记为失败,您可以使用mdadm --detail来检查是否有失败的设备:

1sudo mdadm --detail /dev/md0
 1[secondary_label Output]
 2/dev/md0:
 3        Version : 1.2
 4  Creation Time : Wed Aug 10 21:42:12 2020
 5     Raid Level : raid5
 6     Array Size : 209584128 (199.88 GiB 214.61 GB)
 7  Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
 8   Raid Devices : 3
 9  Total Devices : 3
10    Persistence : Superblock is persistent
11
12    Update Time : Thu Aug 11 14:10:43 2020
13          State : clean, degraded 
14 Active Devices : 2
15Working Devices : 2
16 Failed Devices : 1
17  Spare Devices : 0
18
19         Layout : left-symmetric
20     Chunk Size : 64K
21
22           Name : mdadmwrite:0  (local to host mdadmwrite)
23           UUID : bf7a711b:b3aa9440:40d2c12e:79824706
24         Events : 144
25
26    Number Major Minor RaidDevice State
27       0 0 0 0 removed
28       1 8 0 1 active sync   /dev/sda
29       2 8 16 2 active sync   /dev/sdb
30       0 8 32        -      faulty   /dev/sdc

突出列出的线条都表明驱动器不再运行,例如,此输出中的 `/dev/sdc’显示驱动器有故障。

如果您需要删除没有问题的驱动器,您可以通过--fail选项手动标记为失败:

1sudo mdadm /dev/md0 --fail /dev/sdc
1[secondary_label Output]
2mdadm: set /dev/sdc faulty in /dev/md0

如果你查看mdadm --detail的输出,你会注意到设备现在被标记为故障。

一旦设备失败,您可以用mdadm --remove将其从数组中删除:

1sudo mdadm /dev/md0 --remove /dev/sdc
1[secondary_label Output]
2mdadm: hot removed /dev/sdc from /dev/md0

然后,您可以用一个新的驱动器代替它,使用相同的mdadm --add命令,您可以用来添加备用:

1sudo mdadm /dev/md0 --add /dev/sdd
1[secondary_label Output]
2mdadm: added /dev/sdd

数组将通过将数据复制到新驱动器开始恢复。

删除一个 Array

要摧毁一个数组,包括其中的所有数据,请开始遵循用于阻止数组的过程。

通过以下命令走出安装的目录:

1cd ~

然后卸载文件系统:

1sudo umount /mnt/md0

接下來,停止 Array:

1sudo mdadm --stop /dev/md0

之后,用针对 RAID 设备的 --remove 命令删除阵列本身:

1sudo mdadm --remove /dev/md0

一旦数组本身被删除,在每个组件设备上使用mdadm --zero-superblock。这将删除md超级块,这是mdadm用于组装和管理组件设备的一部分的头条。

检查lsblk -fs输出中的FSTYPE列,以确认超级块存在于数组中:

1lsblk --fs
 1[secondary_label Output]
 2NAME FSTYPE LABEL UUID MOUNTPOINT
 3 4sda linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
 5sdb linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
 6sdc linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
 7sdd                                                                         
 8vda                                                                         
 9├─vda1 ext4 DOROOT 4f8b85db-8c11-422b-83c4-c74195f67b91 /
10└─vda15

在本示例中,/dev/sda/dev/sdb/dev/sdc都是数组的一部分,并且仍然被标记为数组。

用以下命令删除标签:

1sudo mdadm --zero-superblock /dev/sda /dev/sdb /dev/sdc

接下来,请确保您在 /etc/fstab 文件中删除或评论任何对数组的引用,您可以通过在开始时添加 hashtag 符号 # 来做到这一点:

1sudo nano /etc/fstab
1[label /etc/fstab]
2. . .
3# /dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0

保存并关闭文件,当你完成。

/etc/mdadm/mdadm.conf 文件中删除或评论任何对数组的引用:

1nano /etc/mdadm/mdadm.conf
1[label /etc/mdadm/mdadm.conf]
2# ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=bf7a711b:b3aa9440:40d2c12e:79824706

保存并关闭文件,当你完成。

然后更新 initramfs:

1sudo update-initramfs -u

这将使设备从早期启动环境中移除。

结论

Linux 的mdadm实用程序有助于管理数组,一旦您了解了它所使用的惯例和您可以找到信息的地方,本指南并不完整,但旨在介绍您可能需要每天执行的一些管理任务。

一旦您舒适地使用mdadm创建和管理 RAID 阵列,您可以探索若干不同的方向。LVM 等量级管理层与 RAID 紧密集成,可让您灵活地将空间分割为逻辑卷。

同样,LUKS 和 dm-crypt 加密通常用于在编写文件系统之前加密 RAID 设备。

Published At
Categories with 技术
comments powered by Disqus