链接到特定的inode


14

我有一个已删除的文件,但仍由程序保持打开状态。我使用lsof找到了索引节点号。如何创建硬链接回到该索引节点?

Answers:


31

您无法创建链接,但可以将其取回。让我们做一个实验:

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

myfile.txt现在消失了,但是intail通过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

我已经在很远的时候使用文件系统调试器(例如“ debugfs dump”)来完成此操作,但是概念是相同的。
Gerald Combs

1
好答案,+ 1
asdmin

这对我不起作用。鉴于“ 3”是一个悬挂的符号链接,而不是“真实的”文件描述符,因此它始终只会创建一个空文件。
罗布·尚特

4
@Rob:不,不是。如果使用文件描述符,则符号链接指向有效数据,否则符号链接将不存在。关闭文件后,符号链接消失。您在“ 3”之后确实有空格,对吗?如果没有,你会输出文件描述符3的在当前shell的内容,而是和大概空。
09年

1
唯一的问题是,如果仍在写入文件,则您制作的副本将被截断。从停止写入到关闭文件之间可能没有时间执行此操作,以便获得完整的文件。
KayEss


-8

在Linux下,没有可移植的方法来执行此操作。最好的方法可能是停止文件系统上的所有活动,杀死使文件保持打开状态的程序,卸载文件系统并使用文件系统调试器将其重新连接到目录。如果您具有通过NFS导出的文件系统,则至少某些版本的NFS可能允许您跨NFS读取文件数据。


2
一旦
终止
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.