関連:スーパーブロック、iノード、Dentry、ファイルとは何ですか?
有名なメタデータ構造のどれも、実際のファイルの場所データを保持していません。Dentry は名前を inode にマッピングし、inode はファイルに関する情報を格納します。システムは、ファイルの実際のデータ ビットがディスク上のどこにあるのかをどのようにして知るのでしょうか。inode の整数とディスクの場所をデフォルトでマッピングする何らかの方法があるのでしょうか。
答え1
世の中にはさまざまなファイル システムが存在するため、例外が存在することは確かですが、従来、inode にはディスク ブロック番号の配列が含まれていました。
たとえば、 では/usr/include/linux/ext3_fs.h
の定義が見られますstruct ext3_inode
。
中にはstruct ext3_inode
メンバーがいますi_block[EXT3_N_BLOCKS];/* Pointers to blocks */
異なるファイル システムでは、どのディスク ブロックが inode (ファイルのデータを表すディスク上のデータ構造) に属しているかを追跡する方法が異なります。ブロック番号の配列を持つものもあれば、連続ブロックの連続のカウントと開始ブロック番号を足した連続またはエクステントの配列を持つものもあります。Berkeley FFS inode には、ブロック番号の配列とブロック番号の配列があり、各ブロックにはデータ ブロック番号と、データ ブロック番号を含むブロック番号が含まれていました。
「ログ構造化ファイルシステム」の場合は、全体的に少し奇妙になりますが、これは例外であり、一般的ではありません。
答え2
カーネル ソース (またはカーネル ドキュメント パッケージ、または Web) を調べる場合は、Documentation/filesystems を調べてください。これはファイルシステムによって異なります。
たとえば、ext2 では、スーパーブロックに格納されている情報を使用して、inode 番号をパーティション内の特定のオフセットに変換できます (ext2 が mkfs 時に固定数の inode を割り当てる理由の 1 つ)。その後、この inode 番号が読み取られます。inode には、実際のファイル データが保存されている場所を示す 12 個のポインターなど、多くのメタデータが含まれています。12 個を超えるフラグメントがある場合は、間接ブロック (より多くのデータが格納されます) へのポインターがあります。間接ブロックは連鎖できます (各ブロックには次の間接ブロックへのポインターがあります)。
スーパーブロックはパーティションの先頭から固定オフセットで保存されるため、簡単に見つけることができます。(mkfs はバックアップ スーパーブロックも作成します)
あなたは興味があるかもしれませんbtrfs オンディスクフォーマット、それはピクチャーただし、そのドキュメントは ext2 のドキュメントほど完全ではありません。