вторник, 23 марта 2010 г.

Восстановление удаленных файлов на ext3/ext4

В еженедельном выпуске Distrowatch промелькнул интересный способ восстановления удаленных файлов на ext3/ext4 системах. Этот способ применим только к открытым в данный момент файлам. Я решил попробовать его применить и обнаружил одну интересную деталь.
Первая мысль, пришедшая мне в голову по прочтении этой статьи - многие, если не большинство, приложений имеют кнопочку "сохранить" или "сохранить как", поэтому каких-то извращений с консолью для восстановления открытых в них файлов, но уже удаленных из файловой системы и из корзины, не требуется. Но некоторые программы такой опции не имеют - например стандартный видеопроигрыватель totem, которым лично я слушаю и музыку. Итак несколько консольных проб по мотивам восстановления удаленных и открытых в данный момент файлов:

$mkdir temp
$cd temp
$touch proba # в этот момент в другом терминале я открываю этот же файл командой mcedit ~/temp/proba и переключаюсь на обратно на первый терминал
$rm proba # файл удаляется
$ls # удостоверяюсь в удалении файла
$lsof | grep proba # пытаюсь найти его описанным по ссылке способом
$ls # файл этой командой найти не удаётся и в каталоге ничего не появляется
# хочется заметить, что в mcedit можно сохранить файл кнопкой F2, что я и делаю
$ls # файл появляется
proba
$ gedit proba & # открываю этот файл в дочернем для моего терминала приложении
[1] 3158
$ rm proba # удаляю файл
$ ls # файл из каталога исчезает
$ lsof |grep proba # запускаю команду - файл не найден
# здесь также следует сказать, что в gedit есть пункт меню "Сохранить как"
$ cp ~/Downloads/kiss.avi kiss.avi # копирую в свой злосчастный каталог видеофайл
$ ls # он успешно копируется и появляется в каталоге
kiss.avi
$ totem kiss.avi & # запускаю его в дочернем приложении (уже втором - первым был текстовый редактор)
[2] 3251
$ rm kiss.avi # удаляю файл
$ ls # каталог пуст
$ lsof |grep kiss.avi # пытаюсь найти файл - и совершается чудо, файл найден!
totem 3251 moradan 23r REG 8,21 47935488 5566 /home/moradan/temp/kiss.avi (deleted)
$ cp /proc/3251/fd/23 kiss.restored.avi # восстанавливаю его указанным по ссылке способом.
$ ls # файл восстановлен
kiss.restored.avi

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

[1]+  Done                    gedit touch
[1]+  Done                    totem kiss.avi


Почему файл, открыты в gedit не находится командой lsof я не знаю. Вообще gedit сам-по-себе достаточно умный и при открытии одного и того же файла в нескольких экземплярах gedit выводит заметное сообщение о конфликте версий с предложением сохранить имеющуюся в данном экземпляре версию отдельно. Если кому-то захочется попробовать другие программы, как с опцией сохранения, так и без нее (просмотровщики вполне логично лишены такой возможности), на возможность такого трюка - милости прошу в камменты. Ну и не дай Бог, чтобы Вам это потребовалось (в этом случае есть и подробный, хотя и относящийся к ext3, учебник по восстановлению файлов с объяснением даже какой-никакой теории, и его русский перевод, кроме того можно попытать счастье с программой extundelete)
И совсем последнее. Надо оговориться, что пробовал я всё это сделать только на системе ext4 с дефолтным ядром из Ubuntu 9.10, обновленным из репозитория:

$ uname -a
Linux 2.6.31-20-generic #58-Ubuntu SMP Fri Mar 12 05:23:09 UTC 2010 i686 GNU/Linux
blog comments powered by Disqus