Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.




Опыт по восстановлению файлов.

Автор : C.E.C. Artime и J.A. Baro
Перевод : Иван Песин

Мы опишем попытку восстановления данных, удаленных по невнимательности с файловой системы 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

Эпилог

Хотелось бы подчеркнуть следующее.

RTFM -- Читайте руководство[*3]

И никогда не используйте новые ключи в первый раз с правами пользователя root.

Магнитные ленты

На компьютере Fish есть устройство записи на магнитную ленту. Утилиты GNU mt и tar очень полезны при выполнении планового архивирования данных. Документ Аарона Крэна содержит интересные ссылки по этому поводу.

Регулярные выражения

Использование регулярных выражений в командах интерпретатора очень опасно (но, в тоже время, это очень мощный инструмент - Прим.пер), особенно в работе с файлами, названия которых начинаются с точки. Возможно суперпользователь root должен использовать командный интерпретатор с ограниченной (а не расширенной) поддержкой регулярных выражений (для офисных дистрибутивов, или инсталляций "из коробки" -- да, но только не для опытных администраторов, для которых регулярные выражения -- важнейший инструмент! - Прим. пер.). Мы рекомендуем esh.

PDA

Эта статья в основном была написана при помощи Agenda VR3. Возможно единственным PDA со свободным ПО на пляже Gran Canaria.


Авторы

С.Е.С Эртайм -- фан GNU и адвокат свободного ПО с 2000.
Дж. А. Баро -- пользователь Linux и Perl-хакер с 1996.


Примечания редактора

[*1] Мда... Этот безымянный пользователь им очень насолил, если они решили дать ему в статье библейское имя.
[*2] Утилита factor раскладывает указанное число на ряд множителей, являющихся простыми числами: 10142 = 2 * 11 * 461
[*3] Угу. Читайте и "...будет вам благодать..." :)



Обсудить данную тему на нашем форуме "Все о Linux"