我不小心跑了rm -R / home /。我的Homefolder包含此时正在使用的多个虚拟机磁盘。我也收到错误消息,指出某些文件无法删除。但是,我无法再访问/ home /文件夹中的文件。
寻找我发现的解决方案,我可以尝试使用cp / proc / PID / fd / 12 / target /还原文件。
现在,我有点困惑-由于虚拟机仍在工作,它可能会写入要恢复的磁盘。
这些磁盘中会有不一致的地方吗?还是您可能还有其他提示?
我感谢各种帮助!
非常感谢你!
给定文件系统上的文件由其索引节点aka inode引用。只要有对该inode的引用,它就可以在磁盘上(作为文件名链接,可以多次存在)或“在内存中”(打开文件描述符aka fd,挂载点,mmaped ...)它的数据保留在磁盘上。如果没有更多参考,则将其真正删除并回收空间。当磁盘引用变为0时,即使仍然有“内存中”引用,也无法用新名称重新链接它,因为用户没有内核API,例如,允许链接由其fd或ind引用的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的磁盘文件是“惰性”配置的并且通常是空的,以使用较少的空间,则使用cp
with选项--sparse=always
似乎是一个不错的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句