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

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

私はUnix / Linuxがディレクトリへのハードリンクを許可しませんが、ソフトリンクを許可することを教科書で読みました。ループが発生したときにハードリンクを作成し、一定時間が経過した後に元のファイルを削除すると、いくつかのゴミの値を指すでしょうか?

ループがハードリンクが許可されない唯一の理由である場合、ディレクトリへのソフトリンクはなぜ許可されますか?

ベストアンサー1

ハードリンクと元の名前を区別する方法がないので、これは単に悪い考えです。

ディレクトリへのハードリンクを許可すると、ファイルシステムの方向性非循環グラフ構造が破損し、潜在的にディレクトリループが生成され、fsck他のファイルツリーエクスプローラにエラーが発生しやすいディレクトリサブツリーがハングアップする可能性があります。

まず、これを理解するためにインデックスノードについて説明します。ファイルシステムのデータはディスクのブロックに保存され、inodeによって一緒に収集されます。 inodeをファイルと考えることができます。ただし、inodeにファイル名がありません。これがリンクが機能する場所です。

リンクは単にinodeへのポインタです。ディレクトリはリンクを保持するインデックスノードです。ディレクトリ内の各ファイル名は単にinodeへのリンクです。 Unixでファイルを開くとリンクも作成されますが、これは別の種類のリンクです(名前付きリンクではありません)。

ハードリンクは、対応する inode を指す追加のディレクトリエントリです。リンク数を指定する場合、ls -l権限の後の数字は次のとおりです。ほとんどの一般的なファイルにはリンクがあります。新しいファイルハードリンクを作成すると、両方のファイル名が同じinodeを指します。メモ:

% 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元のファイルとは何ですか、ハードリンクとは何ですか?結局のところ、両方の名前が同じもの、同じinodeを指すので、(タイムスタンプを介して)実際にはわかりません。

% 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行の先頭に inode 番号を表示します。とのinode番号testtest2同じですが、test3inode番号は異なります。

これでディレクトリを使用してこれを行うことができる場合は、ファイルシステムの異なるポイントにある2つの異なるディレクトリが同じエントリを指すことがあります。実際、サブディレクトリは親ディレクトリを指し、循環を作成できます。

このサイクルに注目する価値があるのはなぜですか?巡回中にループ中であることを検出する方法がないためです(巡回中にアノード番号は追跡されません)。duディスク使用量を理解するために、サブディレクトリへの再帰が必要なコマンドを作成すると想像してください。duループにいつ入るのかはどうすればわかりますか?duこの簡単なタスクを実行するには、エラーが発生しやすく、多くの帳簿が必要です。

シンボリックリンクは、多くのファイルシステムAPIが自動的に従う傾向がある特別な種類の「ファイル」であるため、まったく異なる獣です。シンボリックリンクは inode を直接指すのではなく、名前で指すので、存在しないターゲットを指すことができます。この概念はハードリンクには適していません。なぜなら、「ハードリンク」が存在するということは、ファイルが存在することを意味するからです。

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    .

おすすめ記事