Linux如何通过lsof命令恢复误删除的文件?(数据挽救)

2026-03-11电脑数码176088

误删正在使用的文件可通过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)。

What-the-Diff

检查请求差异,自动生成更改描述

下载

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 /恢复路径/恢复文件名" /dev/sdXN

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子目录中。

《Linux如何通过lsof命令恢复误删除的文件?(数据挽救).doc》

下载本文的Word格式文档,以方便收藏与打印。