Linux システム - ファイルシステムと仮想ファイルシステム

Linux システム - ファイルシステムと仮想ファイルシステム

[[334629]]

1. ソフトリンクとハードリンクの違い

ファイルにはファイル名とデータが含まれていることはご存じのとおりです。データは、ユーザー データとメタデータの 2 つの部分に分かれています。ユーザー データ、つまりファイル データ ブロックは、ファイルの実際の内容が記録される場所です。メタデータは、ファイル サイズ、作成時間、所有者、その他の情報など、ファイルの追加属性です。 Linux では、メタデータ内の inode 番号 (inode はファイル メタデータの一部ですが、ファイル名は含まれません。inode 番号はインデックス ノード番号です) がファイル名ではなくファイルの一意の識別子になります。ファイル名は、人々の記憶と使用の便宜のためだけに付けられます。システムまたはプログラムは、i ノード番号を通じて正しいファイル データ ブロックを見つけます。

ファイル共有の問題を解決するために、Linux システムでは、ハード リンクとソフト リンク (シンボリック リンクとも呼ばれます) の 2 種類のリンクが導入されています。リンクは、Linux システムでのファイル共有の問題を解決するだけでなく、ファイル パスの非表示、権限のセキュリティの強化、ストレージの節約などの利点ももたらします。 1 つの inode 番号が複数のファイル名に対応する場合、これらのファイルはハード リンクと呼ばれます。ハードリンクは複数のエイリアスを持つファイルです。

ハード リンクは、同じ inode 番号を持ちながらファイル名が異なるファイルであるため、次のような特性があります。

  • ファイルは同じ inode とデータ ブロックを持ちます。
  • 既存のファイルのみを作成できます。
  • ファイル システム間でハード リンクを作成できません。
  • ディレクトリは作成できません。作成できるのはファイルのみです。
  • ハードリンク ファイルを削除しても、同じ inode 番号を持つ他のファイルには影響しません。

inode 番号は各ファイルシステム内でのみ一意です。 Linux が複数のファイルシステムをマウントする場合、inode 番号が繰り返されます。したがって、ファイル システム間でハード リンクを作成することはできません。

ソフトリンクはハードリンクとは異なります。ファイルのユーザー データ ブロックに格納されているコンテンツが別のファイルのパス名を指している場合、そのファイルはソフト リンクです。ソフトリンクは普通のファイルですが、データブロックの内容は少し特殊です。ソフト リンクには独自の inode 番号とユーザー データ ブロックがあります。したがって、ソフト リンクの作成と使用には、ハード リンクのような多くの制限はありません。

  • ソフトリンクには独自のファイル属性や権限などがあります。
  • 存在しないファイルまたはディレクトリのソフト リンクを作成できます。
  • ソフト リンクはファイル システムをまたぐことができます。
  • ファイルまたはディレクトリに対してソフト リンクを作成できます。
  • ソフト リンクが作成されると、リンク数 i_nlink は増加しません。

ソフト リンクを削除しても、それが指すファイルには影響しませんが、それが指す元のファイルが削除された場合、関連するソフト リンクはデッド リンク (つまり、ぶら下がったリンク) と呼ばれます。指しているパス ファイルを再作成すると、デッド リンクを通常のソフト リンクに復元できます。

一般的に、ファイル名と inode 番号は 1 対 1 で対応しており、各 inode 番号はファイル名に対応します。ただし、Unix/Linux システムでは、複数のファイル名が同じ inode 番号を指すことができます。つまり、異なるファイル名を使用して同じコンテンツにアクセスできるということです。ファイルの内容を変更すると、すべてのファイル名に影響します。ただし、1 つのファイル名を削除しても、別のファイル名へのアクセスには影響しません。この状況は「ハードリンク」と呼ばれます。

2. Linux VFS

Linux には非常に豊富なファイルシステムがあり、大まかに次のカテゴリに分類できます。

  • nfs、cifs などのネットワーク ファイル システム。
  • ext4、ext3 などのディスク ファイル システム。
  • proc、sysfs、ramfs、tmpfs などの特殊なファイル システム。

上記のファイルシステムを実装し、Linux 下で共存させるための基盤となるのが、Linux VFS (Virtual File System、Virtual Filesystem Switch とも呼ばれる)、つまり仮想ファイルシステムです。一般的なファイル システムとして、VFS はファイル、ディレクトリ エントリ (dentry)、インデックス ノード (inode)、マウント ポイントというファイル システムの 4 つの基本概念を抽象化します。カーネルのユーザー空間層のファイルシステムに関連するインターフェースを提供します。 VFS は open() や read() などのシステム コールを実装し、cp などのユーザー空間プログラムがファイル システムをまたぐことを可能にします。 VFS は上記の内容を実際に実現します。Linux では、プロセス以外のすべてがファイルです。

Linux VFS には、スーパーブロック オブジェクト、inode オブジェクト、dentry オブジェクト、ファイル オブジェクトの 4 つの基本オブジェクトがあります。スーパーブロック オブジェクトはインストールされたファイル システムを表します。インデックス ノード オブジェクトはファイルを表します。ディレクトリ エントリ オブジェクトはディレクトリ エントリを表します。たとえば、デバイス ファイル event5 はパス /dev/input/event5 にあり、ディレクトリ エントリ オブジェクトは /、dev/、input/、event5 の 4 つあります。ファイル オブジェクトは、プロセスによって開かれたファイルを表します。ファイル パスを迅速に解決するために、Linux VFS はディレクトリ エントリ キャッシュ (Directory Entry Cache、dcache) を設計しました。

3. ファイルを開くプロセス

open() システムコールのプロセスは次のとおりです。

  • ファイルがシステム全体のオープン ファイル テーブルに存在するかどうか、つまり、ファイルが他のプロセスによって開かれているかどうかを確認します。
  • 存在する場合、プロセスは、システム全体のオープン ファイル テーブル内のファイルを指すエントリをプロセスごとのオープン ファイル テーブルに作成します。
  • 存在しない場合は、ファイル名に基づいてディレクトリ内でファイルを検索する必要があります。通常、ディレクトリの一部はキャッシュに保存されるため、検索が高速化されます。
  • ファイルが見つかると、FCB (ファイル制御ブロック) ファイル制御ブロックがシステム全体のオープン ファイル テーブルにコピーされます。このテーブルは、FCB を保存するだけでなく、各ファイルを開いたプロセスの数も記録します。
  • 次に、プロセスごとのオープン ファイル テーブルには、プロセス オープン ファイル テーブル内の項目を指すエントリが 1 つだけあります。

プロセスがファイルを close() すると、次のようになります。

  • プロセスのプロセスごとのオープンファイルテーブル内の対応するエントリが削除され、システムオープンテーブル内のファイルカウンタが1減少します。
  • システムオープンテーブルの計算が0の場合、ファイル項目を削除します

4. inodeの理解

オペレーティング システムがハード ディスクを読み取るとき、セクターごとに読み取るわけではないため、効率が悪すぎます。代わりに、一度に複数のセクターを連続的に読み取ります。つまり、一度に「ブロック」を読み取ります。複数のセクターで構成されるこの「ブロック」は、ファイル アクセスの最小単位です。最も一般的な「ブロック」サイズは 4KB です。つまり、8 つの連続したセクターがブロックを形成します。

ファイル データは「ブロック」に保存されるため、ファイルの作成者、ファイルの作成日、ファイルのサイズなどのファイルのメタデータを保存する場所も見つける必要があります。ファイルのメタデータを保存するこの領域は inode と呼ばれ、中国語では「インデックス ノード」と翻訳されます。

inode には、ファイルのメタ情報、具体的には次のものが含まれます。

  • * ファイル内のバイト数
  • * ファイル所有者のユーザーID
  • * ファイルのグループID
  • * ファイルの読み取り、書き込み、実行権限
  • * ファイルには 3 つのタイムスタンプがあります。ctime は inode が最後に変更された時刻、mtime はファイルの内容が最後に変更された時刻、atime はファイルが最後に開かれた時刻を示します。
  • * リンクの数、つまりこのinodeを指すファイル名の数
  • * ファイルデータブロックの場所

ファイル名以外のすべてのファイル情報はinodeに保存されます

各 inode には番号があり、オペレーティング システムは inode 番号を使用してさまざまなファイルを識別します。

表面的には、ユーザーはファイル名でファイルを開きます。実際、システム内のこのプロセスは 3 つのステップに分かれています。まず、システムはファイル名に対応する inode 番号を見つけます。 2 番目に、inode 番号を通じて inode 情報を取得します。最後に、inode 情報に基づいて、ファイル データが配置されているブロックを見つけてデータを読み取ります。

ディレクトリもファイルの一種です。ディレクトリ ファイルの構造は非常に単純で、一連のディレクトリ エントリ (dirent) のリストです。各ディレクトリ エントリは、含まれるファイルのファイル名と、ファイル名に対応する inode 番号の 2 つの部分で構成されます。

