Linux下文件误删除恢复案例
说明:将/etc/profile文件删除,然后恢复
在linux中为什么讲文件删除还能恢复呢?
详见:文件删除原理
http://blog.csdn.net/grantlee1988/article/details/8057228
http://oldboy.blog.51cto.com/2561410/791322/
总之就是说:当我执行rm命令的时候文件的实体(block数据块)并没有被删除,删除的只是i_link,只有当原来的数据块被后来的数据覆盖之后该数据才是被彻彻底底的删除了,这样就是找不回来了。
文件误删恢复的步骤:
故障演练:
删除/etc/profile文件 #profile这是很重要的一个文件
profile文件是很终重要的一个文件,控制着系统环境变量的设置[root@localhost ~]# cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$
else
PATH=$:$PATH
fi
fi
}
# ksh workaround
if [ -z "$EUID" -a -x /usr/bin/id ]; then
EUID=`id -u`
UID=`id -ru`
fi
# Path manipulation
" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
# No core files by default
ulimit -S -c > /dev/>&
if [ -x /usr/bin/id ]; then
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
HOSTNAME=`/bin/hostname`
HISTSIZE=
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
unset pathmunge
[root@localhost ~]#
[root@localhost ~]# rm /etc/profile //删除文件 提示:一般删除当个文件的时候不要加-rf参数,这样还会有收手的机会
rm: remove regular file `/etc/profile'? y
[root@localhost ~]#
第一步:查看被删除文件所在的目录是挂载在哪一个分区下的
[root@localhost ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
ext3 % / // /etc/profile就是在这个根目录下啦 要记住被挂载的分区
/dev/sda1 ext3 % /boot
tmpfs tmpfs % /dev/shm
[root@localhost ~]#
第二步:找到被删除文件的inode
tmpfs tmpfs % /dev/shm
[root@localhost ~]# debugfs // 这个就是恢复的主打命令啦
debugfs -May-)
debugfs: open /dev/mapper/VolGroup00-LogVol00 //打开被挂载的分区
debugfs: ls -d /etc/提示:下面内容中的数字代表的就是该目录下每一个文件的inode节点,被删除的文件的inode使用的是尖括号<>,存在的文件使用的是圆括号(),因为是实验室的机器,不知道问什么全部显示的尖括号,不过不影响我们演示啦,因为你总会记得刚删除的文件的文件名吧,让我们将被删除文件的inode号找出来,但是内容很多不好找怎么办?,没关系,我们可以讲内容复制下来,使用grep命令找。
() . () .. <> () X11 <> () rpm
<> () fstab <> () mtab <> () modprobe.conf
<> () hosts <> () resolv.conf <> () csh.cshrc
<> () aliases <> () bashrc <> () profile.d
<> () csh.> () environment
<> () exports <> () filesystems <> () group
<> () host.conf <> () hosts.allow
<> () hosts.deny <> () inputrc <> () motd
<> () > () printcap <> () profile
<> () opt <> () pki <> () protocols
<> () securetty <> () services <> () shells
<> () skel <> () xinetd.d <> () default
........省略.......
[root@localhost ~]# grep "profile" a //将内容复制到a文件中 可以看到profile文件的inode是<4321184>
<4321169> (16) aliases <4321170> (16) bashrc <4321185> (28) profile.d
<4323146> (16) passwd <4321183> (16) printcap <4321184> (16) profile
<4353891> (24) desktop-profiles <4353894> (12) gdm
4321185 (20) profile.d 4321172 (20) csh.login
<0> (16) gre.d <0> (24) tux.mime.types <0> (24) desktop-profiles
4353891 (24) desktop-profiles 4321200 (20) ld.so.conf.d
4321352 (32) fb.modes <4321184> (16) profile 4321921 (16) samba
[root@localhost ~]#
第三步:找到被删除文件的block
debugfs: logdump -i <4321184> //根据inode去找block
Inode is at group , block , offset
Journal starts at block , transaction
FS block logged at sequence , journal block
(inode block ):
Inode: Type: regular Mode: Flags:
User: Group: Size:
File ACL: Directory ACL:
Links: Blockcount:
Fragment: Address: Number: Size:
ctime: ::
atime: ::
mtime: ::
Blocks: (0+1): 4327454 //找到啦
......省略......
第四步:恢复
[root@localhost ~]# count= skip=4327454 //恢复命令
+ records in
+ records out
bytes (4.1 kB) copied, 6.3368e-05 seconds, 64.6 MB/s
You have mail in /var/spool/mail/root
[root@localhost ~]# cat /tmp/profile.bak //内容还是原来的内容
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$
else
PATH=$:$PATH
fi
fi
}
# ksh workaround
if [ -z "$EUID" -a -x /usr/bin/id ]; then
EUID=`id -u`
UID=`id -ru`
fi
# Path manipulation
" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
# No core files by default
ulimit -S -c > /dev/>&
if [ -x /usr/bin/id ]; then
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
HOSTNAME=`/bin/hostname`
HISTSIZE=
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
unset pathmunge
[root@localhost ~]# mv /tmp/profile.bak /etc/profile //移动到原来的位置
[root@localhost ~]#
Linux下文件误删除恢复案例的更多相关文章
- linux 下文件误删恢复
linux 下文件误删恢复 0x01 事件背景 某天晚上写代码的时候,本来想删除当前目录下一个叫xxx的文件夹 rm -rdf ./xxx/*, 结果光顾着和人说话,一不留神手贱把命令敲成了rm -r ...
- 恢复Linux下被误删除的文件(笔记)
恢复Linux下被误删除的文件 [root@xuegod63 ~]# mount /dev/cdrom /mnt/ 分一个区:sda4 查找:extundelete 分一个区:sda4 [root ...
- linux系统下文件误删除该如何恢复?
一.linux误删除数据的场景 在实际的工作中,朋友们可能会将linux服务器上的文件不小心误删除掉了.而且越是资历老的工程师越容易犯这样的错误,敲代码的速度也是够快,啪啪rm -rf一个回车,然后就 ...
- (转)linux下文件删除的原理精华讲解(考试题答案系列)
linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://ol ...
- linux 下文件重命名/移动/复制命令(转)
linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc 重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...
- Linux下文件的三种时间戳
Linux下文件的三种时间标记 三种时间对应关系表 column column column 访问时间 Access atime 修改时间 Modify mtime 状态改动时间 Change cti ...
- linux下文件结束符
linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...
- dos2unix,去掉Linux下文件中的^M
Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一 ...
- linux下文件的复制、移动与删除
linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination) ...
随机推荐
- 基于服务的SOA架构_后续篇
今天是元宵节,首先祝各位广大博友在接下来的光阴中技术更上一层,事事如意! 昨天简单介绍了一下本人在近期开发过的一个电商购物平台的架构流程和一些技术说明:今天将详细总结一下在项目中用到的各个架构技术的环 ...
- foreach和for循环的区别
for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素.在处理比较复杂的处理的时候较为方便. foreach循环 foreach,从头到尾,对于集合中的对象遍历 ...
- CAN信号值解析
本文提供一种可以解析CAN信号各信号值的一种方法并进行说明. 一般情况下,高端一点的设备会计算每一个信号的值,但是接受到CAN信号的报文实际上有各种情况,如何通过设定的起始位和数据长度来获取某一信号的 ...
- static的加载先后顺序
1.静态变量的声明和赋值是分开的,静态变量会先被声明,赋值操做被放在了静态代码块中. 2.静态变量的赋值和静态代码块的执行顺序和代码的先后书写顺序相关. 3.静态代码块优先执行,其次构造方法,最后普通 ...
- GCD(关于容斥原理)
Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...
- Vue2.0源码阅读笔记--双向绑定实现原理
上一篇 文章 了解了Vue.js的生命周期.这篇分析Observe Data过程,了解Vue.js的双向数据绑定实现原理. 一.实现双向绑定的做法 前端MVVM最令人激动的就是双向绑定机制了,实现双向 ...
- fetch使用的常见问题及解决办法
首先声明一下,本文不是要讲解fetch的具体用法,不清楚的可以参考MDN fetch教程. 引言 说道fetch就不得不提XMLHttpRequest了,XHR在发送web请求时需要开发者配置相关请求 ...
- hibernate系列笔记(1)---Hibernate增删改查
Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
- Activiti工作流(二)之常用操作
前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线.排他网关.并行网管.流程变量.个人任务及组任务的三种发布方式. 下面将介绍 ...
- 【转】Mysql分页语句Limit用法
http://qimo601.iteye.com/blog/1634748 FAQ: MYSQL limit,offset 区别 SELECT keyword FROM `keyword_rank` ...