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

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

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

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

创建成功如图1

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

2.创建环回设备

losetup /dev/loop0 bean

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

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

3.创建EXT2文件系统

mke2fs /dev/loop0

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

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

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

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

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(小端),如下图验证正确。
【linux】linux 文件系统,如何通过 inode number 定位文件内容?

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

回答

以上是 【linux】linux 文件系统,如何通过 inode number 定位文件内容? 的全部内容, 来源链接: utcz.com/a/82215.html

回到顶部