Extundelete工具恢复数据

Extundelete 是一款专为 Ext 文件系统(Linux 系统中最常用的文件系统,如 Ext3、Ext4)设计的开源数据恢复工具,核心功能是恢复被意外删除(通过rm命令等操作)但尚未被新数据覆盖的文件或目录。它基于文件系统的底层机制工作,避免了对磁盘的 “破坏性扫描”,是 Linux 环境下数据恢复的重要工具之一。

核心工作原理

要理解 Extundelete,首先需要了解 Ext 文件系统的 “删除逻辑”:当用户在 Linux 中删除文件(如 rm -rf test.txt)时,系统并不会直接擦除磁盘上的文件数据,而是仅做两步关键操作:
  1. 将文件对应的 inode 节点(存储文件元信息,如权限、大小、数据块指针)中的 “链接数”(link count)设为 0;
  2. 将文件原本占用的 数据块(存储实际文件内容)标记为 “空闲”,允许后续新数据覆盖。
Extundelete 的恢复逻辑正是利用这一特性:它通过扫描磁盘的 inode 区域和数据块区域,识别出 “链接数为 0 但数据块尚未被覆盖” 的文件,重新构建 inode 与数据块的关联,最终将文件恢复到指定位置。

1、直接安装

yum install -y extundelete

2、编译安装

wget https://github.com/curu/extundelete/archive/refs/tags/v1.0.tar.gz
yum install libcom_err e2fsprogs-devel gcc gcc-c++
tar xf v1.0.tar.gz
cd extundelete-1.0/ # 稳定版本,比较推荐该版本
./configure
make && make install
cd ./src/ #进入 src 目录,可查看已编译好的 Extundelete 文件

使用方法extundelete –help

# 参数(options)有:
–superblock,# 显示超级块信息。
–journal,# 显示日志信息。
–after dtime,# 时间参数,表示在某段时间之后被删的文件或目录。
–before dtime,# 时间参数,表示在某段时间之前被删的文件或目录。

# 动作(action)有:
–inode ino,# 显示节点“ino”的信息。
–block blk,# 显示数据块“blk”的信息。
–restore-inode ino[,ino,…],# 恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。
-restore-file ‘path’,# 恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。
-restore-files ‘path’,# 恢复命令参数,表示将恢复在路径中已列出的所有文件。
-restore-all,# 恢复命令参数,表示将尝试恢复所有目录和文件。
-j journal,# 表示从已经命名的文件中读取扩展日志。
-b blocknumber,# 表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。
-B blocksize,# 通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件

使用方法

mount /dev/sdb /root/123     # 挂载一块空盘,并进入到挂载点
for i in {1..10};do sleep 1 && for i in {1..100};do echo `date +%s` >> $i.txt ;done ;done  # 创建实验环境,删除20.txt文件尝试恢复
# - 查看sdb1 分区根目录下面可被恢复的文件及文件夹
extundelete /dev/sdb --inode 2  
# -- 恢复单个文件, 恢复对应inode的文件
extundelete /dev/sdb --restore-inode 12
# - 恢复单个文件,恢复对应文件名称
extundelete /dev/sdb --restore-file filename
# -- 恢复目录,空目录不会被恢复
extundelete /dev/sdb --restore-directory
# -- 恢复所有文件
extundelete /dev/sdb --restore-all

注意:在数据删除之后,首先要卸载被删除数据所在的磁盘或分区,如果是系统根分区遭到误删除,就需要进入单用户模式下,将根分区以只读的方式挂载。原因:因为文件删除之后,仅仅是将文件的inode节点中的扇区指针清零,实际上文件还存在磁盘上面,如果磁盘以读写方式挂载,这些删除的数据块可能会被系统从新分配出去,这些数据块被覆盖之后,这些数据就真的丢失了,所以以只读的方式挂载,尽可能避免数据被覆盖。

模拟数据恢复过程

1、创建挂载点,并创建测试文件

mkdir /root/123 && cd /root/123
for i in {1..10};do sleep 1 && for i in {1..100};do echo `date +%s` >> $i.txt ;done ;done

2、模拟误删文件

rm -f 20.txt

3、为防止数据被覆盖,卸载挂载点

cd ~
umount /root/123

4、开始进行文件恢复

extundelete /dev/sdb --inode 2 | grep 20.txt # 过滤出20文件inode
20.txt 31 Deleted
extundelete /dev/sdb --restore-file 20.txt

5、检查文件恢复情况

ls –l RECOVERED_FILES/

 

posted @ 2025-09-21 09:42  杨灏  阅读(124)  评论(0)    收藏  举报