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

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

newDirectoryディレクトリを作成し、ls -ldコマンドを実行するとします。ハードリンクの数は2つで確認されます。当初、ハードリンク2を正確に作成するものは何ですか?また、現在のディレクトリのサブディレクトリの数はハードリンクの数 - 2と同じですか?

答え1

歴史の中、最初のUnixファイルシステムは、各ディレクトリに2つのエントリを作成しました。.ディレクトリ自体を指すエントリと..親ディレクトリを指すエントリです。これは、アプリケーションとオペレーティングシステム自体がファイルシステムを簡単にナビゲートする方法を提供します。

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

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

これでdirリンク数は5つです。つまり、dirの項目/parent.の項目、 、/parent/dirおよび の項目それぞれ 3 つです。サブディレクトリがないため、そのリンク数は2つです(のエントリとエントリ)。../parent/dir/sub1/parent/dir/sub2/parent/dir/sub3/parent/dir/sub1sub1/parent/dir./parent/dir/sub1

「適切な」親ディレクトリを持たないルートディレクトリの特殊な大文字と小文字の区別を最小限に抑えるために、ルートディレクトリには..自分を指すエントリが含まれています。したがって、対応するリンクの数は、2にサブディレクトリの数を加えた値です。ここで、2は/.合計です/..

最新のファイルシステムは、メモリの親ディレクトリを追跡する傾向があり、実際のエントリとしては必要ないか、存在しないことがよくあります...一般的な最新のUNIXシステムでは、.ファイル..システムの種類に関係なく、ファイルシステムコードの一部として特別な値として扱われます。一部のファイルシステムでは、ディスクに何も表示されない場合でも、エントリが含まれているか含まれているふりをして...ます。

ファイルシステム自体にエントリが含まれていても、..カーネルはまだ特殊なケースを処理する必要があります。マウントされたファイルシステムのルートディレクトリの名前付きエントリは、ディレクトリ自体を指します。ルートディレクトリがinode 2の場合、..ルートディレクトリのエントリ.とエントリは..すべてinode 2を指します。ただし、..そのディレクトリからのアクセスは実際にはマウントポイントの親ディレクトリにアクセスする必要があります/。つまり、/media/fooマウントポイントであると仮定すると、マウントされたファイルシステムがルートディレクトリにある場合でも、代わりに/media/foo/..指定する必要があります。エントリポイントはinode 2を指します。/media/media/foo../media/foo

.ほとんどのファイルシステムは、エントリが存在するかどうかに関係なく、ディレクトリ内のリンク数を2 + nとして報告しますが..、これを行わずにこの設定を変更するbtrfsなどの例外があります。拒否済みとマークされたアイデア内部にウィキペディア

答え2

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

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

..これは、各サブディレクトリがハードリンクを作成し、それ以上のディレクトリへのハードリンクを生成できないために意味があります。1 しかし、私はこれが深刻だとは思わない。これは、サブディレクトリを計算して実際の数値を取得するのが簡単なためです。

lsどのくらいのサブアイテムがあるかを確認するために出力を見ると、かなり良いアイデアが得られます。

1または少なくとも使用できませんln。プログラムで試したことがなく、man 2 link明確ではありません。一部は適用できますが、ディレクトリへの接続には明らかな問題はありません(EMLINK、、EPERM)。したがって、ディレクトリに対して可能な唯一のハードリンクは、など.という標準がない限り..、私はハードリンクの数を一時的な手がかりと見なします。

答え3

ファイルシステムによって異なります。 BTRFSはこの規則に違反します。

# dd if=/dev/zero of=btrfs.img bs=114294784 count=1
1+0 records in
1+0 records out
114294784 bytes (114 MB, 109 MiB) copied, 0.172979 s, 661 MB/s
# mkfs.btrfs btrfs.img 
btrfs-progs v4.20.1 
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ad5f6c58-ec7a-41db-9d19-ec98db96d725
Node size:          16384
Sector size:        4096
Filesystem size:    109.00MiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP              32.00MiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1   109.00MiB  btrfs.img
# mount btrfs.img /mnt
# mkdir -p /mnt/{1,2,3}/{1,2,3}
# find /mnt/ -links 2
# find /mnt/ -links 1
/mnt/
/mnt/1
/mnt/1/1
/mnt/1/2
/mnt/1/3
/mnt/2
/mnt/2/1
/mnt/2/2
/mnt/2/3
/mnt/3
/mnt/3/1
/mnt/3/2
/mnt/3/3

リンクカウンタはBTRFSのディレクトリには意味がありません。

# find /mnt/ -printf '%n %p\n'
1 /mnt/
1 /mnt/1
1 /mnt/1/1
1 /mnt/1/2
1 /mnt/1/3
1 /mnt/2
1 /mnt/2/1
1 /mnt/2/2
1 /mnt/2/3
1 /mnt/3
1 /mnt/3/1
1 /mnt/3/2
1 /mnt/3/3

関連情報