Linux文件删除恢复

Posted

技术标签:

【中文标题】Linux文件删除恢复【英文标题】:Linux file deleted recovery 【发布时间】:2013-08-14 09:02:49 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

由于没有涉及 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 尾部并按住文件以显示进一步的修改,-c+1 从第一个字节开始“尾部”,--pid =PID pid退出时通知tail退出。

【讨论】:

inode 并非特定于 ext2/3/4。它们是关于 stat(2) 等系统调用如何工作以及如何找到硬链接的 POSIX 规范的一部分。但不幸的是,您似乎是对的,似乎没有任何方法可以从 /proc/PID/fd/FD 链接到真实文件,只需打开它进行读/写。如果只有像链接(2)这样的系统调用将打开的文件描述符作为源,而不是路径。【参考方案2】:

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

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

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

> 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

享受

【讨论】:

喘不过气来。你说得对。我以为我只是测试了它,但它没有用。 NTL:OP 要求提供硬链接,而不是副本。【参考方案3】:

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

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

更新:如果你仔细想想,这很合乎逻辑。

/proc 和 /sys 是不同于硬盘的文件系统。因此,他们无法提供可以硬链接到硬盘上目标位置的目录条目之类的文件。

/proc/*/fd/ 条目伪装成符号链接,但实际上它们是不同的,否则复制将不起作用。我认为他们假装是符号链接,以使用“ln -l”提供有意义的信息。

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

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

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

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

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

【讨论】:

hardlink-to-inode 不存在的原因是它会让人们访问他们不应该访问的文件。 700 目录将其下的所有内容设为私有,除非您可以使用 inode 编号作为 link(2) 的参数绕过它。对于这种情况,最好的方法是 link(2) 采用打开的文件描述符。尽管即使这样也会打开进程可以做的新事情,但如果从一个不再可访问的文件上的 open fd 开始,或者您无法自己打开的文件。此外,删除语义是:磁盘空间一直存在,直到最后一个链接和最后一个打开 fd 和最后一个 mmap 消失。

以上是关于Linux文件删除恢复的主要内容,如果未能解决你的问题,请参考以下文章

怎样在 Linux 系统中恢复已删除文件

Linux文件误删除恢复操作

Linux 文件夹的所有内容被误删除恢复?

Linux文件误删除恢复操作

Linux恢复误删除文件

Linux文件删除恢复