Linux独特の/usrとか/etcのディレクトリ構造ってどういったルールになっているんだろうと疑問を持ってググってたら辿り着いたのがFHS(Filesystem Hierarchy Standard)という仕様。
2012年9月現在のバージョンは2004年1月にアナウンスされた2.3が最新。PDFにして45ページの軽量なドキュメントだったので、ざっと読んだ内容をメモ。
FHSに書いてあること
- トップディレクトリ以下階層にあるべきディレクトリ/ファイルとオプショナルで存在するディレクトリ/ファイルの定義
- それぞれのディレクトリ毎の用途/利用目的
これを理解すれば、例えばあるソフトウェアの設定ファイルはこのディレクトリにインストールされログファイルはこのディレクトリ以下に出力される、といったことが理解しやすくなる。具体的にはrpmでインストールしたデーモンの設定ファイルが/etc以下にあってログは/var/log以下に出力されるっていうところの話です。
shareable/unshareableとstatic/variableという2軸の分類
shareableとは複数のユーザー/ソフトウェアによって利用されるリソース(unshareableはshareableではないもの全て)、staticは実行可能なバイナリやライブラリやドキュメンテーションなどシステム管理者によってのみ変更されるリソース(variableはstaticじゃないもの全て)。この2軸で分類した目的の単位でディレクトリは作成されているべきという考え方。ドキュメントに書いてあった具体例は以下の通り。
| shareable | unshareable | |
|---|---|---|
| static | /usr /opt |
/etc /boot |
| variable | /var/mail /var/spool/news |
/var/run /var/lock |
各ディレクトリの詳細
ドキュメントには各ディレクトリ毎に用途やあるべきサブディレクトリ/ファイル(バイナリなど)が細かく定義されている。主に自分がよく分かっていなかったものについてメモ代わりに書いていく。
rootディレクトリ
以下のディレクトリ(シンボリックリンクでも可)が要求される。
| Direcotry | Description |
|---|---|
| bin | 必須のコマンドバイナリ |
| boot | boot loaderのための静的ファイル |
| dev | デバイスファイル |
| etc | ホスト毎の設定ファイル |
| lib | 必須の共有ライブラリ、カーネルモジュール |
| media | リムーバブルメディア(CDなど)のマウントポイント |
| mnt | 一時的にマウントされるファイルシステムのマウントポイント |
| opt | 追加のソフトウェアパッケージ用 |
| sbin | 必須のシステムバイナリ |
| srv | サービスのデータ |
| tmp | 一時ファイル |
| usr | セカンダリ階層(ユーザー独自のディレクトリ空間ってことでおk?) |
| var | Variableなデータ |
/usrと/varについてはディレクトリ内でさらに細分化された定義があるので後述される。
以下はオプショナル。
| Direcotry | Description |
|---|---|
| home | ユーザーホームディレクトリ |
| lib<qual> | 共有ライブラリの代替ディレクトリ |
| root | rootユーザーのホームディレクトリ |
アドオンソフトウェアパッケージのための/opt
ルート直下の/optディレクトリはアドオンソフトウェアパッケージがインストールされるディレクトリ。/opt/<package>のようにパッケージ毎に別々のディレクトリが作成されてインストールされるべきと定義されている。ただしそのアドオン用の設定ファイルは/etc/optだったり、variableなファイルは/var/optだったりで横断的にoptというディレクトリが定義されている。
| Directory | Discription |
|---|---|
| /etc/opt | opt用の設定ファイル |
| /var/opt | opt用のvariableなデータ |
そういやMacPortsでインストールされるものは/opt以下にぶち込まれるよね。
/usrディレクトリ
「second major section of the filesystem」とあるルートディレクトリに対してセカンダリな階層。/usrディレクトリはshareableでread-only。
| Direcotry | Description |
|---|---|
| bin | 大部分のユーザーコマンドが格納される |
| include | Cプログラムのヘッダーファイル |
| lib | ライブラリディレクトリ |
| local | ローカル階層 |
| sbin | 必須ではないシステムバイナリ |
| share | アーキテクチャに依存しないread-onlyなデータ、例えばmanファイルなど |
以下はオプショナル。
| Direcotry | Description |
|---|---|
| X11R6 | XWindow system, version 11 release 6 |
| games | Games and educational binaries |
| lib<qual> | 共有ライブラリの代替ディレクトリ |
| src | 参照用のソースコード格納ディレクトリ |
/binと/usr/binについては/binには必須のバイナリが格納される(cat, chmod, chown, cp, date, …)。システム上必須ではないだけで大部分のプログラムは/usr/binに格納される(perl, python, tclsh, wish, expect, etc…)。
/usr/localディレクトリ
システム管理者がソフトウェアをローカルにインストールする場合に利用するディレクトリ。インストールされるソフトウェアは/usr以下のものを置き換えるorアップグレードするでも無い限りは/usr/local以下にインストールされるべき。
/usr/share/manディレクトリとmanのsection
システムのプライマリなmanディレクトリが/usr/share/manディレクトリ。マニュアルページは<mandir>/<locale>/man<section>/<arch>に格納される。セクションは以下に分類される。
| Section | Description |
|---|---|
| man1 | User programs |
| man2 | System calls |
| man3 | Library functions and subroutines |
| man4 | Special files |
| man5 | File formats |
| man6 | Games |
| man7 | Miscellaneous |
| man8 | System administration programs |
/varディレクトリ
variableなデータを格納するディレクトリ。spool、ログファイル、一時的なファイル、ロックファイルなどなど。Requirementなディレクトリは以下。
| Direcotry | Description |
|---|---|
| cache | アプリケーションのキャッシュデータ |
| lib | Variable state information |
| local | /usr/localディレクトリのための領域 |
| lock | ロックファイル |
| log | ログファイル |
| opt | /optディレクトリのための領域 |
| run | 実行プロセスと関連のあるデータ |
| spool | アプリケーションのspoolデータ |
| tmp | リブートの間でも保存される一時データ? |
Linux特有のディレクトリ/ファイル
ドキュメントではいくつかの特定OSでのみの定義も書かれている。と思いきやLinuxのみ。いくつか抜粋。
| Direcotry | Description |
|---|---|
| /dev/null | nullデバイス |
| /dev/zero | zeroデバイス |
| /dev/tty | 端末デバイス |
| /lib64 | 64-bitライブラリ |
| /lib32 | 32-bitライブラリ |
| /proc | Kernel and process information virtual filesystem |