元のファイルを削除してもハードリンクが破損しないのはなぜですか? [コピー]

元のファイルを削除してもハードリンクが破損しないのはなぜですか? [コピー]

元のファイルを削除してもハードリンクが破損しないのはなぜですか?元のファイルを削除するとソフトリンクは壊れますが、ハードリンクは壊れませんが、なぜ壊れないのでしょうか?

答え1

何が間違っていると思います。ハードリンクそして文書Unixにあります。

Unixファイルシステムの基本は文書。 ㅏ文書非構造的匿名バイトストリーム。 1つの文書名前なし。それは1つしかありません。ファイルのシリアル番号、デフォルトではそのファイルシステムの一意の識別子です。 (ファイルシリアル番号は時々インデックスノード)

いくつかの種類があります。特殊ファイル標準化の程度はPOSIX:

オペレーティングシステムは独自の種類の特殊ファイルを追加できます。たとえば、次のようになります。ソラリス持つドア

/dev/sdaデバイスファイルは、最初のハードディスクと対話するための既存のインタフェースなど、デバイスと対話するためのインタフェースを提供するために使用されます。 FIFO特殊ファイルはシェルパイプのように動作しますが、名前があるため、ファイルを読み書きする2つのプロセスは、異なる時間と異なるセキュリティコンテキストで開始できます。ソケットは、ネットワークソケットと同様のプロセス間通信を可能にしますが、ローカルコンピュータでのみ可能です。

それでは、問題に関連する2つの特別な種類のファイルであるディレクトリとシンボリックリンクについて説明しましょう。

ディレクトリ特殊ファイルは実際には実際のディレクトリと非常によく似ています。たとえば、電話帳を考えてみましょう。人の名前と電話番号がリストされています。これがUnixファイルシステムでディレクトリが実行することです。ディレクトリには、ファイル名とファイルのシリアル番号がリストされます。

これ名前とファイルのシリアル番号のペアリングそれが私たちが呼ぶものです。ハードリンク(それ以外の場合協会)

Unixで「ファイルを削除」を使用している場合rmユーティリティ、誰いいえ実際に「ファイルを削除」。あなたは削除中ですその名前のディレクトリエントリつまり、ハードリンクの削除、ファイルではありません。これは…解く実際に使用されるPOSIXライブラリ関数はrm次のとおりです。unlink

したがって、次のことを行うとき

touch foo

あなたはいいえfoo名前はありませんが、特定のファイルのシリアル番号を持つファイルを生成しました。そしてfoo作成したファイルのファイルシーケンス番号に名前を関連付けるディレクトリエントリを現在のディレクトリに追加しました。

今使用するときlnユーティリティ作る第二ハードリンク:

ln foo bar

あなたは第二bar名前を関連付けられた同じファイルシーケンス番号に関連付ける現在のディレクトリのディレクトリエントリ。foo

どちらのリンクも特別ではないことを認識することが重要です。彼らはまったく同じです。

今すぐ接続を解除する場合foo:

rm foo

fooユーザーがすべきことは、ファイルのシリアル番号に名前を関連付けるディレクトリエントリを削除することです。素晴らしいいいえファイルを削除します。したがって、barディレクトリエントリはまったく触れられないため、その名前を使用してファイルにアクセスできます。

実際にはできないUnixからファイルを削除します。リンクのみを削除できます。ファイルシステム自体は、ファイルを指すリンクがなくなり、もはや開いていない場合はファイルを削除します。

シンボリックリンクしかし、これは以下を含む特別なファイルです。。つまり、あなたがするとき

ln -s /path/to/quux baz

誰ですか文字通り/path/to/quuxファイルに文字列を書き込みます。より正確には、以下を含むシンボリックリンク特殊ファイルを生成します。/path/to/quux そしてbaz作成したファイルのファイルシーケンス番号に名前を関連付けるディレクトリエントリを現在のディレクトリに作成しています。

/path/to/quuxファイルのシリアル番号で確認されるかどうかは実際には重要ではありません。実際、一部のプログラムではこれを使用して賢い設定を行います。例えば、フォードそしてガトリングWebサーバーはシンボリックリンクを使用してHTTPリダイレクトを表すため、次のことを行います。

ln -s https://www.google.com/ /var/www/search.html

に移動するとhttp://mydomain/search.htmlにリダイレクトされますhttps://www.google.com/

簡単に言うと:

元のファイルを削除してもハードリンクが破損しないのはなぜですか?

元のファイルを削除していないためです。複数のリンクのうち1つだけを削除しました。その特定の名前を使用してファイルにアクセスすることはできなくなりますが、ファイルはまだ存在し、別の名前を使用してアクセスできます。

元のファイルを削除するとsorflinkが破損する

繰り返しますが、元のファイルは削除されません。あなたは削除中です名前。しかし、シンボリックリンクは以下を指します。名前ファイルではありません。したがって、シンボリックリンクはファイルに解決できなくなった名前を指すようになりました。


注:興味深い点が見つかった可能性があります。ディレクトリはファイルの名前マッピングを提供します。しかし、ディレクトリ自体もファイルです。したがって、ディレクトリは自動的に名前 - ディレクトリマッピングを提供します。

つまり、ディレクトリはUnixでランダムにネストできます。

広く使用されているすべてのファイルシステムは、任意の深さのネストされた階層を可能にするので、今日ではそれほど興味深いことはありません。しかし、ほぼ60年前、Unixが誕生した当時はまったくそうではありませんでした。当時、一部のファイルシステムにはディレクトリがまったくないか、固定されたネストレベル(2つのレベルなど)がありました。

ディレクトリを特別なファイルにすることで、特別な構造を追加することなく階層化されたファイルシステムを無料で入手できます。これは非常にエレガントなデザインです。

答え2

これは、ハードリンクが本質的に同じファイルへの参照であり、ハードリンクに関する限り、「オリジナル」ファイルがないためです。これは、ディスク(ファイル内のすべてのメタデータを含むinode)の同じデータ構造を指します。

ソフトリンクは、ファイルを記述するデータ構造ではなくファイル名を指します。

答え3

Linuxでは、ファイルはファイルシステム内の数字でinode一意に識別されます。これはファイルシステム全体で一意であることを保証する数値IDです(注:inodesリサイクルは可能ですが、inode2つの「アクティブ」ファイルは同じファイルシステムに同じファイルを持つことはできません)。

inodeファイル名は、特定のディレクトリに追加される「便利なタグ」にすぎません。ハードリンクファイルは単に追加されます。その他同じディレクトリまたは別のディレクトリに便利な名前を使用してください(最初の場合は、新しいハードリンクの名前が異なる必要があります)。

inodeで番号を確認できますls -i。たとえば、

# ls -alni
total 4
 68329917 drwxr-xr-x.  2 1000 1000   37 Feb  3 15:25 .
101396179 drwx------. 25 1000 1000 4096 Feb  3 15:24 ..
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 test.txt
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 zzz.txt

実際には同じ数字を持っていますzzz.txttest.txtinode同じファイル - 2つの異なる名前で参照されます。単に2つの名前のいずれかを削除しても、inodeファイルシステムから実際に削除(リンク解除)されませんが、他の名前は影響を受けません。

ソフトリンク全く違うんですね。元のファイルへの実際のリンクではなく、inode元のファイルを指す特別な小さなファイルです(独自の違いがあります)。inodeパス/名前。元のファイルを削除すると、破損した(「破損した」)ポインタが残ります。

関連情報