EUR
european

EUR

usa

USD

Russian Ru
Ex. VAT Ex. VAT 0%

Замена отказавшего диска в корневой части ZFS

В этом руководстве объясняется, как заменить неисправный диск в пуле ZFS, настроенном в режиме зеркала (mirror), в Linux. Процедура включает перевод диска в автономный режим, копирование таблицы разделов на новый диск, повторное добавление диска в пул и установку загрузчика после завершения resilvering.

Предварительные требования

Требуются права root. В приведённых ниже примерах предполагается, что сервер имеет два диска: /dev/sda (исправный) и /dev/sdb (неисправный). При необходимости замените имена устройств на соответствующие вашей конфигурации.

Warning

Перед началом создайте резервную копию всех важных данных. Замена корневого диска — операция с высоким риском. Ошибка на любом этапе может привести к потере данных или невозможности загрузки системы. Не используйте имена устройств вида /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>

Warning

wipefs -a безвозвратно удаляет с диска все сигнатуры файловых систем и разделов. Перед выполнением команды убедитесь, что указан правильный идентификатор диска.

Следующая команда копирует таблицу разделов с /dev/sda (источник) на /dev/sdb (назначение):

sgdisk -R /dev/sdb /dev/sda

Warning

В sgdisk -R первым аргументом указывается диск назначения, а вторым — источник. Если поменять аргументы местами, таблица разделов исправного диска будет перезаписана.

Если новый диск больше исходного, расширьте GPT, чтобы использовать весь доступный объём:

sgdisk -e /dev/sdb

Затем назначьте диску-замене новый уникальный UUID:

sgdisk -G /dev/sdb

Warning

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

Warning

В системах с корневой файловой системой ZFS команда grub-install может завершиться ошибкой или потребовать дополнительных параметров в зависимости от версии GRUB и конфигурации системы. Например, в некоторых системах необходимо установить GRUB с модулями поддержки ZFS или выполнить команду из среды chroot. Если команда возвращает ошибку, обратитесь к документации вашего дистрибутива для получения инструкций по установке GRUB с поддержкой ZFS.

Info

В 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 для получения дополнительной информации.

Warning

Перед тем как утилизировать неисправный диск, извлечённый на шаге 3, перезагрузите сервер и убедитесь, что система нормально загружается с нового диска. Сохраните неисправный диск в качестве резервного варианта до подтверждения успешной загрузки системы.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA