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 .