zoukankan      html  css  js  c++  java
  • Linux下用rm删除的文件的恢复方法

    对于rm,很多人都有惨痛的教训。我也遇到一次,一下午写的程序就被rm掉了,幸好只是一个文件,第二天很快又重新写了一遍。但是很多人可能就不像我这么幸运了。本文收集了一些在Linux下恢复rm删除的文件的方法,给大家作为参考。

      首先,最好的方法是避免这个问题,以下是几点建议:

      1、rm -rf误操作的后果是可怕的,rm -f也要三思而行,不能轻易使用。

      2、做好数据备份。

      3、用一些策略避免出错:

      提倡在shell下用 TAB 补全,用脚本执行任务,减少出错的机会。或者编写一个脚本,起名rm,在脚本里将真实的rm改为mv ,将删除的都mv到一个指定的目录里面,定期清理。

      那么rm删除的文件还能恢复吗?

      rm的man里面有如下说法:

      请注意,如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证该文件的内容无法还原,请考虑使用 shred。

      所以理论上rm删除的文件是还能恢复的。删掉文件其实只是将指向数据块的索引点(information nodes)释放,只要不被覆盖,数据其实还在硬盘上,关键在于找出索引点,然后将其所指数据块内的数据抓出,再保存到另外的分区。在用rm误删除文件后,我们要做的第一件事就是保证不再向误删文件的分区写数据。

      通常我们可以有以下几种选择:

      1、借助工具。

      2、自己写程序。你需要会编程并了解对应的文件系统。

      3、如果数据很有用,也许可以找专业公司抢救。

      工具

      1、The Sleuth Kit http://www.sleuthkit.org/sleuthkit/(Autopsy是它的一个图形前端)

      2、Foremost    http://foremost.sourceforge.net

      3、一个全能的工具,Finaldata,可以恢复unix/linux/dos下误删的文件。对于unix,支持这些产品,     Solaris、AIX和HP-UX。对于linux,支持EXT2的文件系统。对于dos,支持FAT 12/16/32, NTFS 4/5/5.1 的文件系统。

      4、如果文件系统是ext2(对ext3无效):

      ext3的删除机制是直接把 inode data 删除了,所以造成 ext3 无法反删除(ext3设计为无法恢复被删除的文件)。

      unrm

      ext2ed

      debugfs(undel lsdel )

      recover

      Midnight Commander(mc)

      e2undel

      tct

      5、如果文件系统是FAT32或者NTFS:

      EasyRecovery

      Finaldata

      6、freebsd如果使用了rm,可以试一下undelete这个命令.

      7、当进程打开了某个文件时,只要该进程保持打开该文件,lsof可以用来恢复删除文件。

    恢复被误删文件的方法

      大多数Linux发行版都提供一个debugfs工具,可以用来对Ext2文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。

      首先以只读方式重新挂载被误删的文件所在分区。使用如下命令:(假设文件在/usr分区)

      mount –r –n –o remount /usr -r表示只读方式挂载;-n表示不写入/etc/mtab,如果是恢复/etc上的文件,就加上这个参数。如果系统说xxx partion busy,可以用fuser命令查看一下是哪些进程使用这个分区上的文件:

      fuser –v –m /usr

      如果没有什么重要的进程,用以下命令停掉它们:

      fuser -k –v –m /usr

      然后就可以重新挂载这些文件系统了。

      如果是把所有的文件统一安装在一个大的/分区当中,可以在boot提示符下用linux single进入单用户模式,尽量减少系统进程向硬盘写入数据的机会,要不干脆把硬盘挂在别的机器上。另外,恢复出来的数据不要写到/上面,避免破坏那些有用的数据。如果机器上有dos/windows,可以写到这些分区上面:

    mount –r –n /dev/hda1 /mnt/had

    然后就可以执行debugfs:(假设Linux在 /dev/hda5)

    #debugfs /dev/hda5

    就会出现debugfs提示符debugfs:

    使用lsdel命令可以列出很多被删除的文件的信息:

    debugfs:lsdel

    debugfs: 2692 deleted inodes found.

    Inode Owner Mode Size Blocks Time deleted

    164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001

    …………………………………………………………

    36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001

    196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001

    debugfs:

      列出的文件有很多(这里找到2692个),第一字段是文件节点号,第二字段是文件所有者,第三字段是读写权限,接下来是文件大小,占用块数,删除时间。

    然后就可以根据文件大小和删除日期判断那些是我们需要的。比如我们要恢复节点是196829的文件:

      可以先看看文件数据状态:

    debugfs:stat <196829>

    Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1

    User: 0 Group: 0 Size: 149500

    File ACL: 0 Directory ACL: 0

    Links: 0 Blockcount: 38

    Fragment: Address: 0 Number: 0 Size: 0

    ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001

    atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001

    mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001

    dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001

    BLOCKS:

    594810 594811 594814 594815 594816 594817 ………………………………….

    TOTAL: 38

    然后就可以用dump指令恢复文件:

    debugfs:dump <196829> /mnt/hda/01.sav

    这样就把文件恢复出来了。退出debugfs:

    debugfs:quit

    另一种方法是手工编辑inode:

    debugfs:mi <196829>

    Mode [0100644]

    User ID [0]

    Group ID [0]

    Size [149500]

    Creation time [0x31a9a574]

    Modification time [0x31a9a574]

    Access time [0x31a21dd1]

    Deletion time [0x31a9a574] 0

    Link count [0] 1

    Block count [38]

    File flags [0x0]

    Reserved1 [0]

    File acl [0]

    …………………………….

    Triple Indirect Block [0]

      使用mi指令后每次显示一行信息以供编辑,其它行可以直接按回车表示确认,把deletion time改成0(未删除),Link count改成1。改好后退出debugfs:

      debugfs:quit

      然后用fsck检查/dev/hda5

      fsck /dev/hda5

      程序会说找到丢失的数据块,放在lost+found里面。这个目录里的文件就是我们要的东东。

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/ityunwei/p/13634121.html
Copyright © 2011-2022 走看看