Заміна несправного диска в корені ZFS
Цей посібник пояснює, як замінити несправний диск у дзеркальному (mirror) пулі ZFS у Linux. Процедура охоплює переведення диска в автономний режим, копіювання таблиці розділів на диск-заміну, повторне додавання диска до пулу та встановлення завантажувача після завершення resilvering.
Передумови
Потрібні права root. У наведених нижче прикладах передбачається, що сервер має два диски: /dev/sda (справний) і /dev/sdb (несправний). За потреби замініть назви пристроїв відповідно до вашої конфігурації.
Перед початком створіть резервну копію всіх важливих даних. Заміна кореневого диска — операція з високим ризиком. Помилка на будь-якому етапі може призвести до втрати даних або неможливості завантаження системи. Не використовуйте імена пристроїв на кшталт /dev/sdX у командах ZFS. Після перезавантаження імена пристроїв можуть змінитися. Натомість використовуйте стабільні ідентифікатори, наприклад /dev/disk/by-id/. У наведених нижче прикладах /dev/sdX використовується для простоти під час роботи з інструментами розділення дисків. У командах ZFS завжди слід використовувати /dev/disk/by-id/.
Крок 1: Перевірте стан пулу
Перш ніж вносити будь-які зміни, перевірте поточний стан пулу:
zpool status -v
У виведених даних буде зазначено, який диск несправний, а також його ідентифікатор у пулі.
Крок 2: Переведіть несправний диск в автономний режим
Якщо диск має статус ONLINE, але працює з помилками, переведіть його в автономний режим перед фізичною заміною:
zpool offline rpool <failed-device>
ZFS припинить спроби використовувати несправний диск перед його фізичною заміною. Замініть <failed-device> ідентифікатором, показаним командою zpool status -v. Якщо диск уже має статус FAULTED або REMOVED, пропустіть цей крок і перейдіть безпосередньо до кроку 3.
Крок 3: Фізично замініть диск
Якщо ваш сервер підтримує гарячу заміну (hot swap), диск можна замінити без вимкнення системи.
В іншому випадку вимкніть систему:
poweroff
Після встановлення диска-замінника завантажте сервер і переконайтеся, що новий диск розпізнається:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
У наступних кроках використовуйте ідентифікатор by-id нового диска.
Крок 4: Визначте тип таблиці розділів
Якщо gdisk ще не встановлено, встановіть його:
apt install gdisk -y
Перевірте тип таблиці розділів на справному диску:
gdisk -l /dev/sda
У виведених даних знайдіть розділ Partition table scan. Для MBR буде показано MBR: MBR only і GPT: not present. Для GPT буде показано MBR: protective і GPT: present.
Крок 5: Підготуйте та скопіюйте таблицю розділів на новий диск
Більшість конфігурацій із кореневою файловою системою ZFS використовують розмітку GPT. Метод MBR наведено для застарілих систем.
GPT
Перед продовженням визначте ім'я /dev/sdX, яке відповідає новому диску, оскільки воно потрібне інструментам розділення:
lsblk -o NAME,SIZE,MODEL,SERIAL
Перед копіюванням таблиці розділів видаліть старі сигнатури з диска-замінника:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a безповоротно видаляє всі сигнатури файлових систем і розділів із диска. Перед виконанням цієї команди переконайтеся, що вказано правильний ідентифікатор диска.
Наступна команда копіює таблицю розділів із /dev/sda (джерело) на /dev/sdb (призначення):
sgdisk -R /dev/sdb /dev/sda
У команді sgdisk -R перший аргумент — диск призначення, а другий — вихідний диск. Якщо поміняти аргументи місцями, таблиця розділів на справному диску буде перезаписана.
Якщо диск-замінник більший за оригінальний, розширте GPT, щоб використати весь доступний обсяг:
sgdisk -e /dev/sdb
Потім призначте диску-заміннику новий унікальний UUID:
sgdisk -G /dev/sdb
sgdisk -G призначає нові UUID усім розділам на диску-заміннику. Якщо /etc/fstab містить записи на основі UUID для будь-якого з цих розділів, система може не завантажитися. Після завершення resilvering перевірте, що /etc/fstab використовує ідентифікатори /dev/disk/by-id/, а не UUID.
Перезавантажте таблицю розділів, щоб ядро розпізнало нову структуру:
udevadm trigger udevadm settle
Якщо диск-замінник раніше використовувався в іншому пулі ZFS, очистіть старі метадані ZFS, щоб уникнути конфліктів:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Замініть <new-disk-partX> фактичним ідентифікатором розділу ZFS.
MBR
Наступна команда копіює таблицю розділів із /dev/sda (джерело) на /dev/sdb (призначення):
sfdisk -d /dev/sda | sfdisk /dev/sdb
Якщо після копіювання нові розділи не відображаються в системі, перезавантажте таблицю розділів:
udevadm trigger udevadm settle
Крок 6: Додайте диск до пулу
Замініть запис несправного диска в пулі на новий диск. Спочатку перевірте точний ідентифікатор несправного диска, який відображається в пулі:
zpool status rpool
У виведених даних знайдіть запис несправного диска у списку пристроїв пулу. Він відображатиметься як повний шлях, наприклад /dev/disk/by-id/ata-WDC_WD10_12345-part3, зі статусом FAULTED, UNAVAIL або OFFLINE. Використайте цей шлях як <old-device> у команді replace:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Замініть <old-device> ідентифікатором несправного диска з попереднього кроку. Замініть <new-disk-part> ідентифікатором by-id розділу нового диска, використовуючи той самий номер розділу, що й на справному диску, наприклад -part3 або -part4. Щоб знайти правильний ідентифікатор, виконайте ls -l /dev/disk/by-id/.
Якщо старий диск повністю недоступний (UNAVAIL), а zpool replace повертає помилку, додайте параметр -f, щоб примусово виконати заміну:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Після виконання zpool replace переконайтеся, що resilvering розпочався, а новий диск відображається як ONLINE:
zpool status
Resilvering автоматично продовжуватиметься у фоновому режимі.
Крок 7: Контролюйте resilvering
Слідкуйте за прогресом resilvering за допомогою:
zpool status -v
У виведених даних відображаються прогрес, швидкість і приблизний час, що залишився. Перш ніж продовжувати, дочекайтеся стану state: ONLINE та завершення resilvering. Залежно від обсягу диска це може тривати кілька годин.
Крок 8: Перевірте завантажувальний dataset
Перед встановленням завантажувача переконайтеся, що для пулу налаштовано правильний завантажувальний dataset:
zpool get bootfs rpool
У виведених даних має відображатися шлях до dataset, наприклад rpool/ROOT/debian. Якщо значення дорівнює none або вказує на неправильний dataset, встановіть його вручну:
zpool set bootfs=rpool/ROOT/debian rpool
Замініть rpool/ROOT/debian фактичною назвою кореневого dataset у вашій системі. Щоб переглянути доступні dataset, виконайте zfs list.
Крок 9: Встановіть завантажувач
Встановіть завантажувач на диск-замінник після завершення resilvering. Під час resilvering система продовжує працювати з оригінального диска, тому цей крок безпечно виконувати після відновлення працездатного стану пулу.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
У деяких системах grub-install може не приймати шлях by-id. У такому випадку замініть /dev/disk/by-id/<new-whole-disk> відповідною назвою пристрою, наприклад /dev/sdb.
UEFI
Перед запуском grub-install змонтуйте EFI-розділ із диска-замінника в тимчасовий каталог. Це запобігає перекриттю поточного активного EFI-розділу:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Замініть <new-disk-part1> фактичним ідентифікатором EFI-розділу (зазвичай -part1 або -part2; тип розділу EF00). Якщо ви не впевнені, перевірте за допомогою ls -l /dev/disk/by-id/.
Якщо EFI-розділ порожній, перед запуском grub-install скопіюйте вміст наявного EFI-розділу:
cp -r /boot/efi/* /mnt/new_efi/
Встановіть завантажувач:
apt install grub-efi-amd64 efibootmgr -y grub-install --target=x86_64-efi --efi-directory=/mnt/new_efi --bootloader-id=debian --recheck /dev/disk/by-id/<new-whole-disk> update-grub update-initramfs -u -k all
Замініть --bootloader-id=debian назвою, що відповідає вашому дистрибутиву, наприклад ubuntu або debian. Замініть /dev/disk/by-id/<new-whole-disk> ідентифікатором by-id усього диска-замінника, а не окремого розділу.
Виконання update-initramfs гарантує, що початковий RAM-диск містить актуальні модулі ZFS і розпізнає нову структуру пулу. Без цього кроку система може не завантажитися після заміни диска.
Після встановлення відмонтуйте EFI-розділ:
umount /mnt/new_efi
Перевірте записи завантаження EFI:
efibootmgr -v
У системах із кореневою файловою системою ZFS команда grub-install може завершитися помилкою або потребувати додаткових параметрів залежно від версії GRUB і конфігурації системи. Наприклад, деякі системи потребують встановлення GRUB із модулями підтримки ZFS або виконання команди в середовищі chroot. Якщо команда повертає помилку, зверніться до документації вашого дистрибутива щодо встановлення GRUB із підтримкою ZFS.
У Proxmox VE команда grub-install вимкнена. Замість неї використовуйте proxmox-boot-tool. У наведеному нижче прикладі використовується /dev/sdb2 — замініть його фактичним EFI-розділом у вашій системі:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Висновок
Після встановлення завантажувача перезавантажте сервер і переконайтеся, що система завантажується нормально. Запустіть scrub, щоб перевірити наявність помилок читання/запису, які могли виникнути під час resilvering:
zpool scrub rpool
Потім перевірте стан пулу:
zpool status -v
Пул має перебувати в стані online і не мати помилок. Якщо під час процесу виникнуть проблеми, перевірте системні журнали за допомогою journalctl -xe, щоб отримати додаткову інформацію.
Перш ніж утилізувати несправний диск, який було вилучено на кроці 3, перезавантажте сервер і переконайтеся, що система нормально завантажується з диска-замінника. Зберігайте несправний диск як резервний варіант, доки не підтвердите успішне завантаження системи.