最近私は就職の面接でこれを尋ねられました。私は正直、シンボリックリンクがどのように振る舞うのか、そしてどのようにしてそれを作成するのかを知っていると言ったが、ハードリンクの使い方とシンボリックリンクとの違いは理解していない。
ファイルシステムの下にあるファイルは、iノードで表されています(または複数のiノードがわからない)。
ファイルシステム内のファイルは、基本的にはiノードへのリンクです。
次に、ハードリンクは、同じ基礎となるiノードへのリンクを持つ別のファイルを作成するだけです。
ファイルを削除すると、基礎となるiノードへのリンクが1つ削除されます。 iノードへのすべてのリンクが削除された場合にのみ、iノードが削除されます(または削除可能/上書き可能)。
シンボリックリンクは、ファイルシステム内の別の名前へのリンクです。
ハードリンクが作成されると、そのリンクはinodeになります。元のファイルの名前変更を削除したり移動したりしても、それが基盤となるiノードにリンクしているため、ハードリンクには影響しません。 iノード上のデータに対する変更は、そのiノードを参照するすべてのファイルに反映されます。
注:ハードリンクは同じファイルシステム内でのみ有効です。シンボリックリンクは、単に別のファイルの名前であるため、ファイルシステムにまたがることができます。
Linux(ish)コンソールを使って、手助けになるかもしれないNice直感。
ファイルを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
は存在しないファイルへの単なるリンクです。
ことわざにあるように、絵は千語の価値があります。これを視覚化する方法は次のとおりです。
これがどのようにしてその絵にたどり着くかです:
ファイルシステムに新しいinode(ファイルのメタデータを含み、その内容を含むデータブロック、つまり "Hello、World!"というテキストを指す)をmyfile.txt
という名前で作成します。
$ echo 'Hello, World!' > myfile.txt
ファイルmy-hard-link
へのハードリンクmyfile.txt
を作成します。これは、「myfile.txt
が指すのと同じiノードを指すファイルを作成する」という意味です。
$ 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にあるファイルへのシンボリックリンクはこれによって壊れてしまいますが、ファイルのiノードへの直接リンクであるハードリンクは問題になりません。
ハードリンクはディレクトリエントリを使用するだけなのでディスクスペースを節約できますが、シンボリックリンクはそれが指す名前を格納するための独自のiノードを必要とします。
ハードリンクでも解決にかかる時間が短くなります。シンボリックリンクはシンボリックリンクディレクトリにある他のシンボリックリンクを指すことがあります。また、これらの中にはNFSや他の待ち時間の長いファイルシステム上にあるものもあり、そのためネットワークトラフィックが解決される可能性があります。ハードリンクは、常に同じファイルシステム上にあるため、常に1回のルックアップで解決され、ネットワークの待ち時間を伴うことはありません(NFSファイルシステム上のハードリンクである場合、NFSサーバーが解決します。クライアントシステム)時々これは重要です。私にとってはそうではありませんが、これが重要になる可能性がある高性能システムを想像することができます。
また、mmap(2)やopen(2)のようなものもファイルのinodeをアクティブに保つためにハードリンクと同じ機能を使用するので、ファイルがunlink(2)されてもinodeはプロセスにアクセスを許可します。プロセスが閉じると、ファイルは実際に消えます。これにより、もっと安全な一時ファイルを開くことができます(開いてリンク解除をアトミックに行うことができれば、POSIX APIがあるので覚えていないかもしれませんが、実際には安全な一時ファイルがあります)。誰にもアクセスできないあなたのデータ。まあ、それは/ procが皆にあなたのファイルディスクリプタを見る能力を与える前に本当でした、しかしそれはまた別の話です。
そういえば、プロセスAで開かれているがファイルシステム上でリンクされていないファイルを回復することは、ハードリンクを使ってiノードリンクを作り直すことで、開かれたプロセスがそれを閉じたり消えたりしても消えないということです。
ハードリンクとシンボリックリンクの違いを確認する簡単な方法は、簡単な例です。ファイルへのハードリンクは、ファイルが保存されている場所、またはそのファイルの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"に属する内容を格納し続けます。
ソフトリンク :
ソフトまたはシンボリックは、オリジナルファイルへのショートカットに近いものです。オリジナルを削除するとショートカットは失敗し、ショートカットを削除するだけではオリジナルには何も起こりません。
ソフトリンク構文:ln -s Pathof_Target_file link
出力:link -> ./Target_file
Proof:readlink link
また、ls -l link
の出力では、lrwxrwxrwx
の最初の文字がlと表示されます。これは、ファイルがソフトリンクであることを示しています。
リンクの削除:unlink link
注:必要に応じて、現在のディレクトリから別の場所に移動してもソフトリンクは機能します。ソフトリンクを作成するときは、絶対パスではなく絶対パスを指定してください。つまり、(/ root/user/Target_fileから始まり、。/ Target_fileではなく)
ハードリンク:
ハードリンクは、ミラーコピー、または同じファイルへの複数のパスです。 file1に何かをすると、それがファイル2に表示されます。一方を削除しても、もう一方は問題ありません。
Iノード(またはファイル)は、(同じ)ファイルのiノードへのすべての(ハード)リンクまたはすべてのパスが削除された場合にのみ削除されます。
ハードリンクが作成されると、リンクは元のファイルのiノードを持ちます。元のファイルの名前変更を削除したり移動したりしても、基盤となるiノードにリンクしているためハードリンクには影響しません。 iノード上のデータに対する変更は、そのiノードを参照するすべてのファイルに反映されます。
ハードリンク構文:ln Target_file link
Output: linkという名前のファイルは、Targetfileと同じiノード番号で作成されます。
Proof:ls -i link Target_file
(inodeを確認してください)
リンクの削除:rm -f link
(通常のファイルと同じようにリンクを削除します)
注:シンボリックリンクは単に別のファイルの名前であるため、ファイルシステムをまたぐことができます。ハードリンクは同じファイルシステム内でのみ有効です。
シンボリックリンクにはハードリンクがないという機能がいくつかあります
ハードリンクでシンボリックリンクが指す場所をすぐに知ることができるので、ファイルシステム全体を調べて同じiノードを共有するファイルを見つける必要があります。
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
ハードリンクはディレクトリを指すことはできません。
ハードリンクには2つの制限があります。
シンボリックリンクはパス名にリンクします。これはシステムのファイルツリーのどこにでも置くことができ、リンクが作成されるときに存在する必要すらありません。ターゲットパスは相対パスでも絶対パスでもかまいません。
ハードリンクは、iノードへの追加のポインタです。つまり、ハードリンクは、ターゲットと同じボリューム上にしか存在できません。ファイルへの追加のハードリンクは、ファイルを参照するために使用される「元の」名前と区別がつきません。
ハードリンクは、増分バックアップを実行するときに非常に便利です。たとえば、 rsnapshot を参照してください。アイデアはハードリンクを使ってコピーすることです:
すべての増分バックアップは、変更されていないファイルの同じiノードセットを指すため、新しいバックアップでは、行った変更とは別に余分なスペースを占有しません。
私はニックの質問に付け加えます: ハードリンク はいつ役に立つか、または必要ですか?私の頭に浮かぶ唯一のアプリケーションは、シンボリックリンクがその仕事をしないというもので、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が残っています。
ソフトリンクは、データを含まず、別のディレクトリエントリのパスを除いて、単なる(ほぼ)普通のファイルです。ソフトリンクが参照しているファイルを削除すると、ソフトリンクにはディレクトリエントリを指していないパスが含まれます。壊れています。ソフトリンクを削除しても、それは他のファイルを削除するのと同じです。それが指すファイルは影響を受けません。
シンボリックリンクは、別のファイルシステムオブジェクトを指すファイルシステムオブジェクトです。指し示されているオブジェクトは、ターゲットと呼ばれます。
シンボリックリンクはユーザーに対して透過的です。リンクは通常のファイルまたはディレクトリとして表示され、ユーザーまたはアプリケーションはまったく同じ方法で操作できます。
シンボリックリンクは、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"
ハードリンクは、複数のパスが単一のファイルを参照するファイルのファイルシステム表現です同じボリューム内。
Windowsでハードリンクを作成するには、リンクを作成する場所に移動し、次のコマンドを入力します。
mklink /H Link_name target_path
ハードリンクは、作成された順序に関係なく、任意の順序で削除できることに注意してください。また、次の場合にハードリンクを作成できません。
NTFSは、ジャンクションと呼ばれる別のリンクタイプをサポートしています。 MSDNは次のように定義しています。
ジャンクション(ソフトリンクとも呼ばれます)は、参照するストレージオブジェクトが個別のディレクトリであるという点でハードリンクと異なり、ジャンクションは同じコンピューター上の異なるローカルボリュームにあるディレクトリをリンクできます。それ以外の場合、ジャンクションはハードリンクと同じように動作します。
ハードリンクセクションとジャンクションセクションの太字部分は、両者の基本的な違いを示しています。
ウィンドウでジャンクションを作成し、リンクを作成する場所に移動して、次のコマンドを入力するコマンド
mklink /J link_name target_path
ディレクトリエントリはlink a structrueです。
struct dentry{
ino_t ino;
char name[256];
}
inoはinodeの数、nameはファイル名、inodeの構造は次のようになります。
struct inode{
link_t nlink;
...
}
たとえば、ファイル/ 1を作成すると、ディレクトリエントリは次のようになります。
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
iノード構造体は次のようになります。
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
それからあなたはハードリンク(/ 100かもしれません)を作成します、ディレクトリエントリはおそらく以下のようになります。
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
iノード構造体は次のようになります。
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
次に、ファイル1へのシンボリックリンク(/ 200)を作成します。ディレクトリエントリは次のようになります。
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
iノード構造体は次のようになります。
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 */
簡単に言うと、ハードリンク:ファイルに新しい名前を追加するだけです。つまり、ファイルには同時に複数の名前を付けることができます。すべての名前は同じです。ハードリンクはすべての内容をコピーするわけではありません。ファイルの作成と新しいファイルの作成はそれではありません、それだけで知られている代替の名前を作成します..
シンボリックリンク(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
オプションを使用して)同じファイルシステム/マウントポイントですべてのハードリンクを検索できます。不要な検索を異なるマウントポイントに保存します。
そのため、ハードリンクを検索する方がソフトリンクを検索するよりもやや速くなります(私が間違っているか明確でない場合は修正してください)。
ハードリンクと同様に、シンボリックリンクはファイルに別の名前を付けます。しかし、シンボリックリンクが残っていてもファイルは削除できます。
用法についての私の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
上)を移動または削除できます。
この答えで私はファイルを言うとき私はメモリ内の場所を意味する
Iノード番号はiノードにアクセスするために使用されます。ファイルへのすべてのハードリンクは、異なる名前を持つことができますが、同じiノード番号を共有することができます。すべてのハードリンクは同じinode番号(同じinodeにアクセスする)を持っているので、それらはすべて同じ物理メモリを指しています。
シンボリックリンクは特別な種類のファイルです。ファイルでもあるので、ファイル名とiノード番号を持ちます。前述のように、iノード番号はデータを指すiノードを受け入れます。シンボリックリンクのinode番号は、別のファイルへの「パス」を指すiノードにアクセスします。特に、シンボリックリンクのiノード番号は、別のハードリンクを指すiノードを受け入れます。
gUIでファイルを移動、コピー、削除するときは、物理メモリではなくファイルのハードリンクを使用して再生します。ファイルを削除すると、ファイルのハードリンクも削除されます。ファイルへのすべてのハードリンクが削除されると、それはまだメモリ内に存在する可能性がありますが、保存されているデータにアクセスすることはできません。
一般的なシナリオ、ソフトウェアのインストールでハードリンクを理解する簡単な方法を見つけました。
ある日私はインストールのためにフォルダDownloads
にソフトウェアをダウンロードしました。 Sudo make install
を実行した後、いくつかの実行ファイルがローカルのbinフォルダにcp
されました。ここで、cp
は ハードリンク を作成します。私はソフトウェアに満足していましたが、すぐにDownloads
は長期的には良い場所ではないことに気付きました。そのため、ソフトウェアフォルダをmv
ディレクトリにsource
しました。それでも、Windowsのようにターゲットリンクのことを心配することなく、以前と同じようにソフトウェアを実行できます。これは、 ハードリンク がinodeを直接見つけ、他のファイルが周りにあることを意味します。