ハードリンクと元の名前の違いを伝える方法がないため、これは単なる悪い考えです。
ディレクトリへのハードリンクを許可すると、ファイルシステムの有向非循環グラフ構造が壊れ、ディレクトリループが作成され、ディレクトリサブツリーがぶら下がりfsck
ます。
まず、これを理解するために、iノードについて説明しましょう。ファイルシステム内のデータはディスク上のブロックに保持され、それらのブロックはiノードによって一緒に収集されます。iノードはTHEファイルと考えることができます。ただし、iノードにはファイル名がありません。それがリンクの出番です。
リンクは、iノードへの単なるポインターです。ディレクトリは、リンクを保持するiノードです。ディレクトリ内の各ファイル名は、単にiノードへのリンクです。Unixでファイルを開くとリンクも作成されますが、それは別のタイプのリンクです(名前付きリンクではありません)。
ハードリンクは、そのiノードを指す追加のディレクトリエントリです。の場合ls -l
、権限の後の数字は名前付きリンクカウントです。ほとんどの通常ファイルには1つのリンクがあります。ファイルへの新しいハードリンクを作成すると、両方のファイル名が同じiノードを指すようになります。注意:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
これで、ハードリンクなどはないことが明確にわかります。ハードリンクは通常の名前と同じです。上記の例では、test
またはtest2
、元のファイルとハードリンクはどちらですか?両方の名前が同じコンテンツ、同じiノードを指しているため、最後には、(タイムスタンプでさえ)実際に伝えることはできません。
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
の-i
フラグls
は、行の先頭にiノード番号を表示します。どのように同じiノード番号test
をtest2
持っているかを確認してくださいtest3
。
これで、ディレクトリに対してこれを行うことが許可された場合、ファイルシステム内の異なるポイントにある2つの異なるディレクトリが同じものを指す可能性があります。実際、サブディレクトリは祖父母を指すことがあり、ループを作成します。
このループが問題になるのはなぜですか?移動中は、ループしていることを検出する方法がないため(移動中にiノード番号を追跡せずに)。du
ディスク使用量を調べるためにサブディレクトリを再帰的に処理する必要があるコマンドを書いていると想像してください。du
ループが発生したときはどうすればわかりますか?du
この単純なタスクを実行するためだけに、エラーが発生しやすく、多くの簿記が必要になります。
シンボリックリンクは、多くのファイルファイルシステムAPIが自動的に追跡する傾向がある特殊なタイプの「ファイル」であるという点で、まったく別のものです。シンボリックリンクは、直接iノードを指すのではなく、名前で指すため、存在しない宛先を指すことができます。「ハードリンク」の単なる存在はファイルが存在することを意味するため、その概念はハードリンクでは意味がありません。
それでは、なぜdu
シンボリックリンクをハードリンクではなく簡単に処理できるのでしょうか?上記で、ハードリンクが通常のディレクトリエントリと見分けがつかないことがわかりました。ただし、シンボリックリンクは特別であり、検出可能であり、スキップ可能です!
du
シンボリックリンクはシンボリックリンクであることに気付き、完全にスキップします!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
指すべきですか?特に、このディレクトリへのハードリンクを削除した後、..
?が指すディレクトリで どこかを指す必要があります。