对ext3下的文件恢复1
任何一个系统管理员,包括有经验的和新手,误删除一个有用的文件是迟早发生的事,发生了这种事后果你比谁都清楚,别人删除了文件找你你还有的说,自己删的又是有用的,那就什么也别说了,想办法找吧!
对于ext2文件系统,现在用的很少了,而且也比较好恢复,在这里就不说了,现在用的最多的是ext3文件系统,ext4也已经成熟,有不少Linux的发行版本中已经开始使用了。
那么就针对ext3文件系统来恢复,注意ext3grep只对ext3文件系统来恢复。
1 下载并安装ext3grep
工具ext3grep是一款开源软件,功能比较强大,但遗憾的是这个项目没有自己的主页,也没有相关的文档,在该地址http://code.google.com/p/ext3grep/可以找到相关的下载连接,当前最新的版本为0.10.2.,另外在这个比较干净页面上,你必须注意到一处“here”,如下图,在这里你可以找到你想要的东西,我们在后面会用到这个文档:
file:///C:/DOCUME%7E1/t/LOCALS%7E1/Temp/msohtml1/01/clip_image002.jpg
1.下载ext3grep:
[root@nas ~]#wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz
|
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
上面的结果是自动产生的,要比使用命令行选项--show-journal-inodes快的多。
这个选项用于查找属于一个节点的block,然后再在ext3日志中查找该block的所有拷贝,随后这些仅打印出被请求的inode,而消除了重复性。
[root@nas ~]#ext3grep
/dev/sdb1 --show-journal-inodes 49154
Running ext3grep version 0.10.2
Number of groups: 597
Minimum / maximum journal block: 1545 / 35886
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1273827555 = Fri May 14 16:59:15 2010
Number of descriptors in journal: 115; min / max sequence numbers: 5 / 28
Copies of inode 49154 found in the journal:
--------------Inode 49154 (transaction ------------------
Generation Id: 4288869617
uid / gid: 0 / 0
mode: rrw-r--r--
size: 0
num of links: 0
sectors: 0 (--> 0 indirect blocks).
Inode Times:
Accessed:
1273827555 = Fri May 14 16:59:15 2010
File Modified:
1273827570 = Fri May 14 16:59:30 2010
Inode Modified: 1273827570 = Fri May 14 16:59:30 2010
Deletion time:
1273827570 = Fri May 14 16:59:30 2010
Direct Blocks: 0
--------------Inode 49154 (transaction 7)------------------
Generation Id: 4288869617
uid / gid: 0 / 0
mode: rrw-r--r--
size: 7
num of links: 1
sectors: 8 (--> 0 indirect blocks).
Inode Times:
Accessed:
1273827555 = Fri May 14 16:59:15 2010
File Modified:
1273827555 = Fri May 14 16:59:15 2010
Inode Modified: 1273827555 = Fri May 14 16:59:15 2010
Deletion time:
0
Direct Blocks: 110600
2.2手动恢复举例
在下面的例子中,将会手动恢复一个小文件。使用“ext3grep
/dev/sdb1 --ls --inode 2”来查找想要恢复的文件。
先看一下总体情况:
[root@nas ~]# ext3grep
/dev/sdb1 --ls --inode 2
Running ext3grep version 0.10.2
……
Directory block 1539:
.-- File type in dir_entry (r=regular file, d=directory, l=symlink)
|
.-- D: Deleted ; R: Reallocated
Indx Next |
Inode
| Deletion time
Mode
File name
==========+==========+----------------data-from-inode------+-----------+=========
0
1 d
2
drwxr-xr-x
.
1
2 d
2
drwxr-xr-x
..
2
end r
11
rrw-r--r--
pp
3
4 d 3604481
D 1274249319 Wed May 19 14:08:39 2010
drwxr-xr-x
BB
4
end d
98305
D 1274249319 Wed May 19 14:08:39 2010
drwxr-xr-x
CC
6
7 r
49153
D 1273827555 Fri May 14 16:59:15 2010
rrw-------
.jj.swp
7
end r
49154
D 1273827570 Fri May 14 16:59:30 2010
rrw-r--r--
jj
…
可以看到journal的大小是134217728字节,或32768(134217728/4096=3276个block,这个值在前面的格式化中也见过“Creating journal (32768 blocks): done”。前12个block直接列在该节点内:1545-1156,还有一个间接block是1557,
这个间接块可以包含1024个block,这些block(1158-2181)都跟随在这个间接block之后。然后是一个二次间接(double indirect)块2582。
Journal文件中的第一个block (在上面的例子为:block 1545),其结构在文件中定义/usr/include/linux/jbd.h:
/*
* The journal superblock.
All fields are in big-endian byte order.
*/
typedef struct journal_superblock_s
{
/* 0x0000 */
journal_header_t s_header;
/* 0x000C */
/* Static information describing the journal */
__be32
s_blocksize;
/* journal device blocksize */
__be32
s_maxlen;
/* total blocks in journal file */
__be32
s_first;
/* first block of log information */
/* 0x0018 */
/* Dynamic information describing the current state of the log */
__be32
s_sequence;
/* first commit ID expected in log */
__be32
s_start;
/* blocknr of start of log */
/* 0x0020 */
/* Error value, as set by journal_abort(). */
__be32
s_errno;
/* 0x0024 */
/* Remaining fields are only valid in a version-2 superblock */
__be32
s_feature_compat;
/* compatible feature set */
__be32
s_feature_incompat;
/* incompatible feature set */
__be32
s_feature_ro_compat;
/* readonly-compatible feature set */
/* 0x0030 */
__u8
s_uuid[16];
/* 128-bit uuid for journal */
/* 0x0040 */
__be32
s_nr_users;
/* Nr of filesystems sharing log */
__be32
s_dynsuper;
/* Blocknr of dynamic superblock copy*/
/* 0x0048 */
__be32
s_max_transaction;
/* Limit of journal blocks per trans.*/
__be32
s_max_trans_data;
/* Limit of data blocks per trans. */
/* 0x0050 */
__u32
s_padding[44];
/* 0x0100 */
__u8
s_users[16*48];
/* ids of all fs'es sharing the log */
/* 0x0400 */
} journal_superblock_t;
使用ext3grep命令的--ls--inode选项列出每一个节点N的目录块所包含的内容。例如列出分区的根目录:
[root@nas /]# ext3grep /dev/sdb1
--ls --inode 2
Running ext3grep version 0.10.2
Number of groups: 597
Loading group metadata... done
Minimum / maximum journal block: 1545 / 35886
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1266736861 = Sun Feb 21 15:21:01 2010
Number of descriptors in journal: 1865; min / max sequence numbers: 97 / 308
Inode is Allocated
The first block of the directory is 1539.
Inode 2 is directory "".
Directory block 1539:
.-- File type in dir_entry (r=regular file, d=directory, l=symlink)
|
.-- D: Deleted ; R: Reallocated
Indx Next |
Inode
| Deletion time
Mode
File name
==========+==========+----------------data-from-inode------+-----------+=========
0
1 d
2
drwxr-xr-x
.
1
end d
2
drwxr-xr-x
..
2
3 d
11
D 1273641978 Wed May 12 13:26:18 2010
drwx------
lost+found
3
4 r
49153
D 1273641978 Wed May 12 13:26:18 2010
rrw-r--r--
perl.rpm
4
7 d
32769
D 1273641978 Wed May 12 13:26:18 2010
drwxr-xr-x
side
5
6 d
4472833
D 1273641976 Wed May 12 13:26:16 2010
drwxr-xr-x
aide
6
7 r
49157
D 1273641976 Wed May 12 13:26:16 2010
rrw-r--r--
ft
7
9 d
6488065
D 1273641978 Wed May 12 13:26:18 2010
drwxr-xr-x
side2
8
9 r
49154
D 1273641976 Wed May 12 13:26:16 2010
rrw-r--r--
f
9
end d
5373953
D 1273641978 Wed May 12 13:26:18 2010
drwxr-xr-x
side3
10
11 r
49156
D 1273641976 Wed May 12 13:26:16 2010
rrwxr-xr-x
bash
11
12 d
7503873
D 1273641976 Wed May 12 13:26:16 2010
drwxr-xr-x
sbin
12
end d
3522561
D 1273641978 Wed May 12 13:26:18 2010
drwxr-xr-x
lib
13
14 d
1048577
D 1273641976 Wed May 12 13:26:16 2010
drwxr-xr-x
bd
14
end d
507905
D 1273641976 Wed May 12 13:26:16 2010
drwxrwxrwx
clamav
15
end r
49158
D 1266733035 Sun Feb 21 14:17:15 2010
rrw-r--r--
ft~
计算inode的索引(index):
index = inode_number - (group *inodes_per_group + 1)
因此,group能够被确定:每一inode能够被一个数字标识一个连续的地址[1,number_of_inodes],这里的inode可以被给定:
[root@nas ~]# ext3grep
/dev/sdb1 --superblock | grep 'Inodes count'
Inodes count: 9781248
节点的用法:
下面是一个inode的结构表。
字 节
类 型
描
述
0-1
__le16
文件模式
2-3
__le16
uid的低16位
4-7
__le32
字节大小
8-11
__le32
访问时间
12-15
__le32
建立时间
16-19
__le32
修改时间
20-23
__le32
删除时间
24-25
__le16
gid的低16位
26-27
__le16
链接数
28-31
__le32
扇区数
32-35
__le32
文件标志
36-39
linux1
操作系统依赖1
40-99
__le32[15]
指向块的指针
100-103
__le32
文件版本(用于NFS)
104-107
__le32
文件ACL
108-111
__le32
目录ACL
112-115
__le32
片断地址
116-127
linux2
操作系统依赖2
例如:
[root@nas ~]# ext3grep /dev/sda3
--superblock | egrep 'Size of inode|inodes per group'
Number of inodes per group: 32736
Size of inode structure: 128
下面是通过dumpe2fs得到的信息:
[root@nas ~]# dumpe2fs /dev/sdb1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:
<none>
Last mounted on:
<not available>
Filesystem UUID:
c6e67db9-f86a-41e5-9fb0-c09bd41b577a
Filesystem magic number:
0xEF53
Filesystem revision #:
1 (dynamic)
Filesystem features:
has_journal resize_inode dir_index filetype sparse_super large_file
Default mount options:
(none)
Filesystem state:
clean
Errors behavior:
Continue
Filesystem OS type:
Linux
Inode count:
9781248
Block count:
19531015
Reserved block count:
976550
Free blocks:
19178024
Free inodes:
9781237
First block:
0
Block size:
4096
Fragment size:
4096
Reserved GDT blocks:
1019
Blocks per group:
32768
Fragments per group:
32768
Inodes per group:
16384
Inode blocks per group:
512
Filesystem created:
Thu May 13 19:04:35 2010
Last mount time:
Thu May 13 19:06:10 2010
Last write time:
Thu May 13 19:06:21 2010
Mount count:
2
Maximum mount count:
36
Last checked:
Thu May 13 19:04:35 2010
Check interval:
15552000 (6 months)
Next check after:
Tue Nov
9 19:04:35 2010
Reserved blocks uid:
0 (user root)
Reserved blocks gid:
0 (group root)
First inode:
11
Inode size:
128
Journal inode:
8
Default directory hash:
tea
Directory Hash Seed:
9e0f6a8c-ae09-4473-b821-088e5b189b47
Journal backup:
inode blocks
Journal size:
128M
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-5
Reserved GDT blocks at 6-1024
Block bitmap at 1025 (+1025), Inode bitmap at 1026 (+1026)
Inode table at 1027-1538 (+1027)
0 free blocks, 16373 free inodes, 2 directories
Free blocks:
Free inodes: 12-16384
……
Group 596: (Blocks 19529728-19531014)
Block bitmap at 19529728 (+0), Inode bitmap at 19529729 (+1)
Inode table at 19529730-19530241 (+2)
773 free blocks, 16384 free inodes, 0 directories
Free blocks: 19530242-19531014
Free inodes: 9764865-9781248
分析Superblock,其内容及个字节的作用如下:
字节位置
类 型
作
用
0-3
__le32
总的inode数
4-7
__le32
总的block数
8-11
__le32
文件系统保留的块数
12-15
__le32
空闲块数
16-19
__le32
空闲inode数
20-23
__le32
块组0的起始块号
24-27
__le32
块大小
28-31
__le32
片断(Fragment)大小
32-35
__le32
每个块组所包含的块数
36-39
__le32
每个块组所包含的片断数
40-43
__le32
每个块组所包含的inode数
44-47
__le32
最后挂载时间
48-51
__le32
最后写入时间
52-53
__le16
当被前挂载数
54-55
__le16
最大挂载数
56-57
__le16
魔术签名(Magic signature)
58-59
__le16
文件系统状态
60-61
__le16
检测到错误后的行为
62-63
__le16
子版本级别
64-67
__le32
最后检测的时间
68-71
__le32
两次检测间的最长间隔
72-75
__le32
操作系统类型
76-79
__le32
主版本级别
80-81
__le16
默认UID保留块
82-83
__le16
默认GID保留块
84-87
__le32
第一个非保留inode
88-89
__le16
节点结构的大小(字节数)
90-91
__le16
该超级块所在的块组(Block group)
92-95
__le32
兼容特征
96-99
__le32
非兼容特征
100-103
__le32
只读兼容特征
104-119
__u8[16]
用128位的UUID表示文件系统ID
120-135
char[16]
卷名(Volume name)
136-199
char[64]
最后一次挂载的目录
200-203
__le32
压缩方法
204
__u8
文件再分配块数
205
__u8
目录再分配块数
206-207
__le16
每组描述符在线增长数
208-223
__u8[16]
日志超级块的uuid
224-227
__le32
日志文件(journal file)的inode
228-231
__le32
日志文件设备的inode
232-235
__le32
被删除节点的列表的开始处
236-251
__le32[4]
Hash种子树
252
__u8
默认使用的hash版本
253-255
保留
256-259
__le32
默认挂载选项
260-263
__le32
第一个元块块组
264-1023
保留