CentOS7.5 上使用 mdadm 管理 软RAID 阵列

在运维工作中,我们多数时候是在硬件服务器上通过 RAID 卡设置 RAID 阵列,但有时也需要通过系统对多块硬盘设置软件 RAID。本文分享一下我在 CentOS7.5 上使用 mdadm 管理 软RAID 的经验。

CentOS7.5 上使用 mdadm 管理 软RAID 阵列

update @20190228

背景

在运维工作中,我们多数时候是在硬件服务器上通过 RAID 卡设置 RAID 阵列,但有时也需要通过操作系统对多块硬盘设置软件 RAID。

本文就讲一讲如何在 CentOS7.5 上使用工具 mdadm 来管理 软磁盘阵列

mdadm 的全称是 multiple devices administers or manages(多磁盘管理器), 是早期工具 mdctl 的替代品。

不同版本的 mdadm 使用上有一些差异,目前使用的 CentOS7.5 通过 yum 安装的版本,本文以此为据:

mdadm - v4.1-rc1 - 2018-03-22

mdadm 有 7种 主要的操作模式。

常规操作使用 Create, AssembleMonitor 命令。 其它命令则是当阵列被搞乱时能派上用场。典型的场合是修复和更改阵列。

  • Create 创建
    以每块硬盘一个超级块的方式创建一个磁盘阵列(正常创建)。

  • Assemble 组装
    将先前创建的阵列的部分磁盘组装到现有激活的阵列中。可以明确给出组件或搜索组件。mdadm会 检查组件是否组成了真正的阵列,并且可以根据请求调整超级块信息以便重新组装有故障的阵列。我们通常在重启后在 init 脚本中执行此操作。

  • Follow or Monitor 跟踪或监控
    监视一个或多个 md 设备并对任何状态变更采取应对措施。这仅对 raid1, 4, 5, 6, 10 或多路径阵列有意义,因为只有这些阵列有值得关注的状态。raid0 或 linear(串接)阵列 永远不会有丢失、备用或故障的驱动器,因此无需监控。我们通常也是重启后执行此操作。

  • Build 构建
    和 crete 很相似,但它用于构建一个不是每块硬盘都含有超级块的磁盘阵列。对于这种类型的阵列,mdadm 无法区分阵列的初始创建和后续组装。它也无法执行任何已请求适当设备的检查。因此,只有当我们了解当前环境不需要使用超级块时,才选择构建模式。

    mdadm 参数 create 和 build 区别

  • Grow 扩容
    以某种方式扩大、缩小或以其他方式重塑阵列。目前支持的扩容选项包括更改 RAID1/4/5/6 阵列中设备的已激活容量大小以及更改 RAID1 中的已激活磁盘设备数量。

  • Manage 管理
    这适用于对阵列的特定磁盘执行操作,例如添加新的备份盘和删除故障设备。

  • Misc 杂项
    这是一种“其它一切”模式,支持对活动的阵列和硬盘的操作,如擦除旧的超级块,以及信息收集等。

工具帮助

我在使用过程中,参照的 CentOS7.0 上的命令和使用参数,发现报了很多错误,原来是差异较大,很多参数已经变了,因此这里建议先总览工具的帮助文档。

与常规的工具帮助不同,mdadm --help 显示的帮助有限并且看起来有些混乱,好在它提供了另一个比较概览性的参数:
mdadm --help-options

# mdadm --help-options
Any parameter that does not start with '-' is treated as a device name
or, for --examine-bitmap, a file name.
The first such name is often the name of an md device.  Subsequent
names are often names of component devices.

Some common options are:
  --help        -h   : General help message or, after above option,
                       mode specific help message
  --help-options     : This help message
  --version     -V   : Print version information for mdadm
  --verbose     -v   : Be more verbose about what is happening
  --quiet       -q   : Don't print un-necessary messages
  --brief       -b   : Be less verbose, more brief
  --export      -Y   : With --detail, --detail-platform or --examine use
                       key=value format for easy import into environment
  --force       -f   : Override normal checks and be more forceful

  --assemble    -A   : Assemble an array
  --build       -B   : Build an array without metadata
  --create      -C   : Create a new array
  --detail      -D   : Display details of an array
  --examine     -E   : Examine superblock on an array component
  --examine-bitmap -X: Display the detail of a bitmap file
  --examine-badblocks: Display list of known bad blocks on device
  --monitor     -F   : monitor (follow) some arrays
  --grow        -G   : resize/ reshape and array
  --incremental -I   : add/remove a single device to/from an array as appropriate
  --query       -Q   : Display general information about how a
                       device relates to the md driver
  --auto-detect      : Start arrays auto-detected by the kernel

创建 RAID 阵列

  • 添加硬盘

我在 VMware workstation 里给 CentOS7.5_x64 虚拟机挂载了 4块 5G 的硬盘,用于验证 RAID10:

进入系统,查看挂载的磁盘信息:

[[email protected]:/root] # lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk
├─sda1            8:1    0  512M  0 part /boot
└─sda2            8:2    0  9.5G  0 part
  ├─centos-root 253:0    0  7.5G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0    5G  0 disk
