误删正在使用的文件可通过lsof和/proc恢复:先用lsof +l1或grep deleted定位pid和fd,再cp /proc/pid/fd/fd号到新路径;若进程不可中断,可用gdb重定向fd;ext文件系统还可选debugfs或extundelete工具。

如果在Linux系统中误删除了正在被进程使用的文件,该文件的数据可能尚未从磁盘真正释放,仍可通过lsof命令结合/proc文件系统进行恢复。以下是具体操作步骤:
一、确认被删除文件是否仍被进程占用
当文件被rm命令删除但仍有进程打开它时,其inode未被释放,lsof可列出该文件的句柄信息,这是恢复的前提条件。
1、执行命令:lsof +L1,查看所有链接数为0但仍被打开的文件。
2、若无输出,尝试使用更宽泛的筛选:lsof | grep deleted,查找标记为“deleted”的条目。
3、记录目标文件的PID(进程ID)和文件描述符编号(FD列,如3r、4w等)。
二、通过/proc文件系统直接复制文件内容
Linux内核为每个进程在/proc/PID/fd/下维护符号链接,指向其打开的文件,即使原路径已删除,该链接仍可读取原始数据。
1、进入对应进程的文件描述符目录:cd /proc/目标PID/fd。
2、列出所有fd项并定位目标文件描述符:ls -la | grep "目标FD号"(例如4)。
3、执行复制操作:cp /proc/目标PID/fd/目标FD号 /恢复路径/恢复文件名。
4、验证恢复结果:md5sum /恢复路径/恢复文件名 与原始文件哈希比对(如有备份)。
三、使用gdb临时挂起进程并重定向fd(适用于不可中断场景)
当目标进程不允许终止,且直接cp失败(如设备忙),可通过gdb注入系统调用,将文件描述符重定向至新路径。
1、启动gdb附加到进程:gdb -p 目标PID。
2、在gdb中执行系统调用:call open("/恢复路径/恢复文件名", 577, 0644)(577为O_WRONLY|O_CREAT|O_TRUNC)。
3、获取返回的新fd值(如10),再执行:call dup2(原FD号, 10)。
4、退出gdb:detach,随后手动关闭新fd或等待进程自然写入完成。
四、利用debugfs工具从ext文件系统提取inode原始数据(仅限ext2/ext3/ext4)
若进程已退出但文件系统尚未覆写对应block,可通过debugfs直接读取inode原始扇区内容。
1、卸载目标分区或以只读方式重新挂载:mount -o remount,ro /dev/sdXN。
2、查找已删除文件的inode号:debugfs -R "lsdel" /dev/sdXN。
3、确认目标inode后,导出其数据块:debugfs -R "dump
4、根据文件类型手动修复元数据(如添加文件头、修正长度字段等)。
五、使用extundelete工具恢复已释放的ext文件系统文件
extundelete专为ext3/ext4设计,能解析日志并重建已删除文件的目录结构与内容。
1、安装工具:apt install extundelete(Debian/Ubuntu)或yum install extundelete(CentOS/RHEL)。
2、执行恢复扫描:extundelete /dev/sdXN --restore-all。
3、指定inode恢复单个文件:extundelete /dev/sdXN --restore-inode inode号。
4、恢复文件默认存于当前目录的RECOVERED_FILES子目录中。










