如何在Ubuntu16.04上使用mdadm管理RAID阵列

来自菜鸟教程
跳转至:导航、​搜索

介绍

RAID 阵列通过将单个磁盘组合成特定配置的虚拟存储设备来提供更高的性能和冗余。 在 Linux 中,mdadm 实用程序可以轻松创建和管理软件 RAID 阵列。

在之前的指南中,我们介绍了 如何在 Ubuntu 16.04 上使用 mdadm 创建 RAID 阵列。 在本指南中,我们将演示如何在 Ubuntu 16.04 服务器上管理 RAID 阵列。 在大多数情况下,管理 RAID 阵列非常简单。

先决条件

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

如上所述,本指南将介绍 RAID 阵列管理。 在开始阅读本指南之前,请按照我们关于 如何在 Ubuntu 16.04 上使用 mdadm 创建 RAID 阵列的指南来创建一个或多个阵列。 本指南将假定您有一个或多个阵列要操作。

查询RAID设备信息

正确管理的最基本要求之一是能够找到有关阵列的结构、组件设备和当前状态的信息。

要获取有关 RAID 设备的详细信息,请将带有 -D--detail 选项的 RAID 设备传递给 mdadm

sudo mdadm -D /dev/md0

将显示有关阵列的重要信息:

Output/dev/md0:
        Version : 1.2
  Creation Time : Mon Aug  8 21:19:06 2016
     Raid Level : raid10
     Array Size : 209584128 (199.88 GiB 214.61 GB)
  Used Dev Size : 104792064 (99.94 GiB 107.31 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Aug  8 21:36:36 2016
          State : active 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : mdadmwrite:0  (local to host mdadmwrite)
           UUID : 0dc2e687:1dfe70ac:d440b2ac:5828d61d
         Events : 18

    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
OutputARRAY /dev/md0 metadata=1.2 name=mdadmwrite:0 UUID=0dc2e687:1dfe70ac:d440b2ac:5828d61d

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

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

这可用于一目了然地找到有关 RAID 设备的关键信息。

获取有关组件设备的信息

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

-Q 选项与组件设备一起使用时,将告诉您它所属的阵列及其作用:

sudo mdadm -Q /dev/sdc
Output/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
Output/dev/sdc:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 0dc2e687:1dfe70ac:d440b2ac:5828d61d
           Name : mdadmwrite:0  (local to host mdadmwrite)
  Creation Time : Mon Aug  8 21:19:06 2016
     Raid Level : raid10
   Raid Devices : 4

 Avail Dev Size : 209584128 (99.94 GiB 107.31 GB)
     Array Size : 209584128 (199.88 GiB 214.61 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130984 sectors, after=0 sectors
          State : active
    Device UUID : b0676ef0:73046e93:9d9c7bde:c80352bb

    Update Time : Mon Aug  8 21:36:36 2016
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : 8be1be96 - correct
         Events : 18

         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
OutputPersonalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [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>

这里的输出非常密集,在很小的空间内提供了大量的信息。

/proc/mdstat

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
. . .

Personalities 行描述了内核当前支持的不同 RAID 级别和配置。

md0 开头的行描述了 RAID 设备描述的开头。 随后的缩进线也描述了该设备。

/proc/mdstat

. . .
md0 : active raid10 sdd[3] sdc[2] sdb[1] sda[0]
. . .

第一行表示阵列处于活动状态(未出现故障)并配置为 RAID 10。 之后,列出了用于构建阵列的组件设备。 括号中的数字描述了设备在阵列中的当前“角色”(这会影响给定设备的数据副本)。

/proc/mdstat

. . .
      209584128 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
. . .

本示例中显示的第二行给出了虚拟设备提供的块数、元数据版本(本示例中为 1.2)和数组的块大小。 由于这是一个 RAID 10 阵列,它还包括有关阵列布局的信息(此示例已配置为在“近”布局中存储每个数据块的两个副本)。

方括号中的最后一项都代表健康集合中当前可用的设备。 数字括号中的第一个数字表示健康数组的大小,而第二个数字表示当前可用的设备数量。 其他括号是阵列健康状况的视觉指示,“U”代表健康设备,“_”代表故障设备。

如果您的阵列当前正在组装或恢复,您可能会有另一行显示进度。 它看起来像这样:

/proc/mdstat

. . .
      [>....................]  resync =  0.9% (2032768/209584128) finish=15.3min speed=225863K/sec
. . .

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

在您对系统上当前正在运行的阵列有一个很好的了解之后,您可以采取许多操作。

停止数组

要停止阵列,第一步是卸载它。

跳出已安装的目录并通过键入以下内容将其卸载:

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

删除或注释掉与您的数组定义对应的当前行:

/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
Output/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

    . . .

我们可以看到,在此示例中,阵列被配置为主动使用两个设备,并且阵列可用的设备总数为三个(因为我们添加了备用设备)。

现在,重新配置阵列以拥有一个额外的活动设备。 备用将用于满足额外的驱动器要求:

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
Output/dev/md0:
        Version : 1.2
  Creation Time : Wed Aug 10 18:38:51 2016
     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 的附加选项非常重要。 这应该指向一个位置 off 阵列,其中包含关键信息的备份文件将被存储。

笔记

备份文件仅在此过程中使用很短但很关键的时间,之后将自动删除。 因为需要的时间非常短暂,您可能永远不会在磁盘上看到该文件,但如果出现问题,可以使用它来重建阵列。 这篇文章有一些额外的信息,如果你想了解更多。


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

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

Outputmdadm: 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
Output/dev/md0:
        Version : 1.2
  Creation Time : Wed Aug 10 19:17:14 2016
     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 的输出:

Outputmdadm: 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
Output/dev/md0:
        Version : 1.2
  Creation Time : Wed Aug 10 21:42:12 2016
     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 2016
          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
Outputmdadm: set /dev/sdc faulty in /dev/md0

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

一旦设备出现故障,您可以使用 mdadm --remove 将其从阵列中移除:

sudo mdadm /dev/md0 --remove /dev/sdc
Outputmdadm: hot removed /dev/sdc from /dev/md0

然后,您可以使用与添加备用驱动器相同的 mdadm --add 命令将其替换为新驱动器:

sudo mdadm /dev/md0 --add /dev/sdd
Outputmdadm: added /dev/sdd

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

删除数组

要销毁一个数组,包括其中包含的所有数据,请按照我们用来停止数组的过程开始。

首先,卸载文件系统:

cd ~
sudo umount /mnt/md0

接下来,停止数组:

sudo mdadm --stop /dev/md0

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

sudo mdadm --remove /dev/md0

删除阵列本身后,您应该在每个组件设备上使用 mdadm --zero-superblock。 这将擦除 md 超级块,这是 mdadm 用来组装和管理作为阵列一部分的组件设备的标头。 如果这仍然存在,则在尝试将磁盘重新用于其他目的时可能会导致问题。

通过查看 lsblk --fs 输出中的 FSTYPE 列,您可以看到超级块仍然存在于数组中:

lsblk --fs
OutputNAME    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

/etc/fstab

. . .
# /dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0

完成后保存并关闭文件。

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

nano /etc/mdadm/mdadm.conf

/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 紧密集成,允许您灵活地将空间划分为逻辑卷。 类似地,LUKS 和 dm-crypt 加密通常用于在写入文件系统之前加密 RAID 设备。 Linux 允许一起使用所有这些技术来增强您的存储能力。