Иногда люди удаляют файлы, которые они не должны, длительный процесс все еще имеет открытый файл, и восстановление данных с помощью catting /proc/<pid>/fd/N
просто не достаточно круто . Достаточно удивительным было бы, если бы вы могли «отменить» удаление, запустив некоторую магическую опцию для ln, которая позволила бы вам повторно связать номер инода (восстановленный через lsof).
Я не могу найти никаких инструментов для Linux, чтобы сделать это, хотя бы с беглым гуглом.
Что у тебя, serverfault?
РЕДАКТИРОВАТЬ1: Причина, по которой файл загружается /proc/<pid>/fd/N
не достаточно круто , заключается в том, что процесс, в котором все еще открыт файл, все еще записывает в него файл. Удаление удаляет ссылку на индекс из пространства имен файловой системы. То, что я хочу, это способ воссоздания ссылки.
EDIT2: 'debugfs ln' работает, но риск слишком высок, так как он сбрасывает необработанные данные файловой системы. Восстановленный файл также безумно противоречив. Количество ссылок равно нулю, и я не могу добавить ссылки на него. Мне хуже от этого, так как я могу просто использовать /proc/<pid>/fd/N
для доступа к данным, не портя мои фс.
/path/to/deleted/file
находится в той же файловой системе, что и файл, который был до того, как он был удален, иначе это будет - действительно - не удастся. (Вы можете получить старый путь с помощьюls -l /proc/<pid>/fd/<handle>
)tmpfs
файловых системах, но не на, напримерext3
. Кроме того , эта функция получила полностью отключена в 2.6.39, см коммита . Поэтому, поэтому это решение больше не будет работать с ядром 2.6.39 или новее, а в более ранних версиях оно зависит от файловой системы.ln -L
не работает для меня. У меня есть удаленный файл, и я попытался связать его с исходным путем.ln
дает мнеln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Но я могу, например, успешноcat /proc/19674/fd/16
Похоже, вы уже многое поняли, поэтому я не буду вдаваться в подробности. Есть несколько способов найти индекс, и вы обычно можете перехватить и перенаправить STDOUT. Вы можете использовать
debugfs
. Запустите эту команду в:ln <$INODE> FILENAME
Убедитесь, что у вас есть резервные копии файловой системы. Возможно, вам понадобится запустить fsck позже. Я успешно проверил это с inode, все еще пишущим, и он действительно работает, чтобы создать новую жесткую ссылку на inode с разыменованными ссылками.
Если файл не связан с неоткрытым файлом в ext3, данные будут потеряны. Я не уверен, насколько это верно, но большая часть моего опыта восстановления данных связана с ext2. Из ext3 FAQ:
В этом вопросе также есть соответствующая информация:
Я переписал большой файл с пустым на сервере Linux. Могу ли я восстановить существующий файл?
источник
способ отладки, как вы видели, на самом деле не работает, и в лучшем случае ваш файл будет удален автоматически (из-за журнала) после перезагрузки, и в худшем случае вы можете очистить файловую систему, что приведет к «циклу перезагрузки смерти». Правильное решение (TM) - выполнить восстановление на уровне VFS (что также дает дополнительное преимущество работы практически со всеми современными файловыми системами Linux). Путь системного вызова (flink) сбрасывается каждый раз, когда он появляется в LKML, поэтому лучше всего использовать модуль + ioctl.
Проект, который реализует этот подход и имеет достаточно маленький и чистый код, называется fdlink ( https://github.com/pkt/fdlink.git для версии, протестированной с ядром ubuntu maverick). С его помощью после того, как вы вставите модуль (sudo insmod flink_dev.ko), вы можете просто сделать «./flinkapp / proc // fd / X / my / link / path», и он будет делать именно то, что вы хотите.
Вы также можете использовать версию vfs-undelete.sourceforge.net с прямым переносом, которая также работает (и может также автоматически ссылаться на исходное имя), но код fdlink проще и работает так же хорошо, так что это мое предпочтение.
источник
Я не знаю, как делать то, что вы хотите, но я бы сделал следующее:
Не идеально, конечно, но возможно. Другой вариант - поиграть с debugfs (используя
link
команду), но это довольно страшно на рабочей машине!источник
link
не работал в моем тестировании, ноln
сделал.Столкнулся с той же проблемой сегодня. Лучшее, что я мог придумать, - это бежать
в сеансе tmux / screen до завершения процесса.
источник
>
) на удаленный файл?Интересный вопрос. Интервьюер задал мне тот же вопрос на собеседовании. То, что я сказал ему, было то, что не было легкого способа сделать это и вообще не стоило затраченного времени и усилий. Я спросил его, что он думает, что решение этой проблемы было ....
источник
Используйте Sleuthkit icat.
источник
Быстрое решение, которое сработало для меня, без устрашающих инструментов:
1) найдите процесс + fd, посмотрев прямо в / proc:
2) Затем метод, аналогичный @ nickray, с
pv
добавлением:Вам может понадобиться Ctrl-C, когда вы закончите (
ls /proc/{procnum}/fd/{fdnum}
скажет, что файл больше не существует)), но если вы знаете точный размер в байтах, вы можете использоватьpv -S
его, чтобы завершить работу при достижении счетчика.источник