web-dev-qa-db-ja.com

新しいディレクトリに何かが追加される前に、ハードリンクのカウントが2になるのはなぜですか?

たとえば、ディレクトリnewDirectoryを作成してから、ls -ldコマンドを実行するとします。ハードリンクの数が2であることがわかります。ハードリンクを最初から正確に2にするにはどうすればよいですか。また、現在のディレクトリのサブディレクトリの数は、ハードリンクの数-2と同じですか?

40
John

歴史的に 、最初のUnixファイルシステムはすべてのディレクトリに2つのエントリを作成しました:_._はディレクトリ自体を指し、_.._はその親を指します。これにより、アプリケーションとOSの両方に対して、ファイルシステムをトラバースする簡単な方法が提供されました。

したがって、各ディレクトリのリンク数は2 + nです。nはサブディレクトリの数です。リンクは、その親のディレクトリのエントリ、ディレクトリ自体の_._エントリ、および各サブディレクトリの_.._エントリです。たとえば、これが_/parent_をルートとするサブツリーのコンテンツであり、すべてのディレクトリであるとします。

_/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3
_

次に、dirのリンクカウントは5です。_/parent_のdirエントリ、_._の_/parent/dir_エントリ、および3つの_../parent/dir/sub1_、_/parent/dir/sub2_および_/parent/dir/sub3_のそれぞれの__エントリ。 _/parent/dir/sub1_にはサブディレクトリがないため、リンク数は2です(_sub1_の_/parent/dir_エントリと_._の_/parent/dir/sub1_エントリ)。

「適切な」親を持たないルートディレクトリの特殊なケースの量を最小限に抑えるために、ルートディレクトリにはそれ自体を指す_.._エントリが含まれています。この方法でも、リンク数は2にサブディレクトリの数を加えたものになります。2は_/._と_/.._です。

後のファイルシステムでは、メモリ内の親ディレクトリを追跡する傾向があり、通常、実際のエントリとして存在する_._および_.._は必要ありません。典型的な最近のUNIXシステムは、_._および_.._をファイルシステムタイプに依存しないファイルシステムコードの一部として特別な値として扱います。一部のファイルシステムには、_._および_.._エントリがまだ含まれているか、ディスクに何も表示されていなくてもふりをします。

ほとんどのファイルシステムは、_._および_.._エントリが存在するかどうかに関係なく、ディレクトリのリンク数2 + nを報告しますが、例外があります。たとえば、btrfsはこれを行いません。

1つはディレクトリ自体用で、もう1つは.用です。

また、現在のディレクトリのサブディレクトリの数は、ハードリンクの数-2と同じですか?

各サブディレクトリが..ハードリンクを作成するので、それは理にかなっています。それ以上に、ディレクトリへのハードリンクを作成することはできません。1 しかし、私はこれを深刻なもの、特に特に信頼しません。サブディレクトリを数えて実数を取得するのは簡単だからです。

lsの出力を見て、サブがいくつあるかを考えているだけなら、きちんとしたアイデアが得られます。

1 または、少なくとも、lnではできません。私はプログラムで試したことがなく、man 2 linkがあいまいです-適用される可能性のあるカップルがいくつかありますが、ディレクトリへのリンクに明らかなエラーはありません(EMLINKEPERM) 。したがって、ディレクトリへの唯一の可能なハードリンクは...であるという標準がどこかにない限り、ここでも、そのハードリンク数は偶然の手がかりとしてのみ扱います。

13
goldilocks