Программный RAID в Linux: mdadm и /proc/mdstat
Программный RAID в Linux собирает из обычных дисков массив средствами ядра — без аппаратного контроллера. Управляет им подсистема md (multiple devices), а администрирует — утилита mdadm. Состояние массива удобно смотреть в псевдофайле /proc/mdstat.
Уровни RAID
- RAID 0 (striping) — скорость X2, но без отказоустойчивости. Выход любого диска = потеря всех данных.
- RAID 1 (mirroring) — зеркало, данные дублируются на все диски. Теряем половину ёмкости, но переживаем отказ одного диска.
- RAID 5 — чередование с распределённой чётностью, нужен минимум 3 диска. Переживает отказ одного диска. Восстановление замедляется при интенсивной записи на массив.
- RAID 6 — как RAID 5, но две контрольные суммы, минимум 4 диска. Переживает отказ двух дисков.
- RAID 10 — зеркало из страйпов (или наоборот), нужен минимум 4 диска. Высокая скорость и надёжность.
Для простоты дальше работаем с 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
Параметры:
--create /dev/md0— имя нового устройства.--level=1— уровень RAID.--raid-devices=2— сколько дисков в массиве.- дальше — сами диски (или разделы, например
/dev/sdb1).
Смотрим, что получилось:
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/2]— оба диска на месте из двух.[UU]— оба дискаUp(рабочие). Если увидите_, значит диск отсутствует или неисправен.
Шаг 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
[2/1]— работает один диск из двух (массив в деградированном состоянии).[_U]— первый диск_(нет), второйU(работает).recovery = 12.3%— прогресс пересборки, с прогнозомfinishи скоростьюspeed.
Фоновую проверку целостности можно запустить вручную:
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 # запустить проверку
Замечания
- RAID — это не резервная копия. От случайного удаления файлов или пожара он не спасает, только от отказа дисков.
- Для RAID 5/6 важен «скраб» (проверка чётности) — запускайте
checkрегулярно, например по cron. - При замене диска в RAID 5/6 массив остаётся без запаса прочности на всё время ребилда, поэтому тяните с заменой как можно меньше.
Заключение
mdadm + /proc/mdstat дают простой и предсказуемый способ собрать программный RAID и держать его под контролем. Для зеркала на двух дисках этого хватает с головой, а для больших массивов добавляется только регулярная проверка чётности.