InodeとVnodeの関係について疑問がありました。私の理解では、inodeは仮想ファイルシステムで使用されるファイルの表現です。一方、vnodeはファイルシステム固有です。これは正しいです?
また、inodeがカーネルデータ構造かどうか、つまり、メモリ内のデータ構造か、実際のディスクのブロックに存在するデータ構造かどうか、混乱していますか?
これに何かを追加するには:vnodeについて私が見つけることができる最良の説明は FreeBSD docs にあります。より学問的なことを考えている人のために、 概念を導入した元の論文 もあり、より深いリソースを提供します。
とは言っても、UFSやNFSなど、さまざまな種類のファイルシステムを使用する必要があったため、vnodeはもともとFreeBSD用に作成されたものです。そのカーネル関数は、Sunの下のすべてのファイルシステムを特にサポートする必要はありません。ファイルのvnodeと対話する方法を知っていればよいだけです。
元の質問に戻ると、@ Allen Luceが述べたように、vnodeはメモリの抽象化であり、ファイルシステム固有ではありません。これらは、UFS、ext4、およびその他すべてで互換的に使用できます。対照的に、iノードはディスクに格納され、使用されている正確なファイルシステムに固有です。 iノードには、サイズ、所有者、ブロックアドレスへのポインタなど、ファイルに関するメタデータが含まれています。 Vノードには、ファイルに関する一部のデータが含まれますが、ファイルの存続期間中に変更されない属性のみが含まれるため、ファイルについて可能な限り多くの情報が必要な場合は、iノードが参照先になります。 inodeにもっと興味があるなら、私はチェックすることをお勧めします wikipediaに良い記事があります 。
通常(LinuxやBSDのメインストリームファイルシステムの場合と同様)、inodeは最初に、ディスク(通常はブロック)でファイルのストレージを記述するディスク上の構造です。 vnodeは、inodeが何であるか(inodeはそのデータフィールドの1つである場合があります)を抽象化するインメモリ構造ですが、ファイルやロックなどの操作のようなものもキャプチャします。これにより、非iノードベースのファイルシステムをサポートできます。特にネットワーク化されたファイルシステム。
それはあなたのOSに依存します。たとえばLinuxシステムでは、vノードはなく、一般的なiノードstruct inode
これは概念的にはvノードに似ていますが、実装方法が異なります。
BSD派生カーネルおよびUNIXカーネルの場合、vノードは、ファイルシステムに固有のiノード構造を指し、ファイルを操作する関数へのポインターやiノードに含まれていないメタデータなどの追加情報も示します。主な違いは、inodeがファイルシステムであるのに対し、vnodeはそうではないことです。 (上記のLinuxには、システムに依存しないiノードとファイルシステムに依存するiノードの両方があります)
Iノードはカーネルデータ構造ではありませんが、vnode/generic iノードはiノードのカーネル内表現です。
Vnodeの概念は、使用しているシステムに応じてある程度異なります。誰もが名前を取得して実行しただけです。
LinuxおよびUnixでは、次のように抽象化を検討できます。存在するとします
_f.tmp
_
プログラムの実行中はfにアクセスしているため、fを使い続ける必要がありますが、プログラムが終了またはクラッシュした場合は、プログラムが確実に終了するようにする必要があります。
これを行うには、fを開いてから、unlink()
を実行します。 iノードのディレクトリエントリが0になり、空きとしてマークされていても、fへの参照は保持されます。オペレーティングシステムは、プログラムが終了するまで、ファイルの開始場所とその割り当て状態を保持しています。存在しないiノードのこの「仮想化」はvノードです。
これの別の一般的な状況は、あなたがあなたの下から消えるリソースを読んでいるときです。映画を一時的な場所にストリーミングしながら視聴しているとします。ムービーが完全にダウンロードされると、ストレージ用に別のボリュームに再配置されます。どういうわけか、あなたはそれが開いたままである限り、映画を見続け、スクラブすることができます。この場合、再びリンクはありませんが、vノードがあるため、このiノードはまだクリーンアップできません。
これは、オペレーティングシステムと、使用または作業しているファイルシステムによって異なります。たとえば、VXFSとADVFSのiノードは、vnodeと呼ばれるディスク上のデータ構造にすぎません。一般に、どちらもファイルのメタデータを指します。