Mdadm – утилита Linux, позволяющая создавать и управлять софтварными Raid-массивами дисков (md – multiple devices). Что такое raid и для чего он нужен я писал давным давно.
Сейчас мы замутим программный рейд на Linux-машине. Делать будем “зеркало” (raid1).
План:
- Создаём рейд-массив;
- Делаем автомонтирование;
- Проверяем отказоустойчивость;
Сперва добавим к нашей виртуальной машине два дополнительных диска. Перейдём в настройки, откроем раздел “Носители”, добавим новый диск в раздел “Контроллер: SATA”. Объем небольшой, по 2 гигабайта хватит.

Получилось как-то так:

Запускаем виртуальную машину.
В системе появились два новых устройства /dev/sdb и /dev/sdc
Разделов на них нет. Создадим разделы на обоих, выделив всё свободное место и сменив тип файловой системы на fd – Linux raid autodetect:
Подобные операции мы проделали и с /dev/sdb и с /dev/sdc. Итак, у нас есть /dev/sdb1 и /dev/sdc1 разделы.
Создадим программное зеркало:
# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
Указали создать новое устройство /dev/md0, из двух устройств sdb1 и sdc1 в уровень 1 (raid1).

Готово! Создали рейд. Теперь нам нужно сделать автосоздание рейда при запуске, автомонтирование каталога и проверить отказоустойчивость.
Допишем в файл /etc/fstab запись, чтобы устройство монтировалось в каталог /raid. Не забудем эту папочку создать командой
# mkdir /raid

Ну попутно ещё создадим файловую систему на устройстве:
# mkfs.ext3 /dev/md0

Автосоздание рейда при запуске описывается в конфигурационном файле /etc/mdadm/mdadm.conf, содержимое которого выглядит так:
Строка “DEVICE partitions“, а затем вывод команды # mdadm --detail --scan
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

итак, файл выглядит вот так:

Готово! Перезагружаемся!
# reboot
Сейчас мы заполним данными диск. Я просто скопировал файлы из каталога /etc/ в каталог /raid/, в который у нас примонтировано наше устройство /dev/md0
# cp /etc/* /raid/

Готово. Сейчас мы будем имитировать нештатную ситуацию – выход из строя одного из дисков:
Пометим диск как сбойный (кстати, удалить раздел из рейда без пометки его как сбойного может не получиться):
# mdadm /dev/md0 -f /dev/sdc1

Теперь raid работает на одном диске, в чём легко убедиться:
# mdadm -D /dev/md0

Появилась строка faulty spare /dev/sdc1… А статус массива degraded. Вот, в общем-то и имитация сбоя. На практике это произойдёт автоматически, не надо будет помечать диск как фейловый (ключ -f).
Удалим раздел /dev/sdc1 из массива и занулим его:
# mdadm /dev/md0 -r /dev/sdc1
# dd if=/dev/zero of=/dev/sdc

Теперь у нас имеется “битое зеркало”, которое дышит благодаря одному лишь диску /dev/sdb1, в чём нетрудно убедиться. Данные на месте.
Далее, по нашей симуляции, мы установим “чистый диск”, коим у нас будет являться /dev/sdc (он и правда чист, мы его занулили).
Теперь нужно воссоздать разметку диска. Можно это делать вручную fdisk-ом. А можно воспользоваться sfdisk, если диски одного размера.
# sfdisk -d /dev/sdb | sfdisk /dev/sdc

Таким образом мы скопируем разметку, то есть разделы, начало, конец и количество блоков. И тип файловой системы. Всё, что нам нужно.
Когда процедура будет завершена, добавим в наш рейд /dev/sdc1 и дождёмся окончания синхронизации:
# mdadm /dev/md0 -a /dev/sdc1
А посмотреть состояние синхронизации можно в файле /proc/mdstat
# cat /proc/mdstat

Как видим, происходит восстановление…
Если выполнить команду
# mdadm -D /dev/md0
то увидим, что и тут идёт ребилдинг (синхронизация)

Когда синхронизация завершена – оба диска работает нормально! Данные на месте!

Вот так мы и рассмотрели работу зеркала. Аналогично можно создать и raid5, на трёх дисках, к примеру. Там избыточность будет меньше.
Наблюдать за пересборкой массива удобно при помощи утилиты watch
# watch -n 1 cat /proc/mdstat