Восстановление 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
команда, и это, кажется, работает некоторое время без вывода. Я оставлю его включенным на ночь, чтобы посмотреть, выводит ли он что-нибудь.
Обновление (11/1): zpool import tank
работает уже около 12 часов без вывода командной строки. Тем не менее, мой компьютер по-прежнему отзывчив, так что это плюс.
2 ответа
По сути, нет никакого официального способа восстановления, кроме восстановления из резервной копии. Но есть функция 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 с определенным Id. Используя модифицированный zfs-fuse, я смог получить доступ к файловым системам в ZFS.
Я действительно восстановил свой пул, используя этот метод. Таким образом, можно восстановить, но это неподдерживаемый метод, и его нужно делать очень осторожно, так как довольно легко все испортить. Мое мнение: Sun/Oracle должны предоставить fsck для ZFS для этих ситуаций.
Кстати, в надежде помочь кому-то в будущем:
Я думаю, что эта ошибка усугубилась и, возможно, вызвана использованием именования /dev/sdX, /dev/hdX для моих дисков в пуле вне периода начальной установки.
Я бы порекомендовал использовать другую схему именования, как описано намного лучше в ZFS на Linux FAQ. Для моего небольшого пула я переключился на / dev / disk / by-id /. При необходимости очень легко переключать схемы в существующий пул.