磁盘冗余阵列(RAID)是将多个物理磁盘结合成一个逻辑磁盘的技术,该技术可以提高磁盘容错性能,提高磁盘的读写速度。根据数据存储的排列(如:条带存储,镜像存储,奇偶或者他们的组合),定义了几个不同级别的RAID(RAID-0,RAID-1,RAID-5 等等)。磁盘阵列可以使用软件或者硬件方式实现。现代Linux操作系统中,基本的软件RAID功能是默认安装的。

本文中,我们将介绍软件方式构建RAID-1阵列(镜像阵列),RAID-1将相同的数据写到不同的设备中,一般来说应该使用两个大小相同的磁盘来组建RAID-1。

安装mdadm

我们将使用mdadm(简称多盘管理)工具创建、组装、管理和监控软件RAID-1。现代发行版Linux中mdadm是默认安装的。

开启RAID守护服务,并将其配置成开机启动

systemctl start mdmonitor
systemctl enable mdmonitor 

硬盘分区

准备建立阵列需要的硬盘,用lsblk命令设备显示设备 /dev/sdb 和 /dev/sdc

$ lsblk 
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdb           8:16   0 465.8G  0 disk  
└─sdb1        8:17   0 465.8G  0 part  
sdc           8:32   0 465.8G  0 disk  
└─sdc1        8:33   0 465.8G  0 part  

使用fdisk为每个磁盘建立一个主分区。以下步骤是如何在/dev/sdb上建立分区,假设次磁盘从未被分区(如果有其他分区的话,可以删掉):

 $ sudo fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p

Disk /dev/sdb: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: HGST HTS725050A7
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: C7DE950B-AAFD-456B-AC57-9A62197F1042

Device     Start       End   Sectors   Size Type
/dev/sdb1   2048 976773134 976771087 465.8G Linux filesystem

Command (m for help): 

(如果有分区的话,可以使用 d 选项删除,w 选项应用更改)。

如果磁盘上没有分区,所以我们使用命令 n 创建一个主分区按回车使用默认值,或者输入一个你想设置的值。

用同样的方法为/dev/sdc 分区。

如果我们有两个不同容量的硬盘,比如 750GB 和 1TB的话,我们需要在每个磁盘上分出一个750GB的主分区,大盘剩下的空间可以用作他用,不加入磁盘阵列。

创建 RAID-1 阵列

磁盘分区完成后,我们可以使用以下命令创建 RAID-1 阵列:

mdadm -Cv /dev/md0 -l1 -n2 /dev/sdb1 /dev/sdc1 

说明:

  • -Cv: 创建一个阵列并打印出详细信息。
  • /dev/md0: 阵列名称。
  • -l1 (l as in “level”): 指定阵列类型为 RAID-1 。
  • -n2: 指定我们将两个分区加入到阵列中去,分别为/dev/sdb1 和 /dev/sdc1

以上命令和下面的等价:

mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 

如果你想在在磁盘失效时添加另外一个磁盘到阵列中,可以指定 ‘–spare-devices=1 /dev/sdd1’ 到以上命令。

输入 “y” 继续创建阵列,回车:

可以使用以下命令查看进度:

$ cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sdc1[1] sdb1[0]
      488253440 blocks super 1.2 [2/2] [UU]
      [===========>.........]  resync = 55.5% (271038976/488253440) finish=35.4min speed=102256K/sec
      bitmap: 2/4 pages [8KB], 65536KB chunk

unused devices: <none>

另外一个获取阵列信息的方法是:

# mdadm --query /dev/md0
# mdadm --detail /dev/md0 (or mdadm -D /dev/md0) 
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jan  8 12:36:49 2024
        Raid Level : raid1
        Array Size : 488253440 (465.63 GiB 499.97 GB)
     Used Dev Size : 488253440 (465.63 GiB 499.97 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Mon Jan  8 13:18:07 2024
             State : clean, resyncing 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

     Resync Status : 56% complete

              Name : thinkserver:0  (local to host thinkserver)
              UUID : d565c3f3:5eaa5bd6:8e3e8cd3:a2fc07de
            Events : 502

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       

格式化或加载磁盘阵列

使用ext4格式:
(不需要等待Raid 完成)

# mkfs.ext4 /dev/md0

mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 122063360 4k blocks and 30523392 inodes
Filesystem UUID: 98390707-0aa4-4129-bafa-35459933331a
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): 
done
Writing superblocks and filesystem accounting information:          
done

加载阵列并验证:

# mkdir /mnt/data1
# mount /dev/md0 /mnt/data1
# lsblk 
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda           8:0    0 931.5G  0 disk  
└─sda1        8:1    0 931.5G  0 part  /mnt/data0
sdb           8:16   0 465.8G  0 disk  
└─sdb1        8:17   0 465.8G  0 part  
  └─md0       9:0    0 465.6G  0 raid1 /mnt/data1
sdc           8:32   0 465.8G  0 disk  
└─sdc1        8:33   0 465.8G  0 part  
  └─md0       9:0    0 465.6G  0 raid1 /mnt/data1

监控磁盘阵列

mdadm工具内置有磁盘阵列监控功能。当mdadm作为守护程序运行的时候,会周期性的检测阵列运行状态,将检测到的信息通过电子邮件或者系统日志报告上来。也可以配置其在发生致命性错误的时候调用紧急命令。

mdadm.conf 用于监控跟踪阵列和成员磁盘,可以在配置文件中(debian系统:/etc/mdadm/mdadm.conf ,红帽子系统:/etc/mdadm.conf )用以下格式指定监控设备或者阵列。如果mdadm.conf文件不存在,可以创建一个。

配置文件主要有两种类型:

DEVICE 指定在其中查找潜在成员磁盘的设备列表
ARRAY 指定有关如何识别阵列的信息,以便可以激活它们

DEVICE /dev/sd[bc]1 

ARRAY /dev/md0 devices=/dev/sdb1,/dev/sdc1
.....
 
# optional email address to notify events
MAILADDR your@email.com

编辑完毕mdadm配置文件后,重启mdadm服务:

# systemctl restart mdmonitor

自动加载Raid阵列

在/etc/fstab中加入条目使得系统启动的时候将阵列挂载到/mnt目录下:

/dev/md10    /mnt/data1    ext4    defaults    0    2

验证自动挂载,首先卸载阵列,重启mdadm,然后重新加载。

# umount /mnt/data1
# service mdadm restart (on Debian, Ubuntu or Linux Mint)
or systemctl restart mdmonitor (on Fedora, CentOS/RHEL7)
or service mdmonitor restart (on CentOS/RHEL6)
# mount -a 

参考:

  1. 何使用linux程序mdadm创建软件RAID1软阵列