Содержание статьи
О восстановлении данных с файловых систем Linux не писал только
ленивый. Для выполнения этой задачи существует множество самых разнообразных
средств, включая утилиту debugfs, которая с легкостью извлекает любые потертые
файлы с ext2. Но как же быть с другими ФС? Как восстановить исчезнувший файл с
флеш-брелка или расположенного рядом NTFS-раздела? Об этом молчат даже самые
трудолюбивые блоггеры. А между тем, все очень просто и прозаично.
Не всегда удобно перезагружаться в другую операционную систему для выполнения
действий по проверке файловых систем, восстановления файлов, изменения размера
разделов и выполнения других операций с данными. Представь, что уже несколько
лет на твоем компе установлено две операционные системы: Windows и Linux. Первую
ты загружаешь очень редко и только в экстренных случаях, второй пользуешься
ежедневно и уже подумываешь о полном переходе на Linux и удалении винды, вот
только NTFS-раздел, хранящий годами накапливаемые данные, перевести в ext3
нельзя никакими инструментами. Приходится держать две операционки, потому что
хоть NTFS-раздел и доступен из Linux (с помощью ntfs-3g), для решения проблем
файловой системы все равно придется перезагружаться в Windows.
А если накрылась файловая система FAT на Flash-накопителе? Опять
перезагружаться в Windows? Или ты случайно удалил файл в файловой системе UFS,
принадлежащей рядом установленной FreeBSD? Может быть, ты системный
администратор, и диска для восстановления Windows в нужный момент не оказалось
под рукой? Отвечу на все вопросы сразу: почти все действия по возвращению из
небытия файловых систем FAT, NTFS, UFS, восстановлению хранящихся в них файлов,
диагностике и многому другому можно произвести, не покидая Linux. Из этой статьи
ты узнаешь, как это сделать.
Набор инструментов
Перед тем, как перейти непосредственно к описанию процесса восстановления,
диагностики и возвращения убитых файлов к жизни, считаю своим долгом ознакомить
тебя со списком используемых инструментов. Во-первых, нам понадобятся
инструменты для работы с файловыми системами (создание, проверка, получение
информации). Все они распространяются в трех пакетах:
1. dosfstools - утилиты для работы с файловыми системами типа FAT.
Пакет содержит всего две программы: mkfs.vfat (mkfs.dos) для создания файловой
системы и fsck.vfat (fsck.dos) для выполнения проверки файловой системы.
2. ufsutils - набор утилит для работы с UFS и производными (например,
FFS, используемой во FreeBSD). Содержит восемь утилит, включая mkfs.ufs,
fsck.ufs, tunefs.ufs (настройка ФС), growfs.ufs (изменение размера) и другие.
3. ntfsprogs - различные утилиты для работы с NTFS. Не содержит
программ для создания или полной проверки (базовая проверка возможна) файловой
системы, но включает в себя массу полезнейших инструментов, таких как ntfscp для
копирования файлов без монтирования раздела, "реинкарнатор" файлов ntfsundelete,
утилита для изменения размера раздела ntfsresize, программа для клонирования
разделов ntfsclone и другие.
Также нам могут пригодиться инструменты для работы с разделами жесткого
диска. Есть три наиболее продвинутые программы такого типа:
parted,
предназначенная для создания разделов, изменения их размера, перемещения,
создания и проверки файловых систем;
gpart -
программа-восстановитель затертой таблицы разделов и
TestDisk -
аналог gpart с псевдо-графическим интерфейсом и несколькими полезными функциями.
Следует отметить, что parted - лишь хорошая обертка поверх описанных утилит
для работы с файловыми системами, поэтому почти все, что может parted, могут и
они. Причем вокруг самой parted есть и другая обертка, названная
gparted. Она
всего-навсего создает удобный графический GTK-интерфейс в стиле Partition Magic.
В пакете TestDisk ты найдешь утилиту PhotoRec, предназначенную для
восстановления различных типов файлов с раздела вне зависимости от используемой
файловой системы. Принцип ее работы заключается в поиске и восстановлении файлов
по их метаданным без анализа структуры файловой системы. PhotoRec способна
восстанавливать изображения (bmp, jpg, png, tiff, raf, raw, rdc, x3f, crw, ctg,
orf, mrw), аудио-файлы (wav, au, mp3, wma), видео-файлы (avi, mov, mpg), архивы
(bz2, tar, zip), документы (doc, pdf, html, rtf), файлы с исходниками программ (c,
pl, sh). Ряд программ такого же типа можно найти в пакете
Sleuth Kit, для которого
существует web-интерфейс autopsy.
Сценарии использования
В следующих разделах мы рассмотрим несколько распространенных сценариев
использования описанных утилит. Во-первых, это подробное описание процесса
восстановления файлов с использованием трех разных подходов, во-вторых, починка
файловых систем после сбоя, в-третьих, клонирование раздела на несколько машин,
в-четвертых, описание процесса переноса данных на раздел меньшего размера.
Кастим ressurection
Для оживления умерших файлов на NTFS предназначена уже упоминавшаяся
ntfsundelete из пакета ntfsprogs. Она очень проста в использовании и чрезвычайно
аккуратна. Если ты случайно потер файл и сразу же отмонтировал раздел, будь
уверен - ntfsundelete сможет вернуть его на место в целости и сохранности.
Для начала необходимо просмотреть список всех удаленных файлов:
# ntfsundelete /dev/sda1
В третьей колонке вывода будет указан процент сохранности файла. Если он
равен 100% - все ок, файл может быть возвращен к жизни целым и невредимым;
меньшее значение указывает на то, что какие-то его участки уже были затерты
новыми данными, поэтому после восстановления файл окажется, что называется,
битым. В некоторых случаях возможность восстановления даже наполовину убитого
файла может сделать погоду, пока же остановимся на полностью целых экземплярах.
Для этого выполним следующую команду:
# ntfsundelete -p 100 /dev/sda1
Ух, как же их много! Заставим программу вывести на экран только файлы,
удаленные за последние 2 дня:
# ntfsundelete /dev/sda1 -p 100 -t 2d
Так-то лучше. Восстановим файл, номер inode (первая колонка вывода) которого
равен 11172, в каталог /undeleted:
# ntfsundelete /dev/sda1 -u -i 11172 -d /undeleted
Файлы можно восстанавливать по маске:
# ntfsundelete /dev/sda1 -u -m "*.doc"
Фильтровать по длине:
# ntfsundelete /dev/hda1 -S 5k-6m
Или же ты можешь восстановить все удаленные файлы, а уже потом разобраться,
что к чему:
# ntfsundelete /dev/sda1 -u -m "*" -d /undeleted
Программа извлекает файлы со всеми атрибутами, включая имя и время создания.
Пользоваться ей одно удовольствие.
Для восстановления данных со всех остальных файловых систем, включая FAT, UFS,
EXT3, да и любых других, удобнее всего использовать PhotoRec. Запускаем
программу:
# photorec
В главном меню выбираем подопытное устройство (например, /dev/sda). Нажимаем
<Enter> и выбираем тип таблицы разделов (для писюков это Intel). Далее выбираем
раздел, а на следующем экране - тип файловой системы (ext2/ext3 или другая).
Задаем каталог, куда мы хотим поместить восстановленные файлы, и нажимаем "Y".
Каталог должен находиться на другом разделе/диске, иначе ты рискуешь усугубить
ситуацию, затерев удаленные файлы новыми данными.
Все, начался процесс восстановления, он может продлиться от 10 минут до
нескольких часов, в зависимости от "старости" файловой системы и количества
удаленных файлов. Ты можешь остановить процесс в любой момент, нажав <Ctrl-C>, и
возобновить его с места прерывания, вновь запустив PhotoRec.
В выбранном тобой каталоге ты найдешь массу подкаталогов с именами вроде
recup_dir.1, recup_dir.2, каждый из которых содержит большое количество файлов
разного типа. Имена PhotoRec не восстанавливает, поэтому придется повозиться с
разгребанием всей этой кучи.
У PhotoRec есть и другие недостатки:
- Достаточно часто он дает сбои, и файлы могут оказаться поврежденными,
поэтому их следует проверять на "небитость" в обязательном порядке. - Программа ищет файлы по шаблонам. Если ты удалил файл, формат которого
не поддерживается PhotoRec - пиши пропало.
Поэтому в довесок к photorec необходимо иметь под рукой другие средства
анализа и восстановления утраченных данных. Лучшим на этом поприще считается
комплект утилит Sleuth Kit,
содержащий огромное количество самых разнообразных инструментов, которые любят
применять в своей работе различные службы по расследованию инцидентов взлома и
продвинутые системные администраторы. Мы далеки от этого, и нас интересуют
только две утилиты из всего комплекта: fls и icat, предназначенные для поиска и
извлечения файлов (как существующих, так и удаленных).
Просмотрим список удаленных файлов с помощью утилиты fls:
# fls -rd /dev/sdb1
r/r * 117: dsc0005.jpg
r/r * 119: dsc0006.jpg
r/r * 122: dsc0007.jpg
r/r * 125: dsc0008.jpg
r/r * 128: dsc0009.jpg
Флаг '-r' заставляет программу рекурсивно проходить по всем каталогам, а '-d'
- показывать только удаленные файлы.
Скорее всего, листинг будет очень длинным, и к тому же будет содержать список
inode, которые уже были отданы другим файлам (строчка realloc в третьей
колонке), поэтому мы его отфильтруем и направим в less:
# fls -rd /dev/sda1 | grep -v '(realloc)' | less
В третьей колонке ты увидишь номера inode-файлов, а в четвертой - их имена.
Чтобы выдернуть файл из ФС, воспользуйся командой icat (флаг '-r' предназначен
для восстановления удаленного файла):
# icat -r /dev/sda1 1023 > /home/vasya/tmp/my_file
Для восстановления всех файлов можно воспользоваться следующей командой:
# for i in `fls -rd /dev/sda1 | grep -v '(realloc)' |\
awk {'print $3'}|tr -d [:]`; do icat -r -f fat /dev/sdb1 $i >\
/home/vasya/tmp/inode-$i ;done
Если ты желаешь найти какой-то конкретный файл, то вывод fls можно просто "погрепать":
# fls -rd /dev/sda1 | grep -v '(realloc)' | grep my_file.jpg
Замечательная особенность утилит Sleuth Kit состоит в том, что они используют
множество самых разнообразных методик поиска удаленных файлов и их частей. Это и
анализ управляющих структур файловой системы, и различные эвристические методы,
и сопоставление с шаблоном. Фактически, с помощью Sleuth Kit возможно вернуть к
жизни даже файлы, затертые на ext3 (притом, что сами разработчики ext3 говорят о
невозможности проведения такой операции).
Починка файловых систем
Починить поломавшуюся файловую систему очень просто. Достаточно
воспользоваться стандартными утилитами fsck.vfat (для файловых систем FAT12,
FAT16 и FAT32), fsck.ufs (для UFS, UFS2, FFS) и ntfsfix (для NTFS).
К сожалению, ntfsfix не способна полностью вылечить NTFS. Она лишь исправляет
некоторые из ее проблем и устанавливает флаг принудительной проверки файловой
системы, так что следующая перезагрузка в Windows повлечет за собой запуск
chkdsk для полной проверки ФС.
Используя виртуальную машину, мы можем избежать необходимости перезагрузки в
Windows. Для этого:
- Запускаем виртуальную машину и устанавливаем винду на виртуальный
жесткий диск. - Отмонтируем раздел, содержащий файловую систему NTFS.
- Запускаем виртуальную машину, в качестве первого жесткого диска которой
указываем виртуальный диск с Windows, а второго - наш настоящий жесткий
диск. - С помощью стандартных средств Windows запускаем проверку NTFS-раздела.
Копирование разделов
Допустим, ты купил новый жесткий диск и хочешь перенести несколько разделов
со старого диска на новый. Если ты начнешь делать это стандартными методами,
через создание нового раздела и ручное копирование файлов, то рискнешь поиметь
массу проблем, связанных с кодировками имен файлов, специальными файлами,
защищенными файлами, да и потеряешь массу времени. Лучше воспользоваться методом
клонирования раздела.
Пользователи UNIX клонируют разделы с помощью стандартной утилиты dd, которую
можно применять в связке с любой файловой системой. Для этого на новом диске
создается раздел, идентичный по размерам источнику, и выполняется команда "dd if=раздел1
of=раздел2 bs=1m". Таким же образом можно скопировать и NTFS-раздел, но в пакете
ntfsprogs для этой цели есть более подходящая утилита.
Программа ntfsclone идентична по функциональности команде dd за исключением
двух особенностей. Во-первых, она не копирует незанятые участки файловой
системы, и перемещение происходит быстрее, а образ раздела (если ты создаешь
образ) занимает меньше места. Во-вторых, ntfsclone способна хранить образ в
специальном сжатом файле, который удобно передавать на другие машины.
Для клонирования раздела достаточно выполнить следующую команду:
# ntfsclone --overwrite /dev/hda1 /dev/hdb1
А для создания образа:
# ntfsclone --save-image --output backup.img /dev/hda1
Утилита ntfsclone особенно удобна, если ты решил скопировать установленный
Windows на целый парк других машин (учебный класс или офис). Для этого
достаточно установить Windows на одну машину и создать образ, который затем
можно выложить в шару и с помощью Linux LiveCD залить на другие машины. Чтобы
они смогли загружаться, придется также скопировать MBR-запись диска:
# sfdisk -d /dev/sda > /share/sda-sfdisk.dump
# dd if=/dev/sda bs=512 count=1 of=/share/sda-mbr.dump
А затем записать ее на диск всех машин:
# sfdisk /dev/sda < /share/sda-sfdisk.dump
# dd if=/share/sda-mbr.dump of=/dev/sda
Перенос данных
Что делать, если ты решил полностью перейти на Linux, но не хочешь
использовать различные ухищрения и ntfs-3g для доступа к своим старым данным,
расположенным на NTFS-разделе? Ведь этот раздел может занимать большую часть
диска, и нет никакой возможности просто скопировать его содержимое на новый
раздел, отформатированный в ext3/ext4. В этом случае тебе на помощь опять придут
утилиты из пакета ntfsprogs, а точнее одна из них - ntfsresize, которая позволит
копировать данные небольшими порциями в новую файловую систему с последующим
уменьшением размера NTFS-раздела и увеличением ext3/ext4-раздела. Для этого тебе
понадобится какой-нибудь LiveCD, содержащий ntfsprogs и e2fsprogs версии не ниже
1.41 (для поддержки ext4, если ты, конечно, собираешься переносить данные на
нее). Также очень желательно, чтобы LiveCD содержал свеженький gparted, потому
что изменять размер вручную трудно и опасно (кроме изменения размера самой ФС,
предстоит менять размер раздела с помощью fdisk, одна ошибка и всю операцию
придется начинать сначала).
Итак, загружаемся с LiveCD и монтируем разделы жесткого диска. Допустим, его
размер составляет 120 Гб. Из них 80 Гб - под завязку набитый NTFS-раздел, а
остальные 30 Гб (да, именно 30, после перевода маркетинговых гигабайт в
настоящие объем диска оказывается равным примерно 111 Гб) - это раздел с
установленным Linux, занятость которого составляет 5 Гб. Значит, наше "окно"
равно примерно 25 Гб. Перемещаем файлы с NTFS-раздела на ext3/ext4-раздел до тех
пор, пока их совокупный размер не станет равен размеру окна. В результате
последний оказывается полностью заполненным, а первый "худеет" на 25 Гб.
Отмонтируем оба раздела и запускаем gparted. Выбираем NTFS-раздел, жмем вторую
кнопку мыши, выбираем Resize/Move и уменьшаем раздел на размер окна, выбираем
ext3/ext4-раздел и увеличиваем его на тот же размер окна (раздел придется
сдвинуть к началу диска, а затем увеличить). Так мы получаем еще 25 Гб
освободившегося места, что позволит нам скопировать часть файлов, а затем вновь
изменить размер. Четыре таких прохода, и мы полностью удаляем NTFS-раздел, а
раздел ext3/ext4 расширяем на весь диск.
Выводы
Как ты смог убедиться, Linux умеет не только работать с множеством сторонних
файловых систем, но и оснащен массой утилит для их модификации, проведения
диагностики и выполнения других операций. Ты никогда не окажешься в безвыходной
ситуации, держа под рукой LiveCD на базе Linux, который как раз и является тем
самым Святым Граалем любого системного администратора и пользователя.
WWW
foremost.sourceforge.net - Foremost, еще одна популярная программа для
восстановления файлов по шаблонам.
www.sysresccd.org -
System Rescue CD содержит все упомянутые в статье программы.