Удаленные открытые файлы linux

Восстановление открытых файлов но удаленных c файловой системы linux

Всех с прошедшим новым годом!
В этой заметке я бы хотел поделиться как можно восстановить открытый файл в linux.

Предыстория

Зашел человек на канал посвященный debian в jabber и сказал что взломали его jabber-bot и выполнили команду:

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

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

Первым делом нам нужно убедиться что у нас стоит приложение lsof и примонтирован procfs в /proc.
В этой заметке я буду считать что в системе где будут восстанавливаться открытые файлы все нужные приложения стоят, root доступ есть, всё примонтировано как нужно.

Первым делом нам нужно найти открытый файл с помощью программы lsof:

$ sudo lsof | grep /home/anton/.xsession-errors kwin 2031 4002 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

kwin 2031 4002 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

$ sudo cp /proc/2031/fd/2 /home/anton/.xsession-error

На этом всё, так можно восстановить открытый файл, но который по какой-то причине был удален.

UPD1: Меня спросили как найти и восстановить все открытые файлы конкретным приложением.
Предположим мы знаем 1 файл который нужно восстановить, мы его нашли с помощью

$ sudo lsof | grep /home/anton/.xsession-errors kwin 2031 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

Мы знаем что 2031 — это pid процесса который держит ваш файл. Нам нужно найти все файлы которые держать открытыми данный процесс:

$ sudo lsof -p 2031 | grep deleted

После чего просто восстанавливаем все файлы как описано выше.

Читайте также:  Linux get application name

UPD2: Почему я использую grep для поиска файлов вместо параметра, который работает быстрей?
Я использую grep так как там видно удален файл или нет, я считаю это более удобным (ИМХО)

UPD3: Также можно посмотреть все открытые файлы процесса через комманду ls, пометки deleted будут, пример:

Источник

Удаление открытого файла в Linux

blog.bissquit.com

Есть ряд каверзных вопросов по Linux, которые вводят в ступор большинство начинающих системных администраторов Linux. Их очень любят задавать на собеседованиях бывалые админы, а в интернете про ответы на них не написал только ленивый. В топе уже наверно полтора десятилетия держится вопрос про удаление открытого файла в Linux. Тем не менее кандидаты все также из раза в раз продолжают делать круглые глаза. Максимум, что от них можно услышать — это «Иноды. Я слышал про иноды, но больше про них ничего не знаю».

Чтобы раз и навсегда внести ясность в этот вопрос и была написана эта статья.

Удаление открытого файла в Linux

Чтобы проверить как работает файловая система в Linux, проведем небольшой эксперимент.

Подготовка

Для проведения всех тестов нам необходима виртуальная машина с практически любым дистрибутивом Linux и дополнительный диск. Благо в век виртуализации это сделать проще простого. Для наглядности возьмем диск в пару гигабайт и заранее подготовим его (базовые операции с дисками рассмотрим в другой статье).

Представим, что вы впервые вошли по ssh на сервер, у вас рутовые права и ваша задача просто разобраться с дисковой подсистемой.

Свободное место и свободные иноды

Первое, что мы сделаем, это проверим диски всем знакомой командой df (лишние данные убраны из вывода):

Утилита отображает занятое на файловой системе место в блоках 1К. Этой информации в большинстве случаев хватает лишь для констатации факта о % свободного места и не стоит на этом останавливать диагностику.

Читайте также:  Close all open files linux

Проблемы с записью новых файлов может вызвать также нехватка инодов (inodes), поэтому полезно будет их проверить той же командой, но с другим ключом:

Используется 1% места на разделе. Запоминаем вывод команд, он нам понадобится для последующего анализа.

Создание файлов на диске

Далее создадим один большой файл на нашем диске. Сделать это проще всего утилитой dd, которая поставляется по умолчанию вместе с системой (предварительно создадим пару каталогов):

И ещё создадим 10 маленьких файлов, но другим способом:

Теперь снова смотрим два вывода df:

Как видно, теперь на диске занято 75%. А что с инодами?

Количество инод изменилось на 13, хотя файлов мы создали всего 11.

Эксперимент с удалением открытого файла

Теперь посмотрим на ситуацию другой утилитой, которую также обязательно нужно использовать для диагностики. Речь о du:

Примерно занят 1ГБ.

Примечание: для изучения ключей наберите в консоли man du. Актуально также и для других утилит, рассматриваемых в статье.

Теперь сымитируем что-то похожее на блокировку файла (если будут предупреждения, соглашайтесь):

Команда просто открывает файл на чтение и отправляет задание в бэкграунд. Теперь удаляем файл:

После этого проверяем свободно место:

В итоге место не освободилось, хотя файл, казалось бы, удален. Инодов используется столько же. Но может быть du покажет нам что-то другое:

Занято 8Кб. Ок, есть ещё одна утилита, которая лучше других объяснит что происходит, это lsof:

Мы посмотрели все, что хотели, можно заканчивать.

Завершение эксперимента

Сворачиваем наш эксперимент — убиваем процесс, который мы ранее запустили в фоновом режиме:

Теперь снова проверяем свободное место:

Большой файл удалился, место и иноды освободились. Смысла проверять вывод du нет, она покажет то же самое, что и в предыдущий раз.

Читайте также:  Ubuntu версии дистрибутивов linux

Выводы

Что все же произошло? А произошло следующее: информация от du и df до удаления большого файла была очевидной и объяснений не требует. За исключением одного момента — почему файлов создали 11, а количество инодов увеличилось на 13? Тут все просто. Наверно все слышали выражение, что все в линуксе — файл 1 ? И каталог тоже, а их мы создали два.

Далее мы удалили файл, который открыт на чтение другим процессом. Команда rm удалила ссылку на файл, которую хранит объект каталога, но не смогла удалить файл физически с диска, поскольку файл был открыт на чтение другой программой.

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

Хоть файл уже и не имел имени, но все ещё имел файловый дескриптор (= инод), к которому продолжала обращаться программа. Это было также хорошо заметно по выводу lsof — файл был помечен как удаленный. Как только программу остановили, файл освободился и система смогла завершить начатое — удалить файл и зависимые структуры данных на диске окончательно.

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

Источник

Оцените статью
Adblock
detector