シンボリックリンクとハードリンクの違いって?


シンボリックリンクとハードリンクの違いや使い分けについてご存知でしょうか?
自分はよく知らなかったので、関連する記事をいろいろ探してみました。

図として直感的にわかりやすかったのはこちらの記事。
それぞれの特徴についてもわかりやすく書かれています。
https://eng-entrance.com/linux-permission-link

シンボリックリンク

シンボリックリンクはショートカットというイメージがわかりやすいのではないでしょうか?
original_fnameというファイルを参照するシンボリックリンクsymkink_fnameを作成することを考えてみましょう。

./original_fname
./symlink_fname

ここで

cat ./symlink_fname

を実行すると

cat ./original_fname

と同等の操作を意味するはずです。
つまり、

rm ./symlink_fname


rm ./original_fname

と同等になってしまい、元のファイルoriginal_fnameを削除することになってしまいます。

これに関して、シンボリックリンク削除時の注意点が例えばこの記事に書かれています。
https://mimirswell.ggnet.co.jp/blog-165
要はrmコマンドでもリンクを削除できるけど、危ないからunlinkを使おうね、という話です。

ハードリンク

これに対し、ハードリンクはどうでしょうか。

./original_fname
./hardlink_fname

それぞれのパスは同じ実体ファイルを指し示すことになります。
この状態で


open ./hardkink_fname

を実行すると、

open <実体ファイル>

の意味になります。
面白いのは、実体ファイルへの参照カウンタのようなものがあり、

rm ./hardkink_fname

を実行すると、./hardkink_fnameというパスは削除されてしまいますが、実体ファイルは削除されません。

なぜなら、今考えている状況だと元々
./original_fname
./hardlink_fname
の2つの「参照」が存在していたため、「参照」を1つ削除してもまだ1つ残っているからです。

そして、「参照」の数が0になると、実体も削除されるらしいです。

inodeと実体ファイル

今までイメージを掴むために「実体」や「参照」という言葉を使ってきましたが、きちんと説明するにはinodeに触れる必要があります。

わかりやすいのはこちらの記事でしょうか。
https://qiita.com/katsuo5/items/fc57eaa9330d318ee342

ハードリンクの使い道

一般的に使われるのはシンボリックリンクの方らしいですね。
では逆に、ハードリンクはいつ使われるのでしょうか?

こちらの質問に対する回答を読むと、なるほど!と思えます。
https://q.hatena.ne.jp/1265361495

IMAPサーバで、送信先が複数人のメールを参照するのに使われているとのこと。
コピーせずに済む&適切に削除が行われる、ということですね。

...勉強になりました!