web-dev-qa-db-ja.com

ハードリンクとシンボリックリンクの違いは何ですか?

タイトルにあるように、コマンドlnによって作成されたハードリンクとソフトリンクの違いを知りたいと思います。コマンドman lnは情報を提供しますが、私の質問には十分に答えません。

また、シンボリックリンクよりもハードリンクの方が望ましい設定を誰かが提供できるといいでしょう。

485
ste_kwr

Linux/Unixでは、ショートカットはリンクとして知られています


リンクには、ソフトリンク(シンボリックリンク)またはハードリンクの2種類があります。

  1. ソフトリンク(シンボリックリンク)

    ファイルおよびディレクトリへのリンクを作成できます。また、別のパーティションに、元のiノード番号とは異なるリンク(ショートカット)を作成できます。

    realコピーが削除された場合、リンク動作しません

  2. ハードリンク

    ハードリンクはファイル専用です。別のiノード番号を持つ別のパーティション上のファイルにリンクすることはできません。

    realコピーが削除されると、実際のコピーがアクセスしていた基礎データにアクセスするため、リンクが機能しますが削除されます。


質問:ソフトリンクを作成するにはどうすればよいですか?

回答:ln -s;を使用してソフトリンクを作成できます。最初にソースを定義し、次に宛先を定義する必要があります。 (送信元と宛先の両方の完全なパスを定義する必要があることに注意してください。そうしないと機能しません。)

 Sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

enter image description here

ご覧のとおり、異なるiノードがあり、異なるパーティションに作成できます。


質問:ハードリンクを作成するにはどうすればよいですか?

回答:ハードリンクはlnで作成できます。最初にソースを定義し、次に宛先を定義する必要があります。 (送信元と宛先の両方の完全なパスを定義する必要があることに注意してください。そうしないと機能しません。)

firefoxという名前の/scriptディレクトリにスクリプトがあるとします。

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

enter image description here

ご覧のとおり、同じiノードがあります。元のリンクを削除すると、リンクが機能し、元のリンクとして機能します。

enter image description here

上記でリンクが機能していることを確認してから、元のFirefoxスクリプトを削除します。


あなたの質問:ハードリンクがシンボリックリンクよりも望ましい設定を誰かが提供できるといいですね。

回答:ディスクパーティションレイアウトに応じて、ハードリンクには同じパーティション上になければならないという制限があります(-1ポイント)ファイルへのリンク(-1ポイント))、しかし+ 1ポイントオリジナルが削除された場合、リンクは機能し、オリジナルのように動作します。

一方、ソフトリンクはディレクトリまたはファイルを指すことができ(+1ポイント)、パーティションの制限はありません(+1ポイント)が、ソースが削除されると(-1ポイント)リンクは機能しません。

58
Qasim

ハードリンクはファイルへのポインタではなく、同じiノードを指すディレクトリエントリ(ファイル)です。他のファイルの名前を変更しても、ハードリンクはそのファイルを指します。他のファイルを(コピーして)新しいバージョンに置き換えると、ハードリンクは新しいファイルを指しません。同じファイルシステム内にのみハードリンクを設定できます。ハードリンクを使用すると、元のファイルとリンクの概念がなく、すべて同じです(オブジェクトへの参照と考えてください)。これは非常に低レベルの概念です。

一方、シンボリックリンクは実際には別のパス(ファイル名)を指しています。シンボリックリンクを介してアクセスするたびに、ファイルの名前を解決します。ファイルを移動すると、シンボリックリンクは続きません。ファイルを別のファイルに置き換えて名前を保持すると、シンボリックリンクは新しいファイルを指します。シンボリックリンクはファイルシステムにまたがることができます。シンボリックリンクを使用すると、実際のファイルとシンボリックリンクを非常に明確に区別することができます。

323
vartec

「写真は千の言葉に値する。」 Pictorial representation


そして、「例は百段落に値する...」

2つのファイルを作成します。

$ touch blah1   
$ touch blah2

それらにいくつかのデータを入力します。

