はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

FHS 〜置くべき場所に置け〜

はじめに

つまり、Filesystem Hierarchy Standard←これ読もう、ということ。

Ubuntuを触っていると、binやdevとかのディレクトリに図らずもいかねばならんときがある。
でもそもそも、binとかdevとか何々です?と疑問に思いつつも今までPATHを.zshrcに追記してたりしてた。

そんな悩みを解決してくれるのが、FHS(Filesystem Hierarchy Standard)。
これにはディレクトリの用途に関してや、どんなファイルをどのディレクトリに置くべきか、などが書いてある。

が、長いし英語だし死ねるので参考書やFHSに載ってる重要なものについてだけガーっと触れる。

FHS?

Wikipediaさんより

Filesystem Hierarchy Standard(FHS、ファイルシステム階層標準)は、Linuxと他のUNIXオペレーティングシステムでの主なディレクトリとその内容を定めたものである。大部分において、BSD系のディレクトリ階層を基にして拡張し定式化している。

つまるところ、「お前らUNIXを使うからにはこれに則ってディレクトリ構造作れよ?絶対だぞ?」といった感じ。
これが定められる前は、はびこるUnix系OSと独自構造で阿鼻叫喚だった様子。

現行標準となっているのは2004年にリリースされた2.3だが、どうもFHS 3.0 Draft 1 | The Linux Foundationによると今年の7月1日に3.0としてドラフト版がリリースされている。

構造

といっても、基本的にうまくまとめられている様子なので、3つの資料を元にそれぞれに書いてあるものをまんま引用して表形式で並べます。

エンタープライズ: - 第14回:FHSによるディレクトリの規格化』からの引用は引用符(FHSの和訳っぽい様子で、一番しっかり書いてあるため)

Filesystem Hierarchy Standard - Wikipedia』からの引用は頭にW:
参考書の『Amazon.co.jp: 改訂 新Linux/UNIX入門: 林 晴比古: 本』からの引用は頭に参:

/bin

 /binディレクトリは,「システム管理者やユーザーが利用し,且つ起動時やメンテナンス時に必須のコマンド類」を格納するために利用される。シェルやファイルの属性変更,ファイルのコピーや削除といった代表的なコマンドは,この/binディレクトリに配置する。

W:シングルユーザモード(英語版)で必要となる一般ユーザー向けの基本コマンドの実行ファイル (binaries)。例えばcat、ls、cpなど。
参:バイナリ形式の実行可能ファイル。UNIXの基本コマンドがここに置かれる(ls, cp, mvなど)

/boot

 /bootディレクトリには,「起動時に必要なカーネルイメージやブートローダー」ファイルなどが配置されている。

 カーネルのイメージ(vmlinuz)は,ルートディレクトリ(/)またはこの/bootディレクトリのいずれかに配置されていなければならない。

W:ブートローダー (boot loader) 関連のファイル群。例えば、カーネルや initrd(初期RAMディスク)。通常は別パーティション。
参:Linuxカーネルやブート処理に必要なファイルが置かれる。

/dev

 /devディレクトリには,デバイスファイルが配置されている。/dev/cdromなどが該当する。

W:基本デバイス(device)。例えば、/dev/nullなど。
参:デバイスファイルが置かれる

/etc

 /etcディレクトリには、このシステムの環境設定ファイルを配置する。

 システム管理者は,/etcディレクトリ内のファイルを編集することでシステムの環境設定を行う。FHSでは,システム設定に必要なファイル群は,この/etcディレクトリ下にまとめて配置するように構成されている。このため/etcディレクトリ以外に格納されているファイルを編集する必要がないよう配慮されている。

W:システム全体に関わる固有設定ファイル群。
参:システム管理用の各種設定ファイルと起動時に実行されるスクリプトが置かれる。

/etc/X11

 X Window Systemの設定ファイルを保存するためのディレクトリ。Xconfig, XF86Config, Xmodmapなどのファイルが含まれる。

