对ext3下的文件恢复1

发布于 2022-09-14 08:53:36 字数 2492 浏览 19 评论 9


任何一个系统管理员,包括有经验的和新手,误删除一个有用的文件是迟早发生的事,发生了这种事后果你比谁都清楚,别人删除了文件找你你还有的说,自己删的又是有用的,那就什么也别说了,想办法找吧!


对于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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

半﹌身腐败 2022-09-15 11:10:03

上面的结果是自动产生的,要比使用命令行选项--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

  

  

故事未完 2022-09-15 11:01:48

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

  


  

沫尐诺 2022-09-15 11:01:46

可以看到journal的大小是134217728字节,或32768(134217728/4096=3276block,这个值在前面的格式化中也见过“Creating journal (32768 blocks): done”。前12block直接列在该节点内:1545-1156,还有一个间接block1557
这个间接块可以包含1024block,这些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;

  

提笔落墨 2022-09-15 10:53:50

使用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~

  

怀念你的温柔 2022-09-15 10:19:04

计算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

  

情域 2022-09-15 09:25:45

节点的用法:

下面是一个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

  

仅一夜美梦 2022-09-15 08:11:08

例如:

  

[root@nas ~]# ext3grep /dev/sda3
--superblock | egrep 'Size of inode|inodes  per group'

  

Number of inodes per group:  32736

  

Size of inode structure: 128

  

长安忆 2022-09-15 07:55:23

下面是通过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

  

我们只是彼此的过ke 2022-09-14 09:00:36

分析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

  

  

  

  

保留

  

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文