Linux 仮想ファイルシステム (VFS) の関係を示す図

Linux 仮想ファイルシステム (VFS) の関係を示す図

皆さんこんにちは。今日は Linux の仮想ファイルシステムについて説明します。仮想ファイルシステムは、私がずっと話したいと思っていた知識ポイントです。 Linux 開発に関連する作業に従事したい場合は、仮想ファイルシステムを理解する必要があります。

1. 仮想ファイルシステムとは何ですか?

Linux 仮想ファイルシステム (VFS) は、Linux オペレーティング システムの重要なコンポーネントです。ユーザーとアプリケーションがさまざまな種類のファイル システムに同じ方法でアクセスできるようにする統合インターフェイスを提供します。

写真

VFS の設計目標は、さまざまな種類のファイル システムを統一されたインターフェイスに抽象化して、ユーザーとアプリケーションが基盤となるファイル システムの特定の実装の詳細を気にする必要がないようにすることです。 VFS を使用すると、ユーザーは同じシステム コール (open、read、write など) を使用して、ローカル ファイル システム (ext4、XFS など)、ネットワーク ファイル システム (NFS、CIFS など)、仮想ファイル システム (procfs、sysfs など) を含むさまざまな種類のファイル システムにアクセスできます。

VFS は次の主要コンポーネントで構成されています。

  • 仮想ファイルシステム インターフェイス: VFS は、共通のファイルシステム操作インターフェイスのセットを定義します。
  • スーパーブロック: 各ファイル システムにはスーパーブロックがあり、ファイル システムの種類、ブロック サイズ、inode テーブルなどのファイル システムのメタデータ情報が含まれています。スーパーブロックは、ファイル システムの全体的な説明と管理を提供します。
  • Dentry: Dentry はディレクトリ エントリの略語で、ファイル システム内のディレクトリとファイルを表すために使用されます。 Dentry には、ディレクトリとファイルに対応する inode ポインタが含まれており、これを使用してディレクトリの下のファイルまたはサブディレクトリをすばやく見つけることができます。
  • ファイル ノード (inode): inode は、ファイル サイズ、権限、所有者などのファイルまたはディレクトリのメタデータ情報を格納するために使用されるファイル システム内のデータ構造です。各ファイルまたはディレクトリは、一意の inode に対応します。
  • ファイル オブジェクト (ファイル): ファイルは、開いているファイルを表すデータ構造です。対応する inode ポインタ、現在の読み取りおよび書き込み位置などの情報が含まれます。ファイルの読み取りおよび書き込み操作は、ファイルを通じて実行できます。

2. Linuxシステムファイルツリー

一般的な Linux ユーザーや運用保守担当者にとって、Linux システムのファイル ツリーは通常、ルート ファイル システムのルート ディレクトリから始まり、ルート ディレクトリを介してファイル ツリー全体をトラバースすると、次の図のようになります。

写真

システム開発者の視点から見ると、Linux システムのファイル ツリーは、各ファイルとディレクトリが dentry 構造に対応する構造になります。

写真

デントリーとはいったい何でしょうか?

dentry 構造の主な機能は、ファイル システム階層の表現を提供することです。ツリー構造を形成することでディレクトリとファイルを整理します。各 dentry には一意のパス名があり、dentry ツリーをトラバースすることで特定のファイルまたはディレクトリを見つけることができます。

構造体dentry構造の定義:

 struct dentry { struct dentry *d_parent; struct qstr d_name; struct inode *d_inode; const struct dentry_operations *d_op; struct super_block *d_sb; struct list_head d_child; struct list_head d_subdirs; .... };

struct dentry 構造は、d_parent、d_child、d_subdirs などのメンバーを通じてファイル システムをファイル ツリーに編成します。 Linux ファイルシステムを理解するには、dentry の使い方を学ぶ必要があります。

セクション: Dentry は VFS の重要な部分です。 VFS を理解するには、まず dentry から始めます。

3. ファイルシステムの登録

これまでの研究を通じて、歯槽骨構造の重要性がわかってきました。次に、dentry 構造を中心としたファイル VFS のさまざまなコンポーネント間の関係を分析します。まず全体的なアーキテクチャ図を見てみましょう。

写真

