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

19

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

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

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

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

Ответы:

7

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

strings /dev/sda1 | less

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

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

Дурвал Менезес
источник
4

Йорг Вальтер реализовал btrfs-undeleteсценарий оболочки, используя инструменты find-rootи , которые можно найти здесь , и должен помочь другим в аналогичной ситуации.restorebtrfs-progs

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

Самир
источник
3
Стоит отметить, что указанный скрипт имеет по крайней мере один путь, жестко закодированный (предположительно по ошибке) и имеет несколько других проблем, поэтому покупатели должны остерегаться того, что он должен быть отредактирован перед использованием.
гамен
2
Вот очищенная версия оригинального сценария: gist.github.com/Changaco/45f8d171027ea2655d74
Чанако,
«Поскольку он лицензирован по GPLv2, я не могу его сюда включить» - возможно, вам следует прочитать то, что говорит GPLv2, потому что это не имеет никакого смысла.
сленг
4
@slang Может быть, вы должны прочитать условия обслуживания этого сайта? Вклады должны быть лицензированы в соответствии с лицензией Creative Commons Attribution Share Alike 3.0.
Suriv
@suriv - Думаю, я могу понять их причины, но это довольно раздражает. Тем более, что CC-BY-SA является лишь немного более ограничительным, чем GPL (кроме материала патента GPLv3s).
Всевышний
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с -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