web-dev-qa-db-ja.com

ファイルがディスク上の物理的な場所(ブロック番号)を見つけるにはどうすればよいですか?

これはあいまいな質問です。 Linuxボックスでいくつかのディスクのパフォーマンステストを実行しようとしています。同じディスクで同じテストを実行すると、一貫性のない結果が得られます。ディスクのどの部分にアクセスするかによって、ディスクのパフォーマンスが異なることは知っています。特に、データ密度がほぼ一定で回転速度が一定であるため、ディスクの外側への読み取りと書き込みは、ディスクの内側への読み取りと書き込みよりもスループットがはるかに高くなります。

私の不整合が、このジオメトリに起因するスループットの変動に起因する可能性があるかどうかを確認したいと思います。既存のツールを使用して、ディスク上のファイルが配置されている場所を見つけることは可能ですか?

そうでない場合は、ファイルシステムをバイパス(および破棄)して、デバイスファイル自体に直接シーク、読み取り、および書き込みを行う何かを書き込むことができると思いますが、それを回避したいと考えています。現在、3.0カーネル(Arch Linux、重要な場合)でext4を使用していますが、他のファイルシステムの手法にも興味があります。

10
Rick Koshi

これにはdebugfsを使用できます。

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

ハード/パーティションドライブを適宜変更し、ドライブがマウント解除されていることを確認します。使用されているすべてのブロックのリストが表示されます。

BLOCKS:
(0):1643532
TOTAL: 1
7
Bart De Vos

FIBMAP ioctl を使用できます-例として here を使用するか、または 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
10
Francois G

これ スレッドは、ext4ファイル配置アルゴリズムについての洞察を与える可能性があります。

debugfsにはbmap関数があり、必要なデータを提供しているようです。ファイルの連続したブロックを与え、物理ブロック番号を取得できるはずです。

5
Paweł Brodacki

質問はかなり古いですが、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で使用しました)でも機能するという利点があります。

出力に表示されるオフセットは、2行目に記述されているブロックサイズ(ここでは4096)の倍数であることを意味しています。ファイルに穴が開いている可能性があるため(ファイルシステムでサポートされている場合)、論理オフセットが連続していない可能性があることに注意してください。

2