Debian 8.9下恢复已删除但被锁定文件的技术求助
解决误执行
rm -R /home/后恢复运行中虚拟机磁盘的问题 哇,这可真是个棘手的情况——误删了/home还赶上里面有运行中的虚拟机磁盘,不过好在你注意到了进程还在持有文件描述符,这是恢复的关键!我来一步步帮你理清该怎么操作,还有你担心的写入问题怎么处理:
先搞懂当前的状况
你执行rm -R /home/后,部分文件删不掉、现在又访问不了/home下的文件,核心原因是:rm只是删除了文件系统里的目录项(也就是文件名),但那些正在被虚拟机进程使用的磁盘文件,因为进程还持有它们的文件描述符(FD),内核不会真正回收这部分磁盘空间,这些文件的实际数据还好好存在磁盘上——这也是/proc/PID/fd/路径能找到它们的原因。
关于虚拟机写入的顾虑:怎么降低风险
你担心虚拟机继续写入会影响恢复?完全合理,不过咱们可以这样处理:
- 绝对不要直接强制关闭虚拟机:一旦进程退出,它持有的文件描述符会被释放,内核就会彻底回收磁盘空间,到时候真的救不回来了。
- 优先给虚拟机做内存快照:如果你的虚拟机管理工具支持(比如KVM的
virsh snapshot-create-as、VMware的快照功能),先创建一个内存快照。这样后续的写入会被引导到快照文件里,不会修改原始的磁盘文件,恢复出来的就是快照时刻的完整状态。 - 如果没法做快照:那尽量快速完成恢复操作,恢复后立即用虚拟机磁盘的文件系统检查工具(比如
fsck针对ext系列,chkdsk针对NTFS)扫描修复可能的不一致——毕竟即使有少量写入,恢复出来的文件大部分还是可用的,总比完全丢失强。
具体的恢复步骤
找到持有磁盘文件的虚拟机进程和对应的FD
- 先用
ps aux | grep qemu(如果是KVM/QEMU)或者对应虚拟机进程的关键词,找到运行中虚拟机的PID。 - 然后查看这个PID的fd目录:
ls -l /proc/<PID>/fd/,那些标注了(deleted)的文件就是你要恢复的虚拟机磁盘。比如你提到的fd/12,就对应一个被删除但仍被进程持有的文件。 - 也可以用
lsof | grep deleted | grep /home快速筛选出所有被删除但仍被进程持有的文件。
- 先用
执行恢复操作
- 先创建一个安全的目标目录(绝对不能在/home下!),比如
mkdir -p /mnt/vm_recovery,确保这个目录所在的磁盘有足够空间容纳虚拟机磁盘文件。 - 复制对应的fd文件到目标目录:
cp /proc/<PID>/fd/<FD_NUMBER> /mnt/vm_recovery/my_vm_disk.img,比如cp /proc/1234/fd/12 /mnt/vm_recovery/web_vm.img。建议用root权限执行,避免权限问题。 - 复制过程中不要中断,耐心等待完成。
- 先创建一个安全的目标目录(绝对不能在/home下!),比如
验证恢复的文件
- 复制完成后,先别急着处理原虚拟机。可以用
qemu-img info /mnt/vm_recovery/my_vm_disk.img检查磁盘格式是否正常,或者临时启动一个测试虚拟机挂载这个磁盘,确认里面的文件、数据都能正常访问。
- 复制完成后,先别急着处理原虚拟机。可以用
后续的收尾和预防措施
- 验证没问题后,把恢复的磁盘文件迁移到新的安全路径(比如
/var/lib/libvirt/images/),然后修改虚拟机的配置文件,指向新的磁盘路径,再重启虚拟机——这时候就可以安全关闭原来的虚拟机进程了。 - 为了避免再犯类似错误,建议给
rm加个交互式别名:echo "alias rm='rm -i'" >> ~/.bashrc,这样每次删除都会提示确认;或者用trash-cli工具替代rm,把文件移到回收站而不是直接删除。
内容的提问来源于stack exchange,提问作者SevenOfNine
相关产品推荐
相关产品推荐