Linux ファイル システムは、file_system_type 構造オブジェクトに対応します。 file_system_type 構造体は次のように定義されます。

 struct file_system_type { const char *name; int fs_flags; int (*init_fs_context)(struct fs_context *); const struct fs_parameter_spec *parameters; struct dentry *(*mount) (struct file_system_type *, int, const char *, void *); void (*kill_sb) (struct super_block *); ...... };

ramfs ファイル システムは次のように定義されます。名前はファイルシステムの種類を示します。 ramfs ファイル システムをインスタンス化する必要がある場合は、グローバル ファイル システム リスト ヘッダーから名前で対応する登録済みファイル システムを見つけ、登録済みファイル システムからスーパー ブロックを作成する必要があります。

 static struct file_system_type ramfs_fs_type = { .name = "ramfs", .init_fs_context = ramfs_init_fs_context, .parameters = ramfs_fs_parameters, .kill_sb = ramfs_kill_sb, .fs_flags = FS_USERNS_MOUNT, };

ファイルシステムを定義した後、register_filesystem 関数を使用してファイルシステムを Linux システムに登録します。正常に登録されたファイル システムは、グローバル ファイル システム リストに挿入されます。登録されたファイル システムを使用してスーパー ブロックを作成できます。

cat /proc/filesystems でシステムに登録されているすべてのファイルシステムを表示します。

写真

4. ファイルシステムのマウント

ファイル システムのマウントとは、新しいファイル システムがマウント インスタンス (struct mount) を生成し、新しいマウント インスタンスと親ファイル システムのマウント インスタンスの間に親子関係を確立することを意味します。

新しいマウント インスタンスは、いくつかの重要な部分で構成されます。

  • スーパーブロック (super_block)

スーパー ブロックは、新しいファイル システムに対応するデバイスを示すために使用されます。

  • 親マウントインスタンス(マウント)

親マウント インスタンスは、マウント ポイントが配置されているファイル システム マウント インスタンスを示します。

  • マウントポイント

マウント ポイントは、新しいファイル システムと親ファイル システム間のリンクです。

  • ファイルシステムのルートディレクトリ (dentry)

各ファイル システムにはルート ディレクトリがあります。ファイル パスを新しいファイル システムにインデックスする場合、インデックス作成は新しいファイル システムのルート ディレクトリから開始されます。

4.1 インデックスマウントポイント

マウント ポイントをインデックスする目的は、マウント ポイントの構造体パス レコード情報を取得することです。マウント ポイントのインデックス作成プロセスは、構造体パス レコード情報を継続的に置き換えるプロセスです。

写真

マウントポイント /mnt/test/dir を例に挙げます。

  1. / ディレクトリをインデックスし、/ ディレクトリのパス レコード情報を取得します。
  2. mnt ディレクトリをインデックスし、mnt ディレクトリのパス レコード情報を取得し、/ ディレクトリのパス レコード情報を上書きします。
  3. テスト ディレクトリをインデックスし、テスト ディレクトリのパス レコード情報を取得し、mnt ディレクトリのパス レコード情報を上書きします。
  4. dir ディレクトリをインデックスし、dir ディレクトリのパス レコード情報を取得し、test ディレクトリのパス レコード情報を上書きします。
  5. 最後に、マウントポイント dir の struct パス レコード情報が取得されます。

struct パス構造は次のように定義されます。

 struct path { struct vfsmount *mnt; struct dentry *dentry; };

mnt: マウント ポイントが配置されているファイル システムのマウント インスタンスを記録します。

dentry: マウントポイントディレクトリ dentry。

4.2 新しいファイルシステムマウントインスタンスを作成する

  • スーパーブロックの作成

スーパーブロックを作成するには、まずファイル システムの種類を知っておく必要があります。 mount コマンドは、-t パラメータを使用してファイル システムの種類を指定します。 mount コマンドによって渡されたファイル システム タイプを使用して、グローバル ファイル システム リストを走査し、登録されているファイル システムを見つけ、登録されているファイル システムを通じてスーパー ブロックを作成できます。

  • 新しいファイルシステムマウントインスタンスを作成する

スーパーブロックが作成されると、スーパーブロック情報を使用して新しいファイルシステムマウントインスタンスが作成されます。

  • マウントポイントを作成する

