Поиск и восстановление удаленных файлов lsof: Подробное руководство

Как найти и удалить/восстановить файлы, которые открыты, но были удалены с помощью lsof

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

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

Часть 1. Что такое команда lsof?

Команда lsof

Команда lsof в системах Unix и Linux означает "Список открытых файлов". Это мощный инструмент для предоставления информации о файлах, открытых активными процессами в системе. Команда lsof предоставляет информацию о файлах, открытых процессами, таких как сетевые сокеты, обычные файлы, каталоги, блочные особые файлы и файлы символьных устройств.

  • Синтаксис команды lsof выглядит следующим образом:

lsof [options]

Опции, используемые с командой lsof, определяют информацию, которая будет отображаться, и формат, в котором она будет представлена.

Команда lsof имеет множество опций, и в таблице ниже перечислены наиболее часто используемые аргументы.

Опция
Описание
lsof Перечисляет все открытые файлы
-b Скрывает ядерные блоки
/ [file system] / Отображает открытые файлы в указанной файловой системе
/dev/tty* Показывает файлы, связанные с терминалом
-u [username] Печатает открытые файлы, принадлежащие определенному пользователю
-u ^[username] Печатает открытые файлы, принадлежащие всем пользователям, кроме определенного
-c [process] Перечисляет все файлы, используемые определенным процессом
-p [process ID] Отображает все открытые файлы, связанные с определенным идентификатором процесса
-p ^[process ID] Показывает открытые файлы, используемые всеми остальными идентификаторами процессов
-R Перечисляет идентификаторы родительских процессов
+D [directory path] Печатает все открытые файлы в каталоге
-i Показывает все файлы, используемые сетевыми соединениями
-i [IP version number] Фильтрует файлы на основе их номера версии IP
- i [udp or tcp] Фильтрует открытые файлы на основе типа соединения (TCP или UDP)
-i :[port number] Находит процессы, работающие на указанном порту
-i :[port range] Находит процессы, работающие в диапазоне портов
-t [file name] Перечисляет идентификаторы процессов, которые имели доступ к определенному файлу
# kill -9 'lsof -t -u [user]' Убивает все процессы, принадлежащие пользователю
-d mem Отображает все файлы, отображенные в память
[path] | grep deleted Печатает заблокированные удаленные файлы
man Открывает страницу справки

Часть 2. Как найти и удалить файлы, которые открыты, но были удалены с помощью lsof?

Давайте сначала поймем концепцию. Файл в Linux - это ссылка на индексный узел (inode), содержащий все свойства файла и блоки данных на диске, которые составляют содержание файла. Когда вы удаляете файл с помощью команды rm, вы удаляете ссылку на его индексный узел, но не сам индексный узел; другие процессы могут по-прежнему его использовать. Только после их завершения и удаления всех ссылок индексный узел и указанные им блоки данных становятся доступными для записи.

Даже если файл кажется исчезнувшим в списке каталога, данные все еще существуют, если какой-то процесс все еще его открыт.

В процесс-псевдофайловой системе Linux вступит в игру каталог /proc. У каждого процесса в системе есть свой каталог с собственным именем, который содержит много вещей, включая подкаталог fd (дескриптор файла) с ссылками на все файлы, которые процесс открыл. Даже если файл был удален из файловой системы, копия данных все еще присутствует:

Шаг 1. Чтобы определить, куда идти, получите идентификатор процесса и дескриптор файла процесса, который имеет открытый файл, с помощью lsof. После того как вы получили эту информацию от lsof, скопируйте данные из /proc.

  • Создайте текстовый файл:

$ man lsof | col -b > myfile

Шаг 2. Затем изучите содержимое только что созданного вами файла:

  • Команда less должна отобразить текстовую версию обширной страницы справки lsof.

$ less myfile

Шаг 3. Чтобы приостановить выполнение команды less, нажмите Ctrl-Z.

  • Проверьте, что ваш файл все еще присутствует при командной строке оболочки:

$ ls -l myfile
-rw-r--r-- 1 jimbo jimbo 114383 Oct 31 16:14 myfile
$ stat myfile
File: `myfile'
Size: 114383 Blocks: 232 IO Block: 4096 regular file
Device: 341h/833d Inode: 1276722 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1010/ jimbo) Gid: ( 1010/ jimbo)
Access: 2006-10-31 16:15:08.423715488 -0400
Modify: 2006-10-31 16:14:52.684417746 -0400
Change: 2006-10-31 16:14:52.684417746 -0400

Шаг 4. Удалите его.

  • На этот раз его уже там нет.

$ rm myfile
$ ls -l myfile
ls: myfile: No such file or directory
$ stat myfile
stat: cannot stat `myfile': No such file or directory
$

На этом этапе вы не должны разрешать процессу продолжить использование файла для выхода, так как это приведет к окончательной потере файла.

Часть 3. Как восстановить удаленные файлы с использованием lsof?

После нахождения и удаления открытых файлов, которые были удалены, давайте теперь восстановим их с помощью lsof. Если файл был удален, но по-прежнему открыт процессом, lsof может отобразить информацию о файле, включая его дескриптор файла, идентификатор процесса и полный путь.

Шаг 1. Посмотрите, что говорит lsof об этом:

$ lsof | grep myfile
less 4158 jimbo 4r REG 3,65 114383 1276722 /home/jimbo/myfile (deleted)

