Соберу в одном месте список полезных команд для mdadm.
mdadm — утилита для управления программными RAID-массивами в Linux.
С помощью mdadm можно выполнять следующие операции:
- mdadm --create, -C Создать новый массив на основе указанных устройств. Использовать суперблоки размещённые на каждом устройстве.
- mdadm --assemble, -A Собрать компоненты ранее созданного массива в массив. Компоненты можно указывать явно, но можно и не указывать — тогда выполняется их поиск по суперблокам.
- mdadm --build, -B Собрать массив из компонентов, у которых нет суперблоков. Не выполняются никакие проверки, создание и сборка массива в принципе ничем не отличаются.
- mdadm --manage Разнообразные операции по управлению массивом, такие как замена диска и пометка как сбойного.
- mdadm --misc Действия, которые не относятся ни к одному из других режимов работы.
- mdadm --grow, -G Расширение или уменьшение массива, включаются или удаляются новые диски.
- mdadm --incremental, -I Добавление диска в массив.
- mdadm --monitor, --follow, -F Следить за изменением состояния устройств. Для RAID0 этот режим не имеет смысла.
И другие: mdadm --help.
Формат вызова:
mdadm [mode] [array] [options]
Создание массива
Для создания массива нужно использовать не смонтированные разделы. Убедитесь в этом, при необходимости демонтируйте и уберите из fstab.
Пример создания RAID5 массива из трёх дисков:
- /dev/nvme0n1
- /dev/nvme1n1
- /dev/nvme2n1
Я использую NVMe диски, у вас названия дисков будут другие.
Желательно изменить тип разделов на FD (Linux RAID autodetect). Это можно сделать с помощью fdisk (t).
Занулить суперблоки дисков:
mdadm --zero-superblock --force /dev/nvme0n1
mdadm --zero-superblock --force /dev/nvme1n1
mdadm --zero-superblock --force /dev/nvme2n1
Стереть подпись и метаданные:
wipefs --all --force /dev/nvme0n1
wipefs --all --force /dev/nvme1n1
wipefs --all --force /dev/nvme2n1
С помощью ключа --create создать RAID5 массив:
mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1
где:
- /dev/md0 — массив, который мы создаём;
- --level 5 — уровень RAID;
- --raid-devices=3 — количество дисков, из которых собирается массив;
- /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 — диски.
Для примера RAID1 из двух дисков /dev/sdb и /dev/sdc можно создать так:
mdadm --create --verbose /dev/md2 -l 1 -n 2 /dev/sd{b,c}
где:
- /dev/md2 — массив, который мы создаём;
- -l 5 — уровень RAID;
- -n 2 — количество дисков, из которых собирается массив;
- /dev/sd{b,c} — диски sdb и sdc.
Состояние массива
Посмотреть инициализацию массива и текущее состояние можно с помощью команды:
cat /proc/mdstat
Пример 1:
root@ch01:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 nvme1n1[1] nvme0n1[0]
3750607192 blocks super 1.2 [2/2] [UU]
unused devices: <none>
Пример 2:
[root@dbk00 ~]# cat /proc/mdstat
Personalities : [raid1] [raid0]
md10 : active raid0 sdb1[1] sda1[0]
70319335424 blocks super 1.2 512k chunks
md20 : active raid0 sdc1[0] sdd1[1]
70319335424 blocks super 1.2 512k chunks
md126 : active raid1 sde[1] sdf[0]
927881216 blocks super external:/md127/0 [2/2] [UU]
md127 : inactive sdf[1](S) sde[0](S)
10402 blocks super external:imsm
unused devices: <none>
Подробный статус выбранного массива
mdadm --detail /dev/md2
Пример:
root@ch01:~# mdadm --detail /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Wed May 6 16:39:32 2020
Raid Level : raid1
Array Size : 3750607192 (3576.86 GiB 3840.62 GB)
Used Dev Size : 3750607192 (3576.86 GiB 3840.62 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Fri Aug 14 17:09:47 2020
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : VirtualDisk01
UUID : 1728ebed:ad0b0000:faad83b7:37070000
Events : 173
Number Major Minor RaidDevice State
0 259 0 0 active sync /dev/nvme0n1
1 259 1 1 active sync /dev/nvme1n1
Список массивов
mdadm --detail --scan --verbose
Пример:
root@ch01:~# mdadm --detail --scan --verbose
ARRAY /dev/md/VirtualDisk01 level=raid1 num-devices=2 metadata=1.2 name=VirtualDisk01 UUID=1728ebed:ad0b0000:faad83b7:37070000
devices=/dev/nvme0n1,/dev/nvme1n1
Создание файловой системы
Файловую систему в массиве можно создать с помощью mkfs, например:
mkfs.ext4 -m 0 /dev/md0
Для лучшей производительности файловой системы имеет смысл указывать при её создании количество дисков в рейде и количество блоков файловой системы, которое может поместиться в один страйп (chunk), это касается массивов уровня RAID0, RAID5 ,RAID6 ,RAID10. Для RAID1 (mirror) это не имеет значения так как запись идет всегда на один device, a в других типах массивов данные записываются последовательно на разные диски порциями, соответствующими размеру stripe. Например, если мы используем RAID5 из 3 дисков с дефолтным размером страйпа в 64К и файловую систему ext3 с размером блока в 4К то можно вызывать команду mkfs.ext3 так:
mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/md0
stripe-width обычно рассчитывается как
stride * N
где N — это диски с данными в массиве, например, в RAID5 два диска с данными и один parity для контрольных сумм. Для файловой системы XFS нужно указывать не количество блоков файловой системы, соответствующих размеру stripe в массиве, а размер самого страйпа:
mkfs.xfs -d su=64k,sw=3 /dev/md0
Создание mdadm.conf
Операционная система не запоминает какие RAID-массивы ей нужно создать и какие диски в них входят. Эта информация содержится в файле mdadm.conf.
mkdir /etc/mdadm
echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
mdadm --detail --scan | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf
В интернете советуют применять команду mdadm --detail --scan --verbose, но я не рекомендую, т.к. она пишет в конфигурационный файл названия разделов, а они в некоторых случаях могут измениться, тогда RAID-массив не соберётся. А mdadm --detail --scan записывает UUID разделов, которые не изменятся.
Проверка целостности массива
echo 'check' >/sys/block/md0/md/sync_action
Есть ли ошибки в процессе проверки программного RAID-массива по команде check или repair:
cat /sys/block/md0/md/mismatch_cnt
Работа с дисками
Диск в массиве можно условно сделать сбойным с помощью ключа --fail (-f):
mdadm /dev/md0 --fail /dev/nvme0n1
mdadm /dev/md0 -f /dev/nvme0n1
Удалить из массива отказавший диск:
mdadm /dev/md0 --remove /dev/nvme0n1
mdadm /dev/md0 -r /dev/nvme0n1
Добавить в массив заменённый диск:
mdadm /dev/md0 --add /dev/nvme0n1
mdadm /dev/md0 -a /dev/nvme0n1
Сборка существующего массива
Собрать существующий массив можно с помощью mdadm --assemble:
mdadm --assemble /dev/md0 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1
mdadm --assemble --scan
Расширение массива
Расширить массив можно с помощью ключа --grow (-G). Сначала добавляется диск, а потом массив расширяется:
mdadm /dev/md0 --add /dev/nvme3n1
Проверяем, что диск добавился:
mdadm --detail /dev/md0
cat /proc/mdstat
Если диск добавился, расширяем массив:
mdadm -G /dev/md0 --raid-devices=4
Опция --raid-devices указывает новое количество дисков в массиве с учётом добавленного. Рекомендуется задать файл бэкапа на случай прерывания перестроения массива, например, добавить опцию:
--backup-file=/var/backup
При необходимости, можно регулировать скорость процесса расширения массива, указав нужное значение в файлах:
- /proc/sys/dev/raid/speed_limit_min
- /proc/sys/dev/raid/speed_limit_max
Убедитесь, что массив расширился:
cat /proc/mdstat
Нужно обновить конфигурационный файл с учётом сделанных изменений:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Возобновление отложенной синхронизации resync=PENDING
Если синхронизации массива отложена, состояние массива resync=PENDING, то синхронизацию можно возобновить:
echo idle > /sys/block/md0/md/sync_action
или
mdadm --readwrite /dev/md0
Переименовать массив
Останавливаем массив:
umount /dev/md0
mdadm --stop /dev/md0
Собираем массив с новым именем:
mdadm --assemble /dev/md3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 --update=name
Или для старых версий:
mdadm –assemble /dev/md3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 –update=super-minor
Удаление массива
Останавливаем массив:
umount /dev/md0
mdadm --stop /dev/md0
Затем необходимо затереть superblock каждого из составляющих массива:
mdadm --zero-superblock --force /dev/nvme0n1
mdadm --zero-superblock --force /dev/nvme1n1
mdadm --zero-superblock --force /dev/nvme2n1
Или с помощью dd:
dd if=/dev/zero of=/dev/nvme0n1 bs=512 count=1
dd if=/dev/zero of=/dev/nvme1n1 bs=512 count=1
dd if=/dev/zero of=/dev/nvme2n1 bs=512 count=1