シンボリックリンクとハードリンクの違いは何ですか?
質問
最近、就職の面接でこれを尋ねられました。正直に言って、シンボリックリンクの動作と作成方法は知っていましたが、ハードリンクの使用とシンボリックリンクとの違いを理解していませんでした。
解決
ファイルシステムファイルの下でiノードで表されます(または、複数のiノードが不明です)
ファイルシステム内のファイルは、基本的にiノードへのリンクです。
ハードリンクは、同じ基になるiノードへのリンクを持つ別のファイルを作成します。
ファイルを削除すると、基になるiノードへのリンクが1つ削除されます。 iノードへのすべてのリンクが削除された場合にのみ、iノードが削除されます(または削除可能/上書き可能)。
シンボリックリンクは、ファイルシステム内の別の名前へのリンクです。
ハードリンクが作成されると、リンクはiノードになります。元のファイルの名前の変更や移動は、基になるiノードにリンクするため、ハードリンクには影響しません。 iノード上のデータへの変更は、そのiノードを参照するすべてのファイルに反映されます。
注:ハードリンクは、同じファイルシステム内でのみ有効です。シンボリックリンクは別のファイルの名前であるため、ファイルシステムにまたがることがあります。
他のヒント
Linux(ish)コンソールを使用すると、役に立つかもしれないいくつかの良い直観。
2つのファイルを作成します:
$ touch foo; touch bar
データを入力してください:
$ echo "Cat" > foo
$ echo "Dog" > bar
(実際には、ファイルが存在しない場合はファイルを作成するため、そもそもechoを使用できたかもしれませんが、気にしないでください。)
そして予想どおり:
$cat foo; cat bar
Cat
Dog
ハードリンクとソフトリンクを作成しましょう:
$ ln foo foo-hard
$ ln -s bar bar-soft
今何が起こったのか見てみましょう:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
fooの名前を変更しても構いません:
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hardは、変更されていないファイルのiノード、コンテンツを指します。
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
ソフトリンクが、コンテンツではなく、変更された名前を指しているため、ファイルのコンテンツが見つかりませんでした。
同様に、 foo
が削除された場合、 foo-hard
はまだコンテンツを保持しています。 bar
が削除された場合、 bar-soft
は存在しないファイルへの単なるリンクです。
ことわざにもあるように、絵は千の言葉に値します。視覚化の方法は次のとおりです。
この写真に到達する方法は次のとおりです。
-
新しいiノード(ファイルのメタデータを含み、その内容を含むデータのブロックを指す)を指すファイルシステムに
myfile.txt
という名前を作成します。テキスト" Hello、World!":$ echo 'Hello, World!' > myfile.txt
-
ファイル
myfile.txt
へのハードリンクmy-hard-link
を作成します。つまり、同じiノードを指すファイルを"作成します。myfile.txt
が指す":$ ln myfile.txt my-hard-link
-
ファイル
myfile.txt
へのソフトリンクmy-soft-link
を作成します。つまり、ファイルを指すファイルを&quot;作成します< code> myfile.txt &quot;:$ ln -s myfile.txt my-soft-link
myfile.txt
が削除(または移動)された場合の動作を見てください: my-hard-link
はまだ同じコンテンツを指しているため、影響を受けません。一方、 my-soft-link
は何も指し示しません。その他の回答では、それぞれの長所/短所について説明しています。
ハードリンクは、元のファイルを移動するときに役立ちます。たとえば、ファイルを/ binから/ usr / binまたは/ usr / local / binに移動します。 / bin内のファイルへのシンボリックリンクはこれにより壊れますが、ハードリンクはファイルのiノードへの直接リンクであるため気になりません。
ハードリンクはディレクトリエントリのみを使用するため、ディスクスペースを節約できますが、シンボリックリンクは、それが指す名前を格納するために独自のiノードを必要とします。
ハードリンクの解決にも時間がかかりません-シンボリックリンクは、シンボリックリンクされたディレクトリにある他のシンボリックリンクを指すことができます。また、これらの一部はNFSまたは他の高遅延ファイルシステム上にある可能性があるため、ネットワークトラフィックを解決する可能性があります。常に同じファイルシステム上にあるハードリンクは、常に単一のルックアップで解決され、ネットワークレイテンシを伴うことはありません(NFSファイルシステム上のハードリンクである場合、NFSサーバーは解決を行い、クライアントシステム)。時々これは重要です。私にとってはそうではありませんが、これが重要な高性能システムを想像できます。
また、mmap(2)やopen(2)のようなものもハードリンクと同じ機能を使用してファイルのiノードをアクティブに保つため、ファイルがunlink(2)されてもiノードはプロセスを許可するために残りますアクセスが継続され、プロセスが閉じられると、ファイルは本当になくなります。これにより、はるかに安全な一時ファイルが可能になります(オープンおよびリンク解除がアトミックに発生し、POSIX APIが記憶していない場合、実際に安全な一時ファイルがあります)。誰もアクセスできない状態であなたのデータ。まあ、それは/ procがファイル記述子を見る能力を誰にでも与える前に真実でしたが、それは別の話です。
と言えば、プロセスAで開かれているが、ファイルシステム上でリンクされていないファイルを回復するには、ハードリンクを使用してiノードリンクを再作成し、開いているプロセスがファイルを閉じたり、消えます。
ハードリンクとシンボリックリンクの違いを簡単に確認するには、簡単な例を使用します。ファイルへのハードリンクは、ファイルが保存されている場所、またはそのファイルのiノードを指します。シンボリックリンクは、実際のファイル自体を指します。
つまり、「a」というファイルがある場合、ハードリンク「b」を作成します;シンボリックリンク&quot; c&quot;これらはすべてファイル「a」を参照しています。 :
echo "111" > a
ln a b
ln -s a c
&quot; a&quot;、&quot; b&quot;、&quot; c&quot;の出力:
cat a --> 111
cat b --> 111
cat c --> 111
では、ファイル&quot; a&quot;を削除しましょう。 &quot; a&quot;、&quot; b&quot;、&quot; c&quot;の出力がどうなるかを確認します。
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
それで何が起こったのですか?
ファイル&quot; c&quot;ファイル&quot; a&quot;を指します。ファイル&quot; a&quot;の場合が削除された後、ファイル&quot; c&quot;指すものは何もなく、実際には削除されます。
ただし、ファイル&quot; b&quot;ファイル「a」の保管場所またはiノードを指します。したがって、ファイル「a」がが削除されると、iノードをポイントしなくなりますが、ファイル&quot; b&quot;その場合、inodeは「a」に属するコンテンツを保存し続けます。ハードリンクがそれを指すことがなくなるまで。
ソフトリンク :
ソフトまたはシンボリックは、元のファイルへのショートカットのようなものです。...元のファイルを削除するとショートカットは失敗し、ショートカットのみを削除すると元のファイルには何も起こりません。
ソフトリンクの構文: ln -s Pathof_Target_file link
出力: link-&gt; ./Target_file
証明: readlinkリンク
また、 ls -l link
の出力では、 lrwxrwxrwx
の最初の文字が l として表示されます。これは、ファイルがソフトリンクであることを示しています。
リンクの削除: リンクのリンク解除
注:必要に応じて、現在のディレクトリから別の場所に移動した後でも、ソフトリンクは機能します。ソフトリンクを作成するときは、相対パスではなく絶対パスを指定してください。つまり、(./ Target_fileではなく/ root / user / Target_fileから開始)
ハードリンク:
ハードリンクは、ミラーコピーまたは同じファイルへの複数のパスです。 file1に何かをすると、ファイル2に表示されます。 一方を削除しても、もう一方は問題ありません。
iノード(またはファイル)は、(同じ)ファイルへのすべての(ハード)リンクまたはすべてのパスが削除された場合にのみ削除されます。
ハードリンクが作成されると、リンクには元のファイルのiノードが含まれます。元のファイルの名前変更または移動を削除しても、基になるiノードにリンクするため、ハードリンクには影響しません。 iノード上のデータへの変更は、そのiノードを参照するすべてのファイルに反映されます。
ハードリンクの構文: ln Target_file link
出力: Targetfileと同じiノード番号で名前リンクのファイルが作成されます。
証明: ls -i link Target_file
(inodeを確認)
リンクの削除: rm -f link
(通常のファイルと同様にリンクを削除します)
注:シンボリックリンクは別のファイルの名前であるため、ファイルシステムにまたがることがあります。一方、ハードリンクは同じファイルシステム内でのみ有効です。
シンボリックリンクには、ハードリンクにない機能がいくつかあります。
- ファイルコンテンツへのハードリンクポイント。一方、ソフトリンクは ファイル名。
- ハードリンクのサイズはコンテンツのサイズであり、ソフトリンクは ファイル名のサイズ。
- ハードリンクは同じiノードを共有します。ソフトリンクはありません。
- ハードリンクはファイルシステムを横断できません。ソフトリンクは行います。
-
シンボリックリンクが指す場所がすぐにわかる リンク、ファイルを見つけるためにファイルシステム全体を探索する必要があります 同じiノードを共有します。
#find / -inum 517333
/home/bobbin/sync.sh /root/synchro
-
ハードリンクはディレクトリを指すことはできません。
ハードリンクには2つの制限があります:
- ディレクトリをハードリンクすることはできません。 Linuxでは、これによりディレクトリの非循環ツリー構造を維持できません。
- ファイルシステム間でハードリンクを作成することはできません。異なるファイルシステムは異なる独立したiノードテーブルを持っているため、両方のファイルが同じファイルシステム上にある必要があります(異なるファイルシステム上の2つのファイルですが、同じiノード番号では異なります)。
シンボリックリンクはパス名にリンクします。これはシステムのファイルツリーのどこにでも存在でき、リンクが作成されるときに存在する必要さえありません。ターゲットパスは相対パスでも絶対パスでもかまいません。
ハードリンクは、iノードへの追加のポインターです。つまり、ターゲットと同じボリュームにのみ存在できます。ファイルへの追加のハードリンクは、「オリジナル」と区別できません。ファイルの参照に使用される名前。
ハードリンクは、増分バックアップを行うときに非常に役立ちます。たとえば、 rsnapshot を参照してください。アイデアは、ハードリンクを使用してコピーすることです。
- バックアップ番号nからn + 1へのコピー
- バックアップn-1からn
- ...
- バックアップ0をバックアップ1にコピー
- 変更されたファイルでバックアップ0を更新します。
すべての増分バックアップは、変更されていないファイルの同じiノードのセットを指すため、新しいバックアップは、行った変更以外の余分なスペースを占有しません。
Nickの質問に追加します。ハードリンクはいつ役立つのですか?シンボリックリンクが役に立たない私の頭に浮かぶ唯一のアプリケーションは、chrooted環境でシステムファイルのコピーを提供することです。
また:
- ハードリンクの読み取りパフォーマンスは、シンボリックリンクよりも優れています(マイクロパフォーマンス)
- シンボリックリンクはコピー、バージョン管理、.. etcが可能です。言い換えれば、それらは実際のファイルです。一方、ハードリンクはやや低レベルのものであり、シンボリックリンクと比較して、通常のファイルではなくハードリンクとしてハードリンクを操作する手段を提供するツールが少ないことがわかります
通常の「ファイル」と思われるもの実際には、ファイルのデータとディレクトリエントリの2つの別個のものです。ファイルのハードリンクを作成するとき、実際には同じデータを参照する2番目のディレクトリエントリを作成します。両方のディレクトリエントリの機能はまったく同じです。それぞれを使用して、ファイルを開いて読み取ることができます。したがって、「ファイルとハードリンク」は実際には存在せず、「2つのディレクトリエントリを持つファイルデータ」が存在します。ファイルを削除すると考えると、実際にはディレクトリエントリが削除され、データの最後のディレクトリエントリが削除されると、データ自体も削除されます。ディレクトリエントリが1つしかない通常のファイルの場合、ディレクトリエントリを削除すると、データは常に削除されます。 (ファイルが開かれている間、OSはファイルへの一時リンクを作成するため、すべてのディレクトリエントリを削除しても、データは残りますが、ファイルを閉じるとすぐに消えます)。
例として、ファイルA.txt、ハードリンクB.txtを作成し、A.txtを削除します。 A.txtを作成すると、いくつかのデータとディレクトリエントリA.txtが作成されました。ハードリンクを作成すると、まったく同じデータを指す別のディレクトリエントリB.txtが作成されました。 A.txtを削除しても、そもそもファイルB.txtを作成したかのように、すべてのデータと単一のディレクトリエントリB.txtが残っています。
ソフトリンクは、データを含まず、別のディレクトリエントリのパスを除いて、単なる(ほぼ)通常のファイルです。ソフトリンクが参照しているファイルを削除すると、ソフトリンクにはディレクトリエントリを指し示していないパスが含まれます。壊れています。ソフトリンクを削除すると、他のファイルを削除するようなものになりますが、それが指すファイルは影響を受けません。
MSDN 、
シンボリックリンク
シンボリックリンクは、別のファイルシステムオブジェクトを指すファイルシステムオブジェクトです。指し示されているオブジェクトはターゲットと呼ばれます。
シンボリックリンクはユーザーに対して透過的です。リンクは通常どおり表示されます ファイルまたはディレクトリであり、ユーザーまたはアプリケーションによるアクションが可能 まったく同じ方法で。
シンボリックリンクは、移行とアプリケーションを支援するように設計されています UNIXオペレーティングシステムとの互換性。マイクロソフトは実装しました UNIXリンクのように機能するシンボリックリンク。
シンボリックリンクは、絶対リンクでも相対リンクでもかまいません。絶対の リンクは、パス名の各部分を指定するリンクです。相対 リンクは、相対リンク指定子が存在する場所を基準にして決定されます 指定されたパス
絶対シンボリックリンクの例
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
相対シンボリックリンクの例
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
ハードリンク
ハードリンクは、ファイルのファイルシステム表現であり、 複数のパスが同じボリューム内の単一のファイルを参照している。
Windowsでハードリンクを作成するには、リンクを作成する場所に移動し、次のコマンドを入力します。
mklink /H Link_name target_path
ハードリンクは、作成された順序に関係なく、任意の順序で削除できることに注意してください。また、次の場合はハードリンクを作成できません
- 参照は異なるローカルドライブにあります
- 参照にはネットワークドライブが含まれます。つまり、参照の1つはネットワークドライブです
- 作成されるハードリンクは、ターゲットと同じパスにあります
ジャンクション
NTFSは、ジャンクションと呼ばれる別のリンクタイプをサポートします。 MSDNは次のように定義しています:
ジャンクション(ソフトリンクとも呼ばれます)は、参照するストレージオブジェクトが個別のディレクトリであるという点でハードリンクと異なり、ジャンクションは同じコンピューター上の異なるローカルボリュームにあるディレクトリをリンクできます 。それ以外の場合、ジャンクションはハードリンクと同じように動作します。
ハードリンクセクションとジャンクションセクションの太字部分は、両者の基本的な違いを示しています。
ウィンドウでジャンクションを作成し、リンクを作成する場所に移動してから入力するコマンド:
mklink /J link_name target_path
単純に、ハードリンク:ファイルに新しい名前を追加するだけです、つまり、ファイルは同時に多くの名前を持つことができ、すべての名前は互いに等しく、誰も優先しません、ハードリンクはコピーすることを意味しませんファイルのすべての内容と新しいファイルを作成するということではなく、既知の別名を作成するだけです。
Symbolic link(symlink):別のファイルへのファイルポインターです。シンボリックリンクが既存のファイルを指し、後で削除される場合、シンボリックリンクは、名前が名前を付けなくなっても同じファイル名を指し続けますファイル。
ディレクトリエントリはリンク構造です:
struct dentry{
ino_t ino;
char name[256];
}
inoはiノードの数、名前はファイル名、iノードの構造は次のようになります&#65306;
struct inode{
link_t nlink;
...
}
たとえば、ファイル/ 1を作成する場合、ディレクトリエントリは次のようになります。
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
inode構造体は次のようになります:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
ハードリンク(/ 100など)を作成すると、ディレクトリエントリは次のようになります。
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
inode構造体は次のようになります:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
次に、ファイル1へのシンボリックリンク(/ 200など)を作成します。ディレクトリエントリは次のようになります。
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
inode構造体は次のようになります:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
上記のすべての答えに加えて、ハードリンクファイルとソフトリンクファイルを見つけることの違いは、次のように理解できます。
現在のディレクトリに f6
というファイルと、 t2
という名前のディレクトリがあります。
f1
および ./ t2 / f2
という名前のファイルは、 f6
へのシンボリックリンクです。
f7
および ./ t2 / f8
という名前のファイルは、 f6
のハードリンクです。
使用できるソフトリンクとハードリンクを見つけるには:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
使用できるハードリンクのみを見つけるには:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
同じファイルシステム上にハードリンクを作成できるため、同じファイル内で -L
オプション( -xdev
オプションを使用)を使用せずにすべてのハードリンクを検索できます。システム/マウントポイント。不要な検索を異なるマウントポイントに保存します。
したがって、ハードリンクの検索は、ソフトリンクの検索よりもいくらか高速です(間違っているか明確でない場合は修正してください)。
シンボリックリンクは、ハードリンクと同様に、ファイルに別の名前を付けます。ただし、シンボリックリンクが残っている場合でも、ファイルを削除できます。
ソフトウェアのインストールという一般的なシナリオでハードリンクを理解する簡単な方法を見つけました。
ある日、インストールのためにソフトウェアをフォルダー Downloads
にダウンロードしました。 sudo make install
を実行した後、いくつかの実行可能ファイルがローカルのbinフォルダーに cp
されました。ここで、 cp
は ハードリンク を作成します。私はソフトウェアに満足していましたが、すぐに Downloads
は長期的には良い場所ではないことに気付きました。そこで、ソフトウェアフォルダーを source
ディレクトリに mv
しました。さて、Windowsのように、リンク先を気にすることなく、以前と同じようにソフトウェアを実行できます。つまり、 ハードリンク はiノードを直接検出し、その他のファイルを検出します。
この回答では、ファイルを言うとき、メモリ内の場所を意味します
保存されるすべてのデータは、iノードと呼ばれるデータ構造を使用してメモリに保存されます。すべてのiノードにはiノード番号があります。iノード番号はiノードへのアクセスに使用されます。 iノード番号。すべてのハードリンクは同じiノード番号(同じiノードにアクセスする)を持っているため、それらはすべて同じ物理メモリを指します。
シンボリックリンクは特別な種類のファイルです。ファイルでもあるため、ファイル名とiノード番号があります。上記のように、iノード番号はデータを指すiノードにアクセスします。特別なのは、シンボリックリンクのiノード番号が、「パス」を指すiノードにアクセスすることです。より具体的には、シンボリックリンクのiノード番号は、別のハードリンクを指すiノードにアクセスします。
GUIでファイルを移動、コピー、削除するときは、物理メモリではなくファイルのハードリンクを使用します。ファイルを削除するときは、ファイルのハードリンクを削除します。ファイルへのすべてのハードリンクが削除されると、保存されているデータにアクセスすることはできませんが、まだメモリに存在している可能性があります
使用に関する2セント:
ソフトリンクを使用して、長いパス名を短縮できます。例:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
/short/file.txt
への変更は、元のファイルに適用されます。
Hard リンクを使用して、大きなファイルを移動できます。
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
別のフォルダへのインスタントコピー、および元のファイル( / myapp / dev
)は、 / myapp / prd
上のファイルに触れることなく移動または削除できます