mdraid — linux-утилита для создания и управления программными RAID-массивами.
Преимущества программного RAID-массива:
- Бесплатно (не надо тратиться на покупку аппаратного RAID-контроллера)
- Одинаковый интерфейс управления на всех популярных linux
- Гибкая настройка (можно перенести RAID в другой сервер, нет привязки к железу, производителю дисков и т д.)
Недостатки программного RAID-массива:
- Отсутствие BBU (батарейки RAID-контроллера. Батарейка RAID-контроллера позволит перенести информацию с кэша на диски, если сервер выключится)
- Отсутствие выделенного кэша (В аппаратных RAID-контроллерах есть специальный кэш, информация сначала пишется в него, и только потом переносится на диски, это может сильно ускорить работу)
- Отсутствие службы поддержки
- Производители некоторого ПО (например vmWare) не поддерживают работу на программном RAID
mdraid может работать не только с дисками, но и с разделами, томами LVM и т.д. Информация о RAID-массиве записывается в суперблок диска.
Рассмотрим на примере ОС CentOS как управлять RAID-массивами
Как создать RAID-массив?
Если вы только устанавливаете ОС на сервер, то RAID-массив можно создать прямо из установщика. Давайте на примере сделаем RAID1:


Если бы у нас был создан аппаратный RAID на уровне BIOS, то мы бы увидели просто один диск, на который сразу могли бы устанавливать ОС.



После успешной установки ОС мы увидим следующее состояние дисков и разделов:
[root@c7-raid ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 6.2G 0 part
│ └─md125 9:125 0 6.2G 0 raid1 /
├─sda2 8:2 0 823M 0 part
│ └─md126 9:126 0 822M 0 raid1 [SWAP]
└─sda3 8:3 0 1G 0 part
└─md127 9:127 0 1022M 0 raid1 /boot
sdb 8:16 0 8G 0 disk
├─sdb1 8:17 0 6.2G 0 part
│ └─md125 9:125 0 6.2G 0 raid1 /
├─sdb2 8:18 0 823M 0 part
│ └─md126 9:126 0 822M 0 raid1 [SWAP]
└─sdb3 8:19 0 1G 0 part
└─md127 9:127 0 1022M 0 raid1 /boot
sr0 11:0 1 1024M 0 rom
[root@c7-raid ~]# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sda1[0] sdb1[1]
6491136 blocks super 1.2 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
md126 : active raid1 sdb2[1] sda2[0]
841728 blocks super 1.2 [2/2] [UU]
md127 : active raid1 sda3[0] sdb3[1]
1046528 blocks super 1.2 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
unused devices: <none>
[root@c7-raid ~]#
#Исправный диск будет отображаться буквой U, неисправный прочерком (_). Сейчас мы #видим что под каждый раздел создалась отдельная RAID-группа.
Собирать все разделы в RAID необязательно, можно собрать лишь тот, который требуется, например /
Дальнейшее управление RAID-массивом будет происходить через утилиту mdadm:
Установка утилиты mdadm: yum install -y mdadm
В Debian\Ubuntu можно установить командой: sudo apt install -y mdadm
Просмотр всех созданных RAID-массивов: mdadm —examine —scan
[root@c7-raid ~]# mdadm --examine --scan
ARRAY /dev/md/root metadata=1.2 UUID=f8eaae19:53973f7b:a79fe7da:e0493fea name=c7-raid:root
ARRAY /dev/md/swap metadata=1.2 UUID=bd51902c:d3a004a1:dd7a3ec2:9b0fc8ae name=c7-raid:swap
ARRAY /dev/md/boot metadata=1.2 UUID=30b96e90:1b5f1775:232bd954:b28f671f name=c7-raid:boot
#/dev/md/root - адрес символьной ссылки на массив
#metadata=1.2 - используемая версия суперблока
#UUID=f8eaae19:53973f7b:a79fe7da:e0493fea - UUID массива
#name=c7-raid:root - имя массива
Вывод подробной информации о RAID-массиве: mdadm -D /dev/md127
[root@c7-raid md]# mdadm -D /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Sun Nov 8 16:10:55 2020
Raid Level : raid1
Array Size : 1046528 (1022.00 MiB 1071.64 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Sun Nov 8 16:52:55 2020
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : bitmap
Name : c7-raid:boot (local to host c7-raid)
UUID : 30b96e90:1b5f1775:232bd954:b28f671f
Events : 22
Number Major Minor RaidDevice State
0 8 3 0 active sync /dev/sda3
1 8 19 1 active sync /dev/sdb3
Что делать, если RAID-массив деградировал?
Допустим, мы заметили, что один диск у нас вышел из строя. Мы извлекли сбойный диск и установили вместо него новый (с таким же размером)
- Сначала проверяем состояние RAID-массива и виден ли новый диск:
[root@c7-raid ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 6.2G 0 part
│ └─md126 9:126 0 6.2G 0 raid1 /
├─sda2 8:2 0 823M 0 part
│ └─md125 9:125 0 822M 0 raid1 [SWAP]
└─sda3 8:3 0 1G 0 part
└─md127 9:127 0 1022M 0 raid1 /boot
sdb 8:16 0 8G 0 disk
sr0 11:0 1 906M 0 rom
[root@c7-raid ~]# cat /proc/mdstat
Personalities : [raid1]
md125 : active (auto-read-only) raid1 sda2[0]
841728 blocks super 1.2 [2/1] [U_]
md126 : active raid1 sda1[0]
6491136 blocks super 1.2 [2/1] [U_]
bitmap: 1/1 pages [4KB], 65536KB chunk
md127 : active raid1 sda3[0]
1046528 blocks super 1.2 [2/1] [U_]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
#Видим что появился диск sdb, но на нём нет RAID-масива
Если сбойный диск ещё не извлечен и он числится в RAID-массиве, то необходимо сделать следующие действия:
- Пометить диск как сбойный (для каждого raid-массива): mdadm /dev/md125 —set-faulty /dev/sdb
- Удалить диск из каждого RAID-массива: mdadm /dev/md125 —remove /dev/sdb
2. Копируем на новый диск все разделы с рабочего диска (очень важно не перепутать диски местами, сначала идёт диск с которого копируем): sfdisk -d /dev/sda | sfdisk —force /dev/sdb
3. Проверяем, что были созданы идентичные разделы: lsblk
[root@c7-raid ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 6.2G 0 part
│ └─md126 9:126 0 6.2G 0 raid1 /
├─sda2 8:2 0 823M 0 part
│ └─md125 9:125 0 822M 0 raid1 [SWAP]
└─sda3 8:3 0 1G 0 part
└─md127 9:127 0 1022M 0 raid1 /boot
sdb 8:16 0 8G 0 disk
├─sdb1 8:17 0 6.2G 0 part
├─sdb2 8:18 0 823M 0 part
└─sdb3 8:19 0 1G 0 part
sr0 11:0 1 906M 0 rom
4. Добавляем диски в RAID-массив:
- mdadm —manage /dev/md125 —add /dev/sdb2
- mdadm —manage /dev/md126 —add /dev/sdb1
- mdadm —manage /dev/md127 —add /dev/sdb3
5. После добавления диска сразу начнётся ребилд массива: cat /proc/mdstat
[root@c7-raid ~]# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sdb2[2] sda2[0]
841728 blocks super 1.2 [2/2] [UU]
md126 : active raid1 sdb1[2] sda1[0]
6491136 blocks super 1.2 [2/1] [U_]
[==========>..........] recovery = 54.2% (3524608/6491136) finish=0.4min speed=104103K/sec
bitmap: 1/1 pages [4KB], 65536KB chunk
md127 : active raid1 sdb3[2] sda3[0]
1046528 blocks super 1.2 [2/1] [U_]
resync=DELAYED
bitmap: 0/1 pages [0KB], 65536KB chunk
unused devices: <none>
После успешного ребилда RAID-массивы вернутся в обычное состояние:
[root@c7-raid ~]# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sdb2[2] sda2[0]
841728 blocks super 1.2 [2/2] [UU]
md126 : active raid1 sdb1[2] sda1[0]
6491136 blocks super 1.2 [2/2] [UU]
bitmap: 1/1 pages [4KB], 65536KB chunk
md127 : active raid1 sdb3[2] sda3[0]
1046528 blocks super 1.2 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
unused devices: <none>
Если вдруг загрузчик находится у вас только на одном диске, то необходимо установить загрузчик на этот диск:
# grub-install /dev/sda
# update-grub
Создание RAID-массива без использования системных дисков из ОС
Допустим, в данный сервер мы установили ещё 3 диска одинаковых размеров и хотим собрать из них RAID5 и смонтировать его в ОС:
- Находим буквы дисков с одинаковым размером: lsblk | grep 20
[root@c7-raid ~]# lsblk | grep 20
sdb 8:16 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sde 8:64 0 20G 0 disk
2. Добавляем в диски суперблок: mdadm —zero-superblock /dev/sd{b,d,e}
3. Создаём RAID5 из 3 дисков: mdadm —create /dev/md0 —level 5 -n3 /dev/sd{b,d,e}
4. Проверяем, что RAID создан успешно:
[root@c7-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde[3] sdd[1] sdb[0]
41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
5. Создаём том для LVM (Необязательно, делается для того, чтобы потом было проще увеличить размер): pvcreate /dev/md0
Удаление RAID-массива:
- Останавливаем RAID-массив: mdadm -S /dev/md0
- Очищаем суперблоки дисков: mdadm —zero-superblock /dev/sd{b,d,e}
- Удаляем метаданные и остальную информацию с дисков: wipefs —all —force /dev/sd{b,d,e}