最近私は就職の面接でこれを尋ねられました。私は正直に言って、シンボリックリンクの動作と作成方法は知っているが、ハードリンクの使用方法とシンボリックリンクの違いを理解していませんでした。
最近私は就職の面接でこれを尋ねられました。私は正直に言って、シンボリックリンクの動作と作成方法は知っているが、ハードリンクの使用方法とシンボリックリンクの違いを理解していませんでした。
回答:
ファイルシステムの下では、ファイルは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
(実際には、エコーがファイルの存在しない場合に作成されるため、そもそもエコーを使用できたかもしれませんが、気にしないでください。)
そして予想通り:
$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
存在しないファイルへの単なるリンクです。
touch blah1; touch blah2
次のように短縮できますtouch blah1 blah2
ことわざにあるように、絵は千の言葉に値する。ここに私がそれを視覚化する方法があります:
ここにその写真を得る方法があります:
myfile.txt
新しいiノードを指す名前をファイルシステムに作成します(ファイルのメタデータを含み、その内容を含むデータのブロックを指します(つまり、「Hello、World!」というテキスト)。
$ echo 'Hello, World!' > myfile.txt
my-hard-link
ファイルへのハードリンクをmyfile.txt
作成します。つまり、「同じiノードを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
現在は何も指していません。その他の回答では、それぞれの長所と短所について説明しています。
myfile.txt
)。ソフトリンクのために、それの参照は、(データが含まれています)iノードではなく、むしろそれの参照がへのファイルシステムパスですmyfile.txt
(例えば/home/Documents/myfile.txt
)
ハードリンクは、元のファイルが移動するときに便利です。たとえば、ファイルを/ 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ノードリンクが再作成されるため、ファイルを開いているプロセスがファイルを閉じたり閉じたりしてもファイルは消えません。
ソフトリンク:
ソフトまたはシンボリックは、元のファイルへのショートカットです。元のファイルを削除すると、ショートカットは失敗します。ショートカットを削除するだけでは、元のファイルには何も起こりません。
ソフトリンク構文:ln -s Pathof_Target_file link
出力: link -> ./Target_file
証明: readlink link
また、ls -l link
出力では、最初の文字がllrwxrwxrwx
として表示されます。これは、ファイルがソフトリンクであることを示しています。
リンクを削除する: unlink link
注:必要に応じて、現在のディレクトリから別の場所に移動した後でも、ソフトリンクは機能します。ソフトリンクを作成するときは、相対パスではなく絶対パスを指定してください。ie(./ Target_fileではなく、/ root / user / Target_fileから開始)
ハードリンク:
ハードリンクは、ミラーコピーまたは同じファイルへの複数のパスです。file1に何かを行うと、file 2に表示されます。一方を削除しても、もう一方は正常です。
iノード(またはファイル)が削除されるのは、すべての(ハード)リンクまたは(同じファイル)iノードへのすべてのパスが削除された場合のみです。
ハードリンクが作成されると、リンクには元のファイルのiノードが含まれます。元のファイルの名前変更または移動を削除しても、ハードリンクは基礎となるiノードにリンクしているため、ハードリンクには影響しません。iノード上のデータへの変更は、そのiノードを参照するすべてのファイルに反映されます。
ハードリンク構文:ln Target_file link
出力:名前がリンクのファイルは、Targetfileと同じiノード番号で作成されます。
証明: ls -i link Target_file
そのiノードを確認)
リンクを削除する: rm -f link
通常のファイルと同じようにリンクを削除します)
注意:シンボリックリンクは、単に別のファイルの名前であるため、ファイルシステムにまたがることがあります。一方、ハードリンクは同じファイルシステム内でのみ有効です。
シンボリックリンクには、ハードリンクがないいくつかの機能があります。
ハードリンクを使用しているときにシンボリックリンクが指す場所がすぐにわかる場合は、ファイルシステム全体を調べて、同じiノードを共有するファイルを見つける必要があります。
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
ハードリンクはディレクトリを指すことはできません。
ハードリンクには2つの制限があります。
ハードリンクとシンボリックリンクの違いを確認する簡単な方法は、簡単な例です。ファイルへのハードリンクは、ファイルが格納されている場所、またはそのファイルのiノードを指します。シンボリックリンクは、実際のファイル自体を指します。
したがって、「a」というファイルがあり、ハードリンク「b」とシンボリックリンク「c」を作成すると、すべてファイル「a」を参照します。
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"のストレージの場所またはiノードを指します。したがって、ファイル "a"が削除されると、それはiノードを指さなくなりますが、ファイル "b"はそうするため、ハードリンクがそれをポイントしなくなるまで、iノードは "a"に属していたコンテンツを保存し続けます。
シンボリックリンクはパス名にリンクしています。これは、システムのファイルツリーのどこにあってもかまいません。また、リンクが作成されるときに存在する必要もありません。ターゲットパスは、相対パスでも絶対パスでもかまいません。
ハードリンクは、iノードへの追加のポインタです。つまり、ターゲットと同じボリューム上にのみ存在できます。ファイルへの追加のハードリンクは、ファイルを参照するために使用される「元の」名前と区別できません。
ウィキペディアを紹介します。
いくつかのポイント:
ハードリンクは、増分バックアップを行うときに非常に役立ちます。たとえば、rsnapshotを参照してください。アイデアはハードリンクを使用してコピーすることです:
すべての増分バックアップは、変更されていないファイルの同じiノードセットをポイントするため、新しいバックアップは、行った変更とは別に余分なスペースを占有しません。
私はニックの質問を付け加えます:ハードリンクはいつ有用または必要ですか?私の頭に浮かぶ唯一のアプリケーションは、シンボリックリンクでは機能しませんが、chrootされた環境でシステムファイルのコピーを提供することです。
シンボリックリンクは、別のファイルシステムオブジェクトを指すファイルシステムオブジェクトです。指し示されているオブジェクトはターゲットと呼ばれます。
シンボリックリンクはユーザーに対して透過的です。リンクは通常のファイルまたはディレクトリとして表示され、ユーザーまたはアプリケーションがまったく同じ方法で操作できます。
シンボリックリンクは、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"
ハードリンクは、複数のパスは、単一のファイル参照れるファイルのファイルシステムである同じ体積にします。
ウィンドウでハードリンクを作成するには、リンクを作成する場所に移動し、次のコマンドを入力します。
mklink /H Link_name target_path
ハードリンクは、作成された順序に関係なく、どの順序でも削除できることに注意してください。また、次の場合はハードリンクを作成できません。
NTFSは、junctionと呼ばれる別のリンクタイプをサポートしています。MSDNでは次のように定義しています。
ジャンクション(ソフトリンクとも呼ばれます)がハードリンクと異なる点は、ジャンクションが参照するストレージオブジェクトが個別のディレクトリであり、ジャンクションが同じコンピューター上の異なるローカルボリュームにあるディレクトリをリンクできることです。それ以外の場合、ジャンクションはハードリンクと同じように動作します。
ハードリンクセクションとジャンクションセクションの太字部分は、両者の基本的な違いを示しています。
ウィンドウにジャンクションを作成し、リンクを作成する場所に移動して、次のように入力するコマンド:
mklink /J link_name target_path
単純に、ハードリンク:ファイルに新しい名前を追加するだけです。つまり、ファイルは同時に多くの名前を持つことができ、すべての名前は互いに等しく、誰も好みません。ハードリンクはすべてのコンテンツをコピーすることを意味しませんファイルの作成と新しいファイルの作成はそれではなく、単に既知の代替名を作成するだけです。
シンボリックリンク(symlink):別のファイルへのファイルポインター。シンボリックリンクが後で削除される既存のファイルを指している場合、シンボリックリンクは、ファイル名がなくなっても同じファイル名を指し続けます。
通常の「ファイル」とは、実際には2つの異なるものです。ファイルのデータとディレクトリエントリです。ファイルのハードリンクを作成すると、実際には同じデータを参照する2番目のディレクトリエントリが作成されます。両方のディレクトリエントリの機能はまったく同じです。それぞれを使用して、ファイルを開いて読み取ることができます。したがって、実際には「ファイルとハードリンク」はなく、「2つのディレクトリエントリを持つファイルデータ」があります。ファイルを削除すると考えると、実際にはディレクトリエントリが削除され、データの最後のディレクトリエントリが削除されると、データ自体も削除されます。ディレクトリエントリが1つしかない通常のファイルの場合、ディレクトリエントリを削除すると、通常どおりデータが削除されます。(ファイルが開かれている間、OSはファイルへの一時リンクを作成しますが、
例として、ファイルA.txt、ハードリンクB.txtを作成し、A.txtを削除します。A.txtを作成すると、いくつかのデータが作成され、ディレクトリエントリはA.txtになります。ハードリンクを作成したときに、まったく同じデータを指す別のディレクトリエントリB.txtが作成されました。A.txtを削除しても、最初にファイルB.txtを作成した場合とまったく同じように、すべてのデータと単一のディレクトリエントリB.txtが残っています。
ソフトリンクは、データを含まず、別のディレクトリエントリのパスを除いて、(ほとんど)通常のファイルです。ソフトリンクが参照するファイルを削除すると、ソフトリンクにはディレクトリエントリを指し示さないパスが含まれます。これは壊れています。ソフトリンクを削除しても、他のファイルを削除するのと同じように、リンク先のファイルは影響を受けません。
ディレクトリエントリは、構造体へのリンクです。
struct dentry{
ino_t ino;
char name[256];
}
inoはiノードの番号、名前はファイル名、iノードの構造は次のようになります。
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
、同じファイルシステム/マウントポイントで、)。不要な検索を別のマウントポイントに保存します。
したがって、ハードリンクを検索する方がソフトリンクを検索するよりもいくらか高速です(私が間違っているか、明確でない場合は修正してください)。
シンボリックリンクは、ハードリンクと同様に、ファイルに別の名前を付けます。ただし、シンボリックリンクが残っていても、ファイルを削除できます。
使用量の私の2セント:
ソフトリンクは、長いパス名を短くするために使用できます。
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
変更/short/file.txt
は元のファイルに適用されます。
大きなファイルを移動するためにハードリンクを使用できます。
$ 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
一般的なシナリオであるソフトウェアのインストールでハードリンクを理解する簡単な方法を見つけました。
ある日、ソフトウェアをフォルダにダウンロードしDownloads
てインストールしました。私がした後sudo make install
、いくつかの実行可能ファイルはcp
ローカルのbinフォルダーに編集されました。ここでcp
は、ハードリンクを作成します。私はソフトウェアに満足していましたが、それDownloads
が長期的には良い場所ではないことにすぐに気付きました。したがって、私mv
はソフトウェアフォルダーを source
ディレクトリに移動しました。まあ、Windowsのように、ターゲットリンクについて心配することなく、以前と同じようにソフトウェアを実行できます。これは、ハードリンクが直接iノードと他のファイルを見つけることを意味します。
この答えでは、私がファイルを言うとき、私はメモリ内の場所を意味します
保存されたすべてのデータは、iノードと呼ばれるデータ構造を使用してメモリに格納されます。すべてのiノードにはiノード番号があります。iノード番号は、iノードにアクセスするために使用されます。ファイルへのすべてのハードリンクの名前は異なる場合がありますが、同じiノード番号を共有します。すべてのハードリンクは同じiノード番号(同じiノードにアクセスする)を持っているため、すべてのハードリンクは同じ物理メモリを指します。
シンボリックリンクは特別な種類のファイルです。ファイルでもあるので、ファイル名とiノード番号があります。前述のように、iノード番号はデータを指すiノードにアクセスします。シンボリックリンクのiノード番号は、別のファイルへの「パス」を指すiノードにアクセスします。より具体的には、シンボリックリンクのiノード番号は、別のハードリンクを指すiノードにアクセスします。
GUIでファイルを移動、コピー、削除するときは、物理メモリではなくファイルのハードリンクで遊んでいます。ファイルを削除するときは、ファイルのハードリンクを削除しています。物理メモリは消去されていません。ファイルへのハードリンクがすべて削除されている場合、格納されているデータにアクセスできなくなりますが、メモリに残っている可能性があります。