ГлавнаяСтатьиПроект YvixSlideCraft

Программный RAID в Linux: mdadm и /proc/mdstat

Программный RAID в Linux собирает из обычных дисков массив средствами ядра — без аппаратного контроллера. Управляет им подсистема md (multiple devices), а администрирует — утилита mdadm. Состояние массива удобно смотреть в псевдофайле /proc/mdstat.

Уровни RAID

Для простоты дальше работаем с RAID 1 на двух дисках — это самый частый сценарий для загрузочного тома или сервера.

Что понадобится

apt install mdadm   # Debian/Ubuntu
dnf install mdadm   # Fedora/RHEL

Диски sdb и sdc отдаём под массив целиком. Перед этим стоит убедиться, что на них нет нужных данных и нет старых признаков RAID:

mdadm --zero-superblock /dev/sdb /dev/sdc

Шаг 1. Создаём массив

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

Параметры:

Смотрим, что получилось:

cat /proc/mdstat

Вывод примерно такой:

Personalities : [raid1]
md0 : active raid1 sdc[1] sdb[0]
      976630464 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

Шаг 2. Сохраняем конфигурацию

Чтобы система при загрузке сама собрала массив, пропишем его в /etc/mdadm/mdadm.conf:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

Подробную информацию о массиве показывает:

mdadm --detail /dev/md0

Шаг 3. Создаём файловую систему и монтируем

mkfs.ext4 /dev/md0
mkdir -p /mnt/data
mount /dev/md0 /mnt/data

В /etc/fstab лучше прописать по UUID, а не по имени устройства:

blkid /dev/md0

Запись в /etc/fstab:

UUID=<uuid-массива>  /mnt/data  ext4  defaults,noatime  0  2

Проверить перед перезагрузкой:

mount -a
df -h /mnt/data

Шаг 4. Следим за состоянием

/proc/mdstat — главный источник правды о состоянии массива:

watch -n 1 cat /proc/mdstat

Во время первичной синхронизации или восстановления вывод выглядит иначе:

md0 : active raid1 sdc[1] sdb[0]
      976630464 blocks super 1.2 [2/1] [_U]
      [=>...................]  recovery = 12.3% (120123456/976630464) finish=42.1min speed=123456K/sec

Фоновую проверку целостности можно запустить вручную:

echo check > /sys/block/md0/md/sync_action

Прогресс снова смотрим в /proc/mdstat, а результат — командой:

cat /sys/block/md0/md/mismatch_cnt

Ненулевое значение означает расхождения между дисками.

Шаг 5. Замена вышедшего из строя диска

Допустим, sdb умер. Сначала смотрим, что система видит неисправность:

cat /proc/mdstat
mdadm --detail /dev/md0

Помечаем диск как сбойный и убираем его из массива:

mdadm --manage /dev/md0 --fail /dev/sdb
mdadm --manage /dev/md0 --remove /dev/sdb

Физически меняем диск. Новый диск должен быть не меньше старого. Если система не дала ему то же имя /dev/sdb, посмотрите lsblk. Добавляем новый диск:

mdadm --add /dev/md0 /dev/sdb

Начинается ребилд — наблюдаем:

cat /proc/mdstat

До окончания ребилда массив деградирован, так что второй диск в этот момент критически важен. После завершения вывод снова покажет [2/2] [UU].

Шаг 6. Ручная сборка

Если массив почему-то не собрался автоматически (например, система загрузилась с live-носителя), его можно собрать вручную:

mdadm --assemble --scan

Или явно:

mdadm --assemble /dev/md0 /dev/sdb /dev/sdc

Посмотреть, какие массивы известны системе, можно так:

mdadm --detail --scan

Полезные команды

cat /proc/mdstat                            # состояние всех массивов
mdadm --detail /dev/md0                     # подробности по массиву
mdadm --manage /dev/md0 --add /dev/sdd      # добавить диск
mdadm --manage /dev/md0 --fail /dev/sdc     # пометить диск сбойным
echo check > /sys/block/md0/md/sync_action  # запустить проверку

Замечания

Заключение

mdadm + /proc/mdstat дают простой и предсказуемый способ собрать программный RAID и держать его под контролем. Для зеркала на двух дисках этого хватает с головой, а для больших массивов добавляется только регулярная проверка чётности.