Восстановление ZFS пула при статусе FAULTED

Дата: 07.02.2025 Автор Admin

Если про какой-то причине ваш пул перешел в состояние FAULTED и при вызове zpool status POOLNAME вы видите ошибки:

pool metadata is corrupted zfs
zpool import zroot gives 4 times failed to load zpool zroot.

Cannot import POOL: I/O error
Destroy or re-create the pool from a backup source.

Значит дело плохо.

Виной может быть умирающий HDD с битыми секторами.

Еще хуже если пул совсем пропал из системы и найти его можно только командой:

zpool import

Но при импорте пула вы скорее всего получите ошибку:

Cannot import POOL: I/O error
Destroy or re-create the pool from a backup source.

Звучит страшно, импортировать не можем данные повреждены, только бэкап (если он у вас был, а если нет?)

Давайте рассмотри как восстановить пул.

Важно понимать — если ваш HDD умирает, лучше не рисковать, а по возможности снять с него посекторную копию и уже работать с ней.

Именно это мы и сделаем.

Ставим ddrescue

apt install gddrescue

Далее запустим посекторное копирование данных с диска поврежденного пула в файл (главное чтобы у вас хватило места) , также обязательно укажем  map фай — это лог куда ddrescue будет записывать прогресс, и если вдруг ваш HDD начнет сбоить (например от перегрева или других причин приводящих к временной недоступности), вы сможете продолжить процесс.

Запускаем копирование:

ddrescue -f -n -v -b 4096 /dev/sdb /mnt/pve/NAS/POOL_backup mapfile

Обратите внимание 4096  — размер сектора.

Терпеливо ждем пока образ будет готов.

Далее нам нужно подключить его как loop device, да поидее ZFS может делать импорт из файла, но у нас другой случай, у нас повреждены метаданные и такой трюк уже не пройдет, при импорте мы получим ошибку:

root@proxmox-lab1:~# zpool import -fF -d /mnt/pve/NAS/POOL_backup POOL
cannot import 'POOL': no such pool available

Давайте подключим наш образ как loop device (нам нужно получить блочное устройство)

losetup -fP --show /mnt/pve/NAS/POOL_backup

Супер! Теперь с помощью команды zdb проверим что у нас вообще забэкапилось:

zdb -e POOL /dev/loop0

Вывод будет примерно такой:

Configuration for import:
        vdev_children: 4
        hole_array[0]: 1
        hole_array[1]: 2
        version: 5000
        pool_guid: 5643723023173928716
        name: 'POOL'
        state: 0
        hostid: 2815505493
        hostname: 'proxmox-lab1'
        vdev_tree:
            type: 'root'
            id: 0
            guid: 5643723023173928716
            children[0]:
                type: 'disk'
                id: 0
                guid: 12377229841096381893
                whole_disk: 1
                metaslab_array: 256
                metaslab_shift: 33
                ashift: 12
                asize: 1000189984768
                is_log: 0
                DTL: 1066
                create_txg: 4
                degraded: 1
                aux_state: 'err_exceeded'
                path: '/dev/loop0p1'
            children[1]:
                type: 'hole'
                id: 1
                guid: 0
            children[2]:
                type: 'hole'
                id: 2
                guid: 0
        load-policy:
            load-request-txg: 18446744073709551615
            load-rewind-policy: 2
zdb: can't open 'POOL': Input/output error

Отлично! Метаданные есть, информация о пуле есть.

Только прочитать ег омы все еще не можем.

Но это не беда, инспектируем пул, проверим возможно ли откатится на последнюю удачную транзакцию (до момента когда пул вышел из строя):

zpool import -f -FXn POOL

Вывод должен быть примерно таком:

Would be able to return POOL to its state as of Tue Jan 25 19:12:24 2025.
Would discard approximately 3 minutes of transactions.

Хорошо, можно откатится до последней удачной транзакции! Запускаем процесс отката:

zpool import -f -FX POOL

И после завершения импортируем пул как обычно:

zpool import -f -FX POOL

Теперь пул должен появится в системе и быть виден через zpool status

Помним, что мы работаем с образом!

Самое время скопировать с пула все важные данные и после этого его экспортировать:

zpool export POOL

И отключить loop device:

losetup -d /dev/loop0

Надеюсь эта статья вам никогда не понадобится ;)

Всем удачи, делайте и проверяйте бэкапы!


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *