Unix / Linuxはディレクトリへのハードリンクを許可していませんが、ソフトリンクは許可していることを教科書で読みました。サイクルがあり、ハードリンクを作成し、しばらくして元のファイルを削除すると、ガベージ値が示されるためですか?
サイクルがハードリンクを許可しない唯一の理由である場合、ディレクトリへのソフトリンクが許可されるのはなぜですか?
承認された回答:
ハードリンクと元の名前の違いを区別する方法がないため、これは悪い考えです。
ディレクトリへのハードリンクを許可すると、ファイルシステムの有向非巡回グラフ構造が壊れ、ディレクトリループが作成され、ディレクトリサブツリーがぶら下がって、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ノード番号が表示されます。 test
の方法に注意してください およびtest2
iノード番号は同じですが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 [email protected] -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .