2006 年 10 月 8 日 23 時 58 分

UNIX ファイルシステムのリンク機能


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


UNIX 系のファイルシステムには、
ハードリンクとシンボリックリンクがある。

これらは、ファイルに別名をつける機能である。
同じデータを参照する別名のファイルを作成するので、
ファイルのコピーと異なり、余計な容量を占有しない。

ハードリンクは、ファイルに複数の名前を持たせる機能である。

あるファイルに対してハードリンクを作成することで、
1 つのファイル内容に対して、複数のファイル名が対応する。

1 方のファイル名でファイルに変更を加えた場合は、
別のファイル名でもその変更内容にアクセスができる。
これは、ファイルの内容が共有されていることを意味する。

ハードリンクの場合、対応するファイル名に主従関係はなく、
ファイルのデータは、ハードリンクされている、
全てのファイルを削除しない限りは失われることはない。

そのため、ハードリンクは、
単純な削除防止機構として使うことができる。

あるファイルにハードリンクを張っておけば、
元のファイルを削除しても、別のファイル名で、
元のデータにアクセスできることになるからだ。

ハードリンクは、ln コマンドで作成することができる。

    $ echo CONTENT > ./file1.txt
    $ ln ./file1.txt ./file2.txt
    $ cat ./file2.txt
    CONTENT

file1.txt file2.txt は同じ内容「CONTENT」を指す、
対等なファイルとなる。
そのため、最初のファイルを削除してもデータは失われず、
file2.txt を使ってアクセスすることができる。

    $ rm ./file1.txt
    $ cat ./file2.txt
    CONTENT

シンボリックリンクは、別のファイル名を指し示す、
特殊なファイルを作成する機能である。

シンボリックリンクの指すのはファイルデータではなく、
「ファイル名」である点が、ハードリンクと異なる。

これは、Windows のショートカットファイルに近い。
(近いだけで等しくはない)

シンボリックで作成したファイルは、特殊なファイルとなり、
内部にファイル名を格納している。

シンボリックファイルを読み書きする際は、
シンボリックファイル自体ではなく、
シンボリックファイルが示すファイルに対して
アクセスしたことになる。

シンボリックリンクは、ln コマンドに、
-s オプションをつける事で作成することができる。

    $ echo CONTENT > ./file1.txt
    $ ln -s ./file1.txt ./file2.txt
    $ cat ./file2.txt
    CONTENT

シンボリックファイルは、名前を持っているだけなので、
リンクが指し示すファイルが存在することは保証しない。
つまり、元のファイルを削除してしまうと、
シンボリックファイルからもアクセスができなくなる。

    $ rm ./file1.txt
    $ cat ./file2.txt
    cat: ./file2.txt: No such file or directory

シンボリックリンクのメリットは、
ディレクトリにも張ることができるということである。
この場合、シンボリックリンクのパスを使って、
リンクの指す実際のディレクトリにアクセスすることができる。
これは、バージョン管理には最適な方法だ。

例えば、mysql の複数の版を以下にインストールするとする。

    /usr/local/mysql-5.0.24/
    /usr/local/mysql-4.1.21/
    /usr/local/mysql-4.1.13/

どのディレクトリにも ./bin/mysql コマンドがあるとする。

    /usr/local/mysql-5.0.24/bin/mysql
    /usr/local/mysql-4.1.21/bin/mysql
    /usr/local/mysql-4.1.13/bin/mysql

これに対して、以下のようなシンボリックリンクを作る。

    /usr/local/mysql => /usr/local/mysql-5.0.24
    /usr/local/mysql-4 => /usr/local/mysql-4.1.21

左がシンボリックファイル名、右が指し示すファイル名だ。
これは、主にバージョン非依存のパスを示すのに用いる。

こうしておけば、/usr/local/mysql/bin/mysql とすることで、
常に最新の mysql コマンドが利用できる。
/usr/local/mysql-4/bin/mysql とすれば、
mysql のバージョン 4 系の最新版が利用できる。

また、設定ファイル等でも、基本的に
/usr/local/mysql/ を使ってパスを指定しておけば、
シンボリックリンクを張り替えるだけで、
簡単に動作しるバージョンを切り替えることができるのだ。

このように、リンクは UNIX で重要な役割を果たしている。

それでは Windows ではどうなのだろうか。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.