どちらを使用するかはいつですか?
どちらを使用するかはいつですか?
回答:
ハードリンクとソフトリンクのセマンティクスが異なるため、さまざまな用途に適しています。
ハードリンク:
シンボリックリンク(ソフトリンク)
ls -l
シンボリックリンクが指すパスを表示します)unlink(2)
ます。「リンク」カウントが1の「通常の」ファイルは、特殊なケースです。役立つ場合は、inodeをオブジェクト、名前を参照カウントポインター(inodeのリンクカウントが参照カウント)と見なすことができます。
..
と.
。
両方のタイプのリンクのポイントは、ファイルを2つの場所に同時に表示する方法を提供することです。これには多くの用途があります。10回のうち9回はシンボリックリンクを使用します。
シンボリックリンク、つまり「シンボリックリンク」は、Windowsのショートカットのように機能します。シンボリックリンクの内容は、ファイル/ディレクトリの実際の場所へのポインタです。実際のファイルを削除すると、シンボリックリンクは「ダングリング」状態になり、機能しなくなります。シンボリックリンクを削除しても、実際のファイルは削除されません。単一のファイル(または他のシンボリックリンク)へのシンボリックリンクを好きなだけ持つことができます。
ただし、Windowsとは異なり、シェルやアプリケーションレベルではなくファイルシステムレベルで動作するため、ほとんどのアプリケーションはシンボリックリンクを期待どおりに「追跡」します。 ls -al
シンボリックリンクが「指す」場所をすばやく確認する方法として使用できます。
ハードリンクは下位レベルでも機能します。ハードリンクは、ファイルの実際の物理的なファイルシステムレベルのディレクトリエントリです。技術的には、ディレクトリエントリはハードリンクであるため、各ファイルはどこかのディレクトリに少なくとも1つのハードリンクを持っています。ハードリンクは、それらが指すファイルから分離されていません。ファイルが異なるディレクトリに複数のハードリンクを持っている場合、rm
すべてのハードリンクがなくなるまで、ファイルを本当に削除しないようなユーティリティでハードリンクを削除します。
意図的にファイルが削除されないようにしたい場合や、パーティションやその他のファイルシステム関連のもので奇妙な低レベルの作業をしている場合を除き、ハードリンクの使用が一般的である、または必要になる状況を考えることはできません。編集:しかし、この質問に対する他の回答には素晴らしいアイデアがあります!
ls -l
、シンボリックリンクによってリンクされているかを確認するために十分であるa
ためにスタンド--all
マンページを参照してください。また、ファイルシステムでシンボリックリンクが機能する場合でも、フォローの代わりにシンボリックリンクをファイルとして使用する代替関数があります。
ln -s /home 1; ls -l 1
シンボリックリンク1は5バイト長でありln -s /usr/share/ 2; ls -l 2
、2は11バイト長であることを示しています。
ハードリンクは、変更されていないファイルのスペースを共有しながら各バックアップの完全なディレクトリツリーを持つことができるため、ディスクベースのバックアップメカニズムに非常に役立ちます。また、ファイルシステムは参照カウントを追跡し、バックアップがスペース上の理由で期限切れ/削除されたため、指定されたバージョンはなくなります。使用されたスペースは自動的に回収されます。同じ理由で、一部のメールクライアントは、複数のフォルダにファイルされたメッセージにも使用します。
ハードリンクは、同じディスクスペースへの単なる参照であり、それが「なぜ」他のファイルシステムの何かをハードリンクできないのです。
シンボリックリンクは、他のファイルを(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のようなディスクベースの増分バックアップメカニズムに非常に役立ちます。変更されていないファイルのスペースを共有しながら各バックアップの完全なディレクトリツリーを持つことができ、ファイルシステムが参照カウントを追跡するため、バックアップがスペース上の理由で期限切れ/削除されたために特定のバージョンへの最後の参照がなくなると、それが使用したスペースは自動的に回収されます。同じ理由で、一部のメールクライアントは複数のフォルダにファイルされたメッセージにも使用します。
乾杯
namei
これは、従来のUnixでこれを行ったカーネル関数の名前から、と呼ばれることがよくあります。)
stat
は失敗します。
ソフトリンクは別のパス名を指します。そのパス名は実際に存在する場合と存在しない場合があります。シンボリックリンクにアクセスするまで、パスは検索されません。アクセスしようとしたときにパスが存在しない場合は、シンボリックリンクが壊れています。
ハードリンクを使用すると、複数の名前を持つ1つのファイルができます。それらの1つが「実際の」ファイルであり、他の1つが単なるリンクであるとは言えません。それらはすべて平等です。壊れたシンボリックリンクがあるように、壊れたハードリンクのようなものはありません。
ハードリンクは単一のファイルシステム内でのみ機能します。別のファイルシステム(別のパーティションやネットワーク共有など)のファイルにリンクする場合は、ソフトリンクを使用する必要があります。
もう1つの大きな違いは、リンクされたファイルを削除するとどうなるかです。ハードリンクされたファイルのペアの1つを削除してから、同じ名前の新しいファイルを作成すると、2つの別個のファイルが作成されます(リンクはなくなります)。シンボリックリンクのターゲットを削除し、同じ名前の新しいファイルを作成すると、リンクは新しいファイルを指します。
「ハード」リンクは同じ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
ハードリンクは、同じファイルの追加のディレクトリエントリです。つまり
多くのエディターは、保存時に新しいコンテンツを同じファイルに書き込みませんが、次の手順を実行します。
このスキームは、同じファイルへの他のハードリンクが現在のファイルを指すのではなく、以前のバージョンを指すようになることを意味します単にリンクを削除することを意味します;削除されたリンクが唯一のリンクである場合にのみ、実際のファイルが削除されます)。
ハードリンクはファイルに直接移動するため、そのファイルの元の場所にアクセスできなくても、そのファイルにアクセスできます(たとえば、元のエントリが存在するディレクトリにアクセス許可がないため) 。アクセスを決定する唯一の権利は、ファイル自体のアクセス権(リンクではなくファイルに関連付けられています。同じファイルに対して異なるアクセス権を持つハードリンクを作成することはできません)およびパスのアクセス権はハードリンクです(基本的に、リンクが存在するディレクトリの実行権限、および直接および間接の親ディレクトリ)に含まれます。
シンボリックリンクは、他の一方で、保存するパス名( -あるいはむしろそのディレクトリエントリ-潜在的に、そのパスを含むようなファイルに名前を/bin/sh
か、subdir/foo.bar
別のファイルの- )。パス名が相対パスの場合、リンクが含まれるディレクトリを基準にして常に解釈されます。つまり、
シンボリックリンクは、別のファイルシステム上のファイルを参照する場合があります(FATなどのハードリンクまたはソフトリンク自体をサポートしていないファイルシステムでも)。
元のファイルが削除された場合、シンボリックリンクはファイルの内容を保持しません。同じファイルへの他のハードリンクがない限り、ファイルの内容は失われます。シンボリックリンクはぶら下がります(つまり、ディレクトリエントリに対応しないパス名を参照します)。一方、シンボリックリンクを削除しても、元のファイルには影響しません。パス名のみを参照するためです。
元のファイルが移動または名前変更された場合、シンボリックリンクは更新されず、ぶら下がります。シンボリックリンクを移動すると、相対パスが含まれている場合にのみ破損し、新しい位置からのパスは無効になります。
元のファイルが同じ名前の新しいファイルに置き換えられた場合(上記のエディターシナリオの場合)、リンクは新しいファイルを参照します。
ハードリンクのほとんどの用途は、基本的に、ファイルコンテンツを2回保存することなくファイルのコピーを保持する方法です。これは、ファイルが再び変更されない場合に最もよく機能します。そうしないと、誤ってリンクを簡単に切断してしまう可能性があります(上記のエディターシナリオを参照)。もちろん、いくつかのバックアップを保持する場合のように、リンクを解除したい場合があります:新しいバックアップで変更されたファイルの場合、古いバックアップのコピーも変更したくないでしょう。
通常、リンクが必要な場合は、シンボリックリンクを使用します。1つの例は、ディレクトリを別のパーティションに移動する場合(現在のディレクトリがいっぱいになるため)、古い位置から新しい位置にソフトリンクを設定できるため、古い場所でディレクトリにアクセスしようとするプログラムは代わりに新しい場所でアクセスしてください。これはハードリンクでは不可能です。ただし、移動されたディレクトリからの相対パスが含まれている場合、移動されたディレクトリ内のシンボリックリンクが破損する可能性があることに注意してください。
ハードリンク(ファイルのみ)vsソフトリンク(ファイルまたはディレクトリ)vs BIND(ディレクトリのハードリンク)
(ソース:freesoftwareservers.com)
daxelrodの答えは質問をうまく説明していますが、この場合の写真は、特にiノードと複雑なLinuxの専門用語をまだ理解していない初心者にとって大きな違いを生むと思いました。
これを考えてみてください。ドライブからすべてを「削除」した場合、ソフトウェアを実行してデータを復元できます。1と0がまだ存在するため、すべてのハードリンクを削除しただけです。回復ソフトウェアの目的は、0および1の意味を理解するためにハードリンクを再構築することです
私はこれがすべて理にかなっている素晴らしい「ライナー」を読み、共有したかった!
Linuxのすべてのファイルは、ディスク上の0と1への「ハードリンク」です。データ(0と1)を作成すると、OSはファイルツリーにハードリンクを作成して、ハードディスク上のそのスポットを参照します。
別のハードリンクを作成して元のファイルを削除しても、新しく作成したハードリンクにアクセスできます。
HARD LINK 1を削除した場合、SOFT LINKは機能すると思いますか?いいえ、OSはHARD LINK 1が存在しないことを報告します。
逆に、ソフトリンクを削除すると、ハードリンクは機能しますか?はい。OSにHARD LINK ファイルが1つある限り、塗りつぶしが削除されていないことが報告されます。
-また、調査/注目する価値があるのは、2つのディレクトリをシンボリックリンクするような2つのディレクトリをバインドする方法であるBINDです。LSではなくMountを使用し、FSTABで設定できます。
ハードリンクは、最初のファイル(「ファイル名」は技術的にはハードリンク)を含むすべてのハードリンクが削除されるまで、ディスク上のファイルを保持します。ソフトリンクは、それが指すファイルが置き換えられるまで「ぶら下がり」のままにすることができます。
これは非常に古い質問ですが、ハードリンクを使用する必要があるユースケースがあります。
私はミュージシャンなので、Macに接続されたいくつかのハードドライブにさまざまな種類のオーディオファイルがたくさんあります。テラバイトの価値。ほとんどの場合、シンボリックリンクディレクトリで非常によく整理されているので、コンテンツの発行元、スタイル/サウンド、およびその時点での考え方に基づいたその他の基準でそれらを見つけることができます。残念ながら、私が使用しているプログラムの1つであるAbleton Liveは、ファイルブラウザからエイリアスまたはシンボリックリンクを表示することができません。私が見つけた唯一の解決策は、見たいディレクトリのハードリンクを作成することです。そうすれば、すべてがうまく機能します。
したがって、これは、他のユーザーには発生しなかったハードリンクを使用する必要がある場合の別のケースです。