linux 文件系统,如何通过 inode number 定位文件内容?
想通过知道一个文件的 inode number,来读取它的内容,我的做法如下
1.首先分配一个大小为512MB的磁盘空间
dd if=/dev/zero of=bean bs=1k count=512000
创建成功如图1
2.创建环回设备
losetup /dev/loop0 bean
如图2,环回设备创建成功
3.创建EXT2文件系统
mke2fs /dev/loop0
如图3,文件系统创建成功
4.挂载文件系统
mount -t ext2 /dev/loop0 /mnt/bean
5.查看环回设备超级块信息
Last mounted on: /mnt/bean
**
Inode count: 12824
Block count: 51200
Reserved block count: 2560
**
Block size: 1024
Fragment size: 1024
**
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 1832
Inode blocks per group: 229
**
First inode: 11
Inode size: 128
**
Group 0: (Blocks 1-8192)
主 superblock at 1, Group descriptors at 2-2
保留的GDT块位于 3-201
Block bitmap at 202 (+201), Inode bitmap at 203 (+202)
Inode表位于 204-432 (+203)
7706 free blocks, 1816 free inodes, 2 directories
可用块数: 447-1044, 1072-1552, 1564-1595, 1598-8192
可用inode数: 17-1832
**
Group 2: (Blocks 16385-24576)
Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)
Inode表位于 16387-16615 (+2)
7960 free blocks, 1828 free inodes, 1 directories
可用块数: 16617-24576
可用inode数: 3669-5496
可见,Inodes per group 为 1832,Inode size 为 128 KB ,块0的inode table 位于204-432.
6.查找文件的 Inode number
用 `ls -i` 命令获取文件 temp.txt的 Inode number,如图4所示,Inode number是13
7.定位inode的location
根据下面3个公式,计算
block_group_number = (inode_number-1) / inodes_per_group
inode_offset = (inode_number-1) % inodes_per_group
inode_location_in_byte = inode_talbe_location+ inode_offset*inode_size = inode_talbe_location+ ((inode_number-1) % inodes_per_group)*inode_size
首先,inode number 为13,因此块号为0,由下式计算得 inode 地址为0x33600
204*1024+((13-1)%1832)*128=0x33600
8.根据inode数值偏移找到块内数据
在次之前,先验证以上步骤没有问题。通过验证文件大小侧面验证,i_size在inode中偏移为4字节,通过命令 dumpe2fs /dev/loop0
得到块设备内容,观察得到
033600 a4 81 00 00 1a 68 00 00 12 6f 64 59 0f 6f 64 59
文件大小为0x681a=26650(小端),如下图验证正确。
inode 的数据结构知道i_block[0] 的偏移为40字节(0x28),经计算得地址为0x33600+0x28=0x33628
用 命令
dd if=/dev/loop0 bs=1k count=2042 |od -tx1 -Ax
得到块设备内容
033600 a4 81 00 00 1a 68 00 00 12 6f 64 59 0f 6f 64 59
033610 0f 6f 64 59 00 00 00 00 00 00 01 00 38 00 00 00
033620 00 00 00 00 01 00 00 00 20 04 00 00 21 04 00 00
033630 22 04 00 00 23 04 00 00 24 04 00 00 25 04 00 00
033640 26 04 00 00 27 04 00 00 28 04 00 00 29 04 00 00
033650 2a 04 00 00 2b 04 00 00 15 04 00 00 00 00 00 00
033660 00 00 00 00 a3 8a d4 7d 00 00 00 00 00 00 00 00
033670 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
可以看到i_block[0]的数值为0x420
由第5步可知块大小为1KB,故数据地址为
0x420*0x400=0x108000
temp.txt的内容是1024个a,1024个b一直到1024个z,然而,dd出来的文件内容中,0x108000是全0,为什么呢?
105400 2c 04 00 00 2d 04 00 00 2e 04 00 00 2f 04 00 00
105410 11 06 00 00 12 06 00 00 13 06 00 00 14 06 00 00
105420 15 06 00 00 16 06 00 00 17 06 00 00 18 06 00 00
105430 19 06 00 00 1a 06 00 00 1b 06 00 00 00 00 00 00
105440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
1fe800
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论