Первая колонка показывает имя команды, связанной с процессом, вторая колонка содержит идентификатор процесса, а четвертая колонка содержит дескриптор файла (буква "r" указывает, что это обычный файл). Вы знаете, что процесс 4158 открыл файл с файловым дескриптором 4. Все, что вам нужно знать, чтобы скопировать его из /proc.

Шаг 2. Поскольку вы восстанавливаете файл, вы можете подумать, что использование флага -a с командой cp - это правильное решение, но ЭТО НЕХОРОШО.

  • Вместо копирования литеральных данных файла вы скопируете теперь сломанную символическую ссылку на файл так, как она ранее отображалась в его исходном каталоге:

$ ls -l /proc/4158/fd/4
lr-x------ 1 jimbo jimbo 64 Oct 31 16:18 /proc/4158/fd/4 -> /home/jimbo/myfile (deleted)
$ cp -a /proc/4158/fd/4 myfile.wrong
$ ls -l myfile.wrong
lrwxr-xr-x 1 jimbo jimbo 24 Oct 31 16:22 myfile.wrong -> /home/jimbo/myfile (deleted)
$ file myfile.wrong
myfile.wrong: broken symbolic link to `/home/jimbo/myfile (deleted)'
$ file /proc/4158/fd/4
/proc/4158/fd/4: broken symbolic link to `/home/jimbo/myfile (deleted)'

  • Так что вместо всего этого будет достаточно просто cp:

$ cp /proc/4158/fd/4 myfile.saved

  • Наконец, убедитесь, что вы все сделали правильно:

$ ls -l myfile.saved
-rw-r--r-- 1 jimbo jimbo 114383 Oct 31 16:25 myfile.saved
$ man lsof | col -b > myfile.new
$ cmp myfile.saved myfile.new

Часть 4. Простая альтернатива lsof для восстановления удаленных файлов в Linux

Если вы ищете простую альтернативу lsof для восстановления удаленных файлов, рассмотрите использование программного обеспечения для восстановления файлов Linux такого как Wondershare Recoverit. В отличие от lsof, инструмента командной строки, Recoverit имеет простой графический интерфейс пользователя (GUI), который делает его легким в использовании, даже для людей с минимальным или отсутствующим техническим опытом. С Recoverit вы можете быстро отсканировать жесткий диск вашего компьютера и восстановить удаленные файлы всего несколькими кликами.

Wondershare Recoverit - ваш безопасный и надежный софт для восстановления данных на Linux.

Более 5 481 435 человек уже скачали его.

Восстанавливает утерянные или удаленные документы, фотографии, видео, музыку, электронные письма и более 1000 других типов файлов эффективно, безопасно и полностью.

Совместим с основными дистрибутивами Linux, включая Ubuntu, Linux Mint, Debian, Fedora, Solus, Opensuse, Manjaro и т.д.

Помогает в более чем 500 сценариях потери данных, таких как удаление, форматирование диска, сбой ОС, отключение питания, атака вируса, потеря раздела и многое другое.

Простой интерфейс с точечным и кликабельным интерфейсом позволяет вам восстанавливать данные с жестких дисков Linux всего несколькими кликами.

Работает через удаленное подключение. Вы можете восстановить утерянные данные даже в случае сбоя вашего устройства Linux.

Мы покажем вам, как использовать Wondershare Recoverit в Linux для восстановления удаленных данных. Если вам трудно следовать инструкциям, вот видеоролик с более подробным руководством для просмотра.

Скачать бесплатно

Для Windows Vista/7/8/10/11

Скачать бесплатно

Для macOS X 10.10 и выше

Шаг 1. Recoverit Linux Recovery

Запустите программу Wondershare Recoverit на вашем устройстве Linux. Затем выберите опции NAS и Linux на левой стороне основного интерфейса. Для продолжения выберите Восстановление Linux.

recoverit linux recovery

Шаг 2. Linux Remote Connection

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

linux remote connection

Пока вы ждете установки подключения, Recoverit начнет автоматический поиск потерянных данных на компьютере Linux.

Шаг 3. Процесс восстановления

В зависимости от объема сканируемых данных процедура сканирования может занять некоторое время; статус сканирования отображается в нижней панели. Лучшей особенностью Recoverit является возможность приостановки сканирования в любой момент, когда нужно восстановить файл.

automatic scanning process

Когда процесс сканирования завершен, Recoverit позволяет проверить файлы, чтобы убедиться, что они те, которые вы хотите восстановить. Выберите Восстановить чтобы сохранить файл на вашем устройстве Linux.

preview and recover data

Программа попросит вас выбрать местоположение для восстановленных файлов на вашем устройстве. Убедитесь, что вы выбираете другое место, чем то, где вы потеряли свои файлы ранее.

Скачать бесплатно

Для Windows Vista/7/8/10/11

Скачать бесплатно

Для macOS X 10.10 и выше

Итак

В заключение, "lsof" - полезная утилита командной строки для отображения информации о файлах, открытых процессами в системах, подобных Unix. Однако поиск и восстановление файлов, которые открыты, но были удалены, является сложным процессом и требует определенного уровня технической компетентности. В таких случаях программное обеспечение для восстановления файлов, такое как Recoverit, может быть более дружелюбной альтернативой, предоставляя простой GUI для быстрого сканирования и восстановления удаленных файлов.