UNIX:シンボリックリンクファイルを制す
inode番号の復習
前回までにこんなことを説明してきました。
- OS(オペレーティングシステム)は、ハードディスクなどに作成するファイルを、「ファイルシステム」という仕組みで管理します。
- UNIXのファイルシステムは、どこかのディレクトリにマウントして利用します。C:、D:などのドライブ名ではアクセスしません。
- UNIXのファイルシステムでは、各ファイルの情報を、inodeというデータに保存します。
- inodeには、ファイルシステム毎に一意の番号が割り振られ、その番号を inode番号といいます。
- inodeには、ファイルの名前を保存する場所がありません。ファイルの名前は、ディレクトリに保存します。
ファイルシステムの表示例
ファイルシステムは普段 df コマンドを起動することでも、よく目にしていることと思います。 次の表示の例は FreeBSDという Linuxとは異なるOSのdfコマンドの出力結果です。 ハードディスクに作成したファイルシステムとして、/、/home、/usr、/var の4つのファイルシステムを表示しています。
FreeBSD 5.3-RELEASE (www) #3: Sat Dec 18 01:06:07 JST 2004 wwwsv06% df -k Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ar0s1a 253678 47024 186360 20% / devfs 1 1 0 100% /dev /dev/ar0s1f 32494668 6626562 23268534 22% /home /dev/ar0s1e 4058062 965550 2767868 26% /usr /dev/ar0s1d 4058062 696530 3036888 19% /var wwwsv06%図1 FreeBSDの df コマンド出力情報
会社の内線番号一覧
ディレクトリには、ファイルの名前とそのinode番号を格納します。 また、ディレクトリは、そのファイルの存在するファイルシステムと同じファイルシステムに存在しなければなりません。 つまり、inode番号はそのファイルシステム内でのみ一意であり、異なるファイルシステムではまったく意味をもちません。
例えば、わが家には、FAX機能付きの電話機1台(親機)と子供の部屋用に子機が2台あります。 この3台の電話機には それぞれ 親機、子機1番、子機2番を識別する番号が存在し、簡単なボタン操作で電話をかけることができます(そのはずです)。 親機、子機を識別する番号は、家の中では一意ですが、隣の家の電話機と一意ではありません。
また、会社の机の上の電話機は、内線番号を使って識別していますが、A社に 9448 という内線番号を割り当てたからといって、B社の 9448 という内線番号とはまったく関係ありません。
次のような会社の内線番号一覧をよく見かけると思いますが、実はディレクトリのデータと考え方はまったく同じです。
氏名 内線番号 鈴木 3313 田中 9448 斉藤 5511 佐藤 3551
ディレクトリとファイルのリンクはファイルシステム内で有効であり、異なるファイルシステムにまたがることはできません。ファイルシステムにまたがって一意にファイルを示す、電話番号に相当するものはありません。
シンボリックリンクファイルの登場
この問題を解決するために、シンボリックリンクファイル(またはソフトリンク)という考え方が導入されました。 シンボリックリンクファイルにより、どこのファイルシステムに存在するのかを意識することなく、自由にファイルに名前を付けることができるようになりました。 シンボリックリンクファイルは、inode番号を使ってファイルを指し示すのではなく、そのファイルのパス名を使用します。
■ファイルシステム1
/home/user/log/test.log ファイル(シンボリックリンクファイル)
=======================================================================
+--------------+
| ino |name |親ディレクトリ
+--------------+
| 505 |test.log|--+
+--------------+ |
| inode
+->+--------------+
|ino = 505 |
|nlink = 1 | test.logのデータ
|mode = S |--->+-----------------------+
+--------------+ |/var/log/debuglog +---+
+-----------------------+ |
|
|
■ファイルシステム2 |
/var/log/debuglog ファイル(参照先のファイル、実ファイル) |
=====================================================================|
+--------------+ |
| ino |name |親ディレクトリ |
+--------------+ |
| 123 |debuglog|--+ |
+--------------+ | |
| inode |
+->+--------------+<-------------------------------+
|ino = 123 |
|nlink = 1 | debuglogのデータ
|mode = R |--->+-----------------------+
+--------------+ |Jan 1 11:12:33 s01 ...|
+-----------------------+
=======================================================================
図2 シンボリックリンクの構成
シンボリックリンクファイルを作成する
シンボリックリンクファイルの作成も ln コマンドを使用します。ハードリンクと異なるのは、"-s" オプションを指定することだけです。 上記例では
- ファイルシステム2には、/var/log/debuglog ファイルが存在する。
- ファイルシステム1の /home/user/log ディレクトリに test.log シンボリックリンクファイルを作成する。
- このファイルの指し示す先は、"/var/log/debuglog"である。
$ pwd /home/user/log $ ln -s /var/log/debuglog /home/user/log/test.log $ ls -l total 4 lrwxr-xr-x 1 user wwwuser 17 Apr 24 22:03 test.log -> /var/log/debuglog ...図3 ln コマンドの実行例
シンボリックリンクを制して、システムを構築する
シンボリックリンクとはとっても簡単な考え方です。一般ファイルやディレクトリなどとは異なる形式の inode で、データ部分には参照先のパス名のみしか格納することができない特殊なファイルです。
ハードリンク、シンボリックリンクを完全に理解することで、柔軟なシステム構築が可能になります。
| 固定リンク | コメント (3) | トラックバック (19)

最近のコメント