Посилання на певний inode


14

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

Відповіді:


31

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

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

myfile.txt тепер відсутній, але команда хвоста зберігає живу команду. Щоб повернути файл, спочатку знайдіть PID процесу зберігання inode:

$ 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 to / 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

Я робив це з налагоджувачем файлової системи в далекому минулому (наприклад, "debugfs dump"), але концепція та ж.
Джеральд Комбс

1
приємна відповідь, +1
asdmin

Це не працює для мене. Зважаючи на те, що "3" є звисаючим символьним посиланням, а не "справжнім" дескриптором файлів, він завжди просто створює порожній файл.
Роб Чентер

4
@Rob: Ні, це не так. Якщо використовується дескриптор файлу, символьне посилання вказує на дійсні дані, інакше символьне посилання не існувало б в першу чергу. Коли файл закритий, симпосилання зникає. У вас був пробіл після "3", правда? Якщо ні, то виведете вміст дескриптора файлів 3 замість поточної оболонки, і він , ймовірно, порожній.
сонячно256

1
Єдина проблема з цим полягає в тому, що якщо файл все ще записується, то копія, яку ви робите, буде усічена. Ймовірно, немає часу між тим, коли припиняється запис і закривається файл, щоб зробити це, щоб отримати повний файл.
KayEss


-8

Немає портативного способу зробити це під Linux. Найкращим способом було б, мабуть, припинити всю активність у файловій системі, вбити програму, яка тримає файл відкритим, відключити файлову систему та використовувати налагоджувач файлової системи, щоб повторно приєднати її до каталогу. Якщо у вас файлова система експортується через NFS, принаймні деякі версії NFS можуть дозволяти вам читати файлові дані через NFS.


2
ви можете втратити файл, коли ви вб'єте програму
DukeLion
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.