20

Как восстановить (восстановить) удаленный файл в разделе btrfs?

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

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

  • (Два) удаленных файла были удалены удаленной командой rsync .
  • Это были небольшие текстовые файлы.
  • Я знаю имена файлов.
  • Я мог бы вспомнить некоторые строки в файлах.
  • Диск является обычным жестким диском, но он большой (2 ТБ).
  • Я использую Kubuntu 12.04 (бета2) со всеми последними обновлениями.
  • Я не записал никаких новых данных в раздел, из которого были удалены файлы.
  • У меня нет снимка или резервной копии этих файлов. (Последняя резервная копия всего на несколько часов старше этих файлов.)
  • Как ни странно, файловая система COW, кажется, имеет меньше вариантов восстановления файлов, чем ext3/4 ...

3 ответа3

8

Поскольку ваши файлы имеют небольшой размер и простой текст, я бы попытался отсканировать вывод "строк" на устройство, где находится файловая система, т. Е.

strings /dev/sda1 | less

затем используйте «/» для поиска строк, которые могут быть в этом файле. Когда вы найдете текст, разделите его начало с помощью "m", затем перейдите к концу и используйте «| cat> file», чтобы сохранить его в файл.

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

4

Йорг Вальтер реализовал btrfs-undelete скрипт с помощью find-root и restore инструмента из btrfs-progs которые можно найти здесь, и должен помогать другим в таком же положении.

Поскольку он лицензирован по GPLv2, я не могу включить его сюда.

2

Если на вашем диске btrfs есть дочерние тома, вам нужно передать дополнительную -r <subvol-id> для btrfs restore . К сожалению, сценарии, подобные тому, который опубликовал пользователь user414471 (http://oelkers.de/tips/undeleteBtrfs.sh), не имеют возможности сделать это, но их, вероятно, можно адаптировать к этому.

Если вы хотите сделать это вручную, вам нужно получить правильный subvol-id, либо с помощью:

# 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 btrfs с -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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .