linux下使用extundelete恢复ext3/ext4分区数据

Windows平台恢复误删数据so easy,但是linux就没那么简单了,因为没有“回收站”。BUT,如果有一天真的不小心误删了文件,那如何是好?那就借助恢复神器extundelete了。

以下均为本人虚拟机上操作,经测试,文件系统ext3/ext4均适用。

一、安装extundelete

1、需要安装依赖包,否则编译不通过

[[email protected] /]#yum install e2fsprogs* -y

2、下载并安装extundelete

下载地址:https://sourceforge.net/projects/extundelete/files/latest/download

[[email protected] /]#tar -jxvf extundelete-0.2.4.tar.bz2 
[[email protected] /]#cd extundelete-0.2.4
[[email protected] /]#./configure --prefix=/usr/local/extundelete
[[email protected] /]#make && make install

3、配置临时环境变量,如果永久则写到profile

[[email protected] /]#PATH=$PATH:/usr/local/extundelete/bin

4、验证是否安装成功

[[email protected] /]# extundelete -v
extundelete version 0.2.4
libext2fs version 1.41.12
Processor is little endian.

二、恢复已删除数据

为方便测试,新建了一个单独的分区/dev/sdb1,挂载/reed

[[email protected] /]#mount /dev/sdb1 /reed

1、创建测试文件

[[email protected] /]# cd /reed/
[[email protected] reed]# cp ~/extundelete-0.2.4.tar.bz2 .
[[email protected] reed]# echo "reed">>del.file
[[email protected] reed]# ll
total 132
-rw-r--r-- 1 root root      5 Mar 16 07:20 del.file
-rw-r--r-- 1 root root 108472 Mar 16 07:20 extundelete-0.2.4.tar.bz2
drwx------ 2 root root  16384 Mar 16 06:45 lost+found

2、删除文件

