Поскольку Linux является многопользовательской и многозадачной операционной системой, после удаления файлов их трудно восстановить. Хотя команда удаления только помечает файловый узел для удаления и фактически не очищает содержимое файла, другие пользователи и некоторые процессы, записывающие на диск, быстро перезапишут данные.
1. Краткое введение в структуру файловой системы Ext2.
В файловой системе Ext2, используемой в Linux, файлы хранятся блоками. По умолчанию размер каждого блока составляет 1 КБ, а разные блоки различаются по номерам. У каждого файла также есть узел, который содержит владельца файла, права на чтение и запись, тип файла и другую информацию. Для файла размером менее 12 блоков номер блока данных файла сохраняется непосредственно в узле. Если размер файла превышает 12 блоков, то узел сохраняет номер косвенного блока после 12 номеров блоков. В блоке, соответствующем этому косвенному номеру блока, сохраняются номера блоков из 256 блоков данных файла (каждый блок в Ext2fs). Число занимает 4 байта, поэтому номер блока, который можно сохранить в блоке, равен 1024/4=256). Если есть файлы большего размера, то в узле также появятся вторичные косвенные блоки и ** косвенные блоки.
2. Способы восстановления случайно удаленных файлов
Большинство дистрибутивов Linux предоставляют инструмент debugfs, который можно использовать для редактирования файловой системы Ext2. Но прежде чем использовать этот инструмент, еще предстоит проделать кое-какую работу.
Сначала перемонтируйте раздел, где находится случайно удаленный файл, в режиме только для чтения. Используйте следующую команду: (при условии, что файл находится в разделе /usr)
mount -r -n -o remount /usr -r указывает на монтирование только для чтения; -n указывает на отсутствие записи в /etc/mtab. Если вы восстанавливаете файлы в /etc, добавьте этот параметр. Если система сообщает, что раздел xxx занят, вы можете с помощью команды Fuser проверить, какие процессы используют файлы в этом разделе:
фьюзер –v –m /usr
Если важных процессов нет, остановите их следующей командой:
фьюзер -k –v –m /usr
Эти файловые системы затем можно перемонтировать.
Если все файлы установлены в большой раздел /, вы можете использовать Linux Single для входа в однопользовательский режим в командной строке загрузки, чтобы свести к минимуму вероятность записи данных на жесткий диск системным процессом, или просто подвесить жесткий диск в другом месте. . на машине. Кроме того, не записывайте восстановленные данные в / выше, чтобы не повредить эти полезные данные. Если на машине стоит dos/windows, то можно писать в эти разделы:
mount –r –n /dev/hda1 /mnt/had
Затем вы можете выполнить debugfs: (при условии, что Linux находится в /dev/hda5)
#debugfs /dev/hda5
Появится приглашение debugfs:
Используйте команду lsdel для вывода информации о многих удаленных файлах:
debugfs: lsdel debugfs: найдено 2692 удаленных индексных дескриптора. Режим владельца инода Размер блоков Время удаления 164821 0 100600 8192 1/ 1 Вс 13 мая 19:22:46 2001 36137 0 100644 4 1/ 1 Вт 24 апреля 10:11:15 2001 196829 0 100644 149500 38/ 38 Пн 27 мая 13:52:04 2001 |
В списке много файлов (здесь находится 2692). Первое поле — это номер узла файла, второе поле — владелец файла, третье поле — права на чтение и запись, а затем размер файла, количество занятых блоков и т. д. время удаления.
Затем мы сможем определить, какие из них нам нужны, исходя из размера файла и даты удаления. Например, мы хотим восстановить файл с узлом 196829:
Сначала вы можете посмотреть состояние данных файла:
debugfs:stat <196829> Индексный дескриптор: 196829 Тип: обычный Режим: 0644 Флаги: 0x0 Версия: 1 Пользователь: 0 Группа: 0 Размер: 149500 ACL файла: 0 ACL каталога: 0 Ссылки: 0 Количество блоков: 38 Фрагмент: Адрес: 0 Номер: 0 Размер: 0 ctime: 0x31a9a574 -- понедельник, 27 мая, 13:52:04 2001 г. atime: 0x31a21dd1 -- вторник, 21 мая, 20:47:29 2001 г. mtime: 0x313bf4d7 -- вторник, 5 марта, 08:01:27 2001 г. dtime: 0x31a9a574 — понедельник, 27 мая, 13:52:04 2001 г. БЛОКИ: 594810 594811 594814 594815 594816 594817 ВСЕГО: 38 |
Затем вы можете использовать команду dump для восстановления файла:
debugfs: дамп <196829> /mnt/hda/01.sav
Это восстановит файл. Выйти из отладки:
debugfs: выйти
Другой способ — отредактировать индекс вручную:
debugfs:mi <196829> Режим [0100644] Идентификатор пользователя [0] Идентификатор группы [0] Размер [149500] Время создания [0x31a9a574] Время модификации [0x31a9a574] Время доступа [0x31a21dd1] Время удаления [0x31a9a574] 0 Количество ссылок [0] 1 Количество блоков [38] Флаги файлов [0x0] Зарезервировано1[0] Файл acl [0] Каталог acl [0] Адрес фрагмента [0] Номер фрагмента [0] Размер фрагмента [0] Прямой блок № 0 [594810] Тройной косвенный блок [0] |
После использования команды mi для редактирования одновременно отображается одна строка информации. Для других строк вы можете напрямую нажать Enter для подтверждения, изменить время удаления на 0 (не удаляется) и изменить количество ссылок на 1. После внесения изменений выйдите из debugfs:
debugfs: выйти
Затем проверьте /dev/hda5 с помощью fsck.
fsck /dev/hda5
Программа сообщит, что нашла потерянный блок данных и поместит его в папку loss+found. Файлы в этом каталоге — это то, что нам нужно.