$ echo "Cat" > blah1
$ echo "Dog" > blah2

そして予想どおり:

$cat blah1; cat blah2
Cat
Dog

ハードリンクとソフトリンクを作成しましょう。

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

何が起こったのか見てみましょう:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Blah1の名前を変更することは重要ではありません。

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hardは、ファイルのiノード、コンテンツを指します-変更されていません。

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

ソフトリンクがコンテンツではなく名前を指しているため、ファイルのコンテンツが見つかりませんでした。
同様に、blah1が削除された場合、blah1-hardはまだコンテンツを保持しています。 blah2が削除された場合、blah2-softは存在しないファイルへの単なるリンクです。


ソース: StackOverflow! から露骨にコピー

318
ABcDexter

どちらもファイルへのポインターです。違いは、ポインタのkindです。シンボリックリンクは別のファイルを指します名前で。シンボリックリンクとして識別する特別なモードビットがあり、その内容は実際のファイルの名前です。名前が含まれているだけなので、その名前は実際に存在する必要はなく、別のファイルシステムに存在する場合もあります。名前付きファイルを置き換える(名前に影響を与えることなく内容を変更する)場合、リンクには同じ名前が含まれているため、新しいファイルを指すようになります。シンボリックリンクを簡単に識別し、それが指すファイルの名前を確認できます。

ハードリンクは、iノード番号でファイルを指します。そのため、ハードリンクはファイルの名前と同じです。 「実際の」名前とハードリンク名はありません。すべてのハードリンクは、ファイルに対して等しく有効な名前です。このため、リンクするファイルは実際に存在し、リンクを作成しようとしているのと同じファイルシステムに存在する必要があります。元の名前を削除しても、ハードリンクは同じファイルを指します。すべてのハードリンクはファイルの有効な名前であるため、ファイルの1つを見て他の名前を確認することはできません。これを見つけるには、すべてのファイルを調べてそのiノード番号を比較し、同じiノード番号を持つ他の名前を見つける必要があります。

ls -lの出力から、ファイルの名前の数を知ることができます。ファイルモードの後の最初の番号はリンクカウントです。 1つ以上のリンクを持つファイルはどこかに他の名前を持ち、逆に、1だけのリンクカウントを持つファイルには(他の)ハードリンクはありません。

89
psusi

ハードリンクは同じファイルシステムでのみ機能し、同じiノードの異なる名前にすぎません(ファイルはiノードによって内部的に参照されます)。ファイルは、そのiノードへの最後のリンクがなくなったときにのみディスクから削除されます(最後のリンクがrmdまたはunlinkd)。通常、ハードリンクはファイルに対してのみ機能し、ディレクトリに対しては機能しません。

シンボリックリンク(シンボリックリンク)は、別のファイルへのパスを含む特別なファイルです。このパスは、絶対パスまたは相対パスにすることができます。シンボリックリンクはファイルシステム間で機能し、たとえば外部ハードドライブを取り外して、同じパスに異なるファイルがある別のハードドライブと交換する場合、異なるファイルを指すことさえできます。シンボリックリンクは、ファイルまたはディレクトリを指すことができます。

58
knittl

他のスレッド(現在、投稿の上部からリンクされています)からの回答の1つに このページ があり、これはかなり良い中レベルの説明だと思います。あなたがアスキーアートに迷っているなら、ここにtl; drバージョンがあります:

  • 標準ファイルは、ファイルシステムからiノードへのポインタであり、iノードは物理データを指します。ファイルコンポーネントは、ファイルシステムへのリンク(基本的にはそのパス)とiノードへのリンクを保存します。
  • ハードリンクは、ファイルのようなものです。これらは、iノードへの直接的な追加ポインターにすぎません。
  • シンボリックリンクは、ファイルへのファイルシステムパスを保存する個別のファイル(個別のiノードとデータを含む)です。

関連するカーネルとファイルシステムは、すべてを透過的に変換します。

