Linuxは、ファイルデータがディスク上のどこにあるかをどうやって知ることができますか?

Linuxは、ファイルデータがディスク上のどこにあるかをどうやって知ることができますか?

関連:スーパーブロック、アノード、ディレクトリエントリ、ファイルとは何ですか?

実際のファイル位置データを保持する周知のメタデータ構造はありません。 Dentry は、ファイルに関する情報を格納する 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)を見ると、ドキュメント/ファイルシステムを見ることはファイルシステムによって異なります。

たとえば、ext2を使用すると、スーパーブロックに格納されている情報を使用してinode番号をパーティションの一部のオフセットに変換し(ext2がmkfsに固定数のinodeを割り当てる理由の1つ)、そのオフセットを読み取ることができますあります。 inodeには、実際のファイルデータが保存される場所を示す12個のポインタを含む大量のメタデータが含まれています。 12個以上のフラグメントがある場合は、間接ブロック(より多くの保存)へのポインタがあります。間接ブロックは接続できます(各間接ブロックには次の間接ブロックへのポインタがあります)。

スーパーブロックはパーティションの開始から固定のオフセットに保存されるため、見つけるのは簡単です。 (mkfsはバックアップスーパーブロックも作成します)

あなたは興味があるかもしれませんbtrfsディスクフォーマット、さらには、たとえ文書がext2文書ほど完全ではありませんが。

関連情報