最近、就職の面接でこれを聞かれました。私は正直に言って、シンボリックリンクがどのように動作し、どのように作成するかは知っていると言いましたが、ハードリンクの使用法とシンボリックリンクとの違いについては理解していません。
24 に答える
ファイルシステムの下では、ファイルはiノードで表されます。(または、複数のiノードですか?わかりません。)
ファイルシステム内のファイルは、基本的にiノードへのリンクです。
ハードリンクは、同じ基になるiノードへのリンクを持つ別のファイルを作成するだけです。
ファイルを削除すると、基になるiノードへのリンクが1つ削除されます。iノードへのすべてのリンクが削除された場合にのみ、iノードが削除されます(または削除可能/上書き可能)。
シンボリックリンクは、ファイルシステム内の別の名前へのリンクです。
ハードリンクが作成されると、iノードへのリンクになります。元のファイルを削除、名前変更、または移動しても、基になるiノードにリンクするため、ハードリンクには影響しません。iノード上のデータへの変更は、そのiノードを参照するすべてのファイルに反映されます。
注:ハードリンクは、同じファイルシステム内でのみ有効です。シンボリックリンクは、単に別のファイルの名前であるため、ファイルシステムにまたがることができます。
ことわざにあるように、写真は千の言葉に値します。これが私がそれを視覚化する方法です:
その画像に到達する方法は次のとおりです。
myfile.txt
新しい i ノード (ファイルのメタデータを含み、その内容を含むデータのブロック、つまりテキスト "Hello, World!" を指す) を指す名前をファイル システムに作成します。$ echo 'Hello, World!' > myfile.txt
my-hard-link
file へのハードリンクを作成しますmyfile.txt
。これは、「指し示すのと同じ inode をmyfile.txt
指すファイルを作成する」ことを意味します。$ ln myfile.txt my-hard-link
my-soft-link
ファイルへのソフトリンクを作成しますmyfile.txt
。これは、「ファイルを指す必要があるファイルを作成する」ことを意味しますmyfile.txt
。$ ln -s myfile.txt my-soft-link
myfile.txt
が削除 (または移動) された場合に何my-hard-link
が起こるかを見てくださいmy-soft-link
。他の回答では、それぞれの長所と短所について説明しています。
ハード リンクは、元のファイルが移動している場合に便利です。たとえば、ファイルを /bin から /usr/bin または /usr/local/bin に移動します。/bin 内のファイルへのシンボリック リンクはこれによって壊れますが、ファイルの inode への直接リンクであるハードリンクは気にしません。
ハード リンクは、ディレクトリ エントリを占有するだけなので、必要なディスク容量が少ない場合がありますが、シンボリック リンクは、それが指す名前を格納するために独自の inode を必要とします。
ハード リンクは、解決にかかる時間も短くなります。シンボリック リンクは、シンボリック リンクされたディレクトリにある他のシンボリック リンクを指すことができます。これらの一部は、NFS またはその他の高遅延ファイル システム上にある可能性があるため、ネットワーク トラフィックが解決される可能性があります。常に同じファイル システム上にあるハード リンクは、常に 1 回のルックアップで解決され、ネットワーク レイテンシが発生することはありません (NFS ファイル システム上のハードリンクの場合、NFS サーバーが解決を行い、サーバーには見えません)。クライアントシステム)。時にはこれが重要です。私にとってはそうではありませんが、これが重要な高性能システムを想像することはできます。
また、mmap(2) や open(2) のようなものでも、ハードリンクと同じ機能を使用してファイルの inode をアクティブに保ち、ファイルが unlink(2) された場合でも、inode が残り、プロセスが引き続きアクセスできるようにすると思います。プロセスが閉じられると、ファイルは実際に消えます。これにより、はるかに安全な一時ファイルが可能になります(オープンとリンク解除をアトミックに行うことができれば、私が覚えていないPOSIX APIが存在する可能性があります)。誰もアクセスできないようにデータを保護します。/proc によってすべてのユーザーがファイル ディスクリプタを参照できるようになる前は、これは真実でしたが、それはまた別の話です。
そういえば、プロセス A で開いているが、ファイル システムでリンクされていないファイルを回復するには、ハードリンクを使用して inode リンクを再作成することを中心に展開するため、ファイルを開いているプロセスがファイルを閉じたり消えたりしても、ファイルは消えません。
ソフトリンク:
ソフトまたはシンボリックは、元のファイルへのショートカットです....元のファイルを削除すると、ショートカットは失敗し、ショートカットのみを削除すると、元のファイルには何も起こりません。
ソフトリンク構文:ln -s Pathof_Target_file link
出力: link -> ./Target_file
証拠: readlink link
また、ls -l link
出力では、最初の文字がllrwxrwxrwx
として表示されます。これは、ファイルがソフト リンクであることを示しています。
リンクの削除: unlink link
注:必要に応じて、現在のディレクトリから別の場所に移動した後でも、ソフトリンクを機能させることができます。ソフトリンクを作成するときは、相対パスではなく絶対パスを指定してください。つまり (./Target_file ではなく、/root/user/Target_file から開始)
ハードリンク:
ハード リンクは、ミラー コピーまたは同じファイルへの複数のパスのようなものです。file1 に何かをすると、ファイル 2 に表示されます。一方を削除しても、もう一方は問題ありません。
i ノード (またはファイル) は、すべての (ハード) リンクまたは (同じファイル) i ノードへのすべてのパスが削除された場合にのみ削除されます。
ハード リンクが作成されると、リンクには元のファイルの inode が含まれます。元のファイルを削除したり、元のファイルを移動したりしても、基になる i ノードにリンクしているため、ハード リンクには影響しません。inode 上のデータへの変更は、その inode を参照するすべてのファイルに反映されます。
ハード リンクの構文:ln Target_file link
出力:リンク名のファイルが、Targetfile と同じ inode 番号で作成されます。
証明: ls -i link Target_file
(inode を確認してください)
リンクの削除: rm -f link
(通常のファイルと同じようにリンクを削除します)
注: シンボリック リンクは単に別のファイルの名前であるため、複数のファイル システムにまたがることができます。一方、ハード リンクは同じファイル システム内でのみ有効です。
シンボリック リンクには、ハード リンクにはないいくつかの機能があります。
- ファイルコンテンツへのハードリンクポイント。一方、ソフトリンクはファイル名を指しています。
- ハードリンクのサイズはコンテンツのサイズですが、ソフトリンクはファイル名のサイズです。
- ハード リンクは同じ inode を共有します。ソフトリンクはそうではありません。
- ハード リンクはファイル システムをまたがることはできません。ソフトリンクはそうです。
シンボリック リンクがどこを指しているかがすぐにわかりますが、ハード リンクでは、ファイル システム全体を調べて、同じ inode を共有しているファイルを見つける必要があります。
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
ハードリンクはディレクトリを指すことはできません。
ハード リンクには 2 つの制限があります。
- ディレクトリはハード リンクできません。Linux では、これがディレクトリの非循環ツリー構造を維持することを許可していません。
- ファイルシステム間でハード リンクを作成することはできません。異なるファイルシステムには異なる独立した inode テーブルがあるため、両方のファイルは同じファイルシステム上にある必要があります (2 つのファイルは異なるファイルシステムにありますが、同じ inode 番号を持つ場合は異なります)。
ハード リンクとシンボリック リンクの違いを確認する簡単な方法は、簡単な例です。ファイルへのハードリンクは、ファイルが保存されている場所、またはそのファイルの inode を指します。シンボリック リンクは、実際のファイル自体を指します。
したがって、「a」というファイルがあり、すべてファイル「a」を参照するハードリンク「b」とシンボリックリンク「c」を作成するとします。
echo "111" > a
ln a b
ln -s a c
「a」、「b」、および「c」の出力は次のようになります。
cat a --> 111
cat b --> 111
cat c --> 111
ここで、ファイル "a" を削除して、"a"、"b"、および "c" の出力がどうなるかを見てみましょう。
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
どうしたの?
ファイル "c" はファイル "a" 自体を指しているため、ファイル "a" が削除されると、ファイル "c" には指すものがなくなり、実際にはファイルも削除されます。
ただし、ファイル「b」は、ファイル「a」のストレージの場所または inode を指しています。そのため、ファイル「a」が削除されると、それはもはや i ノードを指しませんが、ファイル「b」が削除されるため、i ノードは、それを指しているハード リンクがなくなるまで、「a」に属するコンテンツを格納し続けます。
シンボリックリンクはパス名にリンクしています。これはシステムのファイルツリーのどこにあってもかまいません。リンクの作成時に存在している必要はありません。ターゲットパスは、相対パスまたは絶対パスにすることができます。
ハードリンクはiノードへの追加のポインタです。つまり、ハードリンクはターゲットと同じボリュームにのみ存在できます。ファイルへの追加のハードリンクは、ファイルの参照に使用される「元の」名前と区別できません。
増分バックアップを行う場合、ハード リンクは非常に便利です。たとえば、 rsnapshotを参照してください。アイデアは、ハードリンクを使用してコピーを行うことです:
- バックアップ番号 n を n + 1 にコピー
- バックアップ n - 1 を n にコピー
- ...
- バックアップ 0 をバックアップ 1 にコピー
- 変更されたファイルでバックアップ 0 を更新します。
すべての増分バックアップは、変更されていないファイルの同じ inode セットを指すため、新しいバックアップは、行った変更以外に余分なスペースを占有しません。
MSDNから、
シンボリックリンク
シンボリック リンクは、別のファイル システム オブジェクトを指すファイル システム オブジェクトです。指し示されるオブジェクトは、ターゲットと呼ばれます。
シンボリック リンクはユーザーに対して透過的です。リンクは通常のファイルまたはディレクトリとして表示され、ユーザーまたはアプリケーションがまったく同じ方法で操作できます。
シンボリック リンクは、UNIX オペレーティング システムとの移行およびアプリケーションの互換性を支援するように設計されています。Microsoft は、シンボリック リンクを 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"
ハードリンク
ハードリンクは、複数のパスが同じボリューム内の1 つのファイルを参照するファイル システム表現です。
Windows でハード リンクを作成するには、リンクを作成する場所に移動し、次のコマンドを入力します。
mklink /H Link_name target_path
ハード リンクは、作成された順序に関係なく、任意の順序で削除できることに注意してください。また、次の場合はハードリンクを作成できません。
- 参照は異なるローカル ドライブにあります
- 参照には、ネットワーク ドライブが含まれます。つまり、参照の 1 つはネットワーク ドライブです。
- 作成するハードリンクはターゲットと同じパスにあります
ジャンクション
NTFS は、ジャンクションと呼ばれる別のリンク タイプをサポートしています。MSDN は次のように定義しています。
ジャンクション (ソフト リンクとも呼ばれます) は、参照するストレージ オブジェクトが個別のディレクトリであり、ジャンクションが同じコンピューター上の異なるローカル ボリュームにあるディレクトリをリンクできるという点で、ハード リンクとは異なります。それ以外の場合、ジャンクションはハード リンクと同じように動作します。
ハード リンク セクションとジャンクション セクションの太字部分は、両者の基本的な違いを示しています。
Windows でジャンクションを作成するコマンド。リンクを作成する場所に移動し、次のように入力します。
mklink /J link_name target_path
Nick の質問に追加します:ハード リンクが役立つ、または必要になるのはいつですか? シンボリック リンクが役に立たない唯一のアプリケーションは、chroot 環境でシステム ファイルのコピーを提供することです。
また:
- ハードリンクの読み取りパフォーマンスは、シンボリックリンクよりも優れています (マイクロパフォーマンス)
- シンボリック リンクは、コピー、バージョン管理などが可能です。つまり、実際のファイルです。一方、ハード リンクは少し低いレベルのものであり、シンボリック リンクと比較して、ハード リンクを通常のファイルとしてではなくハード リンクとして操作する手段を提供するツールが少ないことがわかります。
通常の「ファイル」と考えられるものは、実際には 2 つの別個のものです。ファイルのデータとディレクトリ エントリです。ファイルのハード リンクを作成すると、実際には、同じデータを参照する 2 番目のディレクトリ エントリが作成されます。両方のディレクトリ エントリの機能はまったく同じです。それぞれを使用してファイルを開いて読み取ることができます。したがって、実際には「ファイルとハードリンク」ではなく、「2 つのディレクトリエントリを持つファイルデータ」があります。ファイルの削除と考えると、実際にはディレクトリ エントリが削除されます。データの最後のディレクトリ エントリが削除されると、データ自体も削除されます。ディレクトリエントリが1つしかない通常のファイルの場合、ディレクトリエントリを削除すると、通常どおりデータが削除されます。(ファイルが開かれている間、OS はファイルへの一時的なリンクを作成します。
例として、ファイル A.txt、ハード リンク B.txt を作成し、A.txt を削除します。A.txt を作成すると、いくつかのデータが作成され、ディレクトリ エントリ A.txt. ハード リンクを作成すると、まったく同じデータを指す別のディレクトリ エントリ B.txt が作成されました。A.txt を削除しても、最初にファイル B.txt を作成した場合とまったく同じように、すべてのデータと 1 つのディレクトリ エントリ B.txt が残ります。
ソフト リンクは、データを含まず、別のディレクトリ エントリのパスであることを除けば、(ほぼ) 通常のファイルです。ソフト リンクが参照するファイルを削除すると、ソフト リンクにはディレクトリ エントリを指していないパスが含まれます。これは壊れています。ソフト リンクを削除すると、他のファイルを削除するのと同じように、それが指すファイルは影響を受けません。
単純に、ハード リンク : ファイルに新しい名前を追加するだけです。つまり、ファイルには同時に多くの名前を付けることができます。すべての名前は互いに同じであり、誰も優先しません。ハード リンクはすべてのコンテンツをコピーすることを意味するものではありません。 of file と make new file はそうではなく、知られる代替名を作成するだけです..
シンボリック リンク (symlink) : 別のファイルへのファイル ポインターです。シンボリック リンクが、後で削除される既存のファイルを指している場合、シンボリック リンクは、その名前がもはやファイルを指定していなくても、同じファイル名を指し続けます。
上記のすべての回答に加えて、ハードリンク ファイルとソフトリンク ファイルの検索の違いは次のように理解できます。
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 はハード リンクを作成します。私はソフトウェアに満足していましたが、ダウンロードは長期的には良い場所ではないことにすぐに気付きました。そのため、ソフトウェアフォルダーをソースディレクトリに移動しました。Windows のように、ターゲット リンクのことを気にせずに、以前と同じようにソフトウェアを実行できます。これは、ハード リンクが inode を直接検出し、他のファイルを検出することを意味します。