Диски умирают. Не вопрос «если», а вопрос «когда», и обычно это случается в пятницу вечером. Программный RAID не отменяет резервные копии, но позволяет пережить отказ одного диска без остановки сервиса и без восстановления из бэкапа. В Linux за это отвечает подсистема md и утилита mdadm. Никакого дорогого контроллера не нужно: подойдут обычные диски и пара команд. В этой статье мы соберём зеркало RAID1 на srv-db01 из домена itpages.lab.local, затем RAID5 для файлового хранилища на srv-linux01, настроим уведомления и пройдём весь сценарий замены отказавшего диска.

Коротко об уровнях, которые встречаются чаще всего. RAID0 — чередование без избыточности: быстро, но отказ любого диска убивает всё. RAID1 — зеркало: данные пишутся на два диска, полезная ёмкость равна одному диску. RAID5 — чередование с распределённой чётностью: нужно минимум три диска, ёмкость n-1, переживается отказ одного диска. RAID6 похож на RAID5, но с двумя блоками чётности, нужно минимум четыре диска, переживается отказ двух. RAID10 — зеркала, объединённые в чередование: быстро и надёжно, но половина места уходит на избыточность. Для баз данных на srv-db01 обычно берут RAID1 или RAID10, для объёмных хранилищ — RAID5 или RAID6.

Шаг 1. Установка и подготовка дисков

Ставим mdadm и смотрим, какие диски доступны:

sudo apt install mdadm      # Debian/Ubuntu
sudo dnf install mdadm      # RHEL/Rocky

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
NAME   SIZE TYPE MOUNTPOINT
sda     40G disk
├─sda1   1G part /boot
└─sda2  39G part /
sdb     20G disk
sdc     20G disk
sdd     20G disk
sde     20G disk

Диски sdb и sdc пойдут под зеркало, sdd и sde вместе с ещё одним позже станут частью массива RAID5. Если на дисках раньше были данные или чужие метаданные RAID, очисти их, иначе mdadm начнёт задавать вопросы:

sudo mdadm --zero-superblock /dev/sdb /dev/sdc
sudo wipefs -a /dev/sdb /dev/sdc

Опытные администраторы советуют не использовать диски целиком, а создавать на каждом один раздел чуть меньшего размера. Причина проста: диски одной модели иногда отличаются на несколько секторов, и при замене может оказаться, что новый диск чуть меньше старого. Раздел с запасом в пару сотен мегабайт решает эту проблему. В нашем лабораторном примере мы для краткости берём диски целиком, но в продакшене лучше сделать разделы.

Шаг 2. Создание зеркала RAID1

Создаём массив /dev/md0 из двух дисков:

sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.
Continue creating array? y
mdadm: array /dev/md0 started.

Сразу после создания начинается первичная синхронизация. Следить за ней можно через /proc/mdstat:

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc[1] sdb[0]
      20954112 blocks super 1.2 [2/2] [UU]
      [=====>...............]  resync = 28.4% (5958272/20954112) finish=3.1min speed=80412K/sec

Самое важное здесь — запись [UU]. Каждая буква U означает работающий диск. Если вместо одной появится подчёркивание, например [U_], значит один из дисков выпал, и массив работает в деградированном режиме. Пользоваться массивом можно уже во время синхронизации, но нагрузка в этот период замедлит и синхронизацию, и приложения.

Теперь файловая система и монтирование. Для базы данных на srv-db01 подойдёт XFS или ext4:

sudo mkfs.ext4 /dev/md0
sudo mkdir -p /var/lib/pgdata
sudo mount /dev/md0 /var/lib/pgdata
sudo blkid /dev/md0
/dev/md0: UUID=7c1e5b42-9a0d-4f3c-8a77-0b6a2d1e9f10 TYPE=ext4

В fstab записывай UUID, а не имя /dev/md0: при перезагрузке система иногда называет массивы по-другому, например md127.