W:X Window System, version 11 用の設定ファイル群。

/home

 /homeディレクトリは必須ではない。このため,用意されていても,いなくてもよいのだ。

 一般に/homeディレクトリには,各ユーザーがファイルを保存できるようにユーザー名と同名のディレクトリをそのユーザーが所有するように作成し,その下を各ユーザーが自由に読み書きできるように設定する。

W:ユーザーの ホームディレクトリ (home directory) 群。セーブファイル、個人用設定など。別パーティションとすることが多い。
参:ユーザのホームディレクトリが置かれる。

/lib

 /libディレクトリには,/binディレクトリや/sbinディレクトリに置かれたコマンドの実行に必要となる共有ライブラリファイルを配置する。

 /libディレクトリの内容は,OSをインストールする際に標準で用意される。システム管理者は,/libディレクトリに後からインストールする共有ライブラリを保存すべきではない。さもないとOSのアップグレード時やパッチ適用時に上書きされる可能性があるためだ。

 また,起動や/bin,/sbinディレクトリ内のコマンドの実行に必須とされない共有ライブラリは,この/libディレクトリではなく,後述の/usr/libディレクトリに保存する。

W:/bin/ や /sbin/ にある実行ファイルの基本となるライブラリ (library) 群。
参:共有ライブラリ(C言語のライブラリなど)が置かれる。

/mnt

 /mntディレクトリは,一時的にマウントする場所として利用する。例えば,フロッピーディスクやCD-ROMのマウント先として利用するのだ。このディレクトリ下にはどのような実ファイルも存在しない。

W:ファイルシステムの一時マウントポイント (mount)
参:CD-ROMやFDの一時的なマウント用ディレクトリ。実体は空のディレクトリ。/mnt/cdromや/mnt/floppyなどがある。

/media(補足)

FHSの2.3より追加された、CD-ROMなどのリームバブル媒体(media)のマウントポイントはこちらになった様子。

/opt

 /optディレクトリ下は,付加的なアプリケーションのインストール先に使われる。

 /optディレクトリにはパッケージ名のサブディレクトリを作り,その下に個々のアプリケーションのプログラムをインストールする。

W:オプション (option) のアプリケーションソフトウェアパッケージのインストール用

/proc

W:カーネルやプロセス (process) の状態に関する情報を主にテキストで示す仮想ファイルシステム(例えば、実行時間やネットワークなど) 用。procfsのマウントポイント。
参:Linuxカーネルの動作情報を含む特殊なファイルシステム

/root

 /rootディレクトリは,rootユーザーのホームディレクトリだ。この位置が必須ではないが,/rootディレクトリをrootユーザーのホームディレクトリとして用意しておくことが推奨されている。ランレベル1で動作する際を考えれば,home/ディレクトリ下にroot/が含まれない理由も自ずとから分かってくるだろう。

W:rootユーザのホームディレクトリ。
参:スーパーユーザのホームディレクトリ

/sbin

 /sbinディレクトリには,システム管理者が用いるコマンド群が配置されている。

 システム管理者が用いるコマンドを格納するディレクトリは,この/sbin以外にも,後述する/usr/sbin,/usr/local/sbinの2つのディレクトリがある。

 /sbinディレクトリには,起動時やメンテナンス時に必要とされるコマンド類を格納し,起動やメンテナンスに必須とされないコマンドについては,/usr/sbinディレクトリに格納する。

W:システム管理系コマンドの実行ファイル群(例えば、init、ip、mount)。(system binaries)
参:システム管理者が使用する実行可能ファイルが置かれる。shutdown、mountなど緊急時に必須のコマンドが置かれる。

/tmp

 /tmpディレクトリは,一時的に利用するテンポラリファイルを格納するのに用いられる。

 /tmpディレクトリに保存したファイルやディレクトリは,システムの起動時にすべて削除される。

W:一時ファイル置場 (temporary files)。/var/tmp も参照されたい。リブート時に内容が保持されない。
参:一時的なファイルの置き場として使用される。

