Можно восстанавливать файлы и по их содержимому. Например, предположим, что нам известно, что удаленный файл содержит строку
hello, world
. Нажимаем <f>, затем — клавишу <A> (Search all block). Этим мы заставляем редактор искать ссылки на все блоки, в том числе и удаленные. Как вариант, можно запустить редактор с ключом
– -all
. Но, так или иначе, затем мы нажимаем клавишу <В>, и, когда редактор перейдет в блочный режим, нажимаем клавишу </> и вводим искомую строку в ASCII. Находим нужный блок. Прокручивая его вверх и вниз, убеждаемся, что он действительно принадлежит тому самому файлу. Если это так, нажимаем <Ctrl>+<R>, давая редактору указание просматривать
все индексные дескрипторы, содержащие ссылку на этот блок. Номер текущего найденного inode отображается в нижней части экрана.
Внимание!
Номер текущего найденного inode отображается именно в нижней части экрана. В верхней части отображается номер последнего просмотренного inode в режиме
inode
.
Переходим в режим inode нажатием клавиши <I>, нажимаем клавишу <#> и вводим номер inode, который требуется просмотреть. Если дата удаления более или менее соответствует действительности, нажимаем <Shift>+<R>/<R> для сброса файла на диск. Если нет — возвращаемся в блочный режим и продолжаем поиск.
В сложных случаях, когда список прямых и/или косвенных блоков разрушен, восстанавливаемый файл приходится собирать буквально по кусочкам, основываясь на его содержимом и частично — на стратегии выделения свободного пространства файловой системой. В этом нам поможет клавиша <w>, дающая указание дописать текущий блок к файлу-дампу. В процессе восстановления мы просто перебираем все свободные блоки один за другим (редактор помечает их строкой
NOT USED
) и, обнаружив подходящий, дописываем в файл. Конечно, таким образом невозможно восстановить сильно фрагментированный двоичный файл, но вот восстановление листинга программы — вполне реалистичная задача.
На основании вышесказанного можно сделать вывод о том, что ручное восстановление файлов с помощью lde крайне непроизводительно и трудоемко. Однако при этом данный подход является наиболее "прозрачным" и надежным. Что касается восстановления оригинальных имен файлов, то эту операцию лучше всего осуществлять с помощью отладчика файловой системы debugfs.
Восстановление с помощью отладчика файловой системы debugfs
Загружаем в отладчик редактируемый раздел или его копию. Сделать это можно с помощью команд
debugfs /dev/sdb1
или
debugfs my_dump
соответственно. Если мы планируем осуществлять запись на диск, необходимо указать ключ
– w
:
debugfs -w my_dump
или
debugfs -w /dev/sdb1
.
Чтобы просмотреть список удаленных файлов, даем команду
lsdel
(или
lsdel t_sec
, где
t_sec
— количество секунд, истекших с момента удаления файла). На экране появится список удаленных файлов (разумеется, без имен). Файлы, удаленные более
t_sec
секунд назад (если эта опция задана), в данный список не попадут.
Команда
cat <N>
выводит содержимое текстового файла на терминал. Здесь
<N>
— номер inode, заключенный в угловые скобки. При выводе двоичных файлов разобрать смысл отображаемой на экране информации практически невозможно. Такие файлы должны сбрасываться в дамп командой
dump <N> new_filе_name
, где
new_file_name
— новое имя файла (с путем), под которым он будет записан в файловую систему, из-под которой был запущен отладчик debugfs. Файловая система восстанавливаемого раздела при этом остается неприкосновенной. Иными словами, команда должна
даваться без ключа
– -w
.
При желании можно восстановить файл непосредственно на самой восстанавливаемой файловой системе (что особенно удобно при восстановлении больших файлов). В этом нам поможет команда
undel <N> undel_file_name
, где
undel_file_name
— имя, которое будет присвоено файлу после восстановления.
Внимание!
Выполняя такую операцию, помните, что команда
undel
крайне агрессивна и деструктивна по своей природе. Она затирает первую свободную запись в таблице каталогов, делая восстановление оригинальных имен невозможным.
Команда
stat <N>
отображает содержимое inode в удобочитаемом виде, а команда
mi <N>
позволяет редактировать их по своему усмотрению. Для ручного восстановления файла (откровенно говоря, этого не пожелаешь и врагу) мы должны установить счетчик ссылок (
link count
) на единицу, а время удаления (
deletion time
), наоборот, сбросить в ноль. Затем отдать команду
seti <N>
, помечающую данный inode как используемый, и для каждого из блоков файла выполнить команду
setb X
, где
X
— номер блока.
Совет
Перечень блоков, занимаемых файлом, можно просмотреть с помощью команды
stat
. В отличие от lde, она отображает не только непосредственные, но и косвенные блоки, что несравненно удобнее.
Остается только дать файлу имя, что осуществляется путем создания ссылки на каталог (
directory link
). Сделать это можно с помощью команды
ln <N> undel_file_name
, где
undel_file_name
— имя, которое будет дано файлу после восстановления (при необходимости имя восстанавливаемого файла указывается с полным путем).
Внимание!
Создание ссылок на каталог необратимо затирает оригинальные имена удаленных файлов.
После присвоения имени восстановленному файлу полезно дать команду
dirty
, чтобы файловая система была автоматически проверена при следующей загрузке. Как вариант, можно выйти из отладчика и вручную запустить команду
fsck
с ключом
– f
, форсирующим проверку.
Теперь перейдем к восстановлению оригинального имени. Рассмотрим простейший случай, когда каталог, содержащий удаленный файл (также называемый родительским каталогом), все еще цел. В этом случае следует дать команду
stat dir_nam
e и запомнить номер inode, возвращенный этой командой.
Затем следует дать отладчику команду
dump <INODE> dir_file
, где
INODE
— номер сообщенного индексного дескриптора, a
dir_file
— имя файла "родной" файловой системы, в которую будет записан дамп. Полученный дамп следует загрузить в шестнадцатеричный редактор и просмотреть его содержимое в "сыром" виде. Все имена будут там. При желании можно написать утилиту-фильтр, выводящую только удаленные имена. На Perl это не замет и десяти минут.