echo 'UUID=7c1e5b42-9a0d-4f3c-8a77-0b6a2d1e9f10 /var/lib/pgdata ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab

Шаг 3. Сохранение конфигурации массива

Чтобы массив собирался при загрузке под тем же именем, сохрани его описание в конфигурацию mdadm и обнови initramfs:

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=srv-db01:0 UUID=a1b2c3d4:e5f60718:293a4b5c:6d7e8f90

sudo update-initramfs -u      # Debian/Ubuntu
sudo dracut -f                # RHEL/Rocky

На RHEL-подобных системах путь к файлу — /etc/mdadm.conf. Если этот шаг пропустить, массив, скорее всего, соберётся и так (автосборка по метаданным работает), но имя может оказаться неожиданным, и твой fstab перестанет совпадать с реальностью. Лучше сделать это сразу.

Шаг 4. RAID5 для файлового хранилища

На srv-linux01 понадобится ёмкое хранилище с защитой от отказа диска. Добавим три диска sdb, sdc и sdd, а один горячий запасной sde. Запасной диск автоматически включится в массив, как только основной откажет:

sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd /dev/sde

sudo mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Tue Oct 13 10:12:41 2026
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
      Raid Devices : 3
     Total Devices : 4
             State : clean
    Active Devices : 3
   Working Devices : 4
    Spare Devices : 1

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        -      spare   /dev/sde

Три диска по 20 ГБ дают около 40 ГБ полезного места, один диск уходит на чётность. Обрати внимание на строку State: clean означает, что всё в порядке. Статус clean, degraded или resyncing — первое, на что нужно смотреть при любой диагностике. Так же полезно знать, что для RAID5 на больших дисках восстановление занимает часы, и всё это время массив уязвим к отказу второго диска. Для дисков от нескольких терабайт обдумай RAID6.

Шаг 5. Мониторинг и уведомления

RAID без мониторинга — самая частая причина потери данных: один диск умер, никто не заметил, через месяц умер второй. mdadm умеет следить за массивами сам и отправлять письма. Укажи адрес в mdadm.conf:

echo 'MAILADDR admin@itpages.lab.local' | sudo tee -a /etc/mdadm/mdadm.conf
sudo systemctl enable --now mdmonitor      # RHEL: mdmonitor, Debian: mdadm

# проверка доставки: тестовое сообщение по всем массивам
sudo mdadm --monitor --scan --test --oneshot

Если почта на сервере не настроена, письма никуда не уйдут, поэтому проверь исходящую почту отдельно (например, через релей на 192.168.10.5). Кроме писем, добавь в систему мониторинга проверку строки в /proc/mdstat: наличие символа подчёркивания внутри квадратных скобок означает проблему. Простейший вариант для cron или агента мониторинга:

grep -E '\[[U_]*_[U_]*\]' /proc/mdstat && echo DEGRADED || echo OK

Раз в месяц запускай плановую проверку целостности. Она читает все блоки и находит скрытые ошибки на дисках, пока они не превратились в проблему при восстановлении. В Debian и Ubuntu такая задача уже есть в cron (checkarray), в RHEL её нужно включить таймером. Вручную проверка запускается так:

echo check | sudo tee /sys/block/md1/md/sync_action
cat /sys/block/md1/md/mismatch_cnt
0

Ненулевое значение mismatch_cnt — повод насторожиться и посмотреть SMART-показатели дисков командой smartctl -a /dev/sdX.

Шаг 6. Замена отказавшего диска

Теперь главный сценарий. Приходит письмо, что на srv-db01 в массиве md0 вышел из строя диск. Смотрим состояние:

cat /proc/mdstat
md0 : active raid1 sdc[1] sdb[0](F)
      20954112 blocks super 1.2 [2/1] [_U]

Флаг (F) рядом с sdb означает failed. Порядок действий такой. Сначала, если диск ещё числится рабочим, помечаем его сбойным вручную, затем извлекаем из массива:

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

Затем физически (или в гипервизоре) меняем диск. Убедись, что ты вынимаешь именно тот диск: сверь серийный номер через smartctl -i /dev/sdb или lsblk -o NAME,SERIAL. Перепутать диски в такой момент — классическая ошибка, которая превращает деградированный массив в потерянный. Когда новый диск появился как /dev/sdb, копируем таблицу разделов (если использовали разделы) и добавляем диск в массив:

sudo sfdisk -d /dev/sdc | sudo sfdisk /dev/sdb    # только если используются разделы
sudo mdadm /dev/md0 --add /dev/sdb
mdadm: added /dev/sdb

cat /proc/mdstat
md0 : active raid1 sdb[2] sdc[1]
      20954112 blocks super 1.2 [2/1] [_U]
      [==>..................]  recovery = 12.3% (2577408/20954112) finish=4.5min speed=68000K/sec

Пока идёт восстановление, база продолжает работать. После завершения вернётся состояние [UU]. Если в массиве было загрузочное зеркало, не забудь переустановить загрузчик на новый диск (grub-install /dev/sdb), иначе при отказе второго диска сервер не загрузится.

Шаг 7. Расширение массива и сценарии восстановления

Массив можно наращивать. Допустим, места на RAID5 из трёх дисков не хватает, и в srv-linux01 добавили четвёртый диск. Его сначала добавляют как запасной, а затем увеличивают число активных устройств; mdadm перестроит данные в фоне:

sudo mdadm /dev/md1 --add /dev/sdf
sudo mdadm --grow /dev/md1 --raid-devices=4
mdadm: Need to backup 3072K of critical section..

cat /proc/mdstat
md1 : active raid5 sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      [>....................]  reshape =  2.1% (440320/20954112) finish=48.2min

Реорганизация (reshape) длится долго и сильно нагружает диски, поэтому проводи её в тихое время и обязательно после свежей резервной копии. Когда она закончится, останется увеличить файловую систему: resize2fs /dev/md1 для ext4 или xfs_growfs для XFS. Если поверх массива работает LVM, сначала выполни pvresize /dev/md1, затем расширяй тома обычным образом.

Теперь о неприятном: массив не собирается после сбоя. Не паникуй и не пересоздавай его командой —create поверх старого, потому что это самый верный способ потерять данные. Сначала посмотри метаданные дисков командой mdadm —examine /dev/sd[b-e]: счётчик событий (Events) у дисков покажет, кто отстал. Затем попробуй обычную сборку mdadm —assemble —scan, а если один диск слегка отстал, добавь —force. Только после успешной сборки и проверки данных разбирайся, почему диск выпал.

Если диск выходит из строя не сразу, а периодически, проверь кабели, питание и SMART. Команда smartctl -a покажет счётчики Reallocated_Sector_Ct и Current_Pending_Sector: рост этих значений говорит, что диск скоро откажет, и его лучше заменить заранее, не дожидаясь аварии. Хорошо работает такая практика: раз в неделю собирать краткую сводку по всем дискам и массивам в один отчёт и отправлять её в почту команды, чтобы тревожные признаки не терялись.

Частые ошибки и как их избежать

  • Считать RAID резервной копией. RAID защищает от отказа диска, но не от удаления файлов, шифровальщика или ошибки администратора: ошибочное удаление мгновенно реплицируется на все диски. Параллельно с RAID настрой отдельное резервное копирование на другой хост, например на srv-linux01.
  • Не настроить мониторинг. Деградированный массив молча работает неделями, пока не выйдет из строя второй диск. Проверь MAILADDR, проверь отправку тестовым письмом и добавь проверку /proc/mdstat в мониторинг.
  • Брать диски одной партии и не держать запас. Диски одной серии часто умирают с интервалом в недели, а долгое восстановление RAID5 нагружает оставшиеся диски. Старайся смешивать партии, держи горячий запасной диск и проверяй SMART-показатели заранее.

Что дальше

Администрирование Linux — это набор связанных навыков, вот соседние темы серии: