ファイルの inode を指しているリンクの数を誤解しており、リンクがそれ自体を指しているという事実があります(以下を参照)。
リンクを持つ可能性を考えてみてください... リンクはディレクトリ内のエントリであり、名前を i ノードに関連付けます。i ノードは、ファイル (またはディレクトリ) に格納されているすべての管理データを表し、パーミッション ビット、最終読み取り、最終書き込み、または最終 i ノード変更の日付、ファイルのデータ ブロックへのポインターなどを格納します。
各 i ノードには、それを指すリンクの数を反映する整数フィールドが 1 つあります (これがls
示します)。これは冗長な情報であるため、効率上の理由から必要です。ファイルシステム全体をナビゲートするだけで、同じ inode を指すディレクトリ エントリの数を特定できます... しかし、それを行うのは実際的ではないため、ノードがリンクまたはリンク解除されるたびにリンク カウントが維持されます。次の質問は、ファイルの inode を指すディレクトリ エントリの数が必要なのはなぜですか? 簿記には理由があります。ゼロに達したことを検出するために、カーネルは i ノードを指すリンクの数を保持し、ファイルが削除された後にデータを回復するために、i ノードに属するすべてのブロックと i ノード自体を解放できるようにします。前回の削除 (リンク解除) (カウンターがゼロになったとき)
通常、ファイルにはそのようなリンクが少なくとも 1 つ含まれていますが、複数のリンクを含めることもできます。次のようなコマンドを実行すると:
ln foo bar
fileのエイリアスを作成していますがfoo
、現在は とも呼ばれていbar
ます。2
ここでディレクトリ リストを作成すると、リンク数フィールドに両方のファイル エントリが表示されます。さらに、実行すると
ls -li foo bar
両方のファイルの inode 番号 (ファイルシステム内のファイルの一意の ID) を同じ inode として示す最初の列が表示されます...リンクの 1 つへのアクセス許可を変更すると、他のファイル名も変更されました...これは、両方のファイル名が同じファイルのエイリアスであるためです。
最初の段落に関して言えば、リンクの数はそれ自体を指すことと同じではありません。すべてのディレクトリには、ディレクトリ自体のディレクトリの inode を指すエントリがあります。これは.
すべてのディレクトリにあるエントリです (このエントリにより、パラメータを指定せずにコマンドを実行できますls
。たとえば、パラメータを指定しない場合、ls
コマンドは.
一覧表示するディレクトリとして使用されます) 2
。最小値 (ファイルについて観察したものと、すべてのディレクトリに含まれるディレクトリ1
のリンクを加えたもの) (これを確認すると、これが UNIX システムの不変であることがわかります).
2 + number_of_subdirectories
その i ノード (ディレクトリ自体を指す親ディレクトリのエントリ用に 1 つ、ディレクトリ自体のディレクトリ エントリ用に.
1 つ、およびこのディレクトリのサブディレクトリ内の各サブディレクトリのエントリの..
親ディレクトリ用に 1 つ) 番号を確認します。失敗しません。ファイルの場合は、ファイルが持つことができるリンク (またはエイリアス) の数です。ディレクトリをリストしているため、リンク付きのファイル0
は表示されません。これらのファイルは、存在する場合は、カーネルによって処理され、それらを消去するタスクで処理されます (使用されたブロックを解放します) ディレクトリは、ファイルとして異なるエイリアスまたは名前を持つことはできません階層ディレクトリ構造を維持するために、.
との 2 つの例外のみ..
許可され、これらはカーネルによって維持 (および強制) されます。