如何找出文件在物理上位于磁盘上的位置(块编号)?

这是一个晦涩难懂的问题,我知道。 我正在尝试在Linux机器上进行一些磁盘的性能testing。 我得到了一些不一致的结果,在同一个磁盘上运行相同的testing。 我知道磁盘有不同的性能,这取决于正在访问磁盘的哪一部分。 特别是,由于接近恒定的数据密度和恒定的转速,对磁盘外部的读取和写入具有比读取和写入磁盘内部部分高得多的吞吐量。

我想看看,如果我的不一致可以归因于这种几何因素导致的吞吐量变化。 是否有可能使用现有的工具来找出磁盘上的文件放置位置?

如果没有,我想我可以写一些东西,直接寻找,读取,并写入设备文件本身,绕过(和销毁)的文件系统,但我希望避免这一点。 我目前在3.0内核上使用ext4(Arch Linux,如果有的话),但我也对其他文件系统的技术感兴趣。

你可以使用debugfs来做到这一点:

 debugfs -R "stat ~/myfile" /dev/hda1 

相应地更改硬盘/分区驱动器,确保卸下驱动器。 你将得到所有使用的块的列表:

 BLOCKS: (0):1643532 TOTAL: 1 

您可以使用FIBMAP ioctl (如此处所示)或使用hdparm :

 / $ sudo /sbin/hdparm --fibmap /etc/X11/xorg.conf /etc/X11/xorg.conf: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 1579088 1579095 8 

这个线程可能会让你对ext4文件放置algorithm有所了解。

debugfs有一个bmap函数,它似乎给你想要的数据。 你应该能够给它一个连续的文件块并获得物理块号。

这个问题是相当古老的,但还有另外一个答案可以帮助那些在Google上发现这个问题的人: filefrag (在Debian里面是包e2fsprogs )。

 # filefrag -eX /usr/bin/aptitude Filesystem type is: ef53 File size of /usr/bin/aptitude is 4261400 (1041 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 1fa: 15bd805.. 15bd9ff: 1fb: 1: 1fb.. 3f2: 15c6608.. 15c67ff: 1f8: 15bda00: 2: 3f3.. 410: 15c8680.. 15c869d: 1e: 15c6800: last,eof /usr/bin/aptitude: 3 extents found 

它的优点是它也适用于其他文件系统(我用它为UDF),这似乎没有被这里描述的其他工具支持。

输出中出现的偏移量意味着在第二行写入的块大小的倍数(这里是4096)。 请注意,逻辑偏移量可能不是连续的,因为文件可能会有漏洞(当被文件系统支持时)。