在Linux操作系统中,没有类似于Windows的回收站,它需要借助工具才能恢复已删除的文件,在执行rm命令时一定要小心谨慎,因为,有工具也并不代表能百分百恢复数据。本文介绍几种在Linux操作系统中恢复被删除文件的方法和工具。
方案一 恢复处于打开状态的已删除文件
通过lsof命令列出被各种进程打开的文件信息,其原理是从内存中的信息恢复文件,先了解lsof命令:
常用参数
参数 | 说明 |
lsof {filenam} | 显示打开指定文件的所有进程 |
lsof -a | 两个参数都必须满足时才显示结果 |
lsof -c {string} | 显示COMMAND列中包含指定字符的进程所有打开的文件 |
lsof -d FD | 显示指定文件描述符的进程 |
lsof +d /DIR/ | 显示目录下被进程开启的文件 |
lsof +D /DIR/ | 显示目录下被进程开启的文件,同时搜索子目录 |
lsof -g {gid} | 显示归属{gid}的进程情况 |
lsof -i:{port} | 显示打开{port}端口号的进程 |
lsof -n | 不将IP转换为{hostname} |
lsof -u {username} | 显示所属{user}进程打开的文件 |
字段说明
字段 | 说明 |
COMMAND | 进程的PID(进程标识符) |
USER | 进程所有者 |
FD | 用来识别该文件(文件描述符) |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
以恢复正在使用中的/opt/chkfile.txt文件为例,我们新建一个终端,将该文件删除。
0x01 查看正在使用删除文件的进程号
# 安装lsof # yum -y install lsof lsof /opt/rmfiles
重点在COMMAND列,即进程{PID},下一步将用到它。
0x02 恢复/proc中对应的文件
cd /proc/{PID}/fd # 查看目录中有有没有被删除的文件 ll # 从指定序号恢复文件 cat 4 > /opt/chkfile.txt
方案二 恢复已删除但未被覆盖的文件(xfs/ext文件系统)
据说没有特别适合xfs文件系统的数据恢复软件,但 TestDisk & PhotoRec 还是可以一试的。
1x01 安装TestDisk(PhotoRec)
# 从源yum/apt/dnf安装 # CentOS/RHEL/Fedora yum install testdisk # Fedora 22+ dnf install testdisk # Debian/Ubuntu apt-get install testdisk # 从官网下载可执行程序 wget https://www.cgsecurity.org/testdisk-7.2-WIP.linux26-x86_64.tar.bz2 # yum -y install bzip2 bzip2 -d testdisk-7.2-WIP.linux26-x86_64.tar.bz2 tar xf testdisk-7.2-WIP.linux26-x86_64.tar cd testdisk-7.2-WIP
在程序目录中有三个可执行文件,分别是fidentify_static、photorec_static和testdisk_static,我们使用photorec_static工具来恢复数据。
1x02 开始恢复数据
# 从列表选择磁盘或分区 ./photorec_static # 指定磁盘或分区 ./photorec_static /dev/sdb1
上下方向键选择对应的选项,左右方向键选择底部菜单,分别是:
菜单 | 说明 |
Search | 开始恢复 |
Options | 调整恢复参数 |
File Opt | 调整扫描的文件类型 |
Quit | 退出 |
此外,通过回车键、空格键进行选择、修改或返回。
方案三 恢复已删除但未被覆盖的文件(ext文件系统)
该方案适用于ext3/ext4文件系统,通过extundelete工具根据存储在ext3/ext4分区日志中的信息恢复被删除的文件。
2x01 卸载分区
恢复前卸载分区或磁盘,如果删除的是系统根分区,须进入单用户模式以只读模式挂载根分区。
# 卸载前建议备份 dd if=/path/file of=/dev/sdc1 # 以卸载/mnt为例 umount /mnt # 如果提示设备busy,可通过fuser命令强制卸载 fuser -m -v -i -k /mnt
2x02 安装extundelete
# 安装依赖 # Redhat/CentOS yum -y install e2fsprogs-devel e2fsprogs* gcc* #Ubuntu apt-get install build-essential e2fslibs-dev e2fslibs-dev # 安装extundelete wget http://udomain.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 bzip2 -d extundelete-0.2.4.tar.bz2 tar xf extundelete-0.2.4.tar cd extundelete-0.2.4 ./configure # 在程序当前的src目录中生成extundelete可执行文件 make # 将extundelete程序安装到/usr/local/bin/中【可选】 make install # 在当前程序目录中 cd src # 若有执行 make install 则可在任意位置执行extundelete命令 extundelete -v
2x03 查找已删除的数据
查找指定分区上被删除的文件,最后一列为红色的deleted标记。
# 根分区的inode值为2 extundelete /dev/sdb1 --inode 2
2x04 开始恢复数据
执行恢复文件的命令后,会在当前位置生成RECOVERED_FILES目录,成功恢复的文件都会出现在该目录中。
# 恢复指定目录 extundelete /dev/sdb1 --restore-directory removed_fold # 恢复指定文件 extundelete /dev/sdb1 --restore-file removed_file # 恢复指定inode extundelete /dev/sdb1 --restore-inode inode_id # 恢复所有文件 extundelete /dev/sdb1 --restore-all
原创文章禁止转载:技术学堂 » Linux中恢复误删文件的方法及工具