/usr

 /usrディレクトリは,システムの起動時には必要がないファイルを配置するためのものだ。

 /usrディレクトリ内のファイルは,システムによって書き換えられることはない不変のデータとして構成される。そのため,/usrディレクトリ以下をNFSなどを使ってネットワークで他のコンピュータと共有して利用したり,読み取り専用でマウントしたりしても,問題なく動作することが保証される。

W:ユーザーが共有する読み込み専用データの第二階層。大部分の(マルチ)ユーザ・ユーティリティとアプリケーションを格納する[26] (User Services and Routines)。
参:起動には必要ないが重要なプログラムが置かれる。

/usr/bin

 /usr/binディレクトリには,一般ユーザーが用い,且つ起動時に必要がないコマンド群を配置する。次のファイルが存在するかどうかは任意である。

W:一般ユーザ向けだが基本的ではないコマンドの実行ファイル(シングルユーザモードで必要としない)。
参:UNIXの一般コマンド

/usr/include

 /usr/includeディレクトリには,一般的なインクルードファイルが格納される。ここのインクルードファイルは,OSのインストール時に用意されるものだ。システム管理者が後からインクルードファイルをインストールする場合には,後述の/usr/local/includeにインストールする。

W:標準 includeファイル群
参:C言語のヘッダファイル

/user/games

 OSで標準に提供されるゲームのバイナリファイルが格納される。システム管理者が後からインストールするゲームは,後述の/usr/local/gamesディレクトリにインストールしよう。

参:ひと休み用

/usr/lib

 このディレクトリには,/usr/binや/usr/sbinディレクトリに格納したバイナリを動作させるために必要な共有ライブラリファイルがインストールされる。システム管理者が後から独自の共有ライブラリファイルをインストールしたい場合には,後述の/usr/local/libディレクトリにインストールする必要がある。

W:/usr/bin/ や /usr/sbin/ にある実行ファイルの基本となるライブラリ (library) 群。

/usr/local

 /usr/localディレクトリは,システム管理者がインストールする各種ファイルを保存するディレクトリだ。

 このディレクトリ内に格納したファイルは,完全にシステム管理者に開放されている。OSのシステムインストール直後は,ディレクトリ階層だけが用意されていて中身は空になっている状態だ。

 システム管理者が何らかのアプリケーションをインストールしたいのであれば,この/usr/localディレクトリ下か,前述した/optディレクトリ下にインストールしよう。

W:ホスト固有のローカル (local) データを格納する第三階層。通常、さらにサブディレクトリとして bin/、lib/、share/ などを持つ

/usr/share

 アーキテクチャに依存しないファイル群,例えばオンラインマニュアルなどが含まれる。

W:アーキテクチャに依存しない共有 (shared) データ
参:UNIXのマニュアルなど

/var

 /varディレクトリは,動的に変化するファイルを格納する。例えば,キャッシュデータやシステムログ,プロセスIDのファイルなどが動的に変化するファイルに相当する。また,Red Hat Linux 7.2などでは,Apacheで公開するドキュメントなどもこのディレクトリ下に設定されている。

 /varディレクトリには書き換えられるファイルが含まれるため,読み書きできるようにマウントしなければならない。またファイルサイズも大幅に増減することが考えられるため,/varディレクトリには十分な空き容量が確保されている必要がある。

W:可変 (Variable) なファイル群。内容が常に変化するようなファイル群を格納する。例えば、ログ、スプール、一時的電子メールファイルなど。別パーティションとすることもある。

おわりに

というか、これは読んで理解するというより、実際にcdで行ってlsしてみんとよくわからん!

参考資料

Amazon.co.jp: 改訂 新Linux/UNIX入門: 林 晴比古: 本, p188-p189.
Filesystem Hierarchy Standard - Wikipedia, http://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard.
エンタープライズ: - 第14回:FHSによるディレクトリの規格化, http://www.itmedia.co.jp/help/howto/linux/0007master/14/.