Замена диска в RAID-массиве без остановки сервера
Порядок такой: найти сбойный накопитель и его серийный номер, пометить его как faulty и вывести из массива, попросить дата-центр заменить диск в корзине, скопировать на новый диск таблицу разделов, добавить разделы в массив и дождаться ребилда. Сервер при этом не выключается, если корзина поддерживает горячую замену, а массив избыточный.
- Перед заявкой в дата-центр зафиксируйте серийный номер диска: слоты в корзине не совпадают с именами
/dev/sdX. - Новый накопитель добавляют не целиком, а разделами — с той же разметкой, что на уцелевшем диске.
- После ребилда загрузочного массива обязательно ставят загрузчик на новый диск, иначе сервер не поднимется при следующем отказе.
- На аппаратном контроллере всё то же самое делает
storcli, а разметка копируется контроллером автоматически.
Шаг 1. Найти диск и снять серийный номер
В /proc/mdstat выпавший накопитель помечен символом подчёркивания вместо U и суффиксом (F). Имя устройства после перезагрузки может измениться, поэтому опорная величина — серийный номер.
# состояние массивов
cat /proc/mdstat
mdadm --detail /dev/md0 2>&1 | grep -E 'State|Number|Failed|removed'
# серийные номера и модели всех дисков
lsblk -o NAME,SIZE,SERIAL,MODEL
smartctl -i /dev/sdb 2>&1 | grep -E 'Serial|Device Model'
Если диск ещё жив, но уже сыплется, вы увидите это по атрибутам SMART до того, как массив его выбросит; как их читать, описано в статье про SMART-диагностику дисков сервера.
Шаг 2. Вывести диск из массива
Массив сам помечает диск сбойным при ошибке записи, но при плановой замене это делают руками. Диск выводят из каждого массива, в котором участвуют его разделы.
# пометить сбойным и убрать из массива
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md0 --remove /dev/sdb1
# если разделов несколько, повторить для каждого массива
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md1 --remove /dev/sdb2
# стереть метаданные, чтобы диск не пытался вернуться в массив
mdadm --zero-superblock /dev/sdb1
Шаг 3. Физическая замена
На выделенных серверах ZevsHost накопитель меняет дежурная смена площадки по заявке. В заявке указывайте модель, серийный номер выведенного диска и подтверждение, что он уже удалён из массива программно. Инженеру нужно понимать, какой именно диск вынимать: имена /dev/sdX ему не видны.
Шаг 4. Разметить новый диск
Новый накопитель приходит пустым. Разметку копируют с уцелевшего диска: для GPT — утилитой sgdisk, для MBR — через sfdisk. После копирования GPT новому диску обязательно выдают собственный GUID, иначе система увидит два диска с одинаковым идентификатором.
# узнать тип таблицы разделов
fdisk -l /dev/sda 2>&1 | grep -i 'Disklabel type'
# GPT: копия разметки sda -> sdb и новый GUID
sgdisk --replicate=/dev/sdb /dev/sda
sgdisk --randomize-guids /dev/sdb
# MBR: копия разметки
sfdisk -d /dev/sda | sfdisk /dev/sdb
Шаг 5. Вернуть диск в массив и дождаться ребилда
# добавить разделы в соответствующие массивы
mdadm --manage /dev/md0 --add /dev/sdb1
mdadm --manage /dev/md1 --add /dev/sdb2
# следить за прогрессом
cat /proc/mdstat
mdadm --detail /dev/md0 2>&1 | grep -E 'Rebuild Status|State'
# поднять скорость ребилда на время окна (KB/s)
echo 50000 > /proc/sys/dev/raid/speed_limit_min
echo 400000 > /proc/sys/dev/raid/speed_limit_max
Время восстановления зависит от типа накопителя и уровня массива. Ниже — ориентиры для диска на 1 TB при умеренной нагрузке; подробности про сами уровни собраны в статье про RAID 0, 1, 5 и 10.
| Конфигурация | Что делает система | Ориентир по времени | Риск в окне |
|---|---|---|---|
| RAID 1, 2×NVMe 1 TB | копирует содержимое зеркала | десятки минут | отказ второго диска |
| RAID 10, 4×NVMe 1 TB | копирует одну пару | десятки минут | отказ парного диска |
| RAID 5, 6×HDD | читает все диски и считает чётность | от 10 часов | второй отказ и ошибки чтения |
Шаг 6. Загрузчик на новом диске
Массив не содержит загрузочного сектора: он живёт вне разделов md. Новый диск после ребилда хранит данные, но загрузиться с него система не сможет, пока вы не поставите загрузчик руками.
# BIOS-режим, Debian/Ubuntu
grub-install /dev/sdb
update-grub
# BIOS-режим, RHEL, AlmaLinux, Rocky
grub2-install /dev/sdb
grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI: скопировать раздел ESP на новый диск
dd if=/dev/sda1 of=/dev/sdb1 bs=1M status=progress
efibootmgr -v
Две ошибки на этом шаге стоят простоя. Первая — добавить в массив весь диск (/dev/sdb) вместо раздела: массив соберётся, но разметки на диске не будет, и сервер с него не стартует. Вторая — не поставить загрузчик: пока жив первый диск, всё работает, а при его отказе машина уходит в «no bootable device». Проверяйте результат до того, как закроете задачу: cat /proc/mdstat показывает все устройства как [UU] без символов подчёркивания и без строки recovery, lsblk показывает на новом диске те же разделы, что на старом, а efibootmgr -v или grub-install отработали без ошибок. Реализацию массива, если она аппаратная, проверяют через утилиту контроллера.
Коротко
- Сначала серийный номер, потом заявка: по
/dev/sdXинженер диск не найдёт. - Диск выводят из каждого массива, где были его разделы, и обнуляют суперблок.
- Разметку копируют с уцелевшего диска, для GPT дополнительно меняют GUID.
- Ребилд стартует сразу после
--add; скорость регулируется параметрамиspeed_limit. - Загрузчик на новом диске ставят вручную и проверяют до закрытия задачи.