Linux ディレクトリ構造の標準仕様(FHS)について

最終更新日

FHSとは

Daniel Quinlan氏らによってまとめられ提唱されているディレクトリ構成を示したファイルの標準化仕様書。

FHSは、Linuxディストリビューション間のファイルやディレクトリ構造の違いによる混乱を防ぎ、互換性を保つために作成された。
ディレクトリ構造を示すだけでなく,ディレクトリの用途やどのようなファイルをどのディレクトリに配置すべきかなどまで示されています。


そのため,OSの各種設定をするときに役立つばかりか,RPMパッケージではなくソースファイルをダウンロードしてアプリケーションをインストールしなければならない場合でも,どのディレクトリに保存するのが適切かを理解する上でも参考になる。

FHSは、UNIX系OSにも適用可能なものになっている。

公式サイト

ディレクトリ編集

FHSにおいて,システム管理者がプログラムをインストールするために利用できるディレクトリは,/usr/local以下だけである。 ※/usr/localディレクトリにサブディレクトリを作成する事は、推奨されていない。

なぜならば,それらのディレクトリには,OSで標準提供されているコマンドが含まれるため,
これらと合わさってしまい後からインストールしたコマンドなのかが分からなくなる可能性があり,
OSのアップグレードやパッチの適用によって書き換えられてしまうことも予想されるためだ。

規模の大きなアプリケーションであるならば,/usr/localディレクトリではなく,
/optディレクトリにインストールすることも検討してもよいだろう。

/optディレクトリは,アプリケーションパッケージごとにサブディレクトリを分けて格納することを想定して
考えられたディレクトリだ。この/optディレクトリに格納したファイルも,OSのアップグレードやパッチの適用
によって書き変わってしまうことはない。

1.起動時に必須のファイル群

+-bin            バイナリのコマンド群
+-boot           起動時に必要とするファイル群
+-dev            デバイスファイル
+-etc            システムの環境設定ファイル群
|   +--opt       /optディレクトリに格納したパッケージのための環境設定ファイル群
|   |   |
|   |   +-       パッケージ名
|   +--x11       X Window Systemの環境設定ファイル群
|   +--sgml      SGMLやXMLのための環境設定ファイル群
+-lib            共有ライブラリ群
|  +--modules    カーネルモジュール群
| 
+-mnt            一時的なマウンティング先
+-opt            ソフトウェアの拡張パッケージ群
|  +--パッケージ名
+-root           rootユーザーのホームディレクトリ
+-sbin           システム管理者が利用するコマンド群
+-tmp            テンポラリファイル群。再起動後に削除される

2.起動時になくてもよいファイル群

/usrディレクトリは,システムを構築するディレクトリではあるが,
これらには起動時に必須のコマンドをインストールするわけではない。
起動後に利用されるコマンドがインストールされる場所だ。

そこで,別のパーティションとして用意しておき,マウントして利用する形にしても問題はない。
マウントする形式にしておけば,万が一システムファイルが破損した場合でも,
正常に動作しているシステムにマウントし直せばすぐに復旧できるというメリットもある。

|
+-home               ユーザーのホームディレクトリ
|  +--ユーザー名
+-usr                様々なファイル格納するための第二階層
|  +--bin
|  |   +--mh         MHメールのためのコマンド群
|  |   +--X11        /usr/bin/X11へのシンボリックリンク
|  +--include        一般的に利用されるインクルードファイル群
|  |     +--dad      BSDシステムで一般的に利用されるインクルードファイル群
|  +--games          ゲームプログラム群
|  +--lib            一般的に利用される共有ライブラリ群
|  |   +--sendmail   /usr/sbin/sendmailへのシンボリックリンク
|  |   +--X11        /lib/X11へのシンボリックリンク
|  |
|  +--local          システム管理者があとからインストールするファイルを格納するディレクトリ
|  |   +--bin
|  |   +--games
|  |   +--include
|  |   +--lib
|  |   +--man
|  |   +--sbin
|  |   +--share
|  |   +--src
|  +--sbin            システム管理者が利用する一般的なコマンド群
|  +--share           アーキテクチャに依存しないファイル群
|  |    +--man        オンラインマニュアル群
|  |    +--misc       その他データ群
|  |    +--dict       辞書データ群
|  |    +--doc        その他ドキュメント群
|  |    +--games      /usr/gamesに格納されたプログラムで使われている静的なデータ群
|  |    +--info       GNUのinfoシステムで使われてるデータ群
|  |    +--locale     地域情報群
|  |    +--nls        NLS(Native language support)のためのメッセージカタログ
|  |    +--sgml       SGMLやXMLのデータ群
|  |    +--terminfo   terminfoのためのデータベース群
|  |    +--tmac       troffマクロのためのデータ群
|  |    +--zoneinfo   タイムゾーンのデータ群
|  +--src             カーネルのソースファイル
|  +--X11R6           X Window Systemバージョン11リリース6のファイル群

3.動的に変化するファイル群

/var以外のファイルシステムは,OSやプログラムによって書き換えられるファイルは含まれない。
よって,ユーザーや管理者が書き換える必要がないのであれば,/var以外のファイルシステムは,読み取り専用でマウントしても構わないのだ。

 例えば,特定の機器に組み込むシステムなどでは,/varディレクトリをRAMディスクに割り当てて,
その他のディレクトリはROMに割り当てるといったことが可能だ。また,通常のシステムであっても,
/var以外を読み取り専用にマウントすることで不正な書き換えを防ぎ,セキュリティ面でも意識されたシステム構築が可能となるのだ。

|
+--var                      動的なデータを格納する場所
|   +--account              アカウントのログを記録するディレクトリ
|   +--cache                キャッシュ情報を保持するディレクトリ
|   |    +--fonts           フォントキャッシュ
|   |    +--man             manのキャッシュ
|   |    +--www             Webのキャッシュやプロキシデータ
|   |    +--パッケージ名      各パッケージが利用するキャッシュ
|   +--crash                システムのクラッシュ時にダンプデータを保存する。
|   +--games                ゲームプログラムの動的データ
|   +--lib                  動的なステータスの保持のためのディレクトリ
|   |   +--misc             その他ステータス
|   |   +--ユーザー名         各ユーザーが編集しているバックアップファイルや状態
|   |   +--パッケージツール名  パッケージのためのファイル群
|   |   +--パッケージ名       パッケージの状態などを保持するファイル群
|   |   +--hwclock          ハードウェアクロックの状態を保持するファイル群
|   |   +--xdm              X Display Managerの状態をほぞ時するファイル群
|   +--local                /usr/localディレクトリに保持したファイル群の動的データ群
|   +--lock                 ロックファイル群
|   +--log                  ログファイル群
|   +--mail                 ユーザーに届いたメール群
|   |    +--ユーザー名
|   |   +--パッケージ名
|   +--run                  実行時の動的なファイル群。プロセスIDのファイルなど
|   +--spool                スプールデータ群
|   |    +--lpd             プリンタスプール
|   |    +--mqueue          メールキュー
|   |    +--news            ニュース用スプール
|   |    +--rwho            rwhodデータ
|   |    +--uucp            UUCPデータ
|   +--tmp                  テンポラリファイル群、再起動しても削除されない
|   +--yp                   NIS(Network Informetion Service)のためのディレクトリ
+--opt                    /optディレクトリに格納したファイル群の動的データ群

補足

/etc設定ファイルがたくさん入ってる場所。サブディレクトリもたくさんある。
/home/home/[ユーザー名]が、Windowsでいう「マイドキュメント」的なとこ。
大容量のパーティションを割り当てるとよい。
/bin、/sbinシステム系のプログラムファイルを保管します。
binはcatなど全員が使うコマンド、sbinはshutdownなどrootが使うようなコマンドを保存。
Windowsでいうと「C:\WINDOWS\system32」です。
/usr「読み出し可能かつ共有可能なファイル」つまりプログラムファイルを保管します。
/bin、/sbinとの違いは、アプリケーションプログラムを保存するってとこかな。
Windowsでいうなら「C:\Program Files」。
/usr/localにはパッケージシステム(yumやYaST2)管理外のプログラムファイルを保管。
例えばLinux用のフリーソフトとかゲームとか。

FHS2.3の規定

ルートディレクトリ直下に必須とされているディレクトリは、「/bin」「/boot」「/dev」「/etc」「/lib」「/media」「/mnt」「/opt」「/sbin」「/srv」「/tmp」「/usr」「/var」となっている。