6
20
2014
0

blktrace分析-由扇区号、文件系统的文件对应关系

参考文章:

本文参考如下:

http://www.ilinuxkernel.com/files/3/Sector_to_file.htm

1.问题背景

最近在用blktrace这个工具,测试结果的最后一列是与扇区号相关的一个地址,那么如何由扇区号推导出inode,再由inode推导出其所指向的文件呢?

我用blktrace检测的时间是一个运行的 .c文件,该代码完成的任务是读取/home/tss/mds_0.csv这个文件。捕捉对应进程号的动作结果如下:

2.步骤

Step1 找到扇区对应分区

上述第五列对应的动作的类型,其中A表示remap,即重新映射地址,这是blktrace跟踪一个请求的检测起点。上述结果第一行如下:

0        1     0.000000000  2271  A   R 1845256 + 8 <- (8,1) 1843208
  8,0    
我们观测到起始扇区号为1845256。于是任务就是找该扇区对应的分区

fdisk -ul

ps:fdisk -u 保证显示的结果为扇区号,若不加-u,则显示的是柱面

结果如下:

我们可以看到1845256位于sda1的start和end之间。故该文件存在sda1中

 

Step2 计算文件在该分区对应的块

通过dumpe2fs /dev/sda1 |grep 'Block size' 可以得到一个block大小为4096,而在上述fdisk指令中看到一个sector大小为512,故一个block含有8个sector。

所读取文件起始地址对应的块编号为 (1845256 - 2048)/ 8 = 230401

 

Step3 利用debugfs找到块所对应的inode,以及inode所对应的文件

debugfs <dev_name> icheck <block_num> 找block对应的inode值

截图观察230401对应的inode number为420915

 

debugfs <dev_name> ncheck <inode_num> 找inode所指向的区域

上图可以上到,inode指向的文件正是我们代码中操作的文件

 

 

附录分析:

附1:

最后A对应读取的大小为3211544 + 24,则计算起始地址块号

(3211544-2048)/ 8 = 401187。由于连续读的扇区号有24个,故最后一个读请求跨3个块。后一个块的编号是401189  ,见图中icheck命令查找block对应的inode编号时,401187,401188,401189都对应一个inode number。

 

附2:

如果把起始block号减去1,在查找其对应inode,则一定不为420915

 

附3:

观察其追踪文件的读大小。

第一个请求只连续读取了8个扇区,即1个block。第1行

 8,0    0        1     0.000000000  2271  A   R 1845256 + 8 <- (8,1) 1843208
  

第二个请求增加到32个扇区,即4个block。第8行

 8,0    0       11     0.029347062  2271  A   R 1263616 + 32 <- (8,1) 1261568
 
请求的block个数逐渐增大。最大连续读取的扇区数256个

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com