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

介绍

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

在之前的指南中,我们介绍了 如何在Ubuntu 16.04上使用mdadm创建RAID阵列。 在本指南中,我们将展示如何在Ubuntu 16.04服务器上管理RAID阵列。

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

前提条件

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

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

寻找有关 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 : Mon Aug 8 21:19:06 2016
 5     Raid Level : raid10
 6     Array Size : 209584128 (199.88 GiB 214.61 GB)
 7  Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
 8   Raid Devices : 4
 9  Total Devices : 4
10    Persistence : Superblock is persistent
11
12    Update Time : Mon Aug 8 21:36:36 2016
13          State : active 
14 Active Devices : 4
15Working Devices : 4
16 Failed Devices : 0
17  Spare Devices : 0
18
19         Layout : near=2
20     Chunk Size : 512K
21
22           Name : mdadmwrite:0  (local to host mdadmwrite)
23           UUID : 0dc2e687:1dfe70ac:d440b2ac:5828d61d
24         Events : 18
25
26    Number Major Minor RaidDevice State
27       0 8 0 0 active sync set-A   /dev/sda
28       1 8 16 1 active sync set-B   /dev/sdb
29       2 8 32 2 active sync set-A   /dev/sdc
30       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=0dc2e687:1dfe70ac:d440b2ac:5828d61d

要获得一个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 : 0dc2e687:1dfe70ac:d440b2ac:5828d61d
 7           Name : mdadmwrite:0  (local to host mdadmwrite)
 8  Creation Time : Mon Aug 8 21:19:06 2016
 9     Raid Level : raid10
10   Raid Devices : 4
11
12 Avail Dev Size : 209584128 (99.94 GiB 107.31 GB)
13     Array Size : 209584128 (199.88 GiB 214.61 GB)
14    Data Offset : 131072 sectors
15   Super Offset : 8 sectors
16   Unused Space : before=130984 sectors, after=0 sectors
17          State : active
18    Device UUID : b0676ef0:73046e93:9d9c7bde:c80352bb
19
20    Update Time : Mon Aug 8 21:36:36 2016
21  Bad Block Log : 512 entries available at offset 72 sectors
22       Checksum : 8be1be96 - correct
23         Events : 18
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 : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [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 : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
3. . .

Personalities 行描述了内核目前支持的不同 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

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

走出安装的目录并通过键入卸载它:

1cd ~
2sudo 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    . . .

我们可以看到,在这个示例中,数组被配置为积极使用两个设备,并且数组可用的设备总数为3个(因为我们添加了一个备用)。

现在,重新配置数组以获得额外的活跃设备. 备用将用于满足额外的驱动器要求:

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 Aug 10 18:38:51 2016
 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 2016
 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 2016
 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 2016
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 ~
2sudo 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
3sda linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
4sdb linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
5sdc linux_raid_member mdadmwrite:0 bf7a711b-b3aa-9440-40d2-c12e79824706 
6sdd                                                                         
7vda                                                                         
8├─vda1 ext4 DOROOT 4f8b85db-8c11-422b-83c4-c74195f67b91 /
9└─vda15

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

通过键入删除标签:

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

接下来,请确保您在 /etc/fstab 文件中删除或评论任何对数组的引用:

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 设备,然后写入文件系统。Linux 允许所有这些技术一起使用以提高存储能力。

Published At
Categories with 技术
comments powered by Disqus