タイトル【Darwinシリーズ】UNIXシステムのシンボリックリンクカテゴリーDarwin, Darwin 1.0
作成日2000/6/20 14:37:27作成者新居雅行
Mac OSでのエイリアスについては馴染みが深いと思う。あるファイルの別名を、同じあるいは異なるフォルダに作成することができる。そして、オリジナルのファイルを改名したり移動させたりしても、エイリアスから元のファイルを探し出すことができる。よく利用するアプリケーションのエイリアスを集めるなど、システムのカスタマイズの高さを演出する重要な機能だ。Windowsでもショートカットという同様な機能をサポートしているが、オリジナルのフォルダを移動すると検索に時間がかかるなど、使い勝手はMac OSが勝っているとも言える。そのエイリアスの機能はSystem 7で導入され、そのときに「UNIXシステムにもある機能だが…」と紹介された。それがシンボリックリンクという機能であるのだが、実は様子がそこそこ違うのである。もちろん、BSD
をベースにしたDarwinでは、シンボリックリンクとつきあう必要がある。それは、Mac OS Xでも同様なのである。

UNIXではファイルの実体、すなわちファイルが存在を、複数の項目で示す手法として「リンク」がある。1つのファイルを異なる項目から参照できるための機能だ。平たく言えば、1つのファイルを複数の異なるファイル名から参照したり、あるディレクトリをまったく別のディレクトリから名前1つで参照したりするのがリンクである。そのリンクにも「ハードリンク」「シンボリックリンク」の2種類がある。ハードリンクはファイルに対して作成できるもので、作成したハードリンクは元のものと区別がつかない同等なものとなる。一方、シンボリックリンクは、元のファイルのありかのパスを記録した、文字通りの単なるリンクであり、Mac OSのエイリアスに似ている。
ハードリンクとシンボリックリンクは動作の上ではあまり違いはないと思うかもしれない。大きな違いはオリジナルのファイルを消した時に出る。ハードリンクで作成した新しいリンクは、その意味ではファイルそのものであり、ファイルの情報を見ても、「ハードリンクで作った」ということはどこにも記されない。「ln -l」コマンドでファイル一覧を見た時に、アクセス権の次に数字が記載されいているが、それはハードリンクをいくつ作ったかを記載するものだ。そこでハードリンクが作られていることは分からなくはないが、どっちがオリジナルかは作った本人しか分からない。オリジナルを削除しても、ハードリンクはやはりファイルとして残っているため、ファイルの中身は消えないわけだ。
一方、シンボリックリンクは、ファイルやディレクトリのありかを、パスで記録する。そのため、オリジナルのファイルやディレクトリを削除すると、何もないと判断する。また、ファイルの移動に対しても、絶対パスを記録しているため、移動先を参照するということはできなくなる。その意味ではMac OSのエイリアスの方が高機能だが、その違いについては、「Inside Mac OSシリーズ」の別掲の記事で論じることにしよう。

さて、リンクを作成するには、lnというコマンドを作るが、引数の与える順序がどうしても覚えられない類いのコマンドだ。ハードリンクを作る時には、

 ln 元ファイル 作成するリンク

のようにコマンドを与える。一方、シンボリックリンクを作成するときには、

 ln -s 元ファイルないしはディレクトリ 作成するリンク

のように、パラメータのsを与える。先に、オリジナルを指定して、後から作成するリンクのファイル名を与えるというあたりが、どうもいつも逆に思えてしまう。逆だと思い込みすぎるとさらにその逆をやってしまう。いずれにしても、「man ln」でいつもチェックしてしまうものである。他にもスイッチや引数の指定方法はあるが、とりあえずこれだけ知っていれば大丈夫だろう。
シンボリックリンクは、「ls -l」コマンドで参照した時、一覧の中の、行の最初の文字が「l」になる。ファイルだと「-」、ディレクトリだと「d」となる部分が、シンボリックリンクでは「l」になるというわけだ。ハードリンクは元ファイルと何ら変わることはないが、シンボリックリンクでは「ls -l」コマンドの結果でファイル名の後に「-> 元ファイルないしはディレクトリ」という記述が追加され、どこにリンクしているかは一覧から参照できる。

いずれの方法でも、リンクは元となっているファイルやディレクトリと、リンクは同じに扱える。たとえば、メールのログは、/var/log/mail.logというファイルに溜め込まれる。そこで、そのファイルをすぐに参照したいと言う場合、自分のホームディレクトリがカレントのときに「ln -s /var/log/mail.log maillog」のようにコマンドを入力して、maillogというシンボリックリンクを作る。そして、カレントがホームディレクトリの時に、「cat maillog」とか「tail maillog」でメールのログを参照することに利用できる。あるいは、Webサーバで公開ディレクトリの外部にあるディレクトリも公開するような場合に使われる手法だが、その場合はWebサーバのさまざまな設定も必要になるので、詳しくはここでは紹介しないでおこう。
関連リンク