ZFS - восстановить или восстановить поврежденный файл в моментальном снимке из резервной копии?

Пул подвергся постоянному повреждению данных, чтобы подать данные, которые являются частью снимка. Если данные файла были частью файловой системы (а не частью какого-либо снимка), я мог бы просто восстановить файл из подходящей резервной копии. Как можно восстановить или исправить (и удалить ошибки, о которых сообщает ZFS) файл в снимке из копии снимка или (частичной1) копии пула?

1 Где частичная копия содержит, по крайней мере, уязвимый снимок и предыдущий снимок также в уязвимом пуле.

пример

Вот простой в воспроизведении чрезвычайно надуманный пример:

Из командной строки (bash):

cd
mkdir zfs-test
for i in {1..2}; do dd if=/dev/zero of=zfs-test/tank-file$i bs=1G count=1 &> /dev/null; done

sudo zpool create tank1 ~/zfs-test/tank-file1
sudo zpool create tank2 ~/zfs-test/tank-file2

sudo zfs snapshot tank1@snapshot1
sudo sh -c 'zfs send tank1@snapshot1 | zfs receive -F tank2'

Создайте текстовый файл /tank1/test-text-file с содержимым, которое вы можете легко найти в шестнадцатеричном редакторе. Вот что я использовал:

Lorem Ipsum Dolor Sit Amet, посвященный Aditiscing Elit. Aenean Коммандо Лигула Эгет Долор. Эней Масса. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla Conquat Massa Quis Enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. В enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Целочисленная tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend Tellus. Aenean leo ligula, porttitor eu, краткие биографические данные, eleifend ac, enim. Aliquam Lorem Ante, Dapibus, Viverra Quis, Feugiat, Теллус. Phasellus viverra nulla ut metus varius laoreet. Quisque Rutrum. Энейский импердиет. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam Eget Dui.

Снова из командной строки:

sudo zfs snapshot tank1@snapshot2
sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'

Теперь вам нужно испортить данные файла. Я использовал ht и искал "dui" и изменил его на "duh".

Вы можете подтвердить, что данные повреждены:

sudo zpool scrub tank1; sudo zpool status -v tank1
  pool: tank1
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0 in 0h0m with 1 errors on Sun Jan 11 20:16:30 2015
config:

        NAME                               STATE     READ WRITE CKSUM
        tank1                              ONLINE       0     0     1
          /home/kenny/zfs-test/tank-file1  ONLINE       0     0     2

errors: Permanent errors have been detected in the following files:

        tank1@snapshot2:/test-text-file

3 ответа

Решение

Вот мое слегка обобщенное решение:

sudo cp /tank2/test-text-file /tank1/test-text-file
sudo zfs snapshot tank1@snapshot3
sudo sh -c 'zfs send -i tank1@snapshot2 tank1@snapshot3 | zfs receive -F tank2'
sudo zfs rollback -r tank1@snapshot1
sudo sh -c 'zfs send -i tank2@snapshot1 tank2@snapshot3 | zfs receive -F tank1'
sudo zpool scrub tank1; sudo zpool status -v tank1

И при условии, что нет других сообщений об ошибках:

sudo zpool clear tank1

Причина, по которой я создал snapshot3 не потому, что это было нужно для моего (чрезвычайно надуманного) примера, а потому, что это, вероятно, хорошая привычка для развития (и я изначально хотел проверить, что это будет работать, как я и надеялся). Если были какие-либо другие изменения на tank1 поскольку snapshot2Я бы в идеале хотел не потерять их на восстановление test-text-file,

Всегда лучше использовать избыточные пулы вместо не избыточных пулов (хотя это не всегда возможно). Вышеуказанная проблема вряд ли может возникнуть в резервном пуле. И это быстрее клонировать снимок (чтобы получить файл из него), чем воссоздать его где-нибудь (если у вас, конечно, нет претензий по поводу неисправного оборудования).

Теперь это возможно с помощью корректирующего получения zfs, см. https://github.com/openzfs/zfs/commit/e8cf3a4f7662f2d1c13684ce52b73ab0d9a12266 .

Другие вопросы по тегам