Як відновити файли на btrfs-розділі?


19

Як я відновити (відновити) видалений файл на розділі btrfs?

Я ще не зробив знімок, тому не можу використовувати цю функцію. Я знаю, що є деякі інструменти для інших файлових систем Linux, але Google не виявив нічого конкретного для btrfs. Я натрапив на одну невиразну згадку про те, що btrfs включає інструмент для відновлення, але я не можу його знайти. Перш ніж спробувати інструменти для іншої файлової системи, я прошу тут.

Більше інформації:

  • Видалені (два) файли були видалені віддаленою rsyncкомандою, що пішла не так.
  • Це були невеликі звичайні текстові файли.
  • Я знаю назви файлів.
  • Можливо, я міг би запам'ятати деякі рядки у файлах.
  • Диск - звичайний жорсткий диск, але він великий (2 ТБ).
  • Я використовую Kubuntu 12.04 (beta2) з усіма останніми оновленнями.
  • Я не писав жодних нових даних до розділу, з яких були видалені файли.
  • У мене немає знімка або резервної копії цих файлів. (Остання резервна копія на кілька годин старша за ці файли.)
  • Як не дивно, файлова система COW, здається, має менше варіантів відновлення файлів, ніж ext3 / 4 ...

Відповіді:


7

Оскільки ваші файли мають невеликий і звичайний текст, я б спробував сканувати вихід "рядків" на пристрій, де знаходиться файлова система, тобто,

strings /dev/sda1 | less

потім використовуйте "/" для пошуку рядків, які можуть бути у цьому файлі. Коли ви знайдете текст, відмежуйте його початок "m", а потім перейдіть до кінця та використовуйте "| cat> файл", щоб зберегти його у файл.

Я фактично робив це, коли у мене була схожа ситуація в іншій файловій системі без відновлення, кілька років тому, і це працювало для мене чудово.


4

Йорг Уолтер реалізував btrfs-undeleteсценарій оболонки, використовуючи інструменти find-rootта restoreінструменти з btrfs-progs, які можна знайти тут , і повинен допомогти іншим у подібній позиції.

Оскільки вона ліцензована під GPLv2, я не можу включити її сюди.


3
Варто зауважити, що згаданий сценарій має принаймні один шлях з твердим кодом (імовірно, помилково) і має кілька інших проблем, тому покупці остерігаються, що його потрібно редагувати перед використанням.
gamen

2
Ось очищена версія оригінального сценарію: gist.github.com/Changaco/45f8d171027ea2655d74
Чангако

"Оскільки вона ліцензована під GPLv2, я не можу включити її сюди" - можливо, ви повинні прочитати, що говорить GPLv2, оскільки це не має сенсу.
сленг

4
@slang, можливо, ви повинні прочитати умови обслуговування цього веб-сайту? Внески повинні ліцензуватися за ліцензією Creative Commons Attribution Share Alike 3.0.
suriv

@suriv - Я думаю, я можу зрозуміти їх причини цього, але це дуже дратує. Тим більше, що CC-BY-SA є лише дещо обмежуючим, ніж GPL (окрім патентних матеріалів GPLv3).
всезначний

2

Якщо ваш диск btrfs має підпункти, вам потрібно передати додаткову -r <subvol-id>опцію btrfs restore. На жаль, сценарії там, як розміщений користувачем414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), не мають можливості зробити це, але вони, ймовірно, можуть бути адаптовані до цього.

Якщо ви хочете зробити це вручну, вам потрібно отримати потрібний ідентифікатор subvol, або за допомогою:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

або альтернативно:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

Після цього ви використовуєте btrfs-find-rootдля отримання номера блоку, до якого ви хочете відновити (як правило, безпосередньо перед максимальним, який є поточним коренем). Для цього вам потрібно спочатку встановити підпункт за замовчуванням на той, з якого ви хочете відновити файли (і відновити цю зміну після цього):

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

Ви можете , нарешті , використовувати btrfs restoreз -r <subvol-id>для відновлення (спочатку з --dry-runаргументом , якщо ви хочете):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

Більше інформації про все це тут: https://btrfs.wiki.kernel.org/index.php/Restore


Тестували це в системі Fedora 26 - і там btrfs-find-rootкрок ніколи не припиняється (тобто працює на 100% процесорі протягом 3 годин на <250 ГБ FS). Дивіться також схожу історію spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.