Замена отказавшего диска в корневой части ZFS
В этом руководстве объясняется, как заменить неисправный диск в пуле ZFS, настроенном в режиме зеркала (mirror), в 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-раздел пуст, скопируйте содержимое существующего EFI-раздела перед запуском grub-install:
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, перезагрузите сервер и убедитесь, что система нормально загружается с нового диска. Сохраните неисправный диск в качестве резервного варианта до подтверждения успешной загрузки системы.