Ссылка на определенный индекс

14

У меня есть файл, который был удален, но все еще остается открытым программой. Я нашел номер инода с помощью lsof. Как я могу создать жесткую ссылку на этот индекс?

Джефф Ферланд
источник

Ответы:

31

Вы не можете создать ссылку на него, но вы можете получить его обратно. Давайте сделаем эксперимент:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt теперь отсутствует, но inode поддерживается командой tail. Чтобы вернуть ваш файл, сначала найдите PID процесса, хранящего индекс:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

PID 409. chdir в / proc / 409 / fd / и список содержимого:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Каталоги / proc / [PID] / fd / содержат символические ссылки на файловые дескрипторы всех файлов, которые использует процесс. В этом случае символическая ссылка «3» указывает на удаленный файл. Итак, чтобы восстановить файл, скопируйте содержимое в новый файл:

$ cat 3 >/home/mydir/saved_file.txt
sunny256
источник
Я сделал это с помощью отладчика файловой системы в далеком прошлом (например, «debugfs dump»), но концепция та же.
Джеральд Комбс
1
хороший ответ, +1
asdmin
Это не работает для меня. Учитывая, что «3» является висячей символической ссылкой, а не «реальным» файловым дескриптором, она всегда просто создает пустой файл.
Роб Чантер
4
@Rob: Нет, это не так. Если дескриптор файла используется, символическая ссылка указывает на допустимые данные, иначе символическая ссылка не существовала бы в первую очередь. Когда файл закрыт, символическая ссылка исчезает. У вас был пробел после «3», верно? Если нет, вы выведете содержимое файлового дескриптора 3 в текущей оболочке, и это, вероятно, пусто.
sunny256
1
Единственная проблема с этим заключается в том, что если файл все еще записывается, то копия, которую вы делаете, будет усечена. Вероятно, нет времени между тем, когда запись останавливается и файл закрывается, чтобы сделать это, чтобы вы получили полный файл.
KayEss
-8

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

Vatine
источник
2
вы можете потерять файл после того, как убьете программу
DukeLion