磁盘冗余阵列(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
参考: