inodeまたはアドレス空間マップからセクタ番号を取得する

inodeまたはアドレス空間マップからセクタ番号を取得する

ext4ファイルシステムのinodeでセクタ番号を計算する方法を理解しようとしています。だから読んでいます。ext4_mpage_readページ機能。

機能説明:読み取り要求時にページがページキャッシュにない場合は、新しいページが割り当てられてページキャッシュに追加されます。次に、上記の関数を呼び出してディスクからデータを取得し、ページに入力します。

私はページのサイズが4096バイトで、ブロックが512バイトであることを知っています(したがって、ページは8つのブロックで構成されています)。私が理解したところ、上記の関数はブロック番号をページにマップします。ブロック [ページブロック]この場所では:ここそしてここ。ブロックをマッピングした後、関数はbioを割り当て、セクタ割り当てディスクからデータを読み取るには、generic_make_request() を読んで呼び出します。

上記の関数が与えられたアドレス空間にマッピングされたセクタを計算する方法を理解するのは混乱しています。 ext4ファイルシステムのinodeからセクタ番号を取得する他の方法はありますか?

ベストアンサー1

filefrag -v /path/to/file最も簡単な方法は、通常のユーザーとして実行できるコマンドを実行することです(debugfs通常、rootユーザーにのみ提供されるブロックデバイスへの読み取りアクセスが必要な場合とは異なり)。これはext4物理学を提供しますブロック番号(通常は4096バイト)ファイル内の対応する論理オフセットに基づくパーティションの始まり。filefrag -v -kKiB単位またはfilefrag -v -b11バイトの「チャンク」を使用することもできます。

$ filefrag -vb1 google-chrome-stable_current_x86_64.rpm 
Filesystem type is: ef53
File size of google-chrome-stable_current_x86_64.rpm is 57333190
     (57335808 blocks of 1 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0.. 8388607: 5872025600..5880414207: 8388608: 
   1:  8388608..16777215: 5897191424..5905580031: 8388608: 5880414208:
   2: 16777216..25165823: 6241124352..6249512959: 8388608: 5905580032:
   3: 25165824..33554431: 8019509248..8027897855: 8388608: 6249512960:
   4: 33554432..41943039: 8128561152..8136949759: 8388608: 8027897856:
   5: 41943040..50331647: 8220835840..8229224447: 8388608: 8136949760:
   6: 50331648..57335807: 28538081280..28545085439: 7004160: 8229224448: last,eof

これは、最も一般的なファイルシステム方法をioctl(fd, FS_IOC_FIEMAP, ...)使用してファイル記述子の範囲マッピングを要求するために使用されます。->fiemap()以前のカーネルが多用されていましたが、ioctl(fd, FS_IOC_FIBMAP, ...)一度に1つのブロックしかマッピングできず、今日では大容量ファイルに対して数百万回の呼び出しが必要になることがあります。

おすすめ記事