Linuxカーネルがファイルシステムを表示する方法

Linuxカーネルがファイルシステムを表示する方法

私はまだカーネルとファイルシステムの概念が混乱しています。

ファイルシステムには、さまざまなメモリ内のさまざまなファイルとディレクトリを取得するために使用されるinodeテーブルが含まれています。

このinodeテーブルはカーネルの一部ですか?つまり、カーネルが別のファイルシステムをマウントすると、inodeテーブルは更新されますか?

それとも、ファイルシステム自体の一部であり、カーネルはドライバとinodeテーブルアドレスを使用して何とか読み込みますか?

答え1

カーネルのソースコードとドキュメントでは「inode」という用語を混乱させているので、ここにはいくつかの混乱があります。

ファイルシステムは、メモリのファイルシステムコードとデータ、ディスクのファイルシステムの2つの部分で構成されていると考えることができます。

ディスク上のファイルシステムは独立しており、ファイル内のすべての不揮発性データとメタデータを含みます。ほとんどのLinuxファイルシステムでは、これにはディスク上のinodeとファイルに関するその他のメタデータとデータが含まれます。

ただし、ファイルシステムがマウントされると、ファイルシステムコードはメモリ内で使用されるファイルのinodeのキャッシュコピーも保持します。すべてのファイルアクティビティはinodeのメモリコピーを使用して更新するため、カーネルコードは実際にはメモリコピーのみを考慮し、ほとんどのカーネルドキュメントではディスクinodeとメモリinodeを区別しません。メモリ内のinodeには、inodeのディスクコピーに含まれていない追加の一時メタデータ(ファイルのキャッシュされたページがメモリ内のどこにあるか、ファイルが開いているプロセスなど)も含まれています。メモリ内のinodeは定期的に同期され、ディスクに書き戻されます。カーネルはそうではありませんみんなメモリ内 inode - 使用中のファイルと最近使用したファイルの inode のみに該当します。最後に、メモリ内インデックスノードがフラッシュされ、メモリが解放されます。ディスクの inode は常に存在します。

UNIXのファイルアクティビティはinodeと密接に関連しているため、inodeを使用しないファイルシステム(vfatなど)には、カーネルメモリにファイルシステムコードによって動的に生成される仮想inodeがあります。これらのインメモリ仮想inodeは、必要に応じてディスク上のファイルシステムに同期するファイルメタデータを保持し続けます。

従来のUnixファイルシステムでは、inodeはファイルのコアデータ構造です。ファイル名は単にinodeへのポインタであり、inodeは複数のファイル名を連結できます。 inodeを使用しない他のファイルシステムでは、ファイルは通常1つの名前しか持たない可能性があり、メタデータはinodeではなくファイル名に関連付けられます。

答え2

Inode、空きブロックなどはファイルシステムドライバによって処理されます。このファイルシステムコードはカーネルへの共通インタフェースを提供します。つまり、カーネルは、この「ユーザー側」で調整することなく、さまざまなファイルシステムのファイルにアクセスできます。

ただし、多くのファイルシステムドライバもカーネル(ソースコードの別の領域)に含まれています。これには、ext4および他のLinuxベースのファイルシステム用のドライバとロジックが含まれます。

2番目のファイルシステムがマウントされると、そのファイルシステムの別のインスタンス(RAMのデータ構造)が作成されるため、各ディスクパーティションは互いに別々に処理されます。両方のディスクのファイルアクセスは同じドライバコード(例:ext4ファイルシステムのルーチン)を使用できますが、データは異なります。

ファイルシステムドライバ自体は、その下のブロックデバイスアクセス(「読み取りブロック17」、「書き込みブロック23」)のみが必要です。つまり、変更せずにディスク、パーティション、LUKS、またはLVM抽象化レイヤなどに配置できます。

関連情報