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


回答:


40

ハードリンクとソフトリンクのセマンティクスが異なるため、さまざまな用途に適しています。

ハードリンク:

  • すべてのディレクトリエントリはハードリンクであるため、他のディレクトリエントリと区別できない
  • 「オリジナル」は、同じiノードへの他のハードリンクを壊さずに移動または削除できます。
  • 同じファイルシステム内でのみ可能
  • パーミッションは「オリジナル」のものと同じでなければなりません(パーミッションはディレクトリエントリではなく、inodeに保存されます)
  • ディレクトリに対してではなくファイルに対してのみ作成可能

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

  • 別のファイルパスを指すレコードを単に記録します。(ls -lシンボリックリンクが指すパスを表示します)
  • オリジナルが移動または削除されると壊れます。(場合によっては、特定の場所を現在占めているファイルを指すリンクが実際に望ましい場合があります)
  • 別のファイルシステムのファイルを指すことができます
  • ディレクトリを指すことができます
  • 一部のファイルシステムフォーマットでは、シンボリックリンクが指すファイルとは異なるアクセス許可を持つことが可能です(これは一般的ではありません)

1
素敵なリスト。シンボリックリンク自体を移動することで、相対パスのシンボリックリンクを解除することもできます。
jw013

4
「[E]すべてのディレクトリエントリはハードリンクです。」これは今までに一度も表現したことのない素晴らしい点ですが、誰かがリンクをラップしたり頭を動かしたりしてもうまくいかないのではないかと心配しています。このような状況の場合、ヒントがあります。lsコマンドの実行時に表示されるファイルとディレクトリのレイアウトは、それが表すストレージシステムとまったく同じではありません。ハードリンクは、ストレージシステム上の個々のファイルへの参照です。ファイルは1回保存されます。「inodes」を読んでください。
マリオ

@マリオ:うん。すべてのディレクトリエントリは、名前をiノードにリンクします。ファイル名を削除するためのシステムコールはと呼ばれunlink(2)ます。「リンク」カウントが1の「通常の」ファイルは、特殊なケースです。役立つ場合は、inodeをオブジェクト、名前を参照カウントポインター(inodeのリンクカウントが参照カウント)と見なすことができます。
ピーターコーデス

1
シンボリックリンクは、名前が含まれたテキストファイルと考えることができます。ファイルへの特別なフラグのため、シンボリックリンクとして解釈されます。あなたが知っているハードリンクの例です...
Ned64


18

両方のタイプのリンクのポイントは、ファイルを2つの場所に同時に表示する方法を提供することです。これには多くの用途があります。10回のうち9回はシンボリックリンクを使用します。

シンボリックリンク、つまり「シンボリックリンク」は、Windowsのショートカットのように機能します。シンボリックリンクの内容は、ファイル/ディレクトリの実際の場所へのポインタです。実際のファイルを削除すると、シンボリックリンクは「ダングリング」状態になり、機能しなくなります。シンボリックリンクを削除しても、実際のファイルは削除されません。単一のファイル(または他のシンボリックリンク)へのシンボリックリンクを好きなだけ持つことができます。

ただし、Windowsとは異なり、シェルやアプリケーションレベルではなくファイルシステムレベルで動作するため、ほとんどのアプリケーションはシンボリックリンクを期待どおりに「追跡」します。 ls -alシンボリックリンクが「指す」場所をすばやく確認する方法として使用できます。

ハードリンクは下位レベルでも機能します。ハードリンクは、ファイルの実際の物理的なファイルシステムレベルのディレクトリエントリです。技術的には、ディレクトリエントリはハードリンクであるため、各ファイルはどこかのディレクトリに少なくとも1つのハードリンクを持っています。ハードリンクは、それらが指すファイルから分離されていません。ファイルが異なるディレクトリに複数のハードリンクを持っている場合、rmすべてのハードリンクがなくなるまで、ファイルを本当に削除しないようなユーティリティでハードリンクを削除します。

意図的にファイルが削除されないようにしたい場合や、パーティションやその他のファイルシステム関連のもので奇妙な低レベルの作業をしている場合を除き、ハードリンクの使用が一般的である、または必要になる状況を考えることはできません。編集:しかし、この質問に対する他の回答には素晴らしいアイデアがあります!


