Sử dụng lsof để tìm số inode và gỡ lỗi để tạo lại một liên kết cứng đến nó. Ví dụ:
# 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
Trước khi bạn phàn nàn, tôi đã làm giả bảng điểm ở trên vì tôi không có tệp bị xóa ngay bây giờ ;-)
Tôi sử dụng mi
để đặt lại thời gian xóa và số lượng liên kết thành các giá trị hợp lý (tương ứng 0 và 1), nhưng nó không hoạt động chính xác - bạn có thể thấy số lượng liên kết vẫn ở mức 0 in ls
. Tôi nghĩ rằng kernel có thể lưu trữ dữ liệu inode. Bạn có lẽ nên fsck trong cơ hội sớm nhất sau khi sử dụng debugfs, để ở bên an toàn.
Theo kinh nghiệm của tôi, bạn nên tạo liên kết bằng tên tệp tạm thời và sau đó đổi tên thành tên thích hợp. Liên kết nó trực tiếp đến tên tệp gốc dường như gây ra hỏng thư mục. YMMV!
readlink /proc/13381/fd/3
-> "/ home / vi / Quan trọng_file (đã xóa)" và/home/vi/important_file\ \(deleted\)
rõ ràng là không tồn tại.