Debian 8.9恢复已删除但锁定的文件


0

我意外地跑了rm -R / home /。我的Homefolder包含几个虚拟机磁盘,目前正在使用中。我也得到了错误,有些文件无法删除。不过,我再也无法访问/ home /文件夹中的文件了。

寻找我发现的解决方案,我可以尝试使用cp / proc / PID / fd / 12 / target /恢复文件。

现在我有点困惑 - 因为虚拟机仍在工作,它可能写入我试图恢复的磁盘。

我会在这些磁盘中出现不一致吗?或者你可能有另一个暗示?

我感谢各种帮助!

非常感谢你!


1
不,所述方法应该是file:在POSIX系统上,打开的文件描述符计为文件的引用(链接),因此这个文件占用的空间完整地保留在文件系统上; 它只是文件系统本身没有名称来访问它。
kostix

1
您可以打开对无名文件的第二个引用(例如:) sleep 99999 < /proc/PID/fd/12 &以避免删除它,然后冻结或停止VM,以确保cp备份中没有不一致。当然,如果你停止虚拟机,之后(以及之前:在用于保持参考的命令中)不允许出错:
AB

谢谢你提出这个好建议!我复制了一些没有第二个引用和暂停的VM,还有一些使用你描述的方法。这两种方法都运行良好,虽然有些机器在启动时必须在日志的帮助下恢复一些块。可能是因为在复制文件期间有写入。但是,我可以恢复所有VirtualMachines。@AB如果你喜欢你可以写一个答案,所以我可以这样标记。谢谢您的帮助!!
SevenOfNine

1
完成,添加了一个答案,并提供了一些解释
AB

Answers:


1

给定文件系统上的文件由其索引节点 aka inode引用。只要有对这个inode的引用,无论是在磁盘上(链接为文件名,可以多次存在)还是“在内存中”(打开文件描述符,也就是fd,挂载点,mmaped ......)文件和它的数据保留在磁盘上。当没有更多的引用时,它会被真正删除并回收空间。当磁盘引用变为0时,即使仍然存在“内存中”引用,也无法使用新名称重新链接它,因为用户没有内核API,例如可以链接由其fd引用的inode或者inode的值本身,它是唯一可用的文件名(除非使用适当的文件系统的黑暗和危险的魔法debugfs ln)。

Linux内核仍提供一些使用/proc伪文件系统访问此文件的工具。每个打开的文件都显示为指向文件的符号链接。该文件的名称是化妆品信息(以及可能是错的当文件是未链接),但文件本身是被视为实际的文件,由内核所看到。/proc/PID/fd/

因此,对于这种情况,只要VM正在运行,用作VM的磁盘后端的文件仍然存在,但无法重新链接到磁盘上。可以轻松完成的是使用适当的命令复制它,例如:

cp --sparse=always /proc/PID/fd/12 > backup

由于VM正在运行,因此执行此操作可能会产生不一致的结果:文件系统(文件内部)可能在复制期间发生更改,并且可能会变得不一致和损坏。因此,要么在虚拟机管理程序允许的情况下冻结虚拟机,在冻结时不关闭虚拟机的磁盘文件,要么添加对无名文件的新引用并停止虚拟机。如果您不想冒任何风险,请在冻结之前添加参考。任何读取文件并且持续时间足够长的命令都可以。例如:

$ sleep 99999 < /proc/PID/fd/12 &
[1] 12087

您现在应该验证/proc/12087/fd/0引用相同的... (deleted)文件。

VM现在可以被冻结甚至停止(但是之后将无法再次启动)。由于文件系统上没有更多活动,因此备份应该是一致的(如果简单冻结,则使用文件系统日志恢复)。如果VM的磁盘文件是“懒惰”配置并且大部分为空,则使用cpwith选项--sparse=always似乎是一个不错的选择,以减少占用空间。

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.