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. 消息队列rabbitmq的五种工作模式(go语言版本)

    前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由 ...

  2. 小程序的<label>标签

    用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...

  3. 2次方的期望dp

    某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(    我们来简化一下这个游戏的规则    有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个com ...

  4. dp - 求符合题意的序列的个数

    The sequence of integers a1,a2,…,ak is called a good array if a1=k−1 and a1>0. For example, the s ...

  5. 解析Json字符串中的指定的值

    { "head": { ", "Id": "20191008144448iAQE", "Message": & ...

  6. http的异步请求

    需要用到的包(包版本应该可能不同): httpcore-4.1.4.jar httpsayncclient-4.0-alpha3.jar httpcore-nio-4.2-alpha3.jar /** ...

  7. [Other]THUWC2020 游记

    Dec. 20th 一下飞机,\(\text{FJ}\) 选手感觉 \(\text{BJ}\) 好冷 下午去了鸟巢,晚上回 \(\text{GLHT}\) 酒店吃泡面 写了洛谷上的线段树分治模板题之后 ...

  8. python接口自动化测试 - openpyxl封装类

    前言 为了更好的让openpyxl在工作中使用,将openpyxl的常用操作封装起来,这样不仅复用性高,而且阅读性好 直接上代码 #!/usr/bin/env python # -*- coding: ...

  9. GitHub Top 微信小程序——在家中憋了几天写点代码吧

    GitHub Top 本项目为 GitHub 热点项目微信小程序客户端,首页仅推荐一个热点项目,这个项目往往是社会热门事件所催生的一个项目,如 996.ICU.wuhan2020,所推荐项目标准为:积 ...

  10. sqli_labs学习笔记(一)Less-54~Less-65

    续上,开门见山 暴库: http://43.247.91.228:84/Less-54/?id=-1' union select 1,2,database() --+ challenges 爆表: h ...