Восстановление файлов на FreeBSD

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

В интернете практически нет информации по восстановлению файлов на FreeBSD. Восстановить файлы на UFS2 и других файловых системах можно(как повезёт вобщем), чем мы и займёмся.


Общий принцип восстановления сводится к правилам:

1. Консервация системы или создание образа диска.
2. Анализ происшествия.
3. Восстановление.

Итак задача: Есть шесть pdf файлов разного размера, записать, удалить и восстановить их.

Что такое сигнатура?

Сигнатура файла — набор байтов, служащий «визитной карточкой» некоего типа файла.

Запишем несколько файлов и посмотрим, что нам скажет встроенная утилита file, которая содержит базу сигнатур.

file1.pdf
file2.exe
file3.doc
file4.djvu

Смотрим вывод, что же это за файлы:

# ls file[1-4].* | xargs file
file1.pdf: PDF document, version 1.3
file2.exe: MS-DOS executable (EXE), OS/2 or MS Windows
file3.doc: Microsoft Office Document
file4.djvu: DjVu Image file

Уберём расширения у наших файлов и переименуем в 1,2,3,4:

# ls [1-4] | xargs file
1: PDF document, version 1.3
2: MS-DOS executable (EXE), OS/2 or MS Windows
3: Microsoft Office Document
4: DjVu Image file

Как видим утилита file анализирует данные по базе сигнатур, а имя файла с расширением не имеют никакого значения для её работы. Существует On-Line определение расширения файла по базе сигнатур: http://mark0.net/onlinetrid.aspx


Foremost – программа для анализа файловой системы или образа диска на основании содержимого конфигурационного файла. В конфигурационном файле создаются записи для каждой сигнатуры.

Строка из конфигурационного файла /usr/local/etc/foremost.conf.sample выглядит так:

#       pdf     y       5000000 %PDF-  %EOF

Означает это следующее:

pdf - расширение файла.
y - будет ли учитываться регистр символов.
5000000 - максимальный размер в байтах.
%PDF- - заголовок. (header)
%EOF - завершитель. (footer) Не обязателен.

Т.е. файлы с расширением PDF начинаются на %PDF- и заканчиваются на %EOF Заголовок можно посмотреть так:

# head -c 5 1.pdf
%PDF-

Или так:

# head -c5 1.pdf | hexdump
0000000 5025 4644 002d

Согласно моей архитектуре(IA32) придётся поменять местами байты и получим 25 50 44 46 2d (в ASCII это %PDF-) Таким образом запись в конфигурационном файле можно сделать так:

pdf     y       5000000 \x25\x50\x44\x46\x2d  %EOF

А если совсем в шестнадцатеричном виде, тогда:

pdf     y       5000000 \x25\x50\x44\x46\x2d  \x25\x45\x4f\x46\x0d

Т.к. существуют символы, которые нельзя ввести с клавиатуры, приходится работать с шестнадцатеричными данными. Можно сделать запись и в десятичном виде, но так гораздо удобнее. В итоге Foremost будет извлекать данные, находящиеся между заголовком и завершителем.


Пробуем воспользоваться полученными знаниями. Я буду использовать жёсткий диск на 2Гб. (ad1: 2014MB <Seagate ST32122A 3.02> at ata0-slave UDMA33) Очистим диск:

# dd if=/dev/zero of=/dev/ad0
dd: /dev/ad0: Operation not permitted

Упс, ошибся, но порадовало. (ad0 - это диск на котором установлена система.)

# dd if=/dev/zero of=/dev/ad1
# fdisk -BI /dev/ad1
# newfs -O2 -U /dev/ad1
# mount /dev/ad1 /mnt/target

Смотрим, смотировался ли диск:

# df -h
Filesystem Size Used Avail Capacity Mounted on /dev/ad1 1.9G 4.0K 1.8G 0% /mnt/target

Я записал шесть PDF файлов c максимальным размером 42Мб:

-rw-r--r-- 1 dik dik 122080 25 июл 2006 1.pdf
-rw-r--r-- 1 dik dik 4795073 30 авг 2006 2.pdf
-rw-r--r-- 1 dik dik 933425 30 авг 2006 3.pdf
-rw-r--r-- 1 dik dik 42381941 5 сен 2006 4.pdf
-rw-r--r-- 1 dik dik 2611287 17 сен 2006 5.pdf
-rw-r--r-- 1 dik dik 2328268 18 сен 2006 6.pdf

Удаляем эти файлы. Запускаем foremost со следующими ключами:

-t – расширения файлов для восстановления, их можно написать через запятую.
Из man foremost приведу все расширения, для которых конфигурационный файл не нужен, но
и максимальный размер файла для восстановления тоже не известен:
jpg, gif, png, bmp, avi, exe, mpg, wav, riff, wmv, mov, pdf, ole, doc, zip, rar, htm, cpp.
all - включает все перечисленные типы.
-o – директория, куда будут записываться найденные файлы.
-v – отображается прогресс на экране и информация представленная ниже.

Foremost может работать как с образами дисков, так и напрямую с жёстким диском, как в моём случае. Пробуем:

# foremost -v -t pdf -o /mnt/test2/recovery /dev/ad1
foremost: /usr/local/etc/foremost.conf: No such file or directory Foremost version 1.4 by Jesse Kornblum, Kris Kendall, and Nick Mikus Audit File
Foremost started at Sat Oct 13 22:32:45 2007 Invocation: foremost -v -t pdf -o /mnt/test2/recovery /dev/ad1 Output directory: /mnt/test2/recovery Configuration file: /usr/local/etc/foremost.conf Processing: /dev/ad1 |------------------------------------------------------------------ File: /dev/ad1 Start: Sat Oct 13 22:32:45 2007 Length: Unknown
Num Name (bs=512) Size File Offset Comment
0: 12096.pdf 119 KB 6193152 (PDF is Linearized) 1: 95328.pdf 2 MB 48807936 (PDF is Linearized) *********************| Finish: Sat Oct 13 22:43:58 2007
2 FILES EXTRACTED
pdf:= 2 ------------------------------------------------------------------
Foremost finished at Sat Oct 13 22:43:58 2007

Обратите внимание на комментарий: (PDF is Linearized) – Такие данные, как правило, нормальные файлы.

Вот собственно получилось только 2-а файла:

# ls -ll recovery
total 4 -rw-r--r-- 1 root wheel 774 13 окт 22:43 audit.txt drwxr-xr-- 2 root wheel 512 13 окт 22:33 pdf
# ls -ll recovery/pdf
total 2408 -rw-r--r-- 1 root wheel 122080 13 окт 22:33 00012096.pdf -rw-r--r-- 1 root wheel 2313048 13 окт 22:33 00095328.pdf

В audit.xt записывается отчёт о проделанной работе, он такой же как при использовании ключа –v. Foremost восстановил файлы 1.pdf и 6.pdf, правда у последнего размер отличается, но внутри он нормальный. Мной были использованы разные настройки для foremost, такие как: -d для Unix систем, лучше указывать. -b 16384 - размер блока в моей системе, лучше указывать.

Блок – это группа смежных фрагментов. Фрагмент – это группа смежных секторов. (Справедливо для UFS) Размер блока можно узнать установив TSK (/usr/ports/sysutils/sleuthkit)

# fsstat -f ufs /dev/ad1 | grep "Block Size" | awk '{print $3}'
16384

Я стал использовать конфигурационный файл с описанием PDF, вместо опции -t, нужные 2 файла найдены небыли, по неизвестной причине. Убрав завершитель, был найден файл под номеров 6 и часть файла под номером 5. Поиск по всем расширениям результата не принёс, хотя были найдены jpg из одного PDF файла. Их было так много, что можно было составить PDF из этих файлов. Восстановить все 6 файлов мне не удалось, появлялись ещё мелкие файлы, якобы pdf, но открыть их потом не представлялось возможным.

Воспользовавшись photorec, входящей в состав /usr/ports/sysutils/testdisk были найдены 2 файла PDF и 27 файлов txt. PDF файлами оказались всё те же 1.pdf и 6.pdf.

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

Устанавливаем TSK (/usr/ports/sysutils/sleuthkit) Можно посмотреть список удалённых файлов/директорий:

# fls -f ufs /dev/ad1
d/- * 3: .snap r/- * 4: 1.pdf r/- * 5: 2.pdf r/- * 6: 3.pdf r/- * 7: 4.pdf r/- * 8: 5.pdf r/- * 9: 6.pdf

Как видно из вывода, записи обо всех файлах есть. Звёздочкой (*) отмечены удалённые файлы/директории.

Немного ознакомившись с блоками, фрагментами и как происходит сохранение или удаление файла, дальнейшее восстановление не представляется возможным.(У меня нет времени собирать из фрагментов нужные мне файлы. Это как пазл (puzzle) собирать.)

После удаления файла в метаданных затираются следующие поля: - Указатели на блоки размещения, в которых находилcя файл. - Данные о размере файла.

Можно вывести сохранившиеся метаданные, но пользы от них не будет.(Вместо нужных данных записаны нули)

# ils -f ufs /dev/ad1
class|host|device|start_time ils|server.dom.ru.local||1192354043 st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime 3|f|0|5|1192306041|1192306029|1192306041|0|0|0|0|0 4|f|1001|1001|1192306029|1192299975|1192306029|0|0|0|0|0 5|f|1001|1001|1192306029|1192299976|1192306029|0|0|0|0|0 6|f|1001|1001|1192306029|1192299976|1192306029|0|0|0|0|0 7|f|1001|1001|1192306029|1192299983|1192306029|0|0|0|0|0 8|f|1001|1001|1192306029|1192299983|1192306029|0|0|0|0|0 9|f|1001|1001|1192306029|1192299984|1192306029|0|0|0|0|0

5,6,7 столбцы содержат информацию о времени.

      st_mtime
             UNIX time (seconds) of last file modification.
      st_atime
             UNIX time (seconds) of last file access.
      st_ctime
             UNIX time (seconds) of last inode status change.

Есть ещё /usr/ports/sysutils/ffs2recov, но и она маловероятно, что поможет.

P.S. Хранение данных о файле очень важно. Представьте себе лист в клетку. А теперь закрасим все клетки на этом листе разными цветами. Т.е. первую клетку красным, вторую зелёным, третью синим цветом и т.д. В итоге получим красивую картинку. Так вот всё, что закрашено красным – будет файл 1.pdf. Что закрашено синим - будет файл 2.pdf. И т.д. Теперь попробуйте собрать из красных клеток файл? Количество (размер) же известно? Маловероятно, но можно, т.к. неизвестен только порядок соединения красных клеток. В UFS всё ещё сложнее, представьте теперь, что лист стал чёрно-белым. :-)

Вот и всё.


Полезные ссылки по теме:
http://mark0.net/soft-trid-e.html
http://rlab.ru/doc/linuxharddatarecovery.html
http://weblog.infoworld.com/venezia/archives/2006_01.html


Используемая литература:
Криминалистический анализ файловых систем. Брайан Кэрриэ.