web-dev-qa-db-ja.com

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

いつどちらを使用しますか?

55
ripper234

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

ハードリンク:

  • everyディレクトリエントリはハードリンクであるため、他のディレクトリエントリと区別できません
  • 「元の」は、同じiノードへの他のハードリンクを壊すことなく移動または削除できます。
  • 同じファイルシステム内でのみ可能
  • 権限は「オリジナル」の権限と同じである必要があります(権限はディレクトリエントリではなくiノードに保存されます)
  • ファイルのみ、ディレクトリは不可

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

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

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

シンボリックリンク、つまり「シンボリックリンク」は、Windowsショートカットと少し似ています。シンボリックリンクの内容は、ファイル/ディレクトリの実際の場所へのポインターです。実際のファイルを削除すると、シンボリックリンクが「ぶら下がり」になり、機能しなくなります。シンボリックリンクを削除しても、実際のファイルは削除されません。 1つのファイルへのシンボリックリンク(または他のシンボリックリンク)をいくつでも持つことができます。

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

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

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

18
LawrenceC

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

13
geekosaur

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

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

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

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

4
cjm

ハードリンクは、同じディスクスペースへの参照にすぎません。そのため、他のファイルシステムで何かをハードリンクすることができません。

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

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

$ 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と呼ばれることがよくあります。)

そしてこれ(編集):

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

乾杯

3
D4RIO

「ハード」リンクは同じ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つだけ削除すると、inodeとデータが保持され、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
3
bsd

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

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

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

    このスキームは、同じファイルへの他のハードリンクが現在のファイルを指すのではなく、以前のバージョンを指すことを意味します(これは、エディターが古いファイルを削除した場合でも当てはまります。Unixではファイルを「削除」するため、単にそのリンクを削除することを意味します。削除されたリンクが唯一のリンクである場合のみ、実際のファイルが削除されます).

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

一方、シンボリックリンクはpathname(ファイルへの名前、またはそのディレクトリエントリ、/bin/shsubdir/foo.barなどのパスを含む可能性があります)を保存します—別のファイルの。パス名が相対の場合、リンクが含まれているディレクトリを基準にして常に解釈されます。つまり、

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

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

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

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

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

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

1
celtschk

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

VIEW THIS IMAGE BEFORE READING POST
(ソース: freesoftwareservers.com

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

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

私はこれをすべて意味のあるものにした素晴らしい「ワンライナー」を読み、共有したいと思いました!

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

HARD LINK 2を作成し、HARD LINK 1を削除します元のファイル

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

ソフトリンクされているFILE(HARD LINK 1)を削除します。

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

ハードリンクへのソフトリンクを削除します。

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

-調査/注意する価値があるのは、BINDです。2つのディレクトリをシンボリックリンクするような2つのディレクトリをバインドする方法ですが、OSに対して透過的です(OSは、Symlinkにいつアクセスできるかを知らせ、Symlinksを追跡できる天気に関するルールがあります)。 LSではなくマウントを使用し、FSTABを介して構成できます。

BINDマウントとは

1

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

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

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

0
JVC

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