作为一个多用户、多任务的操作系统 , Linux下的文件一旦被删除 , 是难以恢复的 。尽管删除命令只是在档节点中作删除标记 , 并不真正清除文件内容 , 但是其它用户和一些有写盘动作的进程会很快覆盖这些资料 。不过 , 对于家庭单机使用的Linux , 或者误删档后及时补救 , 还是可以恢复的 。
1、Ext2文件系统结构的简单介绍
在Linux所用的Ext2文件系统中 , 文件是以块为单位存储的 , 默认情况下每个块的大小是1K , 不同的块以块号区分 。每个档还有一个节点 , 节点中包含有档所有者 , 读写权限 , 文件类型等信息 。对于一个小于12个块的档 , 在节点中直接存储档数据块的块号 。如果档大于12个块 , 那么节点在12个块号之后存储一个间接块的块号 , 在这个间接块号所对应的块中 , 存储有256个档数据块的块号(Ext2fs中每个块号占用4字节 , 这样一个块中所能存储的块号就是1024/4=256) 。如果有更大的档 , 那么还会在节点中出现二级间接块和三级间接块 。
2、恢复被误删档的方法
大多数Linux发行版都提供一个debugfs工具 , 可以用来对Ext2文件系统进行编辑操作 。不过在使用这个工具之前 , 还有一些工作要做 。
首先以只读方式重新挂载被误删的档所在分区 。使用如下命令:(假设文件在/usr分区)
mount ?Cr ?Cn ?Co remount /usr
-r表示只读方式挂载;-n表示不写入/etc/mtab , 如果是恢复/etc上的档 , 就加上这个参数 。如果系统说xxx partion busy , 可以用fuser命令查看一下是哪些进程使用这个分区上的?n:
fuser ?Cv ?Cm /usr
如果没有什么重要的进程 , 用以下命令停掉它们:
fuser -k ?Cv ?Cm /usr
然后就可以重新挂载这些文件系统了 。
如果是把所有的档统一安装在一个大的/分区当中 , 可以在boot提示符下用linux single进入单用户模式 , 尽量减少系统进程向硬盘写入资料的机会 , 要不干脆把硬盘挂在别的机器上 。另外 , 恢复出来的资料不要写到/上面 , 避免破坏那些有用的资料 。如果机器上有dos/windows , 可以写到这些分区上面:
mount ?Cr ?Cn /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
推荐阅读
- 保护Linux下的Apache网站
- 如何在Linux下压缩文件
- 简析Linux中如何改变文件或目录的访问权限
- Redhat Linux升级SSH笔记
- DOS兄弟玩转Linux
- Linux技巧小总结
- Linux环境下使用XFS文件系统
- Linux下C开发环境的构成和安装
- linux下通过脚本实现自动重启程序
- qq怎么发送录音文件