タイトルにあるように、コマンドで作成されたハードリンクとソフトリンクの違いを知りたいln
です。コマンドman ln
は情報を提供しますが、私の質問には十分に答えません。
また、誰かがシンボリックリンクよりもハードリンクの方が望ましい設定を提供できると便利です。
タイトルにあるように、コマンドで作成されたハードリンクとソフトリンクの違いを知りたいln
です。コマンドman ln
は情報を提供しますが、私の質問には十分に答えません。
また、誰かがシンボリックリンクよりもハードリンクの方が望ましい設定を提供できると便利です。
回答:
リンクには、ソフトリンク(シンボリックリンク)またはハードリンクの2種類があります。
ソフトリンク(シンボリックリンク)
ファイルとディレクトリへのリンクを作成できます。また、別のパーティションに、元のiノード番号とは異なるリンク(ショートカット)を作成できます。
場合は、実際のコピーが削除され、リンクが機能しません。
ハードリンク
ハードリンクはファイル専用です。別の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ノードを指すディレクトリエントリ(ファイル)です。他のファイルの名前を変更しても、ハードリンクはそのファイルを指します。他のファイルを(コピーして)新しいバージョンに置き換えると、ハードリンクは新しいファイルを指しません。同じファイルシステム内にのみハードリンクを設定できます。ハードリンクを使用すると、元のファイルとリンクの概念がなく、すべて同じです(オブジェクトへの参照と考えてください)。これは非常に低レベルの概念です。
一方、シンボリックリンクは実際には別のパス(ファイル名)を指します。シンボリックリンクを介してアクセスするたびに、ファイルの名前を解決します。ファイルを移動すると、シンボリックリンクは続きません。ファイルを別のファイルに置き換え、名前を保持すると、シンボリックリンクは新しいファイルを指します。シンボリックリンクはファイルシステムにまたがることができます。シンボリックリンクを使用すると、実際のファイルとシンボリックリンクを非常に明確に区別できます。
そして、「例は百段落に値する...」
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から露骨にコピー!
どちらもファイルへのポインターです。違いはポインタの種類です。シンボリックリンクは、名前で別のファイルを指します。シンボリックリンクとして識別する特別なモードビットがあり、その内容は実際のファイルの名前です。名前が含まれているだけなので、その名前は実際に存在する必要はなく、別のファイルシステムに存在する場合もあります。名前付きファイルを置き換える(名前に影響を与えずに内容を変更する)場合、リンクには同じ名前が含まれているため、新しいファイルを指すようになります。シンボリックリンクを簡単に識別し、それが指すファイルの名前を確認できます。
ハードリンクは、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
-これはよく説明されていないと思います。シンボリックリンクを取得したファイルを置き換えても、名前を含むリンクは変更されません。しかし、そのファイル名(つまり、古いファイルを置き換える新しいファイル)が置き換えられる(つまり、新しいファイルで置き換えられた古いファイル)ものと同じ場合にのみ、置き換えられるファイルを指しますか?
ハードリンクは同じファイルシステムでのみ機能し、同じiノードの異なる名前にすぎません(ファイルはiノードによって内部的に参照されます)。ファイルは、そのiノードへの最後のリンクがなくなった(最後のリンクをrm
dまたはunlink
dした)ときにのみディスクから削除されます。通常、ハードリンクはファイルに対してのみ機能し、ディレクトリに対しては機能しません。
シンボリックリンク(シンボリックリンク)は、別のファイルへのパスを含む特別なファイルです。このパスは、絶対パスまたは相対パスにすることができます。シンボリックリンクはファイルシステム間で機能し、たとえば外部ハードドライブを取り外して、同じパスに異なるファイルを持つ別のハードドライブと交換する場合、異なるファイルを指すことさえできます。シンボリックリンクは、ファイルまたはディレクトリを指すことができます。
-d, -F, --directory
スイッチを参照してください。そして、はい、私はln(1)
ページでメモを見ました:)
ln
ディレクトリへのハードリンクを作成するために使用することはできません。ただし、ディレクトリへのハードリンクが存在.
し..
ます。最も顕著な例はand です。私は元の答えにそれを含めたくありませんでした。それは物事を複雑にするだけだからです。
他のスレッド(現在、投稿の上部からリンクされています)からの回答の1つがこのページに言及していますが、これはかなり良い中レベルの説明だと思います。あなたがアスキーアートに迷っているなら、ここにtl; drバージョンがあります:
関連するカーネルとファイルシステムは、すべてを透過的に変換します。
それに基づいて:
../parent.file
)少し混乱したかもしれませんが、さまざまなことを読んで、標準ファイルとハードリンクの違いを見つけるのに苦労しています。私がそれを読んでいる方法は、すべてのファイルがハードリンク(ファイル名を保存する)から成り、物理データを指すiノードにリンクしていることです。
ハードリンクを追加すると、ファイルシステムベースのポインターが追加されたinodeが提供されます。そうですか?
ソフトリンクを使用する場合:
ファイルシステム間でリンクする:ファイルシステム間でファイルをリンクする場合は、シンボリックリンク/ソフトリンクのみを使用できます。
ディレクトリへのリンク:ディレクトリをリンクする場合は、ディレクトリへのハードリンクを作成できないため、ソフトリンクを使用する必要があります。
ハードリンクを使用する場合:
ストレージスペース:ハードリンクの作成中に新しいiノードが作成されないため、ハードリンクのスペースはごくわずかです。ソフトリンクでは、スペースを消費するファイルを作成します(ファイルシステムに応じて通常4KB)
パフォーマンス:別のファイルを経由するのではなく、ディスクポインターに直接アクセスするため、ハードリンクにアクセスするときのパフォーマンスがわずかに向上します。ファイルの場所の移動:ソースファイルを同じファイルシステム上の他の場所に移動した場合、ハードリンクは引き続き機能しますが、ソフトリンクは失敗します。
冗長性:データの安全性を確保したい場合は、ハードリンクを使用する必要があります。ハードリンクでは、データは安全です。ファイルへのすべてのリンクが削除されるまで、ソフトリンクではなく、ファイルのマスターインスタンスが削除された場合のデータ。
「ファイル名」とハードリンクの違いを見つけようとすると、混乱が生じます。
作成するすべてのファイルは、ディスク上のデータと、ディレクトリ内のファイル名でありディスク上のデータへのポインターであるハードリンクで構成されます。物語の終わり。最後の(または唯一の)ハードリンクが削除されると、OSはデータが不要になったことを認識します。
これから、実際のデータは削除されず、ハードリンクのみが削除されることがわかります。そして、ディスク上で十分に混雑すると、データは別のファイルのデータによって上書きされる可能性があります。それまでは、削除されたファイルのデータは復元される可能性がありますが、ハードリンクがないと見つけるのは少し困難です。
前述のように、シンボリックリンクは、単に「名前<targetname>
のフォルダーに名前のファイルがある」と伝えます<targetfolder>
。ハードリンクを指します。データがどこにあるのか、彼らは知りません。ハードリンクはそれを知っています。
とても簡単です。ファイル(およびディレクトリ!)は、ブロックデバイス(HDDなど)のアドレスに保存されます。通常、アドレスにマップされた単一の名前があり、それがファイルを取得する方法です。ハードリンクは、同じアドレスにマッピングされた第二、第三などの名前です。シンボリックリンクは、名前- -代わりにシンボルを参照し、第1の名前にマッピングされた第二の名前です。カーネルに関する限り、シンボリックリンクターゲットを読み込むと停止し、ターゲット値をファイル名として(多少なりとも)最初に戻ります。そのため、相対シンボリックリンクは可能ですが、ほとんど役に立ちません。ターゲット名は、ユーザー空間コードで明示的にクエリされている場合を除き、ファイルシステムレベルより上では使用されません。