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カーネル仮想化技術とその管理方法の詳細な説明

推薦する

ソーシャルメディアアーキテクチャのどの垂直分野がMeilishuoを再現できますか?

Meilishuoは、Weiboなどのソーシャルメディアを女性向けオンラインショッピングの分野に垂直...

2012年は医療業界にとって百度の「審判の日」となるのか?

最新の報道によると、百度百科事典はすべての医療項目に専門認証を導入する。一般ユーザーは編集に参加でき...

クラウドアーキテクチャの5つの主要テクノロジー

[[408138]] [51CTO.com クイック翻訳]スタートアップ企業や中小企業にとって、So...

Baidu のキーワードランキングではサイトの履歴が考慮されますか?

Baidu のアルゴリズムの中には本当に奇妙なものがあり、あまりに奇妙なので、Baidu 自身でさえ...

検索エンジンのユーザーエクスペリエンスタイトルの書き方はより人間的

私たちは普通のウェブマスターとして、常にユーザーエクスペリエンスの重要性を強調してきました。これは ...

UBI-$19/AtomD525/4g メモリ/160g ハードディスク/10T トラフィック/シアトル/ロサンゼルス

ubiquityhosting.com は長い歴史を持つ企業です(2004 年設立)。自社のコンピュ...

SEO外部要因調査SEO経験概要スキル

みなさんこんにちは。私はMuzi Chengzhouです。前回の記事「SEO 外部要因の調査: SE...

Bilibili、Zhihu、Weiboの3大プラットフォームの商業化分析!

ビリビリにとって広告は「長年の」問題であり、パッチ広告はユーザーから「忌まわしい」ものと考えられてい...

贅沢か奇跡か?黄太極の100億の思考

6ヶ月以内に売上高が1億に達し、年間売上高が100億に達しなければならない...パンケーキ販売者の黄...

PaaS 市場は急速に成長しています。中核となる競争優位性をどのように構築できるでしょうか?

現在のクラウド コンピューティング市場を見ると、PaaS は成熟した IaaS や人気の SaaS ...

姚小偉:歴史上最も包括的なウェブサイト降格の理由の分析

インターネットの急速な発展と高額な入札料金により、ほとんどの企業は苦しんでいます。その結果、低コスト...

Webmaster Network レポート: OpenSSL の重大な脆弱性の詳細な説明: 史上最悪のブラウザ IE6 が消滅

1. OpenSSL の重大な脆弱性の詳細な説明: 誰が影響を受けるのか? どのように解決するのか?...

中小規模のウェブサイト構築、リモート利用などに最適なraksmart香港VPSの簡単なレビュー。

香港のVPSは登録する必要がなく、本土からのアクセス速度が速く、他の国との接続も非常にスムーズです。...

小規模ゲームウェブサイトの SEO 戦争: 内部最適化分析

正直に言うと、4399ミニゲームプロダクトマネージャーのYin Jinqian氏の「大規模なキーワー...