sdc               8:32   0    5G  0 disk
sdd               8:48   0    5G  0 disk
sde               8:64   0    5G  0 disk

可以看到新加的 4块盘已经被识别到了。如果没有正常显示,可能需要重启服务器。

  • 创建RAID10 阵列
mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

这里我们创建了一个名为 /dev/md0 的RAID 设备,使用 RAID10,指定使用 4块硬盘,随后跟上具体的硬盘设备。

  • 查看阵列的状态
# mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=localhost.localdomain:0 UUID=dae0daa5:77a7533d:20ae5272:2c642682

# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 27 01:27:30 2019
        Raid Level : raid10
        Array Size : 10475520 (9.99 GiB 10.73 GB)
     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Feb 27 01:28:23 2019
             State : clean
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0
...
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde
  • 创建挂载点并挂载 RAID
[[email protected]:/root] # mkdir /RAID
[[email protected]:/root] # mkfs.xfs /dev/md0
[[email protected]:/root] # mount /dev/md0 /RAID
[[email protected]:/root] # mount | grep md0
/dev/md0 on /RAID type xfs (rw,relatime,seclabel,attr2,inode64,sunit=1024,swidth=2048,noquota)
  
[[email protected]:/root] # df -hT | grep md0
/dev/md0                xfs        10G   33M   10G   1% /RAID

[[email protected]:/root] # lsblk
NAME           MAJ:MIN  RM  SIZE   RO  TYPE    MOUNTPOINT
sda            8:0      0   10G    0   disk
├─sda1         8:1      0   512M   0   part    /boot
└─sda2         8:2      0   9.5G   0   part
├─centos-root  253:0    0   7.5G   0   lvm     /
└─centos-swap  253:1    0   2G     0   lvm     [SWAP]
sdb            8:16     0   5G     0   disk
└─md0          9:0      0   10G    0   raid10  /RAID
sdc            8:32     0   5G     0   disk
└─md0          9:0      0   10G    0   raid10  /RAID
sdd            8:48     0   5G     0   disk
└─md0          9:0      0   10G    0   raid10  /RAID
sde            8:64     0   5G     0   disk
└─md0          9:0      0   10G    0   raid10  /RAID

上面我们可以看到新创建的 RAID 阵列组 /dev/md0 被格式化为了 xfs 文件系统,然后挂载到了 /RAID 目录下。
使用df -hT 可以看到 RAID 的磁盘空间是 10G,刚好符合我们 RAID10 的理论值;而在 lsblk 中可以看到新增的每块硬盘都属于 md0

  • 添加 fstab 实现开机自动挂载
echo "/dev/md0 /RAID xfs defaults 0 0" >> /etc/fstab
mount -a

模拟 RAID 阵列故障并修复

  • 模拟磁盘故障并从阵列移除
mdadm --manage /dev/md0 --fail /dev/sde

mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 27 01:27:30 2019
        Raid Level : raid10
        Array Size : 10475520 (9.99 GiB 10.73 GB)
     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Feb 27 01:45:14 2019
             State : clean, degraded
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 0
...
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       -       0        0        3      removed

       3       8       64        -      faulty   /dev/sde

这时可以看到 Failed Devices数量为1,/dev/sde 处于 faulty 状态,我们将其移除阵列:

mdadm --manage /dev/md0 --remove /dev/sde

mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 27 01:27:30 2019
        Raid Level : raid10
        Array Size : 10475520 (9.99 GiB 10.73 GB)
     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
      Raid Devices : 4
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Wed Feb 27 01:48:32 2019
             State : clean, degraded
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0
...
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       -       0        0        3      removed

这时候可以看到 序号3 的磁盘状态为 removed,并且 Total Devices 数量变成了 3。
此时的 RAID 是可以正常工作的,数据也不会丢。

  • 模拟磁盘修复后重新加入阵列
mdadm --manage /dev/md0 --re-add /dev/sde

此时会因为阵列已经有最大数量的磁盘了,无法重新添加,而提示如下:
mdadm: --re-add for /dev/sde to /dev/md0 is not possible

那我们可以以新增磁盘的方式添加这块磁盘到阵列中:

mdadm --manage /dev/md0 --add /dev/sde

最后再看下磁盘状态,又回到了最初 4块磁盘的样子:

 mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 27 01:27:30 2019
        Raid Level : raid10
        Array Size : 10475520 (9.99 GiB 10.73 GB)
     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Feb 27 01:59:31 2019
             State : clean
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : dae0daa5:77a7533d:20ae5272:2c642682
            Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       4       8       64        3      active sync set-B   /dev/sde

参考文档

https://www.tecmint.com/manage-software-raid-devices-in-linux-with-mdadm
https://en.wikipedia.org/wiki/Mdadm
https://raid.wiki.kernel.org/index.php/RAID_setup
https://www.digitalocean.com/community/tutorials/how-to-create-raid-arrays-with-mdadm-on-ubuntu-18-04