linux 文件系统,如何通过 inode number 定位文件内容?

发布于 2022-09-05 05:00:04 字数 4117 浏览 54 评论 0

想通过知道一个文件的 inode number,来读取它的内容,我的做法如下

1.首先分配一个大小为512MB的磁盘空间

dd if=/dev/zero of=bean bs=1k count=512000

创建成功如图1

图1

2.创建环回设备

losetup /dev/loop0 bean

如图2,环回设备创建成功

图2

3.创建EXT2文件系统

mke2fs /dev/loop0

如图3,文件系统创建成功

图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

图4


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(小端),如下图验证正确。
clipboard.png

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文