ext2文件系统下rm-rf * 误删数据恢复

来源:互联网 发布:python格式化毫秒数 编辑:程序博客网 时间:2024/04/28 03:20

   如果你不小心执行了rm -rf * 或者 rm -rf XXX,在ext2系统并不是不可以恢复的。

一. 首先需要明确几个基本概念:磁盘设备文件(简称硬盘)、分区、文件系统、目录&文件
  • 磁盘:简单来说,/dev/sda、/dev/sdb均代表一个硬盘设备
  • 分区:在磁盘上(设备文件上),处于使用目的将磁盘划分的不同区域,例如/dev/sda1、/dev/sda2是磁盘sda的分区;
    /dev/sdb1、/dev/sdb2是磁盘sdb的分区。
  • 文件系统:常见的有ext2、ext4,文件系统作用于分区上,如果一个文件系统有多个分区的话,每个分区都可以格式化成一种文件系统。
  • 目录&文件:文件系统挂载(mount)以后,可以从挂载点(/)处访问整个分区的内容,执行创建文件、创建目录等操作
二. 误删数据后的注意事项&&恢复数据需要具备的基本条件:
  • 1. 应该立即停止对删除文件分区的数据写入,不确定有没有写入的话,直接卸载(umount)分区是最可靠的,原因:因为Linux删除文件并不是真实的删除磁盘分区中的文件,而是将文件inode节点中的扇区指针清除,同时释放这些指针对应的数据块,一旦有正在写入的数据,系统会对这些释放的数据块进行重新分配,就会导致那些删掉的数据被新数据覆盖,这样就永远无法恢复了,因此要立马卸载分区。如果确定没有写入,最好不要卸载分区。
  • 2. 准备另外一个用于恢复写入的分区,用于存储恢复出来的文件
  • 3. 恢复出来的文件是没有文件名的,只有一个inode编号,不过还是有很多办法准确恢复我们想要的很多数据
  • 4. 需要这台机器的root权限
  • 5. 删除的文件所在的文件系统是ext2,可以通过df -T命令查看文件系统类型
  • 6. 机器安装有开源工具debugfs,Linux默认都自带的有,一般在root权限下,可以通过 whereis debugfs命令来查看是否存在
三. 数据恢复步骤:
         $cd /home/work
         $ll 
         假设对目录 /home/work目录执行了rm -rf *,恢复过程如下:     
    
     1. 查看当前系统时间,记下数据是什么时候被删除的
         $date        
         Sat May 14 14:48:45 CST 2016
     2. 获取删数据的用户的uid
         $cat /etc/passwd | grep "work"
         work:x:503:505::/home/work:/bin/bash
          第三列 503就是work用户对应的uid
     3. 查看被删文件所在的磁盘、分区、文件系统和挂载点
          $df -T
         
        可以看到被删文件在磁盘sda、分区/dev/sda6、文件系统类型ext2、挂载点/home下
     4. 拿到root权限,切换到root用户
          $su root
     5. 查找开源工具debugfs的位置
          $whereis debugfs
          debugfs: /sbin/debugfs /usr/share/man/man8/debugfs.8.gz
     6. 找一个新的分区,/dev/sda5的/tmp挂载点下,新建文件夹dump,用于存储恢复的文件数据
          $cd /tmp
          $mkdir dump
     7. 运行debugfs打开文件所在分区
         $/sbin/debugfs
         debugfs 1.41.14 (22-Dec-2010)
         debugfs: open /dev/sda6
     8. 列出所有被删掉的文件的inode等信息
         debugfs: lsdel
          这个步骤可能时间比较长,debugfs会扫描整个sda6分区的inode节点,然后把被删的inode节点以more的形式打出来
          <5、6>两个步骤一般会把被删掉的inode节点重定向到文件中,命令:
         echo “lsdel” | debugfs /dev/sda6 > /tmp/dump/ino.log ,info.log文件内容如下:
  
          第一列是inode号(重要);第二列是uid;第4列是文件大小,最后一列是删除时间(重要)
 9. 根据文件删除时间范围从info.log里定位被删除文件的inode信息
       info.log列出的是历史所有被删的inode信息,因此根据删除时间uid如果删除文件数比较少,还可以根据删除文件个数、删除文件大小;来从info.log里定位所有被删掉文件的inode信息(依据步骤1的时间点,步骤2的uid 503定位我自测删除的文件的部分inode信息如下图):重定向到/tmp/dump/nodeInfo.log里
  

 10.  恢复被删除的数据
      ####如果文件不多可以通过命令一个一个恢复,恢复的数据最好选择别的分区比如sda5, 防止被删磁盘数据被覆盖,恢复命令:
         $debugfs
         debugfs 1.41.14 (22-Dec-2010)
         debugfs: open /dev/sda6
         debugfs:  dump <12918785> /tmp/dump/aaa
      即恢复了inode_id为12918785的文件,存放目录为/tmp/dump,vim aaa进去查看了下就是之前自测删掉的脚本内容
      
      ####如果被删除文件比较多,最好选择批量恢复
      a). 先把步骤9定位到的nodeInfo.log的第一列,即所有inode_id取出来,重定向到inode_id.txt文件中,命令:
          $awk '{print $1}' inodeInfo.log >inode_id.txt
      b). 写批量恢复文件的脚本1.sh:
         #!/bin/sh
         cat inode_id.txt | while read LINE
         do
         echo "dump <$LINE> /tmp/dump/$LINE" | debugfs /dev/sda6
         done
       c).  $ sh 1.sh 执行恢复数据dump命令
          运行完后去去/tmp/dump目录查看,即可看到目录下生成了所有被删除的文件
          文件都是以inode_id号命名,根据文件内容可以找到丢失的重要数据。
0 0
原创粉丝点击