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


488

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

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


15
相違点の1つは、ファイルテストなどのファイルがあることです。lnをハードリンクでテストし、ln -sでシンボリックリンクをテストしてから、ファイルtestを他のディレクトリに移動する(または名前を変更する)と、シンボリックリンクは機能しません。ハードリンクは機能します。次に、ファイルtestを削除してみます。ハードリンクは、まだ実際にあなたがまだあるためinodeのイマイチ0ザッツをファイルにハードリンクの数までファイルをアクセスもできるようになり、動作します、それはマニュアルに書かれている...
Denwerko

5
これは、この問題に関する包括的な一般的な答えに値するため、これを再開しました(あいまいなCの例であった前の質問とは異なります)。
オリ

4
ベストアンサー:youtube.com/watch
v=aO0OkNxDJ3c

1
また、非常に完全な答え:stackoverflow.com/questions/185899/...
Elzo Valugi

@AbhishekBhatiaビデオは利用できません
Ooker

回答:


59

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


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

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

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

    場合は、実際のコピーが削除され、リンクが機能しません

  2. ハードリンク

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

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


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

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

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

ここに画像の説明を入力してください

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


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

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

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

 ls -i # Shows you the inode
 5898242 firefox

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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


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

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

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


ハードリンクを作成して、iノードをソースとして提供できますか?
TMOTTM

324

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

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


1
(自分の言葉で)「ファイルを指す」 ものは、ポインターと呼ばれることがあります(それは自明ではほぼトートロジー的に正しいです)。その場合、(一般的に)ファイルシステムがiノードを使用しない場合でも、ハードリンクの概念が存在する可能性があります。
jfs

320

「写真は千の言葉に値する。」 画像表現


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

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から露骨にコピー


13
あなたに公平を期すために-あなたは上部に素敵な画像を追加しました...ああ、あなたもそれをコピーしました!2つの答えを組み合わせると、実際には非常に役立ちます:)
icc97

2
どこにも説明がありません!
デニスボット

3
20秒間画像をじっと見つめていましたが、突然、それを見つけました。これは実に素晴らしいです。
モハメッドジョレード

1
btw:誰かが(ソフトリンクに不満を抱いている)不思議に思った場合に備えgit て、ハードリンクを使用するのは悪い考えです...他のバージョン管理システムにも同様に適用できます。
フランクノッケ

1
クラウドに保存されているファイルに似たハードリンクへのiノードは、デバイスにアクセスしますか?
オーカー

89

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

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

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


If you replace the named file, then the link still contains the same name, and so now it points to the new file-これはよく説明されていないと思います。シンボリックリンクを取得したファイルを置き換えても、名前を含むリンクは変更されません。しかし、そのファイル名(つまり、古いファイルを置き換える新しいファイル)が置き換えられる(つまり、新しいファイルで置き換えられた古いファイル)ものと同じ場合にのみ、置き換えられるファイルを指しますか?
マイク

@Mike、はい:シンボリックリンクは元のファイル名を指しているため、そのファイルを置き換えると、リンクは新しいファイルを指すようになります。
psusi

Bbut同じ名前が正しい場合のみ?シンボリックリンクがバナナを指し、ファイルをオレンジに置き換えると、syリンクはバナナファイルを見つけることができなくなります。つまり、機能しません。
Mike

@Mike、ワールドリプレースとは同じ名前を持つことを意味します。それ以外の場合は、あるファイルを削除して別のファイルを追加するだけです;)
psusi

58

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

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


おかげで、これはどのように機能するかを教えてくれますが、ハードリンクは正確に何をしますか?そして、なぜディレクトリに対して機能しないのですか?
-ste_kwr

@knittl:確かですか?一部のファイルシステムでは、ディレクトリへのハードリンクが許可されているようですが、作成できるのはルートのみです。-d, -F, --directoryスイッチを参照してください。そして、はい、私ln(1)ページでメモ見ました:)
0xC0000022L

1
@kniwor:ハードリンクを記述する最も簡単な方法は、「同じファイル(つまり、ディスク上のデータ)の単なる別の名前」です。そして、少なくとも私のシステムでは、lnディレクトリへのハードリンクを作成するために使用することはできません。ただし、ディレクトリへのハードリンクが存在...ます。最も顕著な例はand です。私は元の答えにそれを含めたくありませんでした。それは物事を複雑にするだけだからです。
ニット

2
@STATUS_ACCESS_DENIED:まあまあ…しかし、それは通常良い考えではありません。だからこそ、私は元の答えに「通常は」と書いた。例については、以前のコメントも参照してください。
ニット

それで、ハードリンクは、異なる名前を持つ同じフォルダ/ファイルを指すことができます。つまり、同じiノードにリンクする異なる名前を持っていますか?
チャーリーパーカー

21

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

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

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

それに基づいて:

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

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

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


5
あなたは正しいと思う、すべてのファイルはiノードのパス名であり、ハードリンクは同じiノードの追加のパス名です。したがって、ハードリンクは通常のファイルと変わりません。
エンゾチブ

私はこれを理解しようとしています...しかし、あなたは言います:>「シンボリックリンクは、ファイルへのファイルシステムパスを保存する別個のファイル(別個のiノードとデータを含む)です。」シンボリックリンクには本当に個別のデータがありますか?次に、リンク先のディレクトリのコピーのようになりますか?...そして、シンボリックリンクに何かを書き込むたびに、ディスクに2回書き込む必要がありますか?意味がありません。
MiniGod

@MiniGodいいえシンボリックリンクは、別のiノード(ファイル名)へのパスを格納するデータブロックへのiノードです。ええ、それはマトリックスのように紛らわしいですが、一度それを手に
入れれ

@Oli私は混乱するかもしれませんが、「iノードとデータを個別に含める」と言うとき、シンボリックリンクには個別のデータがあることを意味します!?
MiniGod

1
@MiniGodうん。Symlinkは(通常のファイルのように)データを指すiノードであり、そのデータはパスです。シンボリックリンクを介して透過的に使用できるようにすることは、それよりも少し賢いですが、本質的にはそれだけです。
オリ

15

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

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

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

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

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

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

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


最大64バイトのパス名サイズの高速シンボリックリンクもあることに注意してください。それでも1つのiノードを占有しますが、4kbのブロックスペースを消費しません。
syockit

8

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

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

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.