「..」は本当にハードリンクですか?

「..」は本当にハードリンクですか?

これは少し理論的な質問ですが、物事に適切な名前を使用することが重要です。

UNIX/Linux ファイルシステムでは、..親ディレクトリを指します。

しかし、我々は知っているハードリンクはディレクトリを指すことはできません。これは、ファイルシステムの非循環グラフ構造を破壊し、命令が無限ループで実行される可能性があるためです。

したがって、これは..実際にはハードリンクです(良い.)?これは、ディレクトリによって制限されず、あらゆる目的でハードリンクのように機能する特別な種類のハードリンクになります。

それともファイルシステムにハードコードされた特殊なinodeマッピングなので、ハードリンクと呼ぶべきではありませんか?

答え1

ファイルシステムによって異なります。ほとんどのファイルシステムは伝統的なUnixデザインに従います。ここで...はハードリンクです。つまり、ファイルシステムの物理ディレクトリエントリです。ディレクトリのハードリンク数は 2+n です。ここで、nはサブディレクトリの数、つまりディレクトリの親ディレクトリのエントリ、ディレクトリ自体の.エントリ、および各サブディレクトリのエントリです..。ハードリンクの数は、ディレクトリが作成、削除、またはディレクトリの内外に移動するたびに更新されます。バラより何か追加する前に、新しいディレクトリのハードリンク数が2であるのはなぜですか?より詳細な説明が必要です。

一部のファイルシステムはこれらの伝統から逸脱しています。特にBTFS

私たちはハードリンクがディレクトリを指すことができないことを知っています。

これは不正確な表現です。より正確には、lnユーティリティやシステムコールなどを使用してlinkディレクトリへのハードリンクを作成することはできません。カーネルがこれを防ぐからです。呼び出しは、mkdir新しいディレクトリの親ディレクトリへのハードリンクを生成します。これは、ファイルシステムのディレクトリへの新しいハードリンクを作成する唯一の方法です。逆に、ディレクトリを削除することは、ディレクトリへのハードリンクを削除する唯一の方法です。

また、ハードリンクがメインファイルを「指す」と考えるのは誤解を招く可能性があることに注意してください。シンボリックリンクとは異なり、ハードリンクは方向付けられません。ファイルに複数のハードリンクがある場合、そのリンクは同じです。次の順序を実行した後:

mkdir a b
touch a/file
ln a/file b/file

ファイルシステムのどれもb/file補助ファイルにすることはできませんa/file。両方のディレクトリエントリは同じファイルを参照します。それらはすべてファイルへのハードリンクです。

答え2

実装の詳細です。

POSIX準拠のファイルシステムでは、..ハードリンクのように動作します。

ただし、一部のファイルシステムではこれをエミュレートするだけで、実際にはディスクに保存しません。

機能目的のためにファイルシステムが壊れていないと仮定すると、これらの区別は意味がありません。 (これにより、fsckはこの問題を解決するように設計されています。)

ハードリンクを完全にエミュレートする際のPOSIX以外のエラーの1つは、ハードリンクの数がディレクトリ内の正しいサブディレクトリの数を表示しないことです。オプションはこのリンク数を使用して最適化をfind無効にします。-noleaf

答え3

サプリメントとしてザイルズの答え私は次の単語に焦点を当てて拡張する価値があると思います。

また、ハードリンクがメインファイルを「指す」と考えるのは誤解を招く可能性があることに注意してください。

Linuxでは、ファイルの概念的なモデルを理解することが重要です。すべてディレクトリ内の名前は、データを指すことができる「インデックスノード」への「リンク」です。

ここで混乱しているのは、「ハードリンク」と「シンボルリンク」の命名規則が同じものの2つの味のように聞こえるということです。彼らはそうではありません!

一般的なファイルは次のとおりです。

link -> x 
        | Inode -> Data

「ハードリンクファイル」も変わりません。

link_a -> x
          | Inode -> Data
link_b -> x

ただし、シンボリックリンクは次のとおりです。

original_file_name -> x
                      | Inode -> Data

sym_link_name      -> x
                      | Inode -> File name "original_file_name"

では、なぜディレクトリをハードリンクできないのですか?

私が得た最良の説明は次のとおりです。これ。エントリ..はディレクトリに残る必要があります。ディレクトリ自体を指す単一の名前が複数ある場合は、親が複数存在する可能性があります..。これは、ディレクトリ内の他のすべての可能な名前が一度だけ存在できるように一度だけ存在できるため、不可能です。

答え4

もしそうなら、..は本当にハードリンクですか?

そのようなことはありませんもの目的)をハードリンクとして使用します。

どのファイル名(.または含む)..もハードリンクにすることはできず、どのファイル名(または含む)もハードリンクではない可能性があります。ハードリンクはそのような属性ではないからです。...

ハードリンクは抽出複数のディレクトリリストエントリが同じオブジェクト(inode)を指します。これは再計算の概念であり、再計算は1より大きい場合があります。

実際、ゲームの.一部として..、彼らは常に他の場所を指すオブジェクトを指します。つまり、常に少なくとも2回のレビューがあります。

関連情報