linux恢复删除的文件

先介绍下一些文件的基本概念:

·         文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据.

·         proc文件系统可以协助我们恢复数据. 每一个系统上的进程在/proc都有一个目录和自己的名字,里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接). 如果从文件系统中删除一个文件, 此处还有一个inode的引用:

1.第一种方法 lsof

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。

大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。

lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。

进程在运行中,接下来我就把/var/log/messages这个文件删掉

shell> rm /var/log/messages

删掉之后,我再来看看这个进程的变化

shell> lsof |grep /var/log/messages

rsyslogd   1737      root    1w      REG                8,2   5716123     652638 /var/log/messages (deleted)

大家看到有变化了吧,对比两个之后发现多了(deleted)。要找到这个文件在哪还要看看这个

PID:1737 FD:1 那我们有直接进入/proc/1737/FD/1用ll查看一下

shell> cd /proc/1737/fd/

shell> ll

total 0

lrwx------ 1 root root 64 Dec 2313:000 -> socket:[11442]

l-wx------ 1 root root 64 Dec 2313:001 -> /var/log/messages (deleted)

l-wx------ 1 root root 64 Dec 2313:002 -> /var/log/secure

lr-x------ 1 root root 64 Dec 2313:003 -> /proc/kmsg

l-wx------ 1 root root 64 Dec 2313:004 -> /var/log/maillog

看到了1对应/var/log/messages (deleted),看看文件是不是我们要的文件:

shell> head -51

Nov 1403:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.

Nov 1403:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10"x-pid="1241"x-info="http://www.rsyslog.com"] start

Nov 1403:11:11 localhost kernel: Initializing cgroup subsys cpuset

Nov 1403:11:11 localhost kernel: Initializing cgroup subsys cpu

Nov 1403:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.720120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比备份文件:

shell> head -5 /var/log/message_bac

Nov 1403:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.

Nov 1403:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10"x-pid="1241"x-info="http://www.rsyslog.com"] start

Nov 1403:11:11 localhost kernel: Initializing cgroup subsys cpuset

Nov 1403:11:11 localhost kernel: Initializing cgroup subsys cpu

Nov 1403:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.720120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比发现数据是一样的,恢复

shell> cat 1 > /var/log/messages

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