[[email protected] reed]# rm *
rm: remove regular file `del.file‘? y
rm: remove regular file `extundelete-0.2.4.tar.bz2‘? y
rm: cannot remove `lost+found‘: Is a directory
[[email protected] reed]# ll
total 16
drwx------ 2 root root 16384 Mar 16 06:45 lost+found

3、查看/reed的inode值

[[email protected] reed]# ls -id /reed2 /reed

4、卸载/reed分区

[[email protected] reed]# cd ..[[email protected] /]# umount /reed

5、恢复已删除数据

注:默认被删文件会恢复到当前目录下的RECOVERED_FILES目录

5.1先查看已删除文件

[[email protected] /]# extundelete /dev/sdb1 --inode=2
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Group: 0
Contents of inode 2:
0000 | ed 41 00 00 00 10 00 00 ec 98 e8 56 e9 98 e8 56 | .A.........V...V
0010 | e9 98 e8 56 00 00 00 00 00 00 03 00 08 00 00 00 | ...V............
0020 | 00 00 00 00 00 00 00 00 41 02 00 00 00 00 00 00 | ........A.......
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 | 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0090 | 6e 90 e8 56 00 00 00 00 00 00 00 00 00 00 00 00 | n..V............
00a0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
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
File mode: 16877
Low 16 bits of Owner Uid: 0
Size in bytes: 4096
Access time: 1458084076
Creation time: 1458084073
Modification time: 1458084073
Deletion Time: 0
Low 16 bits of Group Id: 0
Links count: 3
Blocks count: 8
File flags: 0
File version (for NFS): 0
File ACL: 0
Directory ACL: 0
Fragment address: 0
Direct blocks: 577, 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
.                                                 2
..                                                2
lost+found                                        11
extundelete-0.2.4.tar.bz2                         12             Deleted
del.file                                          13             Deleted

标记为”Deleted”的文件则是被删除的文件

5.2恢复

[[email protected] /]# extundelete --restore-all /dev/sdb1
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 23 descriptors loaded.
Searching for recoverable inodes in directory / ... 
2 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.
[[email protected] /]# ll RECOVERED_FILES/
total 112
-rw-r--r-- 1 root root      5 Mar 16 07:25 del.file
-rw-r--r-- 1 root root 108472 Mar 16 07:25 extundelete-0.2.4.tar.bz2

5.3大功告成。

当然还有很多其它参数,如可以指定恢复某个时间点的文件。

三、延伸知识:linux系统rm删除文件的原理

转自:http://blog.csdn.net/grantlee1988/article/details/8057228

很多时候,我们都会发现,某个进程在对当前文件读写,但是我们依然能够rm, 是不是很奇怪?而windows下面,肯定会报错,”当前文件正在被使用“, 这就得从linux下面删除文件的原理说起了。
  
  
   Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
  
   i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
  
  当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
  
   对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
  
  这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
  
  以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
  
  前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了

备注:根据以上原理,实际情况会出现以下问题,web服务器磁盘空间不够了,删除了所有无用日志还是先是磁盘空间不足,但是用du -sh /*发现磁盘空间占用的远小于硬盘总大小,这就是因为只删除了一个i_nlink,而还有其他进程在使用着这些log文件,apache或者tomcat,重启再看就ok了。

时间: 2024-08-08 22:09:30

linux下使用extundelete恢复ext3/ext4分区数据的相关文章

Linux系统通过extundelete恢复已删除的数据

我们都知道windows系统有个回收站,凡是被删除的文件都可以通过回收站来恢复数据,即便是按住shift键永久删除了,也有很多数据恢复软件可供使用.那么Linux下如果数据被删除了,又该如何恢复呢,Linux系统可没有回收站,只能通过数据恢复软件来解决了.Linux系统有很多开源的数据恢复工具,例如:debugfs.R-Linux.ext3grep.extundelete等,那么我要给大家介绍的是extundelete,这款工具是用来恢复ext格式(ext3.ext4等)的文件系统被误删除的数据

linux下使用fdisk命令进行磁盘分区

linux下使用fdisk命令进行磁盘分区 目录 分区类型 分区方法表示 文件系统 fdisk命令分区过程 分区类型 主分区:总共最多只能分四个 扩展分区:只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个.但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用. 逻辑分区:逻辑分区是在扩展分区中划分的,如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘Linux最多支持11个逻辑分区 分区方法表示

在linux下使用debugfs恢复rm删除的文件

在linux下使用debugfs恢复rm删除的文件?? 以下方法在ext3的文件系统上测试通过, 以下是通过root来实现的?主要借助debugfs fdisk /dev/vdamkdir /mnt/testmount /dev/vda3 /mnt/test1 运行debugfs,进入调度模式[[email protected] test]# debugfs -w /dev/vda3/////////////////////////[[email protected] test]#sudo de

Linux下不能进入windows的NTFS分区之挂载错误问题(error mounting)

问题描述 装了Windows 8.1与Ubuntu双系统后,在Ubuntu系统下想进入Windows的某个NTFS分区,点击时却出现下面错误: Error mounting /dev/sda2 at /media/love/Mis Archiivos: Command-line `mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" &quo

Linux中利用extundelete恢复误删除的数据

利用extundelete工具恢复磁盘误删除的数据 原理: 简单介绍下关于inode的知识.在Linux下可以通过"ls -id"命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入: [[email protected] Server-100 shell]# ls -id / 2 / 在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根目录的inode一般为2) 来获得当前文件系统下所有文

Linux下如何选择文件系统:EXT4、Btrfs 和 XFS

老实说,人们最不曾思考的问题之一是他们的个人电脑中使用了什么文件系统.Windows 和 Mac OS X 用户更没有理由去考虑,因为对于他们的操作系统,只有一种选择,那就是 NTFS 和 HFS+.相反,对于 Linux 系统而言,有很多种文件系统可以选择,现在默认的是广泛采用的 ext4.然而,现在也有改用一种称为 btrfs 文件系统的趋势.那是什么使得 btrfs 更优秀,其它的文件系统又是什么,什么时候我们又能看到 Linux 发行版作出改变呢? 首先让我们对文件系统以及它们真正干什么

linux下怎样释放内存、swap分区满的情况

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换).Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作.但是在进行了大量文件操作之后,缓存会把内存资源基本用光.但实际上我们文件操作已经完

linux下使用fdisk命令进行硬盘分区

添加一块硬盘 # fdisk -l Disk /dev/vdb: 53.7 GB, 53687091200 bytes 16 heads, 63 sectors/track, 104025 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512

Linux下mysql备份 恢复

转载自http://blog.chinaunix.net/uid-20577907-id-161611.html 比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [[email protected] root]# mysqldump -u root -p linux > /root/linux.sql Enter password:在这里输入数据库的密码 通过上面的命令,我们要明白两件事,首先备份数据库是要以数据库管理员的身份备份:其次: