Заміна диска в 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. - Завантажувач на новому диску ставлять вручну і перевіряють до закриття задачі.