Если вы используете файловую систему ext3, попробуйте следовать HOWTO Карло Вуда
В нескольких словах,
- Использовать ext3grep $ IMAGE --ls --inode 2 | grep your_file, чтобы найти файл, который вы ищете (где $ IMAGE - ваш раздел, например / dev / sda2)
- Найдите блок файловой системы, содержащий журнал нераспределенного пространства.
- Найти все дескрипторы журнала, ссылающиеся на блок, которые были найдены ранее.
- Скопируйте блок с дд.
- Отредактируйте файл, чтобы удалить конечные нули.
- кошка файл, где вы хотите
Из источника:
«Глава Пример ручного восстановления
В следующем примере мы вручную восстановим небольшой файл. Дан только частичный вывод, чтобы сэкономить место и сделать пример более читабельным.
Используя ext3grep $ IMAGE --ls --inode, мы находим имя файла, который мы хотим восстановить:
$ ext3grep $ IMAGE --ls --inode 2 | Греп Карло 3 конец d 195457 D 1202352103 Чт 7 февраля 03:41:43 2008 drwxr-xr-x carlo
$ ext3grep $ IMAGE --ls --inode 195457 | grep 'bin $' | head -n 1 34 35 d 309540 D 1202352104 Чт 7 февраля 03:41:44 2008 drwxr-xr-x bin
$ ext3grep $ IMAGE --ls --inode 309540 | grep start_azureus 9 10 r 309631 D 1202351093 чт 7 февраля 03:24:53 2008 rrwxr-xr-x start_azureus
Очевидно, что inode 309631 удален, и у нас нет номеров блоков для этого файла:
$ ext3grep $ IMAGE --print --inode 309631 [...] Inode is Nonloclocated Группа: 19 Id поколения: 2771183319 uid / gid: 1000/1000 режим: rrwxr-xr-x размер: 0 количество ссылок: 0 секторов: 0 (-> 0 косвенных блоков).
Времена Inode: Доступ: 1202350961 = Чт 7 Фев 03:22:41 2008 Изменен файл: 1202351093 = Чт 7 Фев 03:24:53 Изменен Inode: 1202351093 = Чт 7 Фев 03:24:53 2008 Время удаления: 1202351093 = Чт 7 февраля 03:24:53 2008
Прямые блоки:
Поэтому мы попытаемся найти его более старую копию в журнале. Сначала мы находим блок файловой системы, который содержит этот индекс:
$ ext3grep $ IMAGE --inode-to-block 309631 | Результирующий grep Индекс 309631 находится в блоке 622598 со смещением 0xf00.
Затем мы находим все дескрипторы журнала, ссылающиеся на блок 622598:
$ Ext3grep $ IMAGE --journal --block 622598 [...] дескрипторы журнальные ссылающихся блок 622598: 4381294 +26582 4381311 +28693 4381313 +28809 4381314 +28814 4381321 +29308 4381348 +30676 4381349 +30986 4381350 +31299 4381374 +32718 4381707 1465 4381709 2132 4381755 2945 4381961 4606 4382098 6073 4382137 6672 4382138 7536 4382139 7984 4382140 8931
Это означает, что транзакция с порядковым номером 4381294 имеет копию блока 622598 в блоке 26582 и так далее. Самый большой порядковый номер внизу должен быть последними данными, записанными на диск, и, таким образом, блок 8931 должен совпадать с текущим блоком 622598. Чтобы найти последнюю не удаленную копию, нужно начать снизу и работать снизу вверх.
Если вы попытаетесь напечатать такой блок, ext3grep распознает, что это блок из таблицы инодов, и напечатает содержимое всех 32 инодов в нем. Однако мы хотим видеть только индекс 309631; поэтому мы используем умный grep:
$ ext3grep $ IMAGE --print --block 8931 | grep -A15 'Inode 309631' -------------- Inode 309631 ----------------------- Идентификатор поколения: 2771183319 uid / gid: 1000/1000 режим: rrwxr-xr-x размер: 0 количество ссылок: 0 секторов: 0 (-> 0 косвенных блоков).
Времена Inode: Доступ: 1202350961 = Чт 7 Фев 03:22:41 2008 Изменен файл: 1202351093 = Чт 7 Фев 03:24:53 Изменен Inode: 1202351093 = Чт 7 Фев 03:24:53 2008 Время удаления: 1202351093 = Чт 7 февраля 03:24:53 2008
Прямые блоки:
Это действительно то же самое, что мы видели в блоке 622598. Далее мы смотрим на меньшие порядковые номера, пока не найдем один со временем удаления 0. Первый, который мы находим (снизу вверх), это блок 6073:
$ ext3grep $ IMAGE --print --block 6073 | grep -A15 'Inode 309631' -------------- Inode 309631 ----------------------- Идентификатор поколения: 2771183319 uid / gid: 1000/1000 режим: rrwxr-xr-x размер: 40 количество ссылок: 1 секторов: 8 (-> 0 косвенных блоков).
Время инода: Доступ: 1202350961 = Чт 7 февраля 03:22:41 Файл изменен: 1189688692 = Чт 13 сен 15:04:52 Изменен индекс 2007: 1189688692 = Чт 13 сен 15:04:52 2007 Время удаления: 0
Прямые блоки: 645627
Вышеуказанное автоматизировано и может быть сделано намного быстрее с параметром командной строки --show-journal-inodes. Эта опция найдет блок, к которому принадлежит индекс, затем найдет все копии этого блока в журнале и впоследствии напечатает только запрошенный индекс из каждого из этих блоков (каждый из которых содержит 32 inode, как вы знаете), удаляя дубликаты :
$ ext3grep $ IMAGE --show-journal-inodes 309631 Количество групп: 75 Минимальный / максимальный блок журнала: 1115/35026 Загрузка дескрипторов журнала ... выполнено Транзакция журнала 4381435 оборачивается, некоторые блоки данных могут быть потеряны в этой транзакции. Количество дескрипторов в журнале: 30258; мин. / макс. порядковые номера: 4379495/4382264 Копии инода 309631, найденные в журнале:
-------------- Индекс 309631 ----------------------- Идентификатор поколения: 2771183319 uid / gid: 1000/1000 режим: rrwxr-xr-x размер: 0 количество ссылок: 0 секторов: 0 (-> 0 косвенных блоков).
Времена Inode: Доступ: 1202350961 = Чт 7 Фев 03:22:41 2008 Изменен файл: 1202351093 = Чт 7 Фев 03:24:53 Изменен Inode: 1202351093 = Чт 7 Фев 03:24:53 2008 Время удаления: 1202351093 = Чт 7 февраля 03:24:53 2008
Прямые блоки:
-------------- Индекс 309631 ----------------------- Идентификатор поколения: 2771183319 uid / gid: 1000/1000 режим: rrwxr-xr-x размер: 40 количество ссылок: 1 секторов: 8 (-> 0 косвенных блоков).
Время инода: Доступ: 1202350961 = Чт 7 февраля 03:22:41 Файл изменен: 1189688692 = Чт 13 сен 15:04:52 Изменен индекс 2007: 1189688692 = Чт 13 сен 15:04:52 2007 Время удаления: 0
Прямые блоки: 645627
Файл действительно маленький: только один блок. Мы копируем этот блок с помощью dd, как показано ранее:
$ dd if = $ IMAGE bs = 4096 count = 1 skip = 645627 of = block.645627 1 + 0 записей в 1 + 0 записей, скопировано 4096 байт (4,1 кБ), 0,0166104 секунды, 247 кБ / с
и затем отредактируйте файл, чтобы удалить завершающие нули, или скопируйте первые 40 байтов (заданный размер файла):
$ dd if = block.645627 bs = 1 count = 40 of = start_azureus 40 + 0 записей в 40 + 0 записей из 40 байт (40 B) скопированных, 0,000105397 секунд, 380 кБ / с
$ cat start_azureus cd / usr / src / azureus / azureus ./azureus &
Восстановленные!»