また、シンボリックリンクには通常のファイルと同様のアクセス許可がありますが、オペレーティングシステムはそれらを参照せず、代わりに動作を決定するためにアクセス許可対象ファイルを参照します。そして、シンボリックリンクの循環チェーンをしないでください。ひどい。
ローレンス

3
それは本当に非常に悪いですか?何が起こるか?再作成できる最大の興奮は、「シンボリックリンクのレベルが多すぎます」というエラーメッセージです。
mattdm

1
ls -l、シンボリックリンクによってリンクされているかを確認するために十分であるaためにスタンド--allマンページを参照してください。また、ファイルシステムでシンボリックリンクが機能する場合でも、フォローの代わりにシンボリックリンクをファイルとして使用する代替関数があります。
-D4RIO

4
Windowsのショートカットは、実際にはシンボリックリンクとはまったく異なります。ターゲットをたどり、通常のファイルでもあります。(Windowsにもシンボリックリンクがありますが、あまり使用されていません。)シンボリックリンクは純粋にテキスト形式であり、ファイルにアクセスするたびにターゲットテキストが読み取られます。シンボリックリンクのアクセス許可が重要かどうかは、OSとファイルシステムによって異なります。
ジル 'SO-悪であるのをやめる'

私の知る限り、シンボリックリンクファイルの内容は、シンボリックリンクが指すパスであり、シンボリックリンクファイルのサイズを見ると見ることができます:ln -s /home 1; ls -l 1シンボリックリンク1は5バイト長でありln -s /usr/share/ 2; ls -l 2、2は11バイト長であることを示しています。
ダニエルクルマン

13

ハードリンクは、変更されていないファイルのスペースを共有しながら各バックアップの完全なディレクトリツリーを持つことができるため、ディスクベースのバックアップメカニズムに非常に役立ちます。また、ファイルシステムは参照カウントを追跡し、バックアップがスペース上の理由で期限切れ/削除されたため、指定されたバージョンはなくなります。使用されたスペースは自動的に回収されます。同じ理由で、一部のメールクライアントは、複数のフォルダにファイルされたメッセージにも使用します。


5
ディスクベースのバージョン管理メカニズムでしょうか?何かをハードリンクした場合、それはバックアップではありません。元のファイルが破損した場合、そのファイルへのすべてのハードリンクも破損します。
D4RIO

1
AppleのTime Machineのような増分バックアップシステムを考えてください。(これらは災害復旧タイプのバックアップではなく、「おっと、誤ってそのファイルを削除しました」バックアップであることは明らかです。)増分バックアップ内のすべての未変更ファイルは、ハードリンクされています。ファイルが変更されると、前のバージョンにリンクする代わりに、次のインクリメンタルファイルがコピーされます。
-geekosaur

おかげで、インクリメンタルバックアップシステムはこのようにバージョン管理システムにかなり似ています= D
D4RIO

しかし、増分バックアップメカニズムはどのようにしてファイルの「古い」バージョンを保持しますか?1)バックアップAが作成され、ハードリンクされたファイルF。2)ファイルFが変更されました。3)翌日、バックアップBが作成された...何も得られないように見える
Dmitry Pashkevich

3

ハードリンクは、同じディスクスペースへの単なる参照であり、それが「なぜ」他のファイルシステムの何かをハードリンクできないのです。

シンボリックリンクは、他のファイルを(Windowsショートカットとして)リンクするファイルであり、同じファイルシステム内にある場合とそうでない場合があります。

編集:私はもっと何かを説明します。存在するすべてのファイルには、少なくとも1つのハードリンクがあります。ハードリンクは、ファイルシステムのiノードのコンテンツにアクセスする方法です。この例ls -iではstat、次のようにして、ファイルのiノード番号を取得し、ハードリンクの数を取得できます。

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

このリファレンスをありがとう@geekosaur:

カーネルはシンボリックリンクを展開するためにパス名からiノードへの変換を再起動する必要がありますが(ディレクトリツリーを走査)、ハードリンクはすべて同じiノードを使用します。(これは、従来のUnixでこれを行ったカーネル関数の名前から、nameiと呼ばれることがよくあります。)

そして、これ(編集済み):

ハードリンクはAppleのTime Machineのようなディスクベースの増分バックアップメカニズムに非常に役立ちます。変更されていないファイルのスペースを共有しながら各バックアップの完全なディレクトリツリーを持つことができ、ファイルシステムが参照カウントを追跡するため、バックアップがスペース上の理由で期限切れ/削除されたために特定のバージョンへの最後の参照がなくなると、それが使用したスペースは自動的に回収されます。同じ理由で、一部のメールクライアントは複数のフォルダにファイルされたメッセージにも使用します。

乾杯


ハードリンクを使用するとパフォーマンスが向上しますか?または、なぜシンボリックリンクの代わりにハードリンクを使用するのでしょうか?
ripper234

カーネルはシンボリックリンクを展開するためにパス名からiノードへの変換を再起動する必要がありますが(ディレクトリツリーを走査)、ハードリンクはすべて同じiノードを使用します。(nameiこれは、従来のUnixでこれを行ったカーネル関数の名前から、と呼ばれることがよくあります。)
geekosaur

@ ripper234:ハードリンクはディスクスペースを節約するソリューションです。シンボリックリンクを作成するためにファイルシステムについて知る必要はありませんが、シンボリックリンクを作成する前に考える必要があります。ループや長い解決パスを作成できるため、次のような関数statは失敗します。
-D4RIO

@geekosaur:私の回答は非常に役立つので、私の質問に追加します
-D4RIO

問題ない。実際にあなたのコメントとして書き始めましたが、コメントが短すぎます。
ギーコサウルス

3

ソフトリンクは別のパス名を指します。そのパス名は実際に存在する場合と存在しない場合があります。シンボリックリンクにアクセスするまで、パスは検索されません。アクセスしようとしたときにパスが存在しない場合は、シンボリックリンクが壊れています。

ハードリンクを使用すると、複数の名前を持つ1つのファイルができます。それらの1つが「実際の」ファイルであり、他の1つが単なるリンクであるとは言えません。それらはすべて平等です。壊れたシンボリックリンクがあるように、壊れたハードリンクのようなものはありません。

ハードリンクは単一のファイルシステム内でのみ機能します。別のファイルシステム(別のパーティションやネットワーク共有など)のファイルにリンクする場合、ソフトリンクを使用する必要あります。

もう1つの大きな違いは、リンクされたファイルを削除するとどうなるかです。ハードリンクされたファイルのペアの1つを削除してから、同じ名前の新しいファイルを作成すると、2つの別個のファイルが作成されます(リンクはなくなります)。シンボリックリンクのターゲットを削除し、同じ名前の新しいファイルを作成すると、リンクは新しいファイルを指します。


3

「ハード」リンクは同じiノードを共有します

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

fooまたはfoolinkのいずれかを編集すると、ファイルは1つだけになり、更新されます。ファイル名の1つだけを削除すると、iノードとデータが保持され、foolinkは存続します。

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

「ソフト」またはシンボリックリンクを使用して同じものを作成する場合、1つのファイル、1つのiノード、および最初のファイルを指す独自のiノードを持つ新しいファイルがあります。

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

fooまたはfoolinkのいずれかを編集すると、まだ1つのファイルしかなく、更新されます。

シンボリックリンクのみを削除すると、iノードとデータが保持されます。fooを削除すると、データは失われ、シンボリックリンクは保持されますが、存在しないファイルを指します。

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo

1
しかし、これの実用的なユースケースは何ですか?
ewwhite

1
「ショートカット」と同じ1つの使用法システム上のアプリケーションの複数のバージョンを使用する別の使用法では、binのシンボリックリンクが実稼働を指している間に、新しいバージョンをインストール、テスト、フルパスでアプリを指定できます。テストが完了したら、シンボリックリンクを新しいバージョンに変更し、バージョンに依存するコードを持つユーザーのために古いバージョンをそのままにしておきます。PerlやPythonなどを考える
BSD

1
ハードリンクの実用的な使用例。現在、私のファイルシステムでは、/ usr / share / zoneinfoに多数のハードリンクが見つかりました。タイムゾーンを表すすべての名前付きファイルを考えてください。これらはすべてESTと同じです。冗長なコピーを持たないことでファイルシステムのスペースを節約し、パッケージのインストール/削除時にシンボリックリンクの管理オーバーヘッドをインストール/削除することなく、パッケージ管理を容易にします。削除しても元のデータは保持されます。申し訳ありませんが、より詳細な説明をする時間はありませんでした。
bsd

1

