Linux 意外操作后如何进行数据抢救
在 GUI 中使用 shift + delete
组合键或是 CLI 下使用 rm -rf
删除选项,这个文件并没有从硬盘(或是其它存储设备)上彻底销毁。当它文件被删除以后,inode
的数据指针部分被清零,仅仅是从系统的目录结构中被移除,但是这个文件仍然存在你磁盘中的某个 block
物理位置上。( ls -li
或 stat
查询一个文件所对应的 inode 的元信息数据。 )。
注意:独立硬盘冗余阵列 (RAID , R edundant A rray of I ndependent D isks)损坏或数据丢失,不在本次范围。
Linux 系统管理员守则中有这么一条:“慎用 rm -rf 命令,除非你知道此命令所带来的后果“
一、实验环境
1、工具
VMware® Workstation 12 Pro 12.5.2 build-4638234
CentOS-6.5-x86_64-bin-DVD1.iso
2、约定
1、所有操作全部在虚拟机环境下完成,使用CentOS操作系统。关闭SELinux!
2、故障模拟如下:
* 显示当前系统配置情况,不同测试工具不同环境(每张图可体现是一个崭新的CentOS)
使用 openssl 数据工具生成 {num} 位随机数。
* 使用 md5sum 验证工具打印 {mount_path/filename} MD5信息
执行 rm -rf {mount_path/filename}
"#" 表示权限 "root" 、"*" 表示必须截图体现,另特殊情况下也截图。心情好也截图 :)
3、测试情况下包括后续内容皆为 “配置好环境变量” 情况下。
0、不设置,可这么执行
{ProgramName}
/usr/bin/{ProgramName}
/usr/local/{ProgramName}/bin/{ProgramName} --help
1、设置别名,可永久生效
alias {ProgramName}="usr/local/{ProgramName}/bin/{ProgramName}"
2、设置环境变量,临时生效
export PATH=$PATH :/usr/local/{ProgramName}/bin
3、设置程序软链接,永久生效
ln -s /usr/local/{ProgramName}/bin/{ProgramName} /usr/bin/{ProgramName}
4、实验记录详情:
1 、数据恢复:
单个文件(约定2 已进行说明)
文件夹/目录(参见:https: //github.com/erlinux /RecoverDateProject/tree /master/test )
2 、更多包括:
格式支持、界面支持、恢复时长、恢复效果。(详情见文末表格)
5、模拟企业真实情况:
6、测试框架皆为:
1、通过文件系统的 inode 值(一般是 2 )来获取文件系统信息。
2、通过上步骤所得出的结论使用 inode 编号以及 filename 进行恢复。
3、通过程序自带的文件夹恢复 或 时间前后恢复 来恢复所删除的数据。
4、通过上述三种步骤所展现的情况(包括其他测试)进行详细的记录用于对比。
3、备注
1、为帮助大家更好理解已进行中文译化。
2、本人仅仅是一名学生,文章不当的地方还请指出。
3、最后祝各位新年快乐。鸡年大吉大利、心想事成、身体健康。( 就当新年礼物吧 _ )
二、恢复工具
在恢复数据前,要弄清楚俩个概念:inode(索引节点) 和 block (数据块)
block 用于储存数据,inode 用于存储数据属性信息。inode 为每个文件进行信息索引,所以就有了 inode 的数值。
注意:即便不能实现重新只读挂载当前数据盘,也绝对不能在需要恢复文件的目录下进行操作。
1 -> 安装
# curl -O https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
# tar -jxvf extundelete-0.2.4.tar.bz2 && cd extundelete-0.2.4
# ./configure --prefix=/usr/local/extundelete
-------------------
configure: error: C++ compiler cannot create executables
# yum install gcc gcc-c++ -y
configure: error: Can't find ext2fs library
# yum install e2fsprogs.x86_64 e2fsprogs-devel.x86_64 e2fsprogs-libs.x86_64 -y
-------------------
make && make install
2 --> 选项
extundelete
用法: extundelete [选项] [
选项:
除了剩余的内容之外,还打印超级块的内容。
默认选项
功能:
恢复具有已知索引节点号 'ino ',
已恢复的文件在当前目录的RECOVERED_FILES文件夹里创建
而文件的索引节点号作为扩展(ie:file .12345 )
已恢复的文件在当前目录的 'RECOVERED_FILES /path'.
每个文件名格式应该与选项
恢复文件夹 'path '.
'path ' 是相对于文件系统的根目录而言的.
已恢复的文件夹输出目录在'path '。
-j journal 从一个已命名的文件读取外部日志
-b blocknumber 当打开系统文件时,使用一个块数字备份超级快.
-B blocksize 当打开系统文件,使用 blocksize 作为一个块大小.
这个数字应该以 bytes 为单位.
示例如下: 列出选项. Dn 必须是 info,warn 或者 error 中一个。
-o directory 保存恢复的文件到指定目录.
默认情况下,恢复的文件被创建在 'RECOVERED_FILES ' 文件夹.
extundelete /dev/sdb1 --inode 2
查找可恢复的数据信息,标记为Deleted状态的是已经删除的文件或目录。
extundelete /dev/sdb1 --restore-inode 12,13
extundelete /dev/sdb1 --restore-file fstab
extundelete /dev/sdb1 --after 1293877800 --restore-all
在当前目录的 "RECOVERED_FILES" 下恢复恢复1293877800秒后的所有误删文件
Note: date -d "Jan 01 18:30 2011" +%s
3 --> 成功
① 模拟故障
2e4c997cdbdf81b9419297ec156960e0 /mnt/extundelete/extundelete.asdasfsafds-test
② 故障恢复
文件
目录
1 -> 安装
# wget
Note :please use wget to download file ,curl download will be fail.it's hard to say
# unzip ext3grep-0.10 .2 .zip && cd ext3grep-0.10 .2
# ./configure
configure: error : no acceptable C compiler found in $PATH
# yum -y install gcc
configure: error : C++ preprocessor "/lib/cpp" fails sanity check
# yum -y install gcc-c++
configure: error : Missing headers. Please install the package e2fslibs-dev from e2fsprogs, or http://e2fsprogs.sourceforge.net for the upstream tar-ball.
# yum install -y epel-release && yum install ext2fs blkid e2p uuid
# make && make install
2 -->选项
Running ext3grep version 0.10 .2
用法: / usr/ local / ext3grep/ bin/ ext3grep [选项] [
选项:
默认选项
这个选项通常需要打开过滤。
如果改变任何
BOTH stage* 文件!
过滤:
如果条目已删除,inode 已分配,文件类型与 dir 条目和 inode 的不同时。Inodes 经仔细考虑会被 '重新分配'
无论此选项,链接(links)条目都始终显示。
动作:
如果使用
如果你不使用
如果使用
如果你不使用
根据给定的规格生成树状图。
使用 atime,ctime,或者 mtime 将改变
用连续的数字'seq' 显示处理信息
这意味着
为目录路径为 'dir' 找到 block 号和每个已使用的 inodes 节点打印一个表
始终在日志显示 inode 'ino' 副本
恢复具有已知 inode 号的文件。
恢复文件将被创建在./ RESTORED_FILES/
而文件的索引节点号作为扩展(ie:file.12345 )
除非 '@seqnr' 提供使用了序列号的日志条目,不然的话使用最后一个条目。
在一个文件被重写或被删节这种情况下你可以使用这个,而不是删除。
将恢复文件 'path' . 'path' 是相对于根分区而言的,并且不以 '/' 开头 (
它必须成为由
已恢复的目录、文件、被创建在'RESTORED_FILES/path' .
推荐使用
并且如此操作输出量的可能性就越大。
ext3grep /dev/sdb1 --inode 2
查看 indoe 为 2 的目录
ext3grep /dev/sdb1 --dump-names
列出 /dev/sdb1 下的所有文件
ext3grep /dev/sdb1 --restore-all
恢复 /dev/sdb1 下所有文件
3 -->成功
① 模拟故障
289f73b0b41489dfaa98f5eb094a382b /mnt/ext3grep/ext3grep_ashndiasdnaind_test
② 故障恢复
文件
目录
ext3grep 并没有提供恢复目录选项(也许我没发现),但是可以曲线救国法使用before&after进行文件夹恢复 另外计算秒数的 date 命令可以这么使用$(date -d "-1 hour" +%s)
其他
该工具仅能恢复 ext3 文件系统。
1 -> 安装
---------------
configure: error: no acceptable C compiler found in $PATH
configure: error: You must install the develop packages "ext2fs , blkid , e2p , uuid" to build ext4magic
----------------
yum --enablerepo=home_robi-1 install ext4magic -y
WebSite:http://d ownload.opensuse.org/repositories/home:/robi-1/ CentOS_CentOS-6 /
2 -->选项
范例
打印目录的 Inode,这有一些可能性。
在第一示例中,输出的是文件系统根目录实际索引节点。
在第二示例中,输入路径名称也是根目录。 即:Inode 2
使用文件系统镜像 "/tmp/filesystem.iso" ,
搜索并且打印所有 Block 包括根 Inode,并且打印所有不同的 Inode。(包含数据块的块列表)
如果是目录,那么还要为每个 Inode 打印目录的内容。
-t 182
使用文件系统镜像 "/tmp/filesystem.iso" 并且读取从外部日志 "/tmp/journal.backup"
从日志处理 182 编号的 Inode 8195 编号。
+%s) -b $(date -d "-2 day" +%s)
打印俩到三天前被删除的路径名 "user1/Documents" 的索引数据。
如果它是一个目录,那么(也打印)这个目录的内容。
如果在日志找不到旧目录 blocks,目录内容将从文件系统真实内容。
简单实例
恢复文件刚刚被删除 "/home/user1/picture/cim01234.jpg" .
文件系统已正常挂载 "/home" .文件路径规定从指定的文件系统根目录并不是整个 Linux 根目录
不卸载文件系统是不可能的,文件将被写在 "/tmp/user1/picture/cim01234.jpg"
尝试恢复在24小时前删除的所有文件,文件写在"./RECOVERDIR/" 内
尝试恢复所有文件,即使如果他们有些已经被重写,也能恢复所有没有删除的文件。
删除发生在四天前。
尝试多阶段的恢复所有文件在文件系统已经 "rm -rf *" .
文件写入 "/home/recover" .
(on ext4: in this version skipped the last step.)
1274211280 -d /mnt/testrecover
尝试恢复目录结构 "user1/Dokuments/" . "-b" 时间戳,你必须设置删除前的文件,
"-a" 时间戳阻止找到旧的文件版本。这只会更好的工作。
如果你有创建或删除文件在 "-b" 时间戳。(它会被)写入目录 "/mnt/testrecover"
如果只有少数文件恢复,同时尝试不用选项 -Q
./tmpfile
/mnt/testrecover
尝试只恢复所有从目录结构"user1/" ,删除的文件在文件名具有 "jpg" (超过 24 小时)
并且写入进 "/mnt/testrecover" - 使用一个临时文件 "./tmpfile" 用于文件名列表。
BUGS
直接使用当前可读写的日志打开文件系统会读取产生坏块。
这个坏块提供程序错误结果和不真实的结果。
因此你应该永不使用这种文件系统,直接处于开放读写下的日志
如果有必要,使用挂载过的文件系统,创建文件系统日志副本并且使用 -j 选项。
作者
Roberto Maar
译者
jiwenkang
更多参见
debugfs (8) , e2fsck (8)
-I -> inode 索引节点,+数字
-f -> path 目录位置,+位置
ext4magic {sdx} -r/-R -> recover all (程度较低)
ext4magic {sdx} -M -> recover all (程度很强)
ext4magic {sdx} -rf {path /files} -> recover file
ext4magic {sdx} -d {path } -> recover to diresotry
3 -->成功
① 模拟故障
c466f4672a18ee37ba5197e4d264d6ef /mnt/ext4magic1/ext4magic1_111111
33dd6934d4a26c7fcb8a829c98fba1fb /mnt/ext4magic2/ext4magic1_222222
② 故障恢复
文件
目录
三、综合展示
功能\名字
extundelete
ext3grep
ext4magic
分区支持
ext2 ext3 ext4
ext2 ext3
ext3 ext4
扫描时长
3s
3s
0s
恢复时长
2s
1s
1s
程序优势
效果好操作简单
支持的参数较多
前俩者的加强升级版
总体评价
♥♥♥♥
♥♥♥
♥♥♥♥♥
注意,以下为失败展示。仅供参考!
1 -> 安装
# wget --no-check-certificate https://github.com/erlinux/RecoverProject/raw/master/soft/foremost/foremost-1.5.7.tar.gz
# tar -zxvf foremost-1.5.7.tar.gz && cd foremost-1.5.7
# make
------------------
make: gcc:command not found
# yum -y install gcc
------------------
# make install
2 --> 选项
foremost version 1.5 .7 by Jesse Kornblum, Kris Kendall, and Nick Mikus.
$ foremost [-v|-V|-h|-T|-Q|-q|-a|-w-d] [-t <type>] [-s <blocks>] [-k <size>]
[-b <size>] [-c <file>] [-o <dir>] [-i <file]
-V - 显示版权信息并退出。
-t - 列出文件类型 (-t jpeg,pdf ...)
-d - 间接打开块检测 (for UNIX file-systems)
-i - 指定输入文件 (默认标准输入)
-a - 写入所有头,不执行错误检测 (已损坏的文件)
-w - 只写入审计文件,不要将任何检测到的文件写入磁盘
-o - 设置输出目录 (默认标准输出)
-c - 设置需要使用的配置文件 (默认 foremost.conf)
-q - 开启安静模式.搜索在 512 字节范围执行。
-Q - 开启安静模式.禁止内容输出。
-v - 详细模式.屏幕显示所有日志信息。、
Foremost 支持恢复如下格式:avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip。
3 -->失败
1 -> 安装
# wget --no-check-certificate https://raw.githubusercontent.com/erlinux/RecoverProject/master/soft/testdisk/testdisk-7.0.linux26-x86_64.tar.bz2
# tar -jxvf testdisk-7.0.linux26-x86_64
# ./testdisk-7.0/testdisk_static
2 --> 选项
Use arrow keys to select , then press Enter key:
>[ Create ] Create a new log file
[ Append ] Append information to log file
[ No Log ] Don't record anything
使用箭头键选择,然后按Enter键:
>[ 创建 ] 创建一个新日志文件
[ 附加 ] 将信息附加到日志文件
[ 为空 ] 不使用日志记录任何内容
注意:必须正确检测磁盘容量才能成功恢复。
如果上面列出的磁盘大小不正确,请检查HD跳线设置,审查BIOS。以及安装最新的操作系统补丁和磁盘驱动程序。
Please select the partition table type, press Enter when done.
>[Intel ] Intel/PC partition
[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...)
[Humax ] Humax partition table
[Mac ] Apple partition map
[None ] Non partitioned media
[Sun ] Sun Solaris partition
[XBox ] XBox partition
[Return ] Return to disk selection
请选择分区表类型,完成后按Enter键。
>[英特尔 ] 英特尔/ PC分区
[EFI GPT] EFI GPT 分区map (Mac i386, 某些 x86_64...)
[Humax ] Humax 分区表
[Mac ] Apple 分区map
[None ] Non 分区介质
[Sun ] Sun Solaris 分区
[XBox ] XBox 分区
[返回 ] 回到磁盘选择
提示:已检测到Intel分区表类型。
注意:不要为只有单个分区的介质选择“None ”。 很少将磁盘设置为“未分区”。
> [ Analyse ] Analyse current partition structure and search for lost partitions
[ Advanced ] Filesystem Utils
[ Geometry ] Change disk geometry
[ Options ] Modify options
[ Quit ] Return to disk selection
[ 分析 ] 分析当前分区结构并搜索丢失的分区
[ 高级 ] 文件系统实用程序
[3 D参数] 更改磁盘3 D参数(Disk Geometry),即磁头数(Heads),柱面数(Cylinders),扇区数(Sectors)
> [ 选项 ] 选项修改
[ 退出 ] 回到磁盘选择
注意:恢复成功需要正确的磁盘3 D参数。如果它认为分区3 D参数不匹配, 'Analyse' 进程可能会给出一些警告.
专家模式 : No
分区对齐 : Yes
数据转储 : No
专家模式 : No 分区对齐 : Yes 数据转储 : No
3 -->失败
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 领域模型应用
· 记一次 ADL 导致的 C++ 代码编译错误
· MySQL查询执行顺序:一张图看懂SQL是如何工作的
· 为什么PostgreSQL不自动缓存执行计划?
· 于是转身独立开发者
· Cursor 1.2重磅更新,这个痛点终于被解决了!
· C#/.NET/.NET Core优秀项目和框架2025年6月简报
· C#开发的Panel滚动分页控件(滑动版) - 开源研究系列文章
· 从被喷“假开源”到登顶 GitHub 热榜,这个开源项目上演王者归来!
· 上周热点回顾(6.30-7.6)