ブロックアドレス指定

inode はファイル データ ブロックの場所を記録します。アドレッシング モードには 3 つあります。直接ブロックはデータ ブロックを直接指します。単一間接は、データ ブロックへのポインターを含むブロックを指します。二重間接、2レベルブロック

5. ファイル記述子

Linux システムでは、すべてをファイルと見なすことができ、ファイルは通常のファイル、ディレクトリ ファイル、リンク ファイル、デバイス ファイルに分類できます。ファイル記述子は、開かれたファイルを効率的に管理するためにカーネルによって作成されるインデックスです。これは、開かれたファイルを参照するために使用される負でない整数 (通常は小さな整数) です。 I/O 操作を実行するすべてのシステム コールは、ファイル記述子を通じて行われます。プログラムを起動したばかりのときは、0 が標準入力、1 が標準出力、2 が標準エラーです。この時点で新しいファイルを開くと、そのファイル記述子は 3 になります。POSIX 標準では、ファイル (ソケットを含む) を開くたびに、現在のプロセスで使用可能な最小のファイル記述子番号を使用する必要があります。

ファイル記述子はシステムの重要なリソースです。システムメモリと同じ数のファイル記述子を開くことができますが、実際の実装ではカーネルが対応する処理を実行します。通常、開いているファイルの最大数はシステム メモリの 10% (KB 単位で計算) です (システム レベルの制限と呼ばれます)。

6. ファイル記述子と開いているファイルの関係

各ファイル記述子は開いているファイルに対応し、異なるファイル記述子が同じファイルを指すことができます。同じファイルを異なるプロセスで開くことも、同じプロセスで複数回開くこともできます。システムは各プロセスのファイル記述子テーブルを維持します。テーブルの値は 0 から始まるため、異なるプロセスで同じファイル記述子が表示されます。この場合、同じファイル記述子が同じファイルまたは異なるファイルを指す場合があります。特定の状況には特定の分析が必要です。具体的な概要を理解するには、カーネルによって管理される 3 つのデータ構造を確認する必要があります。

  • プロセスレベルのファイル記述子テーブル
  • システム全体のオープンファイル記述子テーブル
  • ファイルシステムのiノードテーブル

プロセス レベルの記述子テーブルの各エントリには、単一のファイル記述子に関する情報が記録されます。

  • ファイル記述子の操作を制御するフラグのセット。 (現在、このようなフラグは close-on-exec フラグの 1 つだけが定義されています。)
  • 開いているファイルハンドルへの参照

カーネルは、開いているすべてのファイルに対してシステム全体の記述子テーブル (開いているファイル記述テーブル) を管理します。場合によっては、オープン ファイル テーブルとも呼ばれ、テーブル内の各エントリはオープン ファイル ハンドルと呼ばれます。開いているファイル ハンドルには、次のように開いているファイルに関連するすべての情報が格納されます。

  • 現在のファイル オフセット (read() および write() の呼び出し時に更新されるか、lseek() で直接変更されます)
  • ファイルを開くときに使用されるステータス フラグ (つまり、open() の flags パラメータ)
  • ファイル アクセス モード (読み取り専用モード、書き込み専用モード、open() 呼び出し時に設定される読み取り/書き込みモードなど)
  • 信号ドライバ関連の設定
  • ファイルのi-nodeオブジェクトへの参照
  • ファイルの種類(通常のファイル、ソケット、FIFO など)とアクセス権限
  • ファイルが保持するロックのリストへのポインタ
  • ファイルのさまざまなプロパティ(ファイルサイズ、さまざまな種類の操作に関連付けられたタイムスタンプなど)

プロセス A では、ファイル記述子 1 と 30 は両方とも同じオープン ファイル ハンドル (ラベル 23) を参照します。これは、dup()、dup2()、fcntl() を呼び出したり、同じファイルに対して open() 関数を複数回呼び出したりすることによって発生する可能性があります。

プロセス A のファイル記述子 2 とプロセス B のファイル記述子 2 は、両方とも同じオープン ファイル ハンドル (ラベル 73) を指します。この状況は、fork() を呼び出した後 (つまり、プロセス A と B が親子プロセスである)、またはプロセスが UNIX ドメイン ソケットを介して開いているファイル記述子を別のプロセスに渡すときに発生する可能性があります。もう 1 つのケースは、異なるプロセスが独立して open 関数を呼び出して同じファイルを開く場合です。このとき、プロセス内の記述子には、他のプロセスがファイルを開くために使用する記述子と同じ記述子が割り当てられます。

さらに、プロセス A の記述子 0 とプロセス B の記述子 3 は異なるオープン ファイル ハンドルを指していますが、これらのハンドルはすべて i ノード テーブルの同じエントリ (1976)、つまり同じファイルを指しています。これは、各プロセスが同じファイルに対して独自の open() 呼び出しを行うために発生します。同じプロセスが同じファイルを 2 回開いた場合にも同様の状況が発生します。

7. 結論

  • プロセス レベルのファイル記述子テーブルが存在するため、同じファイル記述子が異なるプロセスに出現し、同じファイルまたは異なるファイルを指している可能性があります。
  • 同じオープン ファイル ハンドルを参照する 2 つの異なるファイル記述子は、同じファイル オフセットを共有します。したがって、ファイル オフセットがファイル記述子の 1 つ (read()、write()、または lseek() の呼び出しにより) によって変更された場合、2 つのファイル記述子が異なるプロセスに属しているか同じプロセスに属しているかに関係なく、その変更は他の記述子からも検出されます。
  • 開いているファイルのフラグ (O_APPEND、O_NONBLOCK、O_ASYNC など) を取得および変更するには、前の操作と同様のスコープ制約を持つ fcntl() の F_GETFL および F_SETFL 操作を実行します。
  • ファイル記述子フラグ (close-on-exec など) は、プロセスとファイル記述子にのみ適用されます。このフラグを変更しても、同じプロセス内または異なるプロセス内の他のファイル記述子には影響しません。

<<:  革新的企業華雲南がLingdong脆弱性管理プラットフォーム製品をリリース

>>:  オープンソースのKVMカーネル仮想化技術とその管理方法の詳細な説明

推薦する

生死を問わず、UCloudでブロックチェーンのセキュリティと応用について議論しましょう

[51CTO.com からのオリジナル記事] はじめに: ビジネス活動において、お金を介さずに信頼を...

簡単な説明: SEOデータ分析機能の重要性

周知のとおり、検索エンジンのアルゴリズムは最近頻繁に更新されており、SEO 業界が直面している課題は...

モバイルインターネット時代の SEO 最適化戦略の分析 - A5 Webmaster Network

モバイルインターネットはすでに手の届くところにあり、今年に入ってモバイルインターネットに関わるオンラ...

企業が公式ウェブサイトを構築する必要があるのはなぜですか?メリットは何ですか?

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

蘇寧社や美団社が相次いでクラウド市場から撤退する中、中小メーカーはどうやって生き残ることができるのだろうか?

最近、蘇寧クラウドと美団クラウドが相次いでクラウド市場からの撤退を発表し、それぞれ長年続いたクラウド...

外部リンクから考えるインターネットマーケティング戦略

ウェブサイトの運用は、ウェブサイトの最適化とマーケティングのプロセスと切り離せません。ご存知のとおり...

8000億ドルのクラウドサービス市場:大手企業が覇権を競い、新興企業が「一口かじり取る」

[[228679]]クラウド コンピューティング テクノロジーには明らかな利点があります。企業にとっ...

完璧なプレミアムドメイン名を登録する方法

完璧なドメイン名は、あなたのサイトをユーザーに簡単に覚えさせることができます。当時、hao123 が...

SEOトレーニング業界の6つの大きなスキャンダルが暴露される

SEOトレーニング 無料トレーニング 初心者クラストレーニングの罠 1: 無料の SEO トレーニン...

新しいウェブサイトはどうすればBaiduの審査期間を通過できるのでしょうか?

SEO 業界に入ったばかりの新しい友人の中には、Baidu の絶え間ない変化に少し戸惑っている人もい...

Pinduoduoのブラックホール

時価総額が再び1000億元に到達したPinduoduoは、再び業界の注目を集めている。今月はピンドゥ...

Baiduの共有とSEOランキング

Baidu Statistics はここにあり、Baidu Share はここにあり、Baidu P...

Qvodは著作権侵害の疑いで巨額の罰金を科されたと報じられている。Yunfanの捜索は確固たる証拠である。

[要約] 内部関係者は最近、テンセントテクノロジーに、Qvodが著作権侵害の疑いで関係部門から巨額の...

OpenStack の 14 番目のリリースに関する 14 の重要な事実

【51CTO.com クイック翻訳】先週、OpenStack コミュニティはプロジェクトの 14 番...