Linux下误删除后的恢复操作(ext3/ext4)
Linux是作为一个多用户、多任务的操作系统,文件一旦被删除是难以恢复的。尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据。在日常工程中,谁也说不准永远不犯错误,万一哪天不小心误操作删除了一些重要文件,该怎么办呢?? 莫慌!这里介绍一款神器extundelete,这是针对ext4文件格式下文件删除后的恢复工具,十分强大!!
废话不多说,下面开始介绍这款神器的使用: 1)下载并安装软件 extundelete主页:http://extundelete.sourceforge.net/ 下载地址:http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.0/extundelete-0.2.0.tar.bz2 百度云盘下载:https://pan.baidu.com/s/1c1XYHc0 获取地址:xsmg
下载到本机的/usr/local/src目录下 [root@slave-node ~]# cd /usr/local/src [root@slave-node src]# tar -jvxf extundelete-0.2.0.tar.bz2 [root@slave-node src]# cd extundelete-0.2.0 [root@slave-node extundelete-0.2.0]# yum -y install e2fsprogs* //不然会提示找不到ext2fs库 [root@slave-node extundelete-0.2.0]# ./configure [root@slave-node extundelete-0.2.0]# make && make install
2)执行删除操作(要是/根分区之外的分区,并且只能是文件删除后的恢复,目录删除不能恢复) [root@slave-node ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda3 ext4 151189708 2370020 141139688 2% / tmpfs tmpfs 32960412 0 32960412 0% /dev/shm /dev/sda1 ext4 198337 26798 161299 15% /boot /dev/sda2 ext4 806346400 201304 765185096 1% /home
[root@slave-node ~]# cd /home/ [root@slave-node home]# echo "123456"> test1 [root@slave-node home]# echo "hahahahha" > wangshibo [root@slave-node home]# ls lost+found test1 wangshibo zabbix
删除文件 [root@slave-node home]# rm -rf test1 wangshibo [root@slave-node home]# ls lost+found zabbix
3)数据删除后的恢复操作 首先恢复前,卸载需要恢复文件的分区 [root@slave-node ~]# umount /home/ //如果卸载失败,就用命令"fuser -k /home"结束使用此分区的进程树 [root@slave-node ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda3 ext4 151189708 2370024 141139684 2% / tmpfs tmpfs 32960412 0 32960412 0% /dev/shm /dev/sda1 ext4 198337 26798 161299 15% /boot
使用extundelete查看分区上存在的文件,如下: --inode 为查找某i节点中的内容,使用2则说明为搜索,如果需要进入目录搜索,只须要指定目录I节点即可 [root@slave-node ~]# extundelete --inode 2 /dev/sda2 WARNING: Extended attributes are not restored. Loading filesystem metadata ... 6250 groups loaded. Contents of inode 2: 0000 | ed 41 00 00 00 10 00 00 84 10 49 58 82 10 49 58 | .A........IX..IX 0010 | 82 10 49 58 00 00 00 00 00 00 04 00 08 00 00 00 | ..IX............ 0020 | 00 00 00 00 07 00 00 00 21 24 00 00 00 00 00 00 | ........!$...... 0030 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 0040 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 0070 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 0080 | 00 00 00 00 00 00 00 00 11 10 00 00 00 00 00 00 | ................ 0090 | 00 00 00 00 00 00 00 00 62 0e 49 58 62 0e 49 58 | ........b.IXb.IX 00a0 | 62 0e 49 58 00 00 00 00 00 00 00 00 00 00 00 00 | b.IX............ 00b0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00c0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00d0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00e0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00f0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
Inode is Allocated Group: 0 File mode: 16877 Low 16 bits of Owner Uid: 0 Size in bytes: 4096 Access time: 1481183364 Creation time: 1481183362 Modification time: 1481183362 Deletion Time: 0 Low 16 bits of Group Id: 0 Links count: 4 Blocks count: 8 File flags: 0 File version (for NFS): 0 File ACL: 0 Directory ACL: 0 Fragment address: 0 Direct blocks: 9249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 Indirect block: 0 Double indirect block: 0 Triple indirect block: 0
File name | Inode number | Deleted status Directory block 9249: . 2 .. 2 lost+found 11 haha 12 Deleted zabbix 17432577 test1 12 Deleted wangshibo 13 Deleted
如上可以看出,被删除的两个文件test1和wangshibo已经被找到,状态为已经删除。 接下来就将它们恢复出来: [root@slave-node ~]# extundelete --restore-inode 12 /dev/sda2 WARNING: Extended attributes are not restored. Loading filesystem metadata ... 6250 groups loaded. Loading journal descriptors ... 46 descriptors loaded. Restored inode 12 to file RECOVERED_FILES/file.12 [root@slave-node ~]# extundelete --restore-inode 13 /dev/sda2 WARNING: Extended attributes are not restored. Loading filesystem metadata ... 6250 groups loaded. Loading journal descriptors ... 46 descriptors loaded. Restored inode 13 to file RECOVERED_FILES/file.13
[root@slave-node ~]# ls RECOVERED_FILES/ file.12 file.13 [root@slave-node ~]# mount /dev/sda2 /home/ //重新挂载home分区 [root@slave-node ~]# mv RECOVERED_FILES/file.12 /home/test1 [root@slave-node ~]# mv RECOVERED_FILES/file.13 /home/wangshibo
再次查看home分区,发现删除的文件已经恢复回来了,很强大!!! [root@slave-node ~]# cd /home/ [root@slave-node home]# ls lost+found test1 wangshibo zabbix [root@slave-node home]# cat test1 123456 [root@slave-node home]# cat wangshibo hahahahha
------------------------------------------------------------------------------------------------------ 上面介绍的是在ext4文件格式下的文件删除后的恢复,那如果是ext3文件格式下的文件删除后想恢复,怎么办呢? 可以使用debugfs工具,这是linux系统自带工具,debugfs恢复Ext3的文件系统中被rm、rm -f 掉的文件。
实例说明: [root@slave-node ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda3 ext3 151189708 2370036 141139672 2% / tmpfs tmpfs 32960412 0 32960412 0% /dev/shm /dev/sda1 ext3 198337 26798 161299 15% /boot
创建一个文件 [root@slave-node ~]# mkdir test [root@slave-node ~]# echo "123456" > /root/test/test.file
删除文件 [root@slave-node ~]# rm -rf /root/test/test.file
接着运用系统自带工具debugfs来恢复已删除的文件 首先打开,刚刚被删除文件所在的分区 注意上面显示的有<>尖括号内的数字就是我们要找的文件Inode号,执行logdump –i <8654024> [root@slave-node ~]# debugfs debugfs 1.41.12 (17-May-2010) debugfs: open /dev/sda3 debugfs: ls -d /root/test 8654023 (12) . 8519681 (4084) .. <8654024> (4072) test.file debugfs: logdump -i 8654024 FS block 1006 logged at sequence 404351, journal block 7241 (inode block for inode 15): Inode: 15 Type: regular Mode: 0664 Flags: 0×0 Generation: 0 User: 0 Group: 0 Size: 20 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0×48159f2d — Mon Apr 28 15:25:57 2008 atime: 0×48159f27 — Mon Apr 28 15:25:51 2008 mtime: 0×4806f070 — Thu Apr 17 12:08:40 2008 Blocks: (0+1): 102348 No magic number at block 7247: end of journal.
执行完命令后,显示了一屏信息,需要注意的是下面Blocks这一行后面的值(如上信息,需要记住Blocks这一行后面的数字102348)
输入quit,退出debugfs debugfs: quit [root@slave-node ~]#
执行如下命令进行恢复: [root@slave-node ~]# dd if=/dev/sda3 of=/tmp/test.file.bk bs=4096 count=1 skip=102348 1+0 records in 1+0 records out 4096 bytes (4.1 kB) copied, 0.0110028 s, 372 kB/s
最后查看tmp目录下,发现已经恢复了我们之前删除的文件内容 [root@slave-node ~]# cd /tmp/ [root@slave-node tmp]# cat test.file.bk [root@slave-node tmp]# mv test.file.bk /root/test.file [root@slave-node tmp]# cat /root/test.file 123456
- Request——Node世界中被依赖最多的库No.2
- 在传统.NET Framework 上运行ASP.NET Core项目
- .net core快速上手
- logicaldoc的外部认证——AD集成
- CLR 4.0 安全模型
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
- 使用无觅相关文章插件一定要删除的代码
- 管理混合云环境的5个要点
- Team Foundation Server 2010 – Basic Installation
- 富文本编辑器的一键排版功能
- 通过ProGet搭建一个内部的Nuget服务器
- Mercury Editor学习心得
- 无意禁止使用:英伟达官方回应GeForce软件条款更改
- Ext JS 6 新特性和工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP设计模式之策略模式(Strategy)入门与应用案例详解
- 基于Python3读写INI配置文件过程解析
- laravel 解决paginate查询多个字段报错的问题
- php判断/计算闰年的方法小结【三种方法】
- Laravel定时任务的每秒执行代码
- PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
- Python通过zookeeper实现分布式服务代码解析
- laravel 实现向公共模板中传值 (view composer)
- PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
- laravel 解决crontab不执行的问题
- PHP+Redis开发的书签案例实战详解
- Python持续监听文件变化代码实例
- laravel框架如何设置公共头和公共尾
- PHP结合Redis+MySQL实现冷热数据交换应用案例详解
- 浅谈Laravel模板实体转义带来的坑