Опыт по
восстановлению файлов
Автор: (C) C.E.C. Artime и J.A. Baro
Перевод: (C) Иван Песин
Мы опишем попытку восстановления данных, удаленных по невнимательности с файловой системы ext2. Помните, что ход событий был далек от желаемого и мы искренне надеемся, что наши читатели не повторят наших ошибок. А чтобы показать, сколько полезного можно узнать во время кризиса мы детально опишем всю историю.
Две машины -- Fish и Bell. Fish -- это Sun E250, а Bell -- Pentium 3 (450 MHz). Они находятся в одной и той же подсети Ethernet.
Bell работает под управлением Debian GNU/Linux 3.0r0 после беспроблемного обновления с версии 2.2r7. Версия ядра Linux -- 2.4.18.
Fish так же работает под Debian 3.0r0, портированным на Sparc64.
Недавнее обновление с 2.2r7 повлекло за собой единственную
проблему: XFree перестал запускаться из-под обычных пользователей
(из-под root'а
работает). Ядро Linux версии
2.4.18-SMP.
Тип файловых систем -- ext2
.
На Fish XFree работает от root'а
, но не
работает под правами обычных пользователей.
Причины: проблема либо с привилегиями, либо с пользовательскими
конфигурационными файлами.
Решение: добавим нового пользователя[*1] и скопируем файлы настроек
root
'а в его домашний каталог:
root@fish# adduser judas
Enter new UNIX password:
Retype new UNIX password:
root@fish# cp --recursive /root/.[a-zA-Z]* /home/judas
root@fish# chown --recursive judas:judas /home/judas/.*
[Вы заметили разницу в регулярном выражении команд
cp
и chown
?]
(Классическая ошибка использования регулярных
выражений: следует помнить, что под шаблон .* подходит выражение
"..", т.е. родительский каталог. Потому будьте осторожны
с командой rm -rf /bla-bla/.* - можете остаться без корневого
каталога - Прим.пер.) (И с дикой головной болью -- прим.ред.)
После длительной охоты на ошибки, проблема с иксами, наконец, решена; подошло время удалять пользователя. Что бы как-то ускорить процедуру, изучаем страницу руководства. Это приводит к обнаружению привлекательного ключа:
root@fish# deluser --remove-all-files judas
Ба-бах! Приехали! Данный ключ указывает команде
deluser
провести поиск по диску файлов, владельцем
которых является judas
и удалить их!
Содержимое каталога /home
исчезло.
Две минуты спустя мы размонтировали соответствующее устройство
(/dev/sda8
).
В первую очередь необходимо создать образ разрушенного
устройства.
Поскольку на Fish нет достаточного количества свободного места, то
будем копировать данные на жесткий диск компьютера Bell:
root@fish# ftp bell
ftp> put '|dd if=/dev/sda8' fishbackup
Но все оказалось не так просто из-за проблемы с сетью: передача
большого файла обрывалась через некоторое время. Файл нужно было
разбить на части. Размер раздела /dev/sda8
-- 10
ГБайт.
Прибегнув к утилите factor
из пакета GNU
shellutils
:
root@fish# factor 10142
10142: 2 11 461
мы получаем размеры и количество неделимых "долек"
раздела /dev/sda8
[*2].
Для следующего шага мы использовали пакет OpenSSL, вместо
FTP.
Сперва мы обменялись паролями для возможности работать в пакетном
режиме:
root@fish# ssh-keygen
artime@bell$ ssh-keygen
root@fish# scp /root/.ssh/identity.pub artime@bell:/home/artime/.ssh/authorized.keys
root@fish# scp artime@bell:~/.ssh/identity.pub ~/.ssh/authorized.keys
На машине Fish выполняем скрипт:
#!/bin/sh
for i in $(seq 0 460)
do
dd if=/dev/sda8 bs=$((2*11*1024)) skip=$i of=fula
scp --batch fula artime@bell:~/fiback.$i
done
Объединяем куски на машине Bell:
for i in $(seq 0 460)
do cat fiback.$i >> fiback.raw
done
То же самое можно было сделать проще, с машины Fish:
#!/bin/sh
for i in $(seq 0 460)
do
dd if=/dev/sda8 bs=$((2*11*1024)) skip=$i | ssh artime@bell "cat >> fiback.raw"
done
Мы прибегли к Linux Ext2fs undeletion mini-HOWTO, Аарона Крэна (Aaron Crane); Ext2fs undeletion of directory structures mini-HOWTO, Томаса Эриксона (Tomas Ericsson); программе recover Тома Пыке (Tom Pycke); патчу от Торстена Вернера (Torsten Werner) для программы debugfs на платформе i386.
Утилита Recover
предназначена для восстановления
единичных файлов. Поскольку мы внезапно потеряли сотни файлов, мы
думаем, что эта не та утилита, с которой стоит начинать попытки
восстановления. Наиболее подходящее решение -- это использование
патча Вернера для debugfs
; у нас уже есть копия
поврежденной файловой системы на машине с архитектурой i386, а
программу можно загрузить с twerner.debian.org
:
artime@bell$ ./debugfs fishback.raw
debugfs> restore
debugfs> quit
artime@bell$ mkdir mnt
artime@bell$ mount -t ext2 -o loop fishback.raw mnt
artime@bell$ ls -l mnt
Файлов нет! Похоже, что мы размонтировали /dev/sda8
слишком поздно. А как указано на странице Вернера, его утилита
позволяет восстанавливать файлы, которые все еще имеют
имя.
Этот документ, найденный в Проекте документации по Linux,
научил нас, как найти i-ноды (иными словами блоки) удаленных
файлов и как их можно восстановить командой dump
утилиты debugfs
. Изучение закончилось массой файлов в
одном каталоге. Но все равно, это была лишь малая часть из них. Как
уже указывалось ранее, полное по-файловое восстановление по схеме
приведенной в HOWTO Крэна невозможно в нашем случае.
Из него мы научились находить удаленные файлы в каталогах. Мы
следовали инструкциям. Скрипт из седьмого раздела потребовал
доработки для нашей версии debugfs
#!/bin/sh
awk '{ print "mi <" $1 ">\n"\
"\n\n\n\n\n\n\n"\
"0\n"\
"1\n"\
"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" }'
И все равно, у нас не получилось найти имена каталогов и перейти к восьмому разделу. Нужно было искать еще что-то.
Последним шансом был (если честно, то это нужно было делать в первую очередь - Прим.пер.)
$ man debugfs
и там мы нашли упоминание о команде rdump
,
неуказанной ни в одном другом документе. Выполняем следующий скрипт
над i-нодами каталогов, находящихся в файле lsdel.out
,
после выполнения инструкций из раздела 6 документа Ext2fs
Undeletion of Directory Structures mini-HOWTO:
#!/bin/sh
awk '{ print "rdump <" $1 "> folders\n" }'
и большинство каталогов восстанавливается в директории
folders
. Но без имен! В конце концов, нам пришлось
вручную переименовывать двести каталогов, основываясь на их
содержимом. И даже после этого мы не досчитались некоторых файлов,
особенно почтовых ящиков. Попробуем поискать вручную:
$ strings fishback.raw | grep -B1 -A99 "To: lisistrata" > lisistrata.mbox
Хотелось бы подчеркнуть следующее.
И никогда не используйте новые ключи в первый раз с правами
пользователя root
.
На компьютере Fish есть устройство записи на магнитную ленту.
Утилиты GNU mt
и tar
очень полезны при
выполнении планового архивирования данных. Документ Аарона Крэна
содержит интересные ссылки по этому поводу.
Использование регулярных выражений в командах интерпретатора
очень опасно (но, в тоже время, это очень мощный инструмент -
Прим.пер), особенно в работе с файлами, названия которых начинаются
с точки. Возможно суперпользователь root
должен
использовать командный интерпретатор с ограниченной (а не
расширенной) поддержкой регулярных выражений (для офисных
дистрибутивов, или инсталляций "из коробки" -- да, но
только не для опытных администраторов, для которых регулярные
выражения -- важнейший инструмент! - Прим. пер.). Мы рекомендуем esh.
Эта статья в основном была написана при помощи Agenda VR3. Возможно единственным PDA со свободным ПО на пляже Gran Canaria.
[*1] Мда... Этот безымянный пользователь
им очень насолил, если они решили дать ему в статье библейское
имя.
[*2] Утилита factor раскладывает
указанное число на ряд множителей, являющихся простыми числами:
10142 = 2 * 11 * 461
[*3] Угу. Читайте и "...будет вам
благодать..." :)