免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1409 | 回复: 0
打印 上一主题 下一主题

ext2 / ext3 结构分析(第 2 部分) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-11 19:57 |只看该作者 |倒序浏览
本帖最后由 splendid12 于 2012-02-11 20:07 编辑

接上部分

原文在 我的博客 里面
http://lizeaaaa.blog.163.com
《ext2 / ext3 结构分析》

------------------------------

Part 5. Inode Table,n*128 B / take up X block_size by s_inodes_per_group of Superblock

The inode (index node) is a fundamental concept in the ext2 filesystem. Each object in the filesystem is
represented by an inode.
The inode table is used to keep track of every directory, regular file, symbolic link, or special file; their
location, size, type and access rights are all stored in inodes. There is no filename stored in the inode
itself, names are contained in directory files only.
There is one inode table per block group and it can be located by reading the bg_inode_table in its
associated group descriptor. There are s_inodes_per_group inodes per table.
Each inode contain the information about a single physical file on the system. A file can be a directory, a
socket, a buffer, character or block device, symbolic link or a regular file. So an inode can be seen as a
block of information related to an entity, describing its location on disk, its size and its owner.

inode 是最重要的一部分,包含了文件的权限,拥有者,时间信息,存储在哪些 block 上等信息
每个文件系统的对象,都被抽象成了 inode

在 inode 中,不包含文件名!名字仅在 目录 中包含!

struct ext3_inode {  

__u16 i_mode;    /* File mode */  
__u16 i_uid;     /* Low 16 bits of Owner Uid */  
__u32 i_size;    /* 文件大小,单位是 byte */  
__u32 i_atime;   /* Access time */  
__u32 i_ctime;   /* Creation time */
/*10*/  
__u32 i_mtime;   /* Modification time */  
__u32 i_dtime;   /* Deletion Time */  
__u16 i_gid;     /* Low 16 bits of Group Id */  
__u16 i_links_count;          /* Links count */  
__u32 i_blocks;               /* blocks 计数 */
/*20*/  
__u32 i_flags;                /* File flags */
__u32 l_i_reserved1;          /* 可以忽略 */
/*28*/  
__u32 i_block[EXT3_N_BLOCKS]; /* 一组 block 指针 */
/*64*/  
__u32 i_generation;           /* 可以忽略 */
__u32 i_file_acl;             /* 可以忽略 */  
__u32 i_dir_acl;              /* 可以忽略 */  
__u32 i_faddr;                /* 可以忽略 */  
__u8  l_i_frag;               /* 可以忽略 */  
__u8  l_i_fsize;              /* 可以忽略 */  
__u16 i_pad1;                 /* 可以忽略 */
__u16 l_i_uid_high;           /* 可以忽略 */  
__u16 l_i_gid_high;           /* 可以忽略 */  
__u32 l_i_reserved2;          /* 可以忽略 */
};

注意:inode 编号从 1 开始;block 编号从 0 开始

0.
inode 的数量
SuperBlock 中有一个 s_inodes_per_group 指定了 每个 Block group 中含有多少 inode
不过这个数量不会超过 8 * block_size
如我的这个 /dev/sda1 中 block_size 为 1K,所以不会超过 8192 个,这个由 bitmap 限制

1.
详细分析 inode
我打开连续的 2 个 inode table 看,边看边分析。
由于每个 inode 是128B,所以下面用 颜色 进行区分,下划线是 i_block 区域。

# dd if=/dev/sda1 bs=1024 count=2 skip=5 | xxd | less
inode table of inode 1
0000000: 0000 0000 0000 0000 f92a 254f f92a 254f  .........*%O.*%O
0000010: f92a 254f 0000 0000 0000 0000 0000 0000  .*%O............
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................

我们发现,inode 1 很奇怪,block 区域没有存储任何指向 block 号的指针

原因在于 Super Block 中有一个字段:s_rev_level


当这个字段取值为 0,则规定 inode table 中的前 11 个保留;
如果这个字段取值 1,则规定 inode table 需要查看 Superblock 中的 s_first_ino 字段

SuperBlock 中对的 s_first_ino 解释:
32bit value used as index to the first inode useable for standard files. In revision 0, the first non-reserved
inode is fixed to 11 (EXT2_GOOD_OLD_FIRST_INO). In revision 1 and later this value may be set to any
value.

通过查看 s_first_ino,发现值为 b,即 11
就是说前 10 个全是保留给系统使用的。

那么前 10 个都做了些什么呢?文档中说:


inode 2,后面解释根目录;因此所有的分区,跟目录都是 inode 2
inode 5,是 boot loader inode


inode 2
0000080: ed41 0000 0004 0000 b1ae 354f 65b5 344f  .A........5Oe.4O
0000090: 65b5 344f 0000 0000 0000 0400 0200 0000  e.4O............
00000a0: 0000 0000 0000 0000 0001 0000 0000 0000  ................
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
通过上面的分析,这里就是 分区根目录
它使用了 100H block 来存储数据

0000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
0000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
00001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000200: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
0000270: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000280: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
00002f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000300: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
0000370: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 8
0000380: 8081 0000 0000 4000 0000 0000 f92a 254f  ......@......*%O
0000390: f92a 254f 0000 0000 0000 0100 2420 0000  .*%O........$ ..
00003a0: 0000 0000 0000 0000 0d01 0000 0e01 0000  ................
00003b0: 0f01 0000 1001 0000 1101 0000 1201 0000  ................
00003c0: 1301 0000 1401 0000 1501 0000 1601 0000  ................
00003d0: 1701 0000 1801 0000 1901 0000 1a02 0000  ................
00003e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
这里是 ext3 的日志(journal)区,可以使用 dumpe2fs /dev/sda1 :
# dumpe2fs /dev/sda1
......
Journal UUID:             <none>
Journal inode:            8
Journal device:           0x0000
.......
看到他用了 12 个直接block 指向,1 个 1级block,1 个 2级block指向,3级block指向 暂时没使用。
关于 “n级block指向” 的翻译方法很多,这只是我的翻译,保持你自己的翻译即可。下面是其结构图:


0000400: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
0000470: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000480: 0000 0000 0000 0000 0000 0000 0000 0000  ................
all 0s
00004f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 11
0000500: c041 0000 0030 0000 4caa 354f f92a 254f  .A...0..L.5O.*%O
0000510: f92a 254f 0000 0000 0000 0200 1800 0000  .*%O............
0000520: 0000 0000 0000 0000 0101 0000 0201 0000  ................
0000530: 0301 0000 0401 0000 0501 0000 0601 0000  ................
0000540: 0701 0000 0801 0000 0901 0000 0a01 0000  ................
0000550: 0b01 0000 0c01 0000 0000 0000 0000 0000  ................
0000560: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000570: 0000 0000 0000 0000 0000 0000 0000 0000  ................
通过上面的分析,我们得知 inode 11 才是 留给用户使用的
我们看看第一个的具体含义
c041,即 41c0,权限,表如下:


41c0,目录,user read,c=8+4,即 user wirte + user execute。即 drwx------
有兴趣的话,尝试翻译剩下的 inode 的其他字段

inode 12
0000580: a481 0000 445a 0000 29be 5a3e 1e2b 254f  ....DZ..).Z>.+%O
0000590: 29be 5a3e 0000 0000 0000 0100 3000 0000  ).Z>........0...
00005a0: 0000 0000 0000 0000 1f11 0000 2011 0000  ............ ...
00005b0: 2111 0000 2211 0000 2311 0000 2411 0000  !..."...#...$...
00005c0: 2511 0000 2611 0000 2711 0000 2811 0000  %...&...'...(...
00005d0: 2911 0000 2a11 0000 2b11 0000 0000 0000  )...*...+.......
00005e0: 0000 0000 9d04 7138 0000 0000 0000 0000  ......q8........
00005f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 13
0000600: a481 0000 2253 0000 29be 5a3e 1e2b 254f  ...."S..).Z>.+%O
0000610: 29be 5a3e 0000 0000 0000 0100 2c00 0000  ).Z>........,...
0000620: 0000 0000 0000 0000 3711 0000 3811 0000  ........7...8...
0000630: 3911 0000 3a11 0000 3b11 0000 3c11 0000  9...:...;...<...
0000640: 3d11 0000 3e11 0000 3f11 0000 4011 0000  =...>...?...@...
0000650: 4111 0000 4211 0000 4311 0000 0000 0000  A...B...C.......
0000660: 0000 0000 9e04 7138 0000 0000 0000 0000  ......q8........
0000670: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 14
0000680: a481 0000 c016 0000 081b 323e 4a2b 254f  ..........2>J+%O
0000690: 081b 323e 0000 0000 0000 0100 0c00 0000  ..2>............
00006a0: 0000 0000 0000 0000 4d11 0000 4e11 0000  ........M...N...
00006b0: 4f11 0000 5011 0000 5111 0000 5211 0000  O...P...Q...R...
00006c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00006d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00006e0: 0000 0000 9f04 7138 0000 0000 0000 0000  ......q8........
00006f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 15
0000700: a481 0000 6402 0000 081b 323e 4a2b 254f  ....d.....2>J+%O
0000710: 081b 323e 0000 0000 0000 0100 0200 0000  ..2>............
0000720: 0000 0000 0000 0000 5311 0000 0000 0000  ........S.......
0000730: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000740: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000750: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000760: 0000 0000 a004 7138 0000 0000 0000 0000  ......q8........
0000770: 0000 0000 0000 0000 0000 0000 0000 0000  ................

inode 16
0000780: a481 0000 8002 0000 081b 323e 4a2b 254f  ..........2>J+%O
0000790: 081b 323e 0000 0000 0000 0100 0200 0000  ..2>............
00007a0: 0000 0000 0000 0000 5411 0000 0000 0000  ........T.......
00007b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007e0: 0000 0000 a104 7138 0000 0000 0000 0000  ......q8........
00007f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
因为我们用 dd 读取了 conut=2,即读取了 2048 B,
而每个 inode 为 128 B,所以 2048/128 = 16 个 inode
即对于 1K 的 block_size,只能存放 8 个 inode

2.
关于 inode 的计算
因为 inode 是分区内唯一的,是顺序的,而又能在 Super bolck 中知道 每个 block group 中的 inode 数,故:
block group           = (inode - 1) / s_inodes_per_group
local inode index = (inode - 1) % s_inodes_per_group
用这 2 和公式就能找到硬盘中任意的文件的 Inode 信息了


Part 5. Block Data
这部分就全是是 block 了,专门存放数据用的,
关于这里面的格式,下面讲。

------------------------------
还有 1 部分。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP