/var/log/kozy4324

something about software development.

FHS(Filesystem Hierarchy Standard) 2.3を読んでみた

Linux独特の/usrとか/etcのディレクトリ構造ってどういったルールになっているんだろうと疑問を持ってググってたら辿り着いたのがFHS(Filesystem Hierarchy Standard)という仕様。

http://www.pathname.com/fhs/

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