8

有没有办法在 Linux 中创建链接到特定 iNode 的文件?以这种情况为例:有一个正在写入的文件(可能是一个日志)并且该特定文件已被删除,但dir /proc 中的一个链接仍然指向它。在这种情况下,我们不需要它的裸副本,而是到它的硬链接,这样我们就可以在进程关闭和系统删除它之前进行未来的修改和最后一次修改。

如果我们有 iNode 编号,有没有办法实现这个目标?

4

3 回答 3

15

由于没有涉及 iNode 的 Syscall,因为是 extX fs 的概念,并且不是一个好的做法,但它是建立一个责任链(正如 MEL 建议的那样),这个问题只有一个NO答案因为在 VFS 级别我们处理文件路径和名称,而不是其他内部表示。

但是为了实现跟踪最新修改的目标,我们可以使用连续监控和复制tail

tail -c+1 -f --pid=PID /proc/PID/fd/FD > /path/to/the/copy

其中 PID 是仍打开已删除文件的进程的 pid,FD 是其文件描述符编号。使用-f tail 打开并保存文件以显示进一步的修改,使用-c+1从第一个字节开始“尾部”,并使用--pid=PID tail 在 pid 退出时通知退出。

于 2013-08-14T17:10:57.387 回答
6

您可以使用 lsof 来恢复已删除的文件(有时)...

> lsof | grep testing.txt
less    4607    juliet  4r  REG 254,4   21  
       8880214 /home/juliet/testing.txt (deleted)

在尝试此操作之前,请务必阅读原始文章以获取完整的详细信息,除非您是像我这样的小牛。

> ls -l /proc/4607/fd/4
lr-x------ 1 juliet juliet 64 Apr  7 03:19 
         /proc/4607/fd/4 -> /home/juliet/testing.txt (deleted)
> cp /proc/4607/fd/4 testing.txt.bk

http://www.linuxplanet.com/linuxplanet/tips/6767/1

享受

于 2013-08-12T22:27:21.663 回答
4

总是很难以否定的方式自信地回答“我能做到”这样的问题。但据我所知, /sys/ 和 /proc 都没有提供非符号链接的打开文件描述符的映射。我假设“但目录 /proc 中的链接仍然指向它”您的意思是 /proc//fd/ 条目看起来像符号链接?我几乎可以肯定您无法恢复原始文件。

我收回这一点:正如用户 user2676075 指出的那样,复制确实有效。只是硬链接不...

更新:如果您考虑一下,这很合乎逻辑。

  • /proc 和 /sys 是不同于硬盘的文件系统。所以他们不能提供像目录条目这样的文件,可以硬链接到硬盘上的目标。
  • /proc/*/fd/ 条目假装是符号链接,但实际上它们是不同的,否则复制将不起作用。我认为他们假装是符号链接,以使用“ln -l”提供有意义的信息。

  • 关于(缺少)硬链接到某个 inode 的能力(比如说一些系统调用):这不能是内核或 VFS 接口的一部分,原因如下:

    • 它会破坏文件系统的完整性。文件系统不应该以与持久文件相同的方式保留完全删除的文件的磁盘块。

    • inode 可能是一个完全虚拟的概念,用于标识“存储数据流的插槽”。我认为可能存在将没有引用的插槽转换回由文件系统。

    我承认反对这种系统调用的可能性并不是水密的。但是考虑到 VFS 接口的当前状态(AFAIR 没有提供这样的调用),任何文件系统实现(包括分布式文件系统)提供调用以将文件链接到按 inode 的目录。

ATM我想知道在删除最后一个引用之前和之后调用fstat实际上是否需要返回相同的inode信息...... t

于 2013-08-12T22:27:53.887 回答