ハードリンクは、同じファイルの追加のディレクトリエントリです。つまり

  • ファイルへのすべてのハードリンクは同じファイルシステム上にある必要があります(ディレクトリエントリは異なるファイルシステム上のファイルを指すことができないため)が、必ずしも同じディレクトリ内にある必要はありません。
  • 元のディレクトリエントリと新しいハードリンクの間に違いはありません。オペレーティングシステムから見ると、同じファイルへの2つのディレクトリエントリにすぎません。ファイルは、すべてのハードリンクが削除された場合にのみ削除されます(さらに、そのファイルを開いたままにするプロセスが残っていません)。
  • 「オリジナル」を移動/名前変更しても、別のファイルシステムに移動しない限り、他のハードリンクは影響を受けません。彼らはまだ同じファイルを指しています。
  • 多くのエディターは、保存時に新しいコンテンツを同じファイルに書き込みませんが、次の手順を実行します。

    1. 新しいコンテンツを新しいファイルに書き込みます。
    2. 古いファイルの名前をバックアップ名に変更します(または、以前のファイルバージョンのバックアップを保持しない場合は、単に削除します)。
    3. 新しく書き込まれたファイルの名前を以前のファイルの名前に変更します。

    このスキームは、同じファイルへの他のハードリンクが現在のファイルを指すのではなく、以前のバージョンを指すようになることを意味します単にリンクを削除することを意味します;削除されたリンクが唯一のリンクである場合にのみ、実際のファイルが削除されます)。

  • ハードリンクはファイルに直接移動するため、そのファイルの元の場所にアクセスできなくても、そのファイルにアクセスできます(たとえば、元のエントリが存在するディレクトリにアクセス許可がないため) 。アクセスを決定する唯一の権利は、ファイル自体のアクセス権(リンクではなくファイルに関連付けられています。同じファイルに対して異なるアクセス権を持つハードリンクを作成することはできません)およびパスのアクセス権はハードリンクです(基本的に、リンクが存在するディレクトリの実行権限、および直接および間接の親ディレクトリ)に含まれます。

シンボリックリンクは、他の一方で、保存するパス名( -あるいはむしろそのディレクトリエントリ-潜在的に、そのパスを含むようなファイルに名前を/bin/shか、subdir/foo.bar別のファイルの- )。パス名が相対パスの場合、リンクが含まれるディレクトリを基準にして常に解釈されます。つまり、

  • シンボリックリンクは、別のファイルシステム上のファイルを参照する場合があります(FATなどのハードリンクまたはソフトリンク自体をサポートしていないファイルシステムでも)。

  • 元のファイルが削除された場合、シンボリックリンクはファイルの内容を保持しません。同じファイルへの他のハードリンクがない限り、ファイルの内容は失われます。シンボリックリンクはぶら下がります(つまり、ディレクトリエントリに対応しないパス名を参照します)。一方、シンボリックリンクを削除しても、元のファイルには影響しません。パス名のみを参照するためです。

  • 元のファイルが移動または名前変更された場合、シンボリックリンクは更新されず、ぶら下がります。シンボリックリンクを移動すると、相対パスが含まれている場合にのみ破損し、新しい位置からのパスは無効になります。

  • 元のファイルが同じ名前の新しいファイルに置き換えられた場合(上記のエディターシナリオの場合)、リンクは新しいファイルを参照します。

ハードリンクのほとんどの用途は、基本的に、ファイルコンテンツを2回保存することなくファイルのコピーを保持する方法です。これは、ファイルが再び変更されない場合に最もよく機能します。そうしないと、誤ってリンクを簡単に切断してしまう可能性があります(上記のエディターシナリオを参照)。もちろん、いくつかのバックアップを保持する場合のように、リンクを解除したい場合があります:新しいバックアップで変更されたファイルの場合、古いバックアップのコピーも変更したくないでしょう。

通常、リンクが必要な場合は、シンボリックリンクを使用します。1つの例は、ディレクトリを別のパーティションに移動する場合(現在のディレクトリがいっぱいになるため)、古い位置から新しい位置にソフトリンクを設定できるため、古い場所でディレクトリにアクセスしようとするプログラムは代わりに新しい場所でアクセスしてください。これはハードリンクでは不可能です。ただし、移動されたディレクトリからの相対パスが含まれている場合、移動されたディレクトリ内のシンボリックリンクが破損する可能性があることに注意してください。


1

ハードリンク(ファイルのみ)vsソフトリンク(ファイルまたはディレクトリ)vs BIND(ディレクトリのハードリンク)

投稿を読む前にこの画像を見る
(ソース:freesoftwareservers.com

daxelrodの答えは質問をうまく説明していますが、この場合の写真は、特にiノードと複雑なLinuxの専門用語をまだ理解していない初心者にとって大きな違いを生むと思いました。

これを考えてみてください。ドライブからすべてを「削除」した場合、ソフトウェアを実行してデータを復元できます。1と0がまだ存在するため、すべてのハードリンクを削除しただけです。回復ソフトウェアの目的は、0および1の意味を理解するためにハードリンクを再構築することです

私はこれがすべて理にかなっている素晴らしい「ライナー」を読み、共有したかった!

Linuxのすべてのファイルは、ディスク上の0と1への「ハードリンク」です。データ(0と1)を作成すると、OSはファイルツリーにハードリンクを作成して、ハードディスク上のそのスポットを参照します。

HARD LINK 2を作成し、HARD LINK 1 オリジナルファイルを削除します

別のハードリンクを作成して元のファイルを削除しても、新しく作成したハードリンクにアクセスできます。

ソフトリンクされているファイル(ハードリンク1)を削除します。

HARD LINK 1を削除した場合、SOFT LINKは機能すると思いますか?いいえ、OSはHARD LINK 1が存在しないことを報告します。

ソフトリンクからハードリンクへの削除:

逆に、ソフトリンクを削除すると、ハードリンクは機能しますか?はい。OSにHARD LINK ファイルが1つある限り、塗りつぶしが削除されていないことが報告されます。

-また、調査/注目する価値があるのは、2つのディレクトリをシンボリックリンクするような2つのディレクトリをバインドする方法であるBINDです。LSではなくMountを使用し、FSTABで設定できます。

BINDマウントとは


1
特に最初の投稿では、これは非常に野心的な取り組みです。残念ながら、「バインド」(要求されていない)に資料を追加すると問題が混乱するだけだと思います。特に、「バインド」マウントを説明しようとしてあまり努力していないようです。また、ハードリンク、ソフトリンク、シンボリックリンクを非常によく理解しており、あなたの写真をほとんど理解していません。初心者がそれから何かを学ぶことができたら、私は非常に驚くでしょう。
G-Manは「Reinstate Monica」と言います

ディレクトリをシンボリックリンクできますが、ファイルシステムではシンボリックリンクとして表示されます。バインドすると、OSに対して透過的になります。ファイルのように表示されます。
FreeSoftwareServers

1
(1)実際には、少なくともLinuxのいくつかのバージョンでは、ファイルをバインドマウントできます。(2)バインドマウントはハードリンクと非常によく似ていますが、「バインドは単にハードリンクと同じです(ディレクトリをハードリンクできないことを除く)」と言うのは間違っています。
G-マンは「元に戻すモニカ言う

@ G-Man、同意して削除、BIND
FreeSoftwareServers

@Freeは実際にはソフトリンクがファイル(ハードリンク1)を指します。回路図により、これが明らかになるはずです。
JB。

0

ハードリンクは、最初のファイル(「ファイル名」は技術的にはハードリンク)を含むすべてのハードリンクが削除されるまで、ディスク上のファイルを保持します。ソフトリンクは、それが指すファイルが置き換えられるまで「ぶら下がり」のままにすることができます。


0

これは非常に古い質問ですが、ハードリンクを使用する必要があるユースケースがあります。

私はミュージシャンなので、Macに接続されたいくつかのハードドライブにさまざまな種類のオーディオファイルがたくさんあります。テラバイトの価値。ほとんどの場合、シンボリックリンクディレクトリで非常によく整理されているので、コンテンツの発行元、スタイル/サウンド、およびその時点での考え方に基づいたその他の基準でそれらを見つけることができます。残念ながら、私が使用しているプログラムの1つであるAbleton Liveは、ファイルブラウザからエイリアスまたはシンボリックリンクを表示することができません。私が見つけた唯一の解決策は、見たいディレクトリのハードリンクを作成することです。そうすれば、すべてがうまく機能します。

したがって、これは、他のユーザーには発生しなかったハードリンクを使用する必要がある場合の別のケースです。


Ableton Liveのバグレポートを提出します。たぶん彼らはこれを修正できるでしょう。
アベンチュリン

ええ、すでに長年フォーラムでこの問題について多くの苦情が寄せられています...なぜそうなのかはわかりませんが、彼らはそれを解決しようとしていないようです。
ジョナサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.