Linuxでフォルダ/ディレクトリを作成するときに、リンク値 "2"の後に隠されたロジックを初めて理解するのに役立つ人はいますか?
たくさん検索しましたが、満足のいくロジックが見つかりませんでした。
答え1
Unixファイルシステムの基本設計は初期にさかのぼります。これは論文で説明されています。UNIX時間共有システム著者: Dennis M. RichおよびKen Thompson。
デザイナーは現在のディレクトリを参照し、ディレクトリから親ディレクトリに移動する方法を望んでいました。特別なシェル構文を導入する代わりに、彼らはすでに存在する機能を使用することにしました。つまり、ディレクトリには別のディレクトリのエントリを含めることができるため、特別な名前を持つアイテムは常にディレクトリ自体を指し、.
特別な名前を持つアイテムは常にディレクトリ自体を指すことにしました。ディレクトリ自体。 nameは..
常にディレクトリの親ディレクトリを指します。たとえば、ルートディレクトリにサブディレクトリが含まれている場合、エントリはfoo
ルートディレクトリを指し、エントリは自分を指します。foo
..
foo
.
foo
したがって、サブディレクトリがないディレクトリの場合、ディレクトリのリンク数(ディレクトリを指すディレクトリエントリの数)は常に2です。つまり、親ディレクトリの見積もりにディレクトリを追加した値です.
。各サブディレクトリには、各エントリに対して1ずつ増加するリンク数があります..
。
特殊項目.
は、..
最初にmkdir
ファイルシステムのディスク表現を使用して直接クリーンアップするコマンドによって生成されます。その後、システムはそれをカーネルに移動しました。今日、多くのファイルシステムにはディスク表現エントリが含まれなくなりました.
。..
ファイルシステムドライバはそれを必要とせず、ディレクトリの親ディレクトリの場所を常に覚えておく必要はありません(これはメモリ消費をわずかに増やし、今日の標準では無視できますが、1970年代の標準ではそうではありません).
。..
ディスク.
と..
エントリを含むファイルシステムでは、ファイルシステムドライバはこれらのエントリが常に存在することを確認します。ディスク表現にこれらのエントリが含まれていないファイルシステムでは、ファイルシステムドライバはこれらのエントリが存在するかのように偽装します。
答え2
ディレクトリあたりのリンク数は2つ以上です。
- 親ディレクトリからこのディレクトリへの参照
- ディレクトリの自己参照(
.
)
例:一部のデフォルトディレクトリにディレクトリがあるとしますfoo
。
$ ls -i /basedir
1056868 foo
$ ls -ia /basedir/foo
1056868 . 1056849 ..
このls
オプションは、-i
ディレクトリエントリの inode 番号を表示します。このオプションは、-a
ドットで始まる項目を表示します(ls
デフォルトでは表示されません)。同じinode番号がある/basedir/foo
ことに注意してください。/basedir/foo/.
そのインデックスノードへの異なる参照が(少なくとも)2つあるため、そのインデックスノードのリンク数は2つ(またはそれ以上)です。