マウント ポイント dentry を使用してマウント ポイントを作成します。

4.3 古いインスタンスと新しいインスタンスを接続する

前のプロセスを通じて、ファイル システムのマウントの 3 つの要素がすでに用意されています。

  • 新しいファイル システム マウント インスタンス。
  • 親ファイル システムのマウント インスタンス。
  • マウントポイント。

マウントの 3 つの要素を通じて、新しいマウント インスタンスと古いマウント インスタンスのドッキングを完了できます。ドッキングが完了すると、新しいファイル システム マウント インスタンスの mnt_parent が親マウント インスタンスを指し、マウント プロセス全体が完了します。

新しいファイル システムが正常にマウントされると、次に示すように、Linux システム ファイル ツリーに新しいファイル システムが移植されます。

写真


この時点で、新しいファイルシステム内のファイルを操作したい場合は、パス名レイヤーごとにレイヤーインデックスに従ってファイルパス情報を取得するだけで済みます。パス情報には dentry 情報が記録され、dentry は inode オブジェクトにバインドされます。

最後に、inode ファイル ノードを取得してファイルを操作できます。

<<:  2024 年に無視できない 6 つのクラウド セキュリティの脅威

>>:  クラウド環境におけるデータ系統: 課題と解決策

推薦する

SEO担当者の4つのタブー:本質を理解することが成長の鍵

SEO 初心者でも熟練した SEO 経験者でも、SEO 最適化プロセスで多かれ少なかれ問題に遭遇して...

K8sの展開方法の完全ガイド:基本から上級まで、1つの記事ですべてのスキルを紹介します

1. kubeadm kubeadm は Kubernetes によって公式に提供されるツールであり...

Kubernetesを本番環境で使用した3年間の経験から学んだこと

[編集者注] Kubernetes の旅から得られた主な教訓。私たちは 2017 年にバージョン 1...

病院の入札データ分析スキルを4つ学ぶ - 初心者からエキスパートまで

あなたも私と同じ経験をしたことはありませんか。病院の入札を始めて間もなく、結果が理想的ではなく、その...

あなたのクラウド ネットワークは生成 AI に対応していますか?

生成型人工知能 (AI) は、企業に数兆ドルの価値をもたらし、私たちの働き方を根本的に変える可能性を...

元斉森林のブランドマーケティングを説明する12,000語

飲料業界の専門家とコミュニケーションをとる過程で、私たちは一連の興味深い視点を観察しました。巨大飲料...

高速ビジネス環境下でITアーキテクチャーにおいて最小限の労力で高いパフォーマンスを達成する方法

[51CTO.comよりオリジナル記事] デジタルトランスフォーメーションが深まり続ける中、クラウド...

2019年の中国メディア市場の動向を分析!

この記事では、2019 年の中国のメディア市場の動向についての洞察を共有し、今年のメディア市場の発展...

HUYAの急速な海外進出の秘密

[51CTO.com からのオリジナル記事] Huya は、ゲームライブストリーミングを主力事業とす...

この記事を読んだ後でも、あなたのお母さんはあなたが Docker を使い始められないのではないかと心配し続けるでしょうか?

[51CTO.com からのオリジナル記事] 先週、ガールフレンドが突然ペットを飼いたいと言いました...

クラウドサービス市場は本当に暗い冬を迎えているのでしょうか?

まだ初秋ですが、クラウドサービス市場はすでに寒い冬に突入しています。すべての兆候は、この発言が根拠の...

sharktech: 月額 509 ドル、10Gbps 帯域幅、無制限トラフィック、2*e5-2670/32g メモリ/2T ハードディスク/5IP/60g 防御

Sharktech は、16 年間運営されているアメリカのコンピューター ルームの老舗ブランドです。...

ウェブサイト運営によりユーザーの信頼が向上

古来より、誠実と清廉は中華民族の伝統的な美徳です。「誠実」はビジネスを行うための基本条件であるだけで...

Mituo 1元体験サイト構築が正式に開始

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますユーザーエ...

インターネット金融商品を宣伝するために、H5 ミニゲームをどのように企画・開発すればよいでしょうか?

製品が特定の問題点を解決するために作成された場合、製品の最適化と反復は、より優れたユーザー エクスペ...