それに基づいて:

  • ハードリンクは、同じファイルシステムのリンクのみを許可します。シンボリックリンクは任意のパスを指すことができます。
  • ハードリンクは(本質的に)絶対データを指します。シンボリックリンクは相対パスを指すことができます(例:../parent.file
  • 拡張機能により、ハードリンクのターゲットポインターを移動した場合(それ自体は基本的にiノードを指すハードリンクにすぎないことを思い出してください)、ハードリンクは引き続き機能します。通常、シンボリックリンクのターゲットを移動すると、シンボリックリンクが壊れます。
  • ハードリンクの解決は高速ですが、計り知れないほどです。速度の取るに足りない部分は、柔軟性のないファイルシステムの代価を伴います。

少し混乱したかもしれませんが、さまざまなことを読んで、標準ファイルとハードリンクの違いを見つけるのに苦労しています。私が読んでいる方法は、すべてのファイルがハードリンク(ファイル名を保存)で構成され、物理データを指すiノードにリンクしていることです。

ハードリンクを追加すると、追加のファイルシステムベースのポインターを持つiノードが提供されます。そうですか?

21
Oli

ソフトリンクを使用する場合:

ファイルシステム間でリンクする:ファイルシステム間でファイルをリンクする場合は、シンボリックリンク/ソフトリンクのみを使用できます。

ディレクトリへのリンク:ディレクトリへのリンクを作成する場合は、ディレクトリへのハードリンクを作成できないため、ソフトリンクを使用する必要があります。

ハードリンクを使用する場合:

ストレージスペース:ハードリンクの作成中に新しいiノードが作成されないため、ハードリンクのスペースは非常にわずかです。ソフトリンクでは、スペースを消費するファイルを作成します(ファイルシステムに応じて通常4KB)

パフォーマンス:別のファイルを経由するのではなく、ディスクポインターに直接アクセスするため、ハードリンクにアクセスする際のパフォーマンスがわずかに向上します。ファイルの場所の移動:ソースファイルを同じファイルシステム上の他の場所に移動した場合、ハードリンクは引き続き機能しますが、ソフトリンクは失敗します。

冗長性:データの安全性を確保したい場合は、ハードリンクを使用する必要があります。ハードリンクでは、データは安全です。ファイルへのすべてのリンクが削除されるまで、ソフトリンクではなく、ファイルのマスターインスタンスが削除された場合のデータ。

15
Osama

「ファイル名」とハードリンクの違いを見つけようとすると、混乱が生じます。

作成するすべてのファイルは、ディスク上のデータとハードリンクで構成されます-ディレクトリ内のファイル名とディスク上のデータへのポインターです。物語の終わり。最後の(または唯一の)ハードリンクが削除されると、OSはデータが不要になったことを認識します。

これから、実際のデータが削除されることはなく、ハードリンクのみが削除されることがわかります。また、ディスク上で十分に混雑すると、データが別のファイルのデータで上書きされる可能性があります。それまでは、削除されたファイルのデータは回復される可能性がありますが、ハードリンクがないと見つけるのは困難です。

前述のシンボリックリンクは、「<targetname>という名前のフォルダーに<targetfolder>という名前のファイルがあります」と単に通知します。ハードリンクを指します。彼らはデータがどこにあるかを知りません。ハードリンクはそれを知っています。

8
Gonesoft

とても簡単です。ファイル(およびディレクトリ!)は、ブロックデバイス(HDDなど)のアドレスに保存されます。通常、アドレスにマップされた単一の名前があり、それがファイルを取得する方法です。 ハードリンクは、同じアドレスにマッピングされる2番目、3番目などの名前です。 シンボリックリンクは、代わりにシンボル-名前-を参照し、2番目の名前も最初の名前にマップされます。カーネルに関する限り、シンボリックリンクターゲットを読み込むと停止し、ターゲット値をファイル名として(多少なりとも)最初に戻ります。そのため、相対シンボリックリンクは可能ですが、ほとんど役に立ちません。ターゲット名は、ユーザー空間コードで明示的にクエリされた場合を除き、ファイルシステムレベルより上では使用されません。

0
Jim Driscoll