web-dev-qa-db-ja.com

ハードリンクが同じファイルシステム内でのみ有効なのはなぜですか?

私はこれを読んでいます コマンドラインの概要 マーク・ベイツによる。

最初の章では、ハードリンクはファイルシステムにまたがることはできないと述べています。

ハードリンクについて注意すべき重要なことは、現在のファイルシステムでのみ機能するということです。 別のファイルシステム上のファイルへのハードリンクを作成することはできません。これを行うには、シンボリックリンクを使用する必要があります(セクション1.4.3)。

私は1つのファイルシステムしか知りません。ルート(/)。ハードリンクがファイルシステムにまたがることはできないというこの説明は、私には意味がありません。

ウィキペディア nixファイルシステムに関する記事 も役に立ちません。

23
Anton Paras

うまくいけば、私はあなたに意味のある方法でこれに答えることができます。 Linuxのファイルシステムは、一般に、ファイルを格納するさまざまな方法のいずれかでフォーマットされたパーティションで構成されています(選択する必要があります)。あなたのシステムファイルであれ、個人ファイルであれ...それらはすべてファイルシステムに保存されています。あなたが理解しているように見えるこの部分。

しかし、ハードドライブを複数のパーティションに分割する場合(Appleパイを細かく切り分けた場合)と考える)、またはハードドライブを追加する(USBスティックなど)としたらどうでしょう。議論の余地はありますが、それらすべてにもファイルシステムがあります。

コンピューター上のファイルを見ると、パーティションのファイルシステム上のデータが視覚的に表示されています。各ファイル名は、inodeと呼ばれるものに対応します。これは、データが実際に存在する場所です。ハードリンクを使用すると、同じiノードを指す複数の "ファイル名"(わかりやすい説明がないため)を設定できます。これは、それらのハードリンクが同じファイルシステム上にある場合にのみ機能します。シンボリックリンクは、代わりに「ファイル名」をポイントし、データを保持するiノードにリンクされます。私の粗雑なアートワークは許してください。

image.jpg             image2.jpg
          \           /
           [your data]

ここで、image.jpgとimage2.jpgはどちらも直接データを指しています。どちらもハードリンクです。しかしながら...

image.jpg    <-----------  image2.jpg
           \ 
             [your data]

この(粗雑な)例では、image2.jpgはデータを指さず、データへのリンクであるimage.jpg ...を指しています。

シンボリックリンクは、ファイルシステムの境界を越えて機能します(USBスティックのように、ファイルシステムが接続およびマウントされている場合)。ただし、ハードリンクはできません。他のファイルシステムの内容や、そこにデータが保存されている場所については何も知りません。

うまくいけば、これはより理にかなっています。

30
dubkat

ファイルシステムは、ファイルを整理するためのディレクトリエントリ用に構成されたディレクトリ構造によって構成されます。各ディレクトリエントリは、ファイル名を inode に関連付けます。

ソフトリンクsymbolic)は、データを含まないディレクトリエントリです。別のエントリ(同じファイルシステムまたは他のファイルシステム内のファイルまたはディレクトリ)を指すだけです。また、指定されたファイルを削除すると、シンボリックリンクが使用できなくなります。

ハードリンクは、ファイル名と inode 数値。最後のハードリンクを削除すると、ファイルにアクセスできなくなります。

Difference between soft-link and hard-link

結論:

inode はファイルシステムオブジェクトを表すために使用されるデータ構造であるため、ファイルシステムの内部にあり、別のファイルシステムの inode を指すことはできません。

したがって、ハードリンクは同じファイルシステム内でのみ有効ですが、ソフトリンク(シンボリックリンク)はファイルシステムにまたがることができます。ディレクトリエントリ(ファイルシステムのインターフェースであり、内部オブジェクトではありません)。

23
Facundo Victor

ハードリンクは、ターゲットを存続させる効果があります。ハードリンクに到達できる限り、システムはターゲットが解放されないようにします。したがって、特定のiノードへの参照が存在するかどうかをシステムが判別しようとするときは常に、特定のiノードへのハードリンクを含む可能性のあるすべてのメディアをマウントする必要があります。

Inodeの寿命は通常、参照をスキャンするのではなく参照カウントを維持することによって決定されるため、相互にリンクを保持する2つ以上のファイルシステムを個別に使用できるように調整できる可能性があります。ただし、リンクを使用する必要がない場合システム間をブリッジし、どちらのシステムでもfsckを使用する必要がない場合。ただし、システムのいずれかでinodeのカウントが妨げられた場合、そのシステムを再び有効にする唯一の方法は、両方のファイルシステムをスキャンして参照を探すことができるfsck操作の形式を使用することです。その制約があるため、2つの相互リンクされたファイルシステムを個別に使用できるようにすることは可能ですが、そうすることの利点は、あまりにも制限されて価値がなくなるでしょう。

2
supercat

ルートファイルシステムは複数のファイルシステムで構成できます。 /usr/localは別のパーティションにマウントされ、/homeはネットワーク上の別の場所にある別のパーティションにマウントされる場合があります。この場合、(たとえば)/usr/local/bin/gitのハードリンクは/usr/localの外部に作成されない可能性がありますファイルシステムにまたがるため

これは、inodeが//usr/local/home(この例でも)に個別に割り当てられているためであり、ハードリンクを作成するときは、実際に追加するだけです。 iノードの名前。

2
Kusalananda

単一のinode番号を使用して、各ファイルシステムのファイルを表します。 iノード番号に基づくすべてのハードリンク。ファイルシステム参照リンク ここ

1
msc