如何在Ubuntu 22.04上使用mdadm管理RAID阵列.
介绍
在Linux中,RAID阵列通过将单个磁盘以特定配置组合成虚拟存储设备,提供了增加的性能和冗余。mdadm实用程序用于创建和管理软件RAID阵列。
在之前的指南中,我们介绍了如何在Ubuntu 22.04上使用mdadm创建RAID阵列。在本指南中,我们将演示如何在Ubuntu 22.04服务器上管理RAID阵列。
先决条件
要按照这个指南,您需要访问一个非root的sudo用户。您可以按照我们的Ubuntu 22.04初始服务器设置指南来设置一个适当的用户。
如前所述,本指南将涵盖RAID阵列管理。在开始本指南之前,请按照我们在Ubuntu 22.04上使用mdadm创建RAID阵列的指南来创建一个或多个阵列。本指南将假设您已经拥有一个或多个待操作的阵列。
Info
查询有关RAID设备的信息
良好管理最为基本的要求之一是能够找到有关阵列结构、组件设备和当前状态的信息。
要获取有关RAID设备的详细信息,请使用mdadm命令中的-D或–detail选项,传递RAID设备。
- sudo mdadm -D /dev/md0
将会显示有关数组的重要信息。
/dev/md0: Version : 1.2 Creation Time : Thu Sep 29 17:07:10 2022 Raid Level : raid10 Array Size : 209582080 (199.87 GiB 214.61 GB) Used Dev Size : 104791040 (99.94 GiB 107.31 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Sep 29 17:08:24 2022 State : clean, resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Name : raid2:0 (local to host raid2) UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0 Events : 35 Number Major Minor RaidDevice State 0 8 0 0 active sync set-A /dev/sda 1 8 16 1 active sync set-B /dev/sdb 2 8 32 2 active sync set-A /dev/sdc 3 8 48 3 active sync set-B /dev/sdd
输出显示了RAID级别、阵列大小、各个部件的健康状况、阵列的UUID以及组成设备及其角色。
为了向/dev/mdadm/mdadm.conf文件中添加有关数组的缩略信息,您可以使用–brief或-b标志以详情视图传递。
- sudo mdadm -Db /dev/md0
ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=8069bcc7:72e7b49f:fba1c780:560a85e0
为了快速获得可读的RAID设备摘要,请使用-Q选项来查询它。
- sudo mdadm -Q /dev/md0
/dev/md0: 199.88GiB raid10 4 devices, 0 spares. Use mdadm –detail for more detail.
这可以用来一目了然地查找关于RAID设备的重要信息。
获取有关组件设备的信息
您还可以使用mdadm来查询单个组件设备。
当与组件设备一起使用时,-Q选项将告诉您它所属的数组以及其角色。
- sudo mdadm -Q /dev/sdc
/dev/sdc: is not an md array /dev/sdc: device 2 in 4 device active raid10 /dev/md0. Use mdadm –examine for more detail.
您可以通过使用”-E”或”–examine”选项获得更详细的信息。
- sudo mdadm -E /dev/sdc
/dev/sdc: Magic : a92b4efc Version : 1.2 Feature Map : 0x0 Array UUID : 8069bcc7:72e7b49f:fba1c780:560a85e0 Name : RAID2204:0 (local to host RAID2204) Creation Time : Wed Oct 5 15:56:03 2022 Raid Level : raid10 Raid Devices : 4 Avail Dev Size : 209582080 sectors (99.94 GiB 107.31 GB) Array Size : 209582080 KiB (199.87 GiB 214.61 GB) Data Offset : 133120 sectors Super Offset : 8 sectors Unused Space : before=132968 sectors, after=0 sectors State : clean Device UUID : 027f74c5:6d488509:64844c7a:add75d88 Update Time : Wed Oct 5 16:13:57 2022 Bad Block Log : 512 entries available at offset 136 sectors Checksum : 98edf3ae – correct Events : 35 Layout : near=2 Chunk Size : 512K Device Role : Active device 2 Array State : AAAA (‘A’ == active, ‘.’ == missing, ‘R’ == replacing)
这些信息与使用数组设备的 -D 选项显示的信息相似,但是更专注于组件设备与数组之间的关系。
阅读/proc/mdstat信息
要获取服务器上每个已组装阵列的详细信息,请查看/proc/mdstat文件。这通常是查找系统上活动阵列当前状态的最佳方法。
- cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0] 209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU] unused devices: <none>
这里的输出非常紧凑,用很小的空间提供了大量信息。
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
. . .
个性化线条描述了内核当前支持的不同RAID级别和配置。
以md0开头的行描述了RAID设备描述的开始。随后缩进的行也描述了这个设备。
/proc/mdstat
. . .
md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
. . .
首先说明该阵列是活动的、没有故障,并且配置为RAID 10。接着列出了用于构建该阵列的组件设备。方括号中的数字描述了设备在阵列中的当前角色。这会影响设备被赋予的数据副本。
. . .
209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
. . .
在此示例中显示的第二行提供了虚拟设备提供的块数,元数据版本(此处为1.2)以及数组的块大小。由于这是一个RAID 10数组,它还包括有关数组布局的信息。在此示例中,已配置为在相邻布局中存储每个数据块的两个副本。
方括号内的最后两个项目分别代表一组目前可用设备中的最新项目。数字方括号中的第一个数字表示一组健康数组的大小,而第二个数字表示目前可用的设备数量。其他方括号则是对数组健康状况的可视化指示,其中U代表健康设备,_代表故障设备。
如果您的数组目前正在组装或恢复中,您可能会有另一行显示进度。
. . .
[>....................] resync = 0.9% (2032768/209584128) finish=15.3min speed=225863K/sec
. . .
这样描述了正在进行的操作以及当前进展的多种方式。它还提供了当前速度和预计完成时间。
在你对系统当前运行的数组有一个很好的了解之后,你可以采取多种行动。
停止一个数组
停止一个数组,第一步是卸载它。
使用cd ~命令从挂载的目录中跳出来。
- cd ~
然后卸载设备。
- sudo umount /mnt/md0
你可以通过运行以下命令来停止所有正在活动的数组。
- sudo mdadm –stop –scan
如果你想要停止特定的阵列,将其传递给 mdadm –stop 命令即可。
- sudo mdadm –stop /dev/md0
这将停止数组。您将需要重新组装数组以再次访问它。
启动一个数组
要启动在配置文件或/proc/mdstat中定义的所有数组,请运行以下命令:
- sudo mdadm –assemble –scan
要启动特定的阵列,您可以将其作为参数传递给mdadm –assemble。
- sudo mdadm –assemble /dev/md0
如果数组在配置文件中已定义,则此方法适用。
如果配置文件中缺少数组的正确定义,仍可以通过传入组件设备来启动数组。
- sudo mdadm –assemble /dev/md0 /dev/sda /dev/sdb /dev/sdc /dev/sdd
一旦阵列装配完成,可以像往常一样进行安装。
- sudo mount /dev/md0 /mnt/md0
这个数组现在可以在挂载点上访问。
在一个阵列中添加备用设备
可以向任何具有冗余功能的阵列中添加备用设备,比如RAID 1、5、6或10。除非某个活动设备发生故障,否则备用设备将不会被阵列主动使用。当此情况发生时,阵列将重新同步数据到备用驱动器,以修复阵列并使其完好无损。不能将备用设备添加到非冗余阵列(RAID 0)中,因为该阵列无法在驱动器故障时存活下来。
要添加备用设备,将数组和新设备传递给mdadm –add命令。
- sudo mdadm /dev/md0 –add /dev/sde
如果阵列不处于降级状态,则新设备将被添加为备用设备。如果设备当前降级,重新同步操作将立即开始,使用备用设备替换故障驱动器。
在你添加备用装置之后,更新配置文件以反映你的新装置方向。
- sudo nano /etc/mdadm/mdadm.conf
删除或注释掉与你的数组定义对应的当前行。
. . .
# ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=d81c843b:4d96d9fc:5f3f499c:6ee99294
然后,将您当前的配置添加到其中。
- sudo mdadm –detail –brief /dev/md0 | sudo tee -a /etc/mdadm/mdadm.conf
新的信息将被mdadm实用工具用来组装阵列。
增加阵列中活动设备的数量
在组装中增加活动设备的数量可以扩展阵列。具体步骤会稍微依赖您使用的RAID级别。
使用RAID 1或10。
从上一节中演示的方式开始,将新设备添加为备用设备。
- sudo mdadm /dev/md0 –add /dev/sde
找出阵列中的当前RAID设备数量。
- sudo mdadm –detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Wed Aug 10 15:29:26 2016 Raid Level : raid1 Array Size : 104792064 (99.94 GiB 107.31 GB) Used Dev Size : 104792064 (99.94 GiB 107.31 GB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent . . .
在这个例子中,该数组配置为主动使用两个设备。然而,它透露出来的是,由于备用设备,该数组可用的设备总数为三。
现在,重新配置数组以添加一个额外的活动设备。备用设备将被用来满足额外的驱动器需求。请记住在这条命令中替换你的目标RAID设备数量。在这里,我们将一个由2个设备组成的RAID 1增加到3个设备。如果您的RAID 10有4个设备,并且有额外的驱动器,请将其增加到5个。
- sudo mdadm –grow –raid-devices=3 /dev/md0
阵列将开始重新配置,增加一个活动磁盘。要查看数据同步的进度,请运行以下命令:
- cat /proc/mdstat
在流程完成之前,您可以继续使用该设备。
使用RAID 5或6
在最后一节所示的情况下,首先将新设备添加为备用设备。
- sudo mdadm /dev/md0 –add /dev/sde
查找阵列中当前的RAID设备数量。
- sudo mdadm –detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Wed Oct 5 18:38:51 2022 Raid Level : raid5 Array Size : 209584128 (199.88 GiB 214.61 GB) Used Dev Size : 104792064 (99.94 GiB 107.31 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent . . .
在这个例子中,数组被配置为主动使用三个设备,并且由于添加了备用设备,数组可用的设备总数是四个。
现在,重新配置数组以添加一个额外的活动设备。备用设备将用于满足额外的驱动需求。在扩展RAID 5或RAID 6数组时,重要的是要包括一个名为–backup-file的额外选项。这将指向一个位置,离数组外的地方存储一个包含关键信息的备份文件。
Note
- sudo mdadm –grow –raid-devices=4 –backup-file=/root/md0_grow.bak /dev/md0
以下的输出表明关键部分会被备份。
mdadm: Need to backup 3072K of critical section..
阵列将开始重新配置,增加一个活动的磁盘。要查看数据同步的进度,运行以下命令:
- cat /proc/mdstat
在此过程完成之前,您可以继续使用该设备。
在重新调整完成后,您需要扩展阵列的文件系统以利用额外的空间。
- sudo resize2fs /dev/md0
您的阵列现在将拥有与其容量相匹配的文件系统。
使用RAID 0
RAID 0阵列无法有备用驱动器,因为备用驱动器无法重建损坏的RAID 0阵列。您必须在扩展阵列同时添加新设备。
首先,找出阵列中当前的RAID设备数量。
- sudo mdadm –detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Wed Aug 10 19:17:14 2020 Raid Level : raid0 Array Size : 209584128 (199.88 GiB 214.61 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent . . .
现在,你可以在添加新驱动器的同时增加RAID设备的数量。
- sudo mdadm –grow /dev/md0 –raid-devices=3 –add /dev/sdc
你将收到输出,提示数组已更改为RAID 4。
mdadm: level of /dev/md0 changed to raid4 mdadm: added /dev/sdc
这是正常且预期的情况。当数据重新分配到所有现有磁盘上时,阵列将会恢复为RAID 0。
你可以查看行动的进展。
- cat /proc/mdstat
一旦同步完成,调整文件系统的大小以利用额外的空间。
- sudo resize2fs /dev/md0
您的阵列现在将拥有与其容量相匹配的文件系统。
从阵列中移除一个设备
有时候,如果RAID阵列出现故障或者需要更换硬盘,就需要移除其中的一块驱动器。
要移除设备,首先必须在阵列中将其标记为“已失效”。你可以使用mdadm –detail命令来检查是否有设备失效。
- sudo mdadm –detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Wed Aug 10 21:42:12 2020 Raid Level : raid5 Array Size : 209584128 (199.88 GiB 214.61 GB) Used Dev Size : 104792064 (99.94 GiB 107.31 GB) Raid Devices : 3 Total Devices : 3 Persistence : Superblock is persistent Update Time : Thu Aug 11 14:10:43 2020 State : clean, degraded Active Devices : 2 Working Devices : 2 Failed Devices : 1 Spare Devices : 0 Layout : left-symmetric Chunk Size : 64K Name : mdadmwrite:0 (local to host mdadmwrite) UUID : bf7a711b:b3aa9440:40d2c12e:79824706 Events : 144 Number Major Minor RaidDevice State 0 0 0 0 removed 1 8 0 1 active sync /dev/sda 2 8 16 2 active sync /dev/sdb 0 8 32 – faulty /dev/sdc
这些突出显示的行都表示一个驱动器不再工作。例如,在这个输出中/dev/sdc表明这个驱动器是有问题的。
如果您需要移除一个没有问题的驱动器,您可以使用–fail选项手动将其标记为失败。
- sudo mdadm /dev/md0 –fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0
如果您查看mdadm –detail的输出,您会发现设备现在被标记为故障。
一旦设备失败,您可以使用mdadm –remove命令从阵列中移除它。
- sudo mdadm /dev/md0 –remove /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0
您可以使用相同的mdadm –add命令替换为新的驱动器,就像您用来添加备用驱动器一样。
- sudo mdadm /dev/md0 –add /dev/sdd
mdadm: added /dev/sdd
数组将通过将数据复制到新的驱动器开始恢复。
删除一个数组
要销毁一个包括其中所有数据的数组,首先按照停止数组的过程进行操作。
使用以下命令退出已挂载的目录:离开挂载的目录。
- cd ~
然后卸载文件系统。
sudo umount /mnt/md0
接下来,停止数组。 , .)
- sudo mdadm –stop /dev/md0
然后,使用–remove命令来删除指定的RAID设备上的数组本身。
- sudo mdadm –remove /dev/md0
一旦删除了数组本身,对每个组件设备使用mdadm –zero-superblock命令。这将擦除md超级块,即由mdadm用于组装和管理组件设备作为数组的标头。如果仍然存在,当尝试将磁盘重新用于其他目的时可能会引起问题。
确认阵列中的超级块存在,请查看lsblk –fs输出中的FSTYPE列。
- lsblk –fs
NAME FSTYPE LABEL UUID MOUNTPOINT … sda linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 sdb linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 sdc linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 sdd vda ├─vda1 ext4 DOROOT 4f8b85db-8c11-422b-83c4-c74195f67b91 / └─vda15
在这个例子中,/dev/sda、/dev/sdb和/dev/sdc都是数组的一部分,仍然被标示为这样。
使用以下命令去除标签。
- sudo mdadm –zero-superblock /dev/sda /dev/sdb /dev/sdc
接下来,请确保您将/etc/fstab文件中对数组的任何引用删除或注释掉。您可以在开头添加井号符号#来实现这一点。
- sudo nano /etc/fstab
. . .
# /dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0
当你完成时,保存并关闭文件。
从/etc/mdadm/mdadm.conf文件中删除或注释掉对数组的任何引用。
- nano /etc/mdadm/mdadm.conf
# ARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=bf7a711b:b3aa9440:40d2c12e:79824706
完成后请保存并关闭文件。
然后更新initramfs。
- sudo update-initramfs -u
这将从早期启动环境中移除设备。
结论
一旦你了解Linux的mdadm实用程序使用的约定和可以找到信息的位置,它可以帮助管理阵列。这个指南并非详尽无遗,但旨在介绍可能需要在日常工作中执行的一些管理任务。
一旦你熟练使用mdadm创建和管理RAID阵列,你可以探索许多不同的方向。像LVM这样的卷管理层与RAID紧密集成,使你能够灵活地将空间划分为逻辑卷。要了解更多信息,请查阅我们的《LVM概念介绍教程》。
同样,常用的LUKS和dm-crypt加密技术可用于在写入文件系统之前对RAID设备进行加密。Linux允许将所有这些技术一起使用,以提升存储能力。