能抢救,前提是删除后未发生新数据写入、文件系统为ext4、立即卸载分区并用extundelete或/proc句柄恢复;若分区忙需先终止占用进程或惰性卸载,ext4下按路径、inode或时间范围恢复,被打开的文件可直接从/proc/pid/fd拷出。

统信UOS系统中误执行rm -rf命令后,文件是否还能抢救,取决于删除后是否发生新数据写入、文件系统类型(ext4为主)、分区是否仍被挂载以及进程是否仍在占用被删文件——只要立即响应,就有实际恢复可能。
第一步:立刻冻结磁盘写入
按下Ctrl+C中断任何正在运行的写入任务,如日志轮转、上传服务、定时备份脚本等。
执行systemctl stop nginx mysql redis upload-service等可能向目标分区写数据的服务;若不确定,直接停掉所有非核心服务:systemctl list-units --type=service --state=running | grep -E "(nginx|mysql|redis|rsync|logrotate)" | awk '{print $1}' | xargs -r systemctl stop。
【必须卸载被删文件所在分区,否则extundelete无法工作】。例如被删路径是/home/user/docs,先查挂载点:df -h /home,再执行sudo umount /home。若提示“device is busy”,用sudo lsof +D /home查占用进程并kill -9终止,或改用sudo umount -l /home(lazy unmount)强制分离。
第二步:确认文件系统与设备路径
运行lsblk -f,找到目标目录所在分区的设备名(如/dev/sda2)及其FSTYPE字段,确保为ext4——统信UOS默认使用ext4,extundelete仅支持ext3/ext4,不支持btrfs或xfs。
若FSTYPE显示btrfs,立即停止后续操作,改用btrfs restore或专业镜像工具;若为ext4,继续下一步。
第三步:用extundelete恢复文件
方法一:已知原始路径,直接按路径恢复
例如误删了/home/user/project/src/main.c,执行:sudo extundelete /dev/sda2 --restore-file "home/user/project/src/main.c"。
恢复结果会出现在当前目录下的RECOVERED_FILES文件夹内。
方法二:恢复整个被删目录
若删的是/home/user/backup整个目录,先用sudo extundelete /dev/sda2 --inode 2查根目录inode(通常为2),再查backup子目录的inode:sudo extundelete /dev/sda2 --inode 1234567(1234567为backup目录的实际inode,从上一步输出中找Deleted项);
最后执行:sudo extundelete /dev/sda2 --restore-inode 1234567。
方法三:恢复最近24小时内删除的所有文件sudo extundelete /dev/sda2 --restore-all --after $(date -d '24 hours ago' +%s)。
注意:此命令耗时长、生成文件多,仅当其他方法失效且磁盘空闲充足时使用。
第四步:进程未退出时的紧急取回
如果被删文件正被某个进程打开(如Web服务读取配置、数据库加载数据),即使文件已从目录树消失,其内容仍驻留在内存和/proc句柄中。
执行sudo lsof +L1,列出所有已删除但仍被打开的文件;找到对应PID和fd编号(如PID 1234、fd 7);
然后运行:sudo cp /proc/1234/fd/7 /tmp/recovered.conf,即可把内存中的副本拷出。
这步操作极快,且不依赖文件系统类型,但只对“删后进程未重启”的场景有效。











