Linuxのシンボリックリンクとハードリンクはどう使い分けますか?

どう違うのかよくわかりません。
それとも一方が新しくて一方は古く使われてない概念でしょうか?
場面も含めて例を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2010/02/05 18:18:18
  • 終了:2010/02/07 04:24:00

回答(4件)

id:e55ind No.1

e55ind回答回数162ベストアンサー獲得回数42010/02/05 18:56:41

ポイント23pt

ハードリンクは、リンクを削除したら実体も削除される

シンボリックリンクは、リンクを削除しても削除されるのはリンクのみ

http://q.hatena.ne.jp/answer

id:MASHMASH

ありがとうございます!

2010/02/07 04:20:04
id:JULY No.2

JULY回答回数966ベストアンサー獲得回数2472010/02/05 19:13:08

ポイント23pt

ソフトリンク - Wikipedia

ハードリンク - Wikipedia

まず、よく言われるのは、パーティションをまたがっている場合は、ハードリンクは使えないので、シンボリックリンクである必要があります。なので、基本的にはシンボリックリンクの方がオールマイティで使える、という感じはあります。

ただ、シンボリックリンクは Windows のショートカットファイルと同様に、本物のファイルがあって、そこへのショートカット、という意味合いなので、リンク先の本物のファイルが無いのに、シンボリックリンクだけが存在する、という状況がありえます。

それに対し、ハードリンクの場合は、「どっちが本物」という概念がありません。例えば、/tmp/foo に対して /tmp/bar というハードリンクを作った後に /tmp/foo を削除しても、ちゃんと /tmp/foo の中身が残っています。下記のように操作して見ると分かりやすいでしょう。

# cd /tmp
# echo "foo" >foo
# cat foo
foo
# ln foo bar
# rm foo
rm: remove 通常ファイル `foo'? yes
# cat bar
foo
#

ハードリンクを使っているケースでよく見かけるのは、/bin や /usr/bin の下に有るプログラムで、実体は同じなんだけど、どういうファイル名で呼ばれたかで挙動が代わる物があります。

例えば、ファイル圧縮に使われる gzip ですが、展開するための gunzip や、展開して中身を出力する zcat が、ハードリンクになっています。

# cd /bin
# ls -l gzip gunzip zcat
-rwxr-xr-x 3 root root 62228  1月 21 02:44 gunzip
-rwxr-xr-x 3 root root 62228  1月 21 02:44 gzip
-rwxr-xr-x 3 root root 62228  1月 21 02:44 zcat

まぁ、この場合、どれか一つをメインにして、残りでをシンボリックリンクでも構わない、と言えば、構わないのですが(^^;。

私が知っている中で、ハードリンクを最も効果的に使っているのは Cyrus IMAP Server と呼ばれる IMAP サーバのソフトで、このソフトの場合、基本的にはメール1通が1ファイルで保存されるのですが、複数の人に同じメールを送った場合、保存されるのは1通分で、各ユーザのメールボックスのファイルとしてハードリンクを作ります。

こうすると、人数分のファイルを作らないので、それだけディスクの節約になるのと同時に、誰かがメールを削除しても、全く問題ありません。もし、これをシンボリックリンクにしようとすると、ユーザのメールボックスとは無関係にファイルを作って、ユーザのメールボックスにはシンボリックリンクを置く、といったことになると思いますが、じゃぁ、全員が削除したときに、この本物のファイルを削除するのはどうするか? という問題が残ります。

ハードリンクであれば、全員が削除して本当に必要が無くなったときには、本体も削除されていることになるので、その点でもシンボリックリンクよりスマートです。

id:MASHMASH

ありがとうございます。凝ったら凝ったで凝った問題が(笑)

2010/02/07 04:22:38
id:km1967 No.3

km1967回答回数541ベストアンサー獲得回数402010/02/05 21:31:15

ポイント22pt

シンボリックリンクはファイル実体のコピーを作るような。つまり、シンボリックリンクが影で、実体は別に存在する。

ハードリンクはファイル実体(iノード)そのものを指す。つまり、実体が2つ(以上)できる。

このため、ハードリンクは無限ループに陥る可能性がある。またデバイスを跨いでリンクを張ることができない(iノード番号そのものであるため)。このため、あまり使い勝手はよろしくない。

http://itpro.nikkeibp.co.jp/article/Keyword/20070928/283250/

id:MASHMASH

わかりやすい! ありがとうございます。

2010/02/07 04:22:59
id:dacks1 No.4

dacks1回答回数89ベストアンサー獲得回数42010/02/05 21:33:41

ポイント22pt

これは結構わかりやすい例だと思いますがどうでしょうか↓

http://www.itmedia.co.jp/help/tips/linux/l0192.html

http://www.itmedia.co.jp/help/tips/linux/l0058.html

id:MASHMASH

確かにいい説明ですね。ありがとうございます!

2010/02/07 04:23:18

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません