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

在本指南中,我们将讨论如何使用Linux的mdadm实用程序来管理RAID阵列和进行日常的日常管理任务。我们讨论如何启动,停止或删除RAID阵列,如何查找有关这两种RAID设备和底层存储组件,以及如何调整RAID大小和和热备用现有阵列的信息。

介绍

RAID阵列通过将单个磁盘组合到特定配置中的虚拟存储设备来提高性能和冗余性。 在Linux中mdadm工具可以很容易地创建和管理软件RAID阵列。

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

先决条件

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

如上所述,本指南将介绍RAID阵列管理。 按照我们的指导如何创建RAID阵列, mdadm在Ubuntu 16.04开始本指南之前创建一个或多个阵列。 本指南假设您有一个或多个数组要操作。

查询有关RAID设备的信息

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

要获得有关RAID设备的详细信息,通过与RAID设备-D--detail选项mdadm

sudo mdadm -D /dev/md0

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

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

为了得到一个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 : 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
Personalities : [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] 
. . .

个性行描述不同的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阵列,它还包括有关数组布局的信息(此示例已配置为在“near”布局中存储每个数据块的两个副本)。

方括号中的最后一个项目表示当前可用的设备在健康集合中。 数字括号中的第一个数字表示健康阵列的大小,而第二个数字表示当前可用的设备数。 其他括号是阵列运行状况的可视指示,其中“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
/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
/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 这应该指向的位置停止的地方包含关键信息的备份文件将存储阵列。

注意
备份文件仅在此过程中用于非常短但关键的时间,之后它将被自动删除。 因为当这是需要时间很短暂,你可能永远也看不到磁盘上的文件,但在出现问题的情况下,它可以被用来重建阵列。 这篇文章有一些额外的信息,如果你想了解更多。
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 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的输出:

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 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
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组装和作为阵列的一部分管理元器件。 如果仍然存在,当尝试将磁盘重新用于其他目的时,可能会导致问题。

你可以看到,超级块仍存在通过检查出数组中FSTYPElsblk --fs输出:

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
/ 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效用使得它一旦你了解它使用的约定和地方,你可以寻找信息很容易管理阵列。 本指南并不详尽,但用于介绍您可能需要在日常基础上执行的一些管理任务。

一旦你有舒适的创建和管理RAID阵列mdadm ,有许多不同的方向可以下一个探索。 像LVM这样的卷管理层与RAID紧密集成,并允许您灵活地将空间分区为逻辑卷。 类似地,LUKS和dm-crypt加密通常用于在写入文件系统之前加密RAID设备。 Linux允许所有这些技术一起使用来增强您的存储功能。