1. ソフトリンクとハードリンクの違い ファイルにはファイル名とデータが含まれていることはご存じのとおりです。データは、ユーザー データとメタデータの 2 つの部分に分かれています。ユーザー データ、つまりファイル データ ブロックは、ファイルの実際の内容が記録される場所です。メタデータは、ファイル サイズ、作成時間、所有者、その他の情報など、ファイルの追加属性です。 Linux では、メタデータ内の inode 番号 (inode はファイル メタデータの一部ですが、ファイル名は含まれません。inode 番号はインデックス ノード番号です) がファイル名ではなくファイルの一意の識別子になります。ファイル名は、人々の記憶と使用の便宜のためだけに付けられます。システムまたはプログラムは、i ノード番号を通じて正しいファイル データ ブロックを見つけます。 ファイル共有の問題を解決するために、Linux システムでは、ハード リンクとソフト リンク (シンボリック リンクとも呼ばれます) の 2 種類のリンクが導入されています。リンクは、Linux システムでのファイル共有の問題を解決するだけでなく、ファイル パスの非表示、権限のセキュリティの強化、ストレージの節約などの利点ももたらします。 1 つの inode 番号が複数のファイル名に対応する場合、これらのファイルはハード リンクと呼ばれます。ハードリンクは複数のエイリアスを持つファイルです。 ハード リンクは、同じ inode 番号を持ちながらファイル名が異なるファイルであるため、次のような特性があります。
inode 番号は各ファイルシステム内でのみ一意です。 Linux が複数のファイルシステムをマウントする場合、inode 番号が繰り返されます。したがって、ファイル システム間でハード リンクを作成することはできません。 ソフトリンクはハードリンクとは異なります。ファイルのユーザー データ ブロックに格納されているコンテンツが別のファイルのパス名を指している場合、そのファイルはソフト リンクです。ソフトリンクは普通のファイルですが、データブロックの内容は少し特殊です。ソフト リンクには独自の inode 番号とユーザー データ ブロックがあります。したがって、ソフト リンクの作成と使用には、ハード リンクのような多くの制限はありません。
ソフト リンクを削除しても、それが指すファイルには影響しませんが、それが指す元のファイルが削除された場合、関連するソフト リンクはデッド リンク (つまり、ぶら下がったリンク) と呼ばれます。指しているパス ファイルを再作成すると、デッド リンクを通常のソフト リンクに復元できます。 一般的に、ファイル名と inode 番号は 1 対 1 で対応しており、各 inode 番号はファイル名に対応します。ただし、Unix/Linux システムでは、複数のファイル名が同じ inode 番号を指すことができます。つまり、異なるファイル名を使用して同じコンテンツにアクセスできるということです。ファイルの内容を変更すると、すべてのファイル名に影響します。ただし、1 つのファイル名を削除しても、別のファイル名へのアクセスには影響しません。この状況は「ハードリンク」と呼ばれます。 2. Linux VFS Linux には非常に豊富なファイルシステムがあり、大まかに次のカテゴリに分類できます。
上記のファイルシステムを実装し、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() システムコールのプロセスは次のとおりです。
プロセスがファイルを close() すると、次のようになります。
4. inodeの理解 オペレーティング システムがハード ディスクを読み取るとき、セクターごとに読み取るわけではないため、効率が悪すぎます。代わりに、一度に複数のセクターを連続的に読み取ります。つまり、一度に「ブロック」を読み取ります。複数のセクターで構成されるこの「ブロック」は、ファイル アクセスの最小単位です。最も一般的な「ブロック」サイズは 4KB です。つまり、8 つの連続したセクターがブロックを形成します。 ファイル データは「ブロック」に保存されるため、ファイルの作成者、ファイルの作成日、ファイルのサイズなどのファイルのメタデータを保存する場所も見つける必要があります。ファイルのメタデータを保存するこの領域は inode と呼ばれ、中国語では「インデックス ノード」と翻訳されます。 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 つのデータ構造を確認する必要があります。
プロセス レベルの記述子テーブルの各エントリには、単一のファイル記述子に関する情報が記録されます。
カーネルは、開いているすべてのファイルに対してシステム全体の記述子テーブル (開いているファイル記述テーブル) を管理します。場合によっては、オープン ファイル テーブルとも呼ばれ、テーブル内の各エントリはオープン ファイル ハンドルと呼ばれます。開いているファイル ハンドルには、次のように開いているファイルに関連するすべての情報が格納されます。
プロセス 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. 結論
|
<<: 革新的企業華雲南がLingdong脆弱性管理プラットフォーム製品をリリース
>>: オープンソースのKVMカーネル仮想化技術とその管理方法の詳細な説明
[51CTO.com からのオリジナル記事] はじめに: ビジネス活動において、お金を介さずに信頼を...
周知のとおり、検索エンジンのアルゴリズムは最近頻繁に更新されており、SEO 業界が直面している課題は...
モバイルインターネットはすでに手の届くところにあり、今年に入ってモバイルインターネットに関わるオンラ...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますインターネ...
最近、蘇寧クラウドと美団クラウドが相次いでクラウド市場からの撤退を発表し、それぞれ長年続いたクラウド...
ウェブサイトの運用は、ウェブサイトの最適化とマーケティングのプロセスと切り離せません。ご存知のとおり...
[[228679]]クラウド コンピューティング テクノロジーには明らかな利点があります。企業にとっ...
完璧なドメイン名は、あなたのサイトをユーザーに簡単に覚えさせることができます。当時、hao123 が...
SEOトレーニング 無料トレーニング 初心者クラストレーニングの罠 1: 無料の SEO トレーニン...
SEO 業界に入ったばかりの新しい友人の中には、Baidu の絶え間ない変化に少し戸惑っている人もい...
A5 Webmaster Network (www.admin5.com) は 5 月 29 日に、...
時価総額が再び1000億元に到達したPinduoduoは、再び業界の注目を集めている。今月はピンドゥ...
Baidu Statistics はここにあり、Baidu Share はここにあり、Baidu P...
[要約] 内部関係者は最近、テンセントテクノロジーに、Qvodが著作権侵害の疑いで関係部門から巨額の...
【51CTO.com クイック翻訳】先週、OpenStack コミュニティはプロジェクトの 14 番...