分享

让高级程序员都崩溃的rm-rf命令终于找到补救方法了输入标题

 兰宝888 2018-09-26

据说曾经有一个哥们,运维部刚刚整好一台机器交给他部署,然后他听说rm-rf/很好玩,就输了一个rm-rf/然后,然后就没有然后了......

那么问题来了,这个可以让你的世界都安静的rm-rf/命令,到底是个“何方神圣”呢

rm命令用来删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。

rm命令的一般形式为:

rm [选项] 文件名…

如果没有使用- r选项,则rm不会删除目录。

该命令的各选项含义如下:

- f 忽略不存在的文件,强制删除,不给出提示。

- r 指示rm将参数中列出的全部目录和子目录均递归地删除。

- i 进行交互式删除。

使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。为了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会删除。

在国外著名linx管理员守则中有这么一条:“慎用rm -rf命令,除非你知道此命令将带来什么后果。”

但是我们都知道,如果如果所有事情都按我们希望的那样发展,我们程序猿早就飞黄腾达了,哈哈,开个玩笑,有时候我们或许会一不注意,一个rm命令就出来了,然后地球开始旋转,世界开始寂静,大脑开始空白了。。。但不要太过于紧张吧,或许这个方法可以帮你补救下(只是或许哦)

(该方法来源于网络用户名history_xcy的作者,原文地址http://blog./29479238/viewspace-1163084/)

先说一下他的工作原理吧,然后把试验分享给大家, 工作原理其实也不难,这个工具需要在ext3或者ext4 的文件系统上才可以实现,因为ext3文件系统是日志型文件系统,ext3文件系统储存信息的时候是由inode号和block块存储的。

神马? 不知道什么是inode号?和block块? 好吧,在说明白点,比如:一个分区比如一本书,那么block块就是书每页的内容,而inode号 就是书的目录,系统找文件的时候先找inode号 然后根据inode号去找硬盘上的block快信息,明白了吧!

在说一下删除的原理吧。 当硬盘上的一个文件删除,其实没有真正想象中的那样在硬盘上清除掉的,他是把inode号和block块的那个链子 断开,但是真正的数据还是在硬盘上的,有没有感觉在windos上删除是那么快,没考虑到这吧,当你在删除文件的地方重新复制了新文件,那时候才会把之前的文件覆盖掉,也就是说删除了没有关系,千万不要往那个位置放文件了。

源码包下载位置:http://down.51cto.com/data/709491

原理说完了,开始实战。

环境介绍: 系统版本:CentOS release 5.4 (Final)

1 安装之前先检查有没有这个包: rpm -qa | grep e2fsprogs

2 ext4grep 是个源码包,需要编译安装

检查一下e2fsprogs包是否完整,我的却一个-devel的包,所以要先yum install e2fsprogs* 我偷懒了嘿嘿

解压ext3源码包

进入源码包,然后开始检查包的完整性 执行: ./configure 如果在这个过程中到最后有error那么先检查你的是不是少 e2fsprogs-devel

在进行 make && make install (编译 编译安装) 一般这里不会有问题如果这里报错了 检查你系统是不是缺少 gcc gcc-c++ 这俩包 你可以 yum install gcc* 全部安装 有好处没有坏处哈哈哈

等待完整完,,好了安装完以后。可以先查看一个是否完成成功了,用: ext3grep -v 命令查看ext3的版本信息如下如:

当然如果不知道命令怎么用可以输入:ext3grep --help 查看

然后我需要手动创建一个分区, 创建命令: fdisk /dev/sda 这个因为没有办法保存图像所有我直接显示的创建完成以后的。如果大家不知道怎么创建 可以查看我的 linx基本命令(文件系统章节)。

然后 把这个分区y用ext3分区格式格式化 并且挂载到mnt目录下。

然后 我进入了挂载的目录里, 创建了xcy目录, 把/etc/passwrd 和 /etc/my.cnf 俩个文件复制到了/mnt/xcy目录中,并且 把俩个文件改了下名字 为了我的辨认。 最后我执行了 rm -rf /xcy/* 把xcy文件中的文件都删除了。

咳咳,然后我首先做的是卸载下来 把挂载的分区,因为 怕别人动了我的文件夹 在里面复制了东西我就没有办法恢复了,在下面我执行:ext3grep /dev/sda5 --ls --inode 2 给你们解释一下

ext3grep 删除文件的分区 --ls --innode inode号

为什么最后我们要写2 因为我不知道我的删除的文件的inode号多少, 所有我写的是最大的inode / 的inode号 可以用: ls -id / 查看

执行下去以后就会看到 他在刷帮你找删除的文件们。。

继续走,,扫到最后我们想要知道的文件夹的inode号是2099 然后我们继续执行扫描命令: ext3grep /dev/sda5/ --ls --lnode 2009 这个命令他就会扫 xcy目录下的所有文件(包括删除 还有没有删除文件的inode号了) ,然后我们就可以扫除来了,my.cnf.xcy innode号 是2011 passwd.xcy 文件的inode号 是2010

现在我们的目标马上就要达到了,知道了俩个文件的inode号 就可以进行恢复了.

然后我们执行 ext3grep /dev/sda5 --restore-inode 2011 (恢复my.cnf.xcy文件)

我们在执行 ext3grep /dev/sda5 --restore-inode 2010 (恢复passwrd.xcy文件)

然后我们将卸载的文件系统重现挂载上去。

恢复了,文件不会在原来的位置,他会自动在/ 下创建一个叫RESTORED_FILES 目录 你以后所有恢复的文件都会在这里保存着,还有文件的名字是以inode号命名的 你需要手动修改回来原名字,不要怕不知道那个文件是那个,还记得我们 --ls 扫描的时候他都有对应的文件和inode号

文件恢复了,哈哈 是不是很激动啊,解决了liunx 下不能恢复的问题,这样就可以大大节约成本 不用找硬盘恢复工具 不用花钱了, 对了还有呢, 这个同样可以恢复 mysql 数据库 误操作删除了库或者表 都可以恢复 原理嘛 其实就是恢复相对应的mysql数据库中的文件了,自己尝试一下吧,

对了在说一下,我截图中 圈起来了是正确的命令,别的很多有操作错误的,因为毕竟第一次试验吗。。成功了很高兴,,希望能帮到和我同样遭遇的朋友们。

当然还有些正常的补救操作:

对于linux 很多人都认为将用root权限将系统rm -Rf /* 整个盘的数据将会丢失,首先请不要紧张不要对数据盘执行任何操作。如果命令正在执行请立即停止 Ctrl+c

执行rm -Rf /* 后整个系统将会逐步从根目录按照字母表表的先后顺序删除。

立即停机,不要指望能够进入以前的系统。千万千万不要重新安装系统后再试图用软件恢复,那个时候不管用任何方式都是徒劳,切记切记!!下面是方法,如果系统在本地,立即将磁盘取出,挂载到新服务器。如果在云盘,联系服务商将将系统(损坏了的系统)镜像(等同于拆下了硬盘), 然后通常云服务器都可以再将损坏了的系统进行挂载。利用网络上面介绍到方法将系统修复,这里面就不再详细介绍。 总之记住一点问题没有想象中的眼中,也没有论坛里面说的那么严重。 不过对于系统级别的数据可能会造成影响,但是对于存储在硬盘里面的数据一般不会有太多的丢失最后,只能说到这里了,千万不要紧张。记得以后将重要数据及时备份。祝你好运

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多