Linux恢复删除的文件
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
测试误操作删除以下文件
/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
将误操作所在分区进行只读保护
如果确定文件被误删,在没有备份的情况下请马上对分区实施写入保护(预防新的写入覆盖误删的块数据,因此权限给只读):
# mount -o remount,ro /dev/sdb # mount -o remount,ro /usr/local/dbdata/
数据恢复工具安装
工具安装部署
官方网站是
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
文件恢复过程
恢复指定文件:
原理:从根节点(inode=2)开始找到被删除文件的i节点,然后recover i节点。
以下是模拟删除gperftools-2.4.tar.gz(文件)和pcre-8.32 (目录)
先检测被删除的文件有哪些:
# extundelete /dev/sdb --inode 2
可以看到,有以下两个
gperftools-2.4.tar.gz 15 Deletedpcre-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 工具可以实现对误删数据的恢复,而且操作简单。
总结:
使用rm一定要谨慎
磁盘按照功能进行分区是必要的
最少掌握一种数据恢复方式
转载于:https://www.cnblogs.com/centos2017/p/7896721.html
Linux恢复删除的文件相关推荐
- Linux利用lsof命令恢复删除的文件
lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...
- Linux 利用lsof命令恢复删除的文件
lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...
- linux怎么恢复删除的文件
作为一个多用户.多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据.不过, ...
- linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
chattr 只有超级权限的用户才具有使用该命令的权限,这项指令可改变存放在ext2.ext3.ext4.xfs.ubifs.reiserfs.jfs等文件系统上的文件或目录属性. 1.功能说明 改变 ...
- linux打开txt文件命令_「linux命令详解」lsof命令解析,教你一步打开所有文件
专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...
- linux能还原文件版本吗,使用Linux文件恢复工具
软件版本:1.0.0.1003 软件大小:10.66MB 软件授权:免费 适用平台:Win9X Win2000 WinXP Win2003 Vista Win7 Linux 系统管理员守则中有这么一条 ...
- linux 的pwd文件被删,恢复被删除的文件-linux篇
本文转自IBM中国上的文档 [http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/] [http://www.ibm.com/develop ...
- 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API
Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...
- Linux如何搜索文件的方法
#whereis 查找已经安装的软件 在Linux上查找某个文件是一件比较麻烦的事情.毕竟在Linux中需要我们使用专用的"查找"命令来寻找在硬盘上的文件. Linux下的文件表 ...
最新文章
- 如何快速坐地铁高铁?舒工为您带来满满的都是干货~
- linux send 失败_linux高性能网络编程之tcp连接的内存使用
- 人工智能、应用、程序
- 手机QQ浏览器“有码女神”惊现!意在推广二维码
- linux 中卸载提示设备正忙怎么办?
- 移动机器人建图与导航代码实现——3.Path Tracking
- easyexcel中的常用注解
- C# ASP.NET程序员整合Java门户单点登录PHPwind论坛博客软件集成项目经验总结
- Codeforces Round #757 (Div. 2)
- hrbp 牵着鼻子走_防止被下属牵着鼻子走的四个经典方法,学会了,下属就好管了...
- python加密解密算法_Python基于DES算法加密解密实例
- WPF捕获事件即使这个事件被标记为Handled
- Linux内核基础--事件通知链(notifier chain)
- 【数据仓库与OLAP技术】期末复习+考题
- Netty客户端断线重连
- 一次微信小程序的问题跟踪记录
- c语言间接寻址与指针,C语言中指针是不是用汇编的间接寻址实现的?
- oracle ora00957,常见oracle错误代码ORA-xxxxx及其解决方法(持续更行中)
- 配置log4j2.xml输出MyBatis的SQL日志
- 云集技术学社|软件SDN技术原理都在这里了
热门文章
- 微博同步ValidatorException
- JDBC使用总结:增删改查、调用存储过程、执行存储函数、存储过程与存储函数区别分析
- 将一个字段的多个记录值合在一行
- Android ListView常用用法(结合长按、数据库等)
- GitHub上最火的40个Android开源项目(一)
- Github应用最广泛的开源项目
- 在.NET中探测U盘的插入/拔出
- c语言中转义字符efg,c语言的转义字符与空白符
- Qt error: collect2: error: ld returned 1 exit status
- springboot yml多环境开发