如何使用ln代替cp恢复Linux上打开但已删除的文件?


8

我有一个正在下载的文件(来自难以重新下载的源),但是意外从文件系统名称空间(/ tmp / blah)中删除了,我想恢复该文件。

通常情况下,我可以cp /proc/$PID/fd/$FD /tmp/blah,但是在这种情况下,由于文件仍在下载中,因此只能得到部分快照。此外,一旦下载完成,下载过程(例如Chrome)将关闭FD。

通过inode /创建硬链接进行恢复的任何方法?还有其他解决方案吗?如果有什么不同,我主要关注ext4。

Answers:


11

尝试使用tail连续复制文件:

tail -c +0 -f /proc/$pid/fd/$fd > filename

当然,下载完成后,您将不得不手动停止尾部处理(或其他外部手段)。


奇迹般有效。我想这比我想象的要容易得多,因为您所需要的实际上只是另一个打开同一文件来保存该文件的程序。

4

fdlink项目,包括一个Linux内核模块和简单的应用程序,欲使创建一个新的链接,打开的文件描述符。我还没试过


1

这样可以完成工作,尽管不能通过恢复inode来完成:

cp /proc/$PID/fd/$FD /tmp/blah
kill $PID
wget -c $URL -O /tmp/blah

或者,如果您不想杀死整个浏览器,请在Chrome中手动停止下载。


如果只是问题如此简单,以至于我可以继续下载/重新下载!我澄清了这个问题,以表明我无法假设我可以重新下载。

听起来像麻烦:-)似乎任何基于inode的黑客攻击都太底层且特定于文件系统。
帕维尔,

是的,我也将其添加到我的问题中:如果有什么不同,我主要关注ext4。

1

如果要对此进行硬链接,则必须使用-s选项(请参阅参考资料man ln),以便在fd目录中运行ls -f并找出文件号(主要是两位数字),然后输入ln NUMBER destination-file -s

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.