Використовуйте lsof, щоб знайти номер inode, і налагодження відтворити жорстке посилання на нього. Наприклад:
# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root 3w REG 8,3 3000 987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
Mode [0100600]
User ID [0]
Group ID [0]
Size [3181271]
Creation time [1375916400]
Modification time [1375916322]
Access time [1375939901]
Deletion time [9601027] 0
Link count [0] 1
Block count [6232]
File flags [0x0]
...snip...
debugfs: q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug 8 10:10 /var/log/messages
Перш ніж скаржитися, я підробив вищезгадану стенограму, оскільки у мене зараз немає видаленого файлу ;-)
я використовую mi
для скидання часу видалення та підрахунку посилань до значущих значень (0 та 1 відповідно), але це не працює належним чином - ви можете бачити, що кількість посилань залишається на нулі дюйма ls
. Я думаю, що ядро може кешувати дані inode. Вам, ймовірно, слід fsck при першій же можливості після використання налагоджень, щоб бути в безпечній стороні.
На мій досвід, ви повинні створити посилання, використовуючи тимчасове ім’я файлу, а потім перейменувати його на власне ім’я. Пов’язання його безпосередньо з початковим іменем файлу, здається, може призвести до пошкодження каталогу. YMMV!
readlink /proc/13381/fd/3
-> "/ home / vi / важливий_файл (видалено)" і/home/vi/important_file\ \(deleted\)
явно не існує.