GNU/Linux >> Linux の 問題 >  >> Linux

Unix / linuxでディレクトリへのハードリンクが許可されていないのはなぜですか?

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    .

Linux
  1. Linuxのソフトリンクとハードリンクの違い

  2. Linux で SOCK_SEQPACKET の MSG_EOR が表示されないのはなぜですか?

  3. Linux の Makefile はなぜ便利なのですか?

  1. Linuxでハードリンクとシンボリックリンクを作成する方法

  2. Linuxのハードリンクとソフトリンクの説明

  3. Linux –なぜSuだけでなくSuを使用するのですか?

  1. ディレクトリハードリンクを強制的に作成しますか?

  2. Linux –Setuidが機能しないのはなぜですか??

  3. Linux – Unix / linux Osesの標準および/または共通ディレクトリ?