私が理解したところ、Linuxはinodeテーブルを使用してディスク上のファイルを見つけます。 Linuxファイルシステムはinodeテーブルをメモリに保持しますか? ext2、ext3、ext4に関係なく同じですか?
これを説明する良い参考資料を知っている人はいますか?
答え1
この内容はすでにここで取り上げています。ファイルテーブルはファイルシステムにありますか、メモリにありますか?
かなり徹底したようです。しかし、まだ良い質問です。ご覧のとおり、この質問は実際にあなたの質問が示唆するよりも具体的です。
http://140.120.7.21/LinuxKernel/LinuxKernel/node17.html以下は、同じ質問に対処するように思われるより技術的な説明です。同じ答えで正しく読み取ると、メモリとディスクに異なる種類のinodeテーブルがあります。これは2008年のことですが、少なくともextファイルシステムではあまり変わったことがないようですが確かではありません。
以前のカーネルの説明は実際にはかなり良いです。
汎用ファイルは、名前が付いていない一部の物理デバイスに格納された一連のデータバイトです。所有者、権限、サイズ、時間などのファイル管理情報は、ファイルの inode 構造に保存されます。ファイルシステムのすべての inode をまとめて inode テーブルを形成します。各ファイルシステムは1つの論理ディスクを占有します。カーネルは論理ディスクの$2^{nd}$ブロックから始まり、ファイルシステムのinodeテーブルを隣接するディスクブロックに格納します。各inode(inodeテーブルのエントリ)は、ファイルに関する次の情報を格納するためにシステムによって使用されるデータ構造です。
....
最後に、Linuxソースツリー(include/linux/fs.h)で定義されたinode構造があります。これは、メモリにロードされたinode構造であるIn-Core inodeです。このコア内のinodeがロードされると、関連するディスクのinode情報が関連フィールドに入力されます。
答え2
Linux(および実際には他のUnix)では、以下は必要ありません。インデックスノードディスクからファイルを探す、検索タスクただ必要ディレクトリエントリ(dentry
)、つまりパスの場合、/foo/bar
検索ルーチンは、「foo」ディレクトリの「bar」ディレクトリエントリにアクセスする必要があります。
Linuxカーネルには、ディレクトリエントリキャッシュと呼ばれるディレクトリエントリキャッシュのためのクロスファイルシステム階層があります。データキャッシュ要するに。ただし、inode
オブジェクトへのポインタも保持します。カーネルのドキュメントで説明されています。ファイルシステム/vfs.txt:
VFSは
open(2)
、、、stat(2)
およびchmod(2)
同様のシステムコールを実装します。 VFSは、渡されたパス名パラメータを使用してディレクトリエントリキャッシュ(dentryキャッシュまたはdcacheとも呼ばれる)を取得します。これは翻訳のための非常に迅速なルックアップメカニズムを提供します。パス名(ファイル名)コンクリートディレクトリエントリ。ディレクトリエントリはRAMに存在し、ディスクには保存されません。パフォーマンスのためにのみ存在します。dentryキャッシュは、ファイルスペース全体を見るためのものです。ほとんどのコンピュータは、すべてのディレクトリエントリを同時にRAMに入れることができないため、キャッシュ内のビットの一部が失われます。 dentryのパス名を解決するために、VFSは途中でdentryを生成してからinodeをロードする必要があるかもしれません。これは、索引ノードを照会することによって行われます。
答え3
通常、Linuxはファイルが開いたときにのみメモリにinodeをロードします。ファイルが閉じられた後、データは、キャッシュロジックを介してディスクにフラッシュされるか、未使用としてマークされるまで、一定期間メモリに更新された形式で残ることがあります。
特定のファイルを繰り返し開閉するのは、ファイルシステムを頻繁に使用するパターンです。後で再度開くときにinodeを再度読み取らないと、効率が向上する可能性があります。
信頼できる参照はLinuxカーネルのソースコードです。ソースツリーのソース/ドキュメントディレクトリには、探している詳細が含まれていますが、ソースコードと一致するように完全に更新されないことがあります。