2.第二种方法  extundelete

  1. 测试误操作删除以下文件

    /usr/local/dbdata/gperftools-2.4.tar.gz  #文件
    
    /usr/local/dbdata/pcre-8.32              #目录

    执行误操作:

    # rm -rf /usr/local/dbdata/gperftools-2.4.tar.gz /usr/local/dbdata/pcre-8.32
  2. 将误操作所在分区进行只读保护

    如果确定文件被误删,在没有备份的情况下请马上对分区实施写入保护(预防新的写入覆盖误删的块数据,因此权限给只读):

     # mount -o remount,ro /dev/sdb
    # mount -o remount,ro /usr/local/dbdata/
  3. 数据恢复工具安装

    工具安装部署

    官方网站是http://extundelete.sourceforge.net/ ,其目前的稳定版本是extundelete-0.2.4.

    工具下载

     # wget https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

    解压安装

    依赖包

    # yum -y install gcc-c++ e2fsprogs.x86_64 e2fsprogs-devel.x86_64
    # tar -jxvf extundelete-0.2.4.tar.bz2
    # cd extundelete-0.2.4
    # ./configure
    # make && make install

    验证安装结果

    # extundelete -v
  4. 文件恢复过程

    恢复指定文件:

    原理:从根节点(inode=2)开始找到被删除文件的i节点,然后recover i节点。

    以下是模拟删除gperftools-2.4.tar.gz(文件)和pcre-8.32 (目录)

    先检测被删除的文件有哪些:

    # extundelete /dev/sdb --inode 2

    可以看到,有以下两个

    gperftools-2.4.tar.gz 15 Deleted
    
    pcre-8.32 655361 Deleted

    注意:恢复过程不要在误删分区进行,谨防inode. block块相互覆盖

    先恢复文件(可根据文件名进行恢复):

    # extundelete /dev/sdb --restore-file gperftools-2.4.tar.gz

    恢复目录(根据目:# extundelete /dev/sdb --restore-directory pcre-8.32

    最后会在当前目录下看到一个名为RECOVERED_FILES的目录,在目录里就可以看到被误删除的文件以及目录:

    根据上面操作证明extundelete 工具可以实现对误删数据的恢复,而且操作简单。

总结:

  1. 使用rm一定要谨慎

  2. 磁盘按照功能进行分区是必要的

  3. 最少掌握一种数据恢复方式

Linux恢复删除的文件的更多相关文章

  1. Linux 利用lsof命令恢复删除的文件

    lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...

  2. Linux lsof命令 以及 恢复删除的文件

    1.简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传 ...

  3. linux svn恢复删除的文件夹和文件(转)

    我觉得在window下面,查找被删除的svn文件夹和文件是件比较麻烦的事,恢复就更麻烦了.有的时候,命令还是比鼠标要好用的. 下面做一个例子来说明一下,删除和恢复的例子. [root@BlackGho ...

  4. Linux中shell文件操作大全

    1.创建文件夹#!/bin/shmkdir -m 777 "%%1" 2.创建文件#!/bin/shtouch "%%1" 3.删除文件#!/bin/shrm ...

  5. 如何恢复 Linux删除的文件

    原理及普通文件的恢复 要想恢复误删除的文件,必须清楚数据在磁盘上究竟是如何存储的,以及如何定位并恢复数据.本文从数据恢复的角度,着重介绍了 ext2 文件系统中使用的一些基本概念和重要数据结构,并通过 ...

  6. linux下创建文件与目录时默认被赋予了什么样的权限?

    当我们创建一个新的文件或目录的时候,他的默认权限是什么? umask--指定当前使用者在创建文件或目录的时候默认的权限值 [root@iZ288fgkcpkZ default]# umask [roo ...

  7. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

  8. Linux中检索文件

    1 , Use locate command It is a fast way to find the files location, but if a file just created ,it w ...

  9. Linux(三)__文件权限、系统的查找、文本编辑器

    一.文件权限 1.理解文件权限及其分配 2.掌握查看文件和目录的权限 3.掌握权限文字表示法和数值表示法 4.学会使用chmod命令设置权限 5.学会使用chown命令修改属主和组 linux文件能不 ...

随机推荐

  1. 关于在读取excel的文件时候,放在服务器上就报路径错误

    就是指定这个路径:C:\Program Files (x86)\IIS Express 因为在上传到服务器的时候,服务器读取的是在服务器上的路径,所以正确的思路应该是 把上传的Excel存在服务器上, ...

  2. 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第二节:以事件驱动状态、数据处理

    续上一节内容,对Web爬虫进行进一步封装,通过委托将爬虫自己的状态变化以及数据变化暴露给上层业务处理或应用程序. 为了方便以后的扩展,我先定义一个蚂蚁抽象类(Ant),并让WorkerAnt(工蚁)继 ...

  3. 用canvas绘制标准的五星红旗

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. pyautogui介绍

    https://pyautogui.readthedocs.io/en/latest/introduction.html Introduction Purpose The purpose of PyA ...

  5. UVA 最大面积最小三角形剖分

    点击打开题目 题目大意: 以顺时针或逆时针给出一个简单多边形的n个点的坐标,用n-2条互不相交的,且与边不相交的对角线,分成n-2个三角形,要求其中最大三角形的面积最小 开始还汪星人咬乌龟,无从下口, ...

  6. 改进Zhang Suen细化算法的C#实现

    本文主要实现了改进Zhang Suen细化算法的C#实现,相关论文 :“牟少敏,杜海洋,苏平,查绪恒,陈光艺.一种改进的快速并行细化算法[J].微电子学与计算机,2013,(第1期)” .这篇论文中关 ...

  7. Linux 高压缩率工具 XZ 压缩详解

    目录 一.XZ 基础信息 二.安装 三.详解 3.1.常用的参数 3.2. 常用命令 四.扩展 4.1.unxz 4.2.xzcat 4.3.lzma 4.4.unlzma 4.5.lzcat 一.X ...

  8. FLASK 三剑客 request jinjia2

    Flask Web 框架Django 15 优势 : 组件全 - admin - Model ORM - Forms 教科书式 劣势 : 加载所有组件 - 占用资源较高 重型框架 Flask 3 优势 ...

  9. Hyper-V虚拟机设置外部网络访问

    在Hyper-V管理器中新建一个虚拟交换机,类型为 内部 ,修改名称为 nat 在虚拟机的设置页面中,将网络适配器设置为新建的虚拟交换机 nat 打开win10->控制面板->网络和共享中 ...

  10. HashMap实现详解 基于JDK1.8

    HashMap实现详解 基于JDK1.8 1.数据结构 散列表:是一种根据关键码值(Key value)而直接进行访问的数据结构.采用链地址法处理冲突. HashMap采用Node<K,V> ...