Назад | Перейти на главную страницу

Восстановление ZFS из сбойного состояния пула

У меня есть пул ZFS raidz1 с шестью дисками, и недавно произошел сбой, требующий замены диска. Обычно проблем не возникает, но на этот раз мое серверное оборудование вышло из строя, прежде чем я смог произвести замену (но, насколько я могу судить, после сбоя диска и не связанного с ним).

Мне удалось получить другую машину от друга, чтобы восстановить систему, но в процессе перемещения моих дисков мне пришлось поменять их кабели на кучу, пока я не получил правильную конфигурацию, при которой оставшиеся 5 хороших дисков считались подключенными. Этот процесс, похоже, вызвал некоторые ошибки контрольной суммы для пула / raidz.

У меня есть 5 оставшихся дисков, установленный и готовый заменить вышедший из строя диск. Однако, поскольку состояние моего пула FAULTED Я не могу произвести замену.

root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb
cannot open 'tank': pool is unavailable

Есть ли способ исправить эту ошибку? Я думаю, что наличия 5 из 6 дисков в сети было бы достаточно, чтобы восстановить нужные данные, но сейчас этого, похоже, недостаточно.

Вот журнал состояния моего пула:

root@zfs:~# zpool status tank
  pool: tank
 state: FAULTED
status: One or more devices could not be used because the label is missing or invalid.
        There are insufficient replicas for the pool to continue functioning.
action: Destroy and re-create the pool from a backup source.
   see: http://zfsonlinux.org/msg/ZFS-8000-5E
  scan: none requested
config:

    NAME                     STATE     READ WRITE CKSUM
    tank                     FAULTED      0     0     1  corrupted data
      raidz1-0               ONLINE       0     0     8
        sdd                  ONLINE       0     0     0
        sdf                  ONLINE       0     0     0
        sdh                  ONLINE       0     0     0
        1298243857915644462  UNAVAIL      0     0     0  was /dev/sdb1
        sde                  ONLINE       0     0     0
        sdg                  ONLINE       0     0     0

Обновление (31.10): Я пытался экспортировать и повторно импортировать массив несколько раз за последнюю неделю, но безуспешно. Сначала попробовал:

zpool import -f -R /tank -N -o readonly=on -F tank

Это немедленно вызвало эту ошибку:

cannot import 'tank': I/O error
       Destroy and re-create the pool from a backup source.

Я добавил опцию «-X» к приведенной выше команде, чтобы попытаться заставить ее проверить журнал транзакций. Я позволил этому поработать около 48 часов, прежде чем сдаться, потому что он полностью заблокировал мою машину (я не мог войти в систему локально или через сеть).

Теперь я пробую простой zpool import tank команда, и она, кажется, какое-то время работает без вывода. Я оставлю его работать на ночь, чтобы посмотреть, выводит ли он что-нибудь.

Обновление (1/11): zpool import tank работает уже около 12 часов без вывода командной строки. Однако мой компьютер по-прежнему отзывчив, так что это плюс.

По сути, нет официального способа восстановления, кроме восстановления из резервной копии. Но есть функция ZFS, называемая перемоткой, которая может позволить удалить транзакции из пула до такой степени, что пул снова станет работоспособным. Следующий текст взят из блога ZFS Internals, часть 11.

НЕ ПЫТАЙТЕСЬ ЭТО В ПРОИЗВОДСТВЕ. ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК!

zpool import -FX mypool, где параметры означают:
* -F Попытка перемотки при необходимости.
* -X Включить крайнюю перемотку.
* -T Укажите начальный txg для использования при импорте. Этот вариант намеренно недокументирован для целей тестирования.

Сначала попробовал восстановиться с помощью этой процедуры перемотки. У меня не сработало, может, на zfs-fuse для Linux не реализовано. Согласно ZFSOnDiskFormat.pdf, существует массив со 128 возможными значениями для txg. В моей версии zfs-fuse 0.7.0 опция -T не существует. Поэтому я модифицировал zfs-fuse, чтобы отображать доступные txg в массиве uberblock и разрешать запуск с txg с определенным идентификатором. Используя модифицированный zfs-fuse, я смог получить доступ к файловым системам в ZFS.

Я восстановил свой пул с помощью этого метода. Таким образом, восстановление возможно, но это неподдерживаемый метод, и его нужно выполнять очень осторожно, так как довольно легко испортить ситуацию, даже хуже. Я считаю, что Sun / Oracle должны предоставить fsck для ZFS в таких ситуациях.

Кстати, в надежде помочь кому-то в будущем:

Я думаю, что эта ошибка усугубилась и может быть вызвана использованием / Дев / SDX, / Дев / HDX именование моих дисков в моем пуле вне периода начальной настройки.

Я бы рекомендовал использовать другую схему именования как гораздо лучше описано в ZFS на Linux FAQ. Для моего небольшого бассейна я перешел на / dev / диск / по-идентификатору /. Это очень легко переключать схемы на существующем пуле, если необходимо.