各ディレクトリの役割を知ろう(サブディレクトリ編)

第3回 各ディレクトリの役割を知ろう(サブディレクトリ編)

前回は、ルートディレクトリ直下の各ディレクトリについて、どれがどう使われるのかを解説しました。今回は、さらにそのサブディレクトリについても、説明していきます。

サブディレクトリを持つディレクトリ

 ルートディレクトリ直下にあるディレクトリの中で、さらに複雑なサブディレクトリ構造を持っているのが/etc、/opt、/usr、/varの4つです。これらのディレクトリを順番に見ていきましょう。

FHS 2.2における/etcの構造

/etc  
opt/ /opt用設定ファイル
X11/(オプション) X Window System用設定ファイル
sgml/(オプション) SGML/XML用設定ファイル
図1 /etc以下の構成

 前回説明したように、各種の設定ファイルの保存場所として使われるのが/etcです。FHS(Filesystem Hierarchy Standard:前回参照) 2.2では、/etcにバイナリファイルを置かないこと、/opt用の設定ファイルを置くために/etc/optを設けることが要求されています。さらに、オプションとしてX Window System用の/etc/X11、SGMLとXML用の/etc/sgmlが規定されています。

 /etcには以下のファイルを配置することになっていますが、いずれもオプションです。

csh.login cshのシステム設定ファイル ld.so.conf 共有ライブラリのパス
exports NFSアクセス制御リスト motd ログイン後のメッセージ
fstab ファイルシステムの静的な情報 mtab ファイルシステムの動的情報
ftpusers FTPアクセス制御リスト mtools.conf mtools用設定ファイル
gateways routed用ファイル networks ネットワーク名の静的情報
gettydefs getty用設定ファイル passwd パスワードファイル
group ユーザーグループ一覧 printcap プリンタデータベース
host.conf リゾルバ設定ファイル profile shのシステム設定
hosts 静的なホスト名情報 protocols IPプロトコルリスト
hosts.allow TCP_Wrappers用設定ファイル resolv.conf DNSリゾルバ設定ファイル
hosts.deny TCP_Wrappers用設定ファイル rpc RPCプロトコルリスト
hosts.equiv rsh系コマンド用設定ファイル securetty root用にアクセス制御を行えるTTY
hosts.lpd lpdアクセス制御リスト services ネットワークサービスのポート一覧
inetd.conf inetd用設定ファイル shells 使えるシェルプログラムのリスト
inittab init用設定ファイル syslog.conf syslogdの設定ファイル
issue ログイン前の表示用ファイル

 /etc/X11に配置するべきファイルとしては、XconfigXF86Config(いずれもXFree86の設定ファイル)、Xmodmap(X11用キーボード変換ファイル)が挙げられています。もちろんこれだけではなく、X Window Systemで動作するさまざまなプログラムの設定ファイルもここに置かれます。

 /etc/sgmlには、*.confという汎用設定ファイルと*.catというDTD定義用のファイルを配置することになっています。

Red Hat Linux 7.1における/etc

 FHS 2.2で規定されているファイルやディレクトリは、必要最小限の要素にすぎません。実際、Red Hat Linux 7.1では/etcにさまざまなファイルやディレクトリが配置されています。代表的なところでは、

/etc  
FreeWnn/ 仮名漢字変換システム用ディレクトリ
cron.daily/ 毎日実行するファイル群
cron.hourly/ 毎時実行するファイル群
cron.monthly/ 毎月実行するファイル群
cron.weekly/ 毎週実行するファイル群
rc.d/ スタートアップ時に実行するプログラムの格納場所
rc0.d/ ランレベル0用スタートアッププログラム群 
rc1.d/ ランレベル1用スタートアッププログラム群
rc2.d/ ランレベル2用スタートアッププログラム群
rc3.d/ ランレベル3用スタートアッププログラム群
rc4.d/ ランレベル4用スタートアッププログラム群
rc5.d/ ランレベル5用スタートアッププログラム群
rc6.d/ ランレベル6用スタートアッププログラム群
pam.d/ パスワード認証モジュール用設定ファイル
rpm/ RPM用設定ファイル群
aliases sendmail用別名ファイル
crontab 定期実行用設定ファイル
shadow シャドウパスワード
locale 各国語データベース
logrotate.conf ログファイルの切り替え用設定ファイル
modules.conf Linux Kernelモジュールの設定ファイル
rc.local ホスト固有のスタートアッププログラム
rc.sysinit システム設定用スタートアッププログラム
図2 Red Hat Linux 7.1の/etc(主要ディレクトリおよびファイルのみ)。FHS 2.2の規定が最小限のものであることが分かる

といったところでしょうか。ディストリビューションによって違うのはもちろん、Red Hat Linux 7.1であってもインストール時のオプションなどによって変わってきます。

FHS 2.2における/opt

/opt
<package A>/
bin/
man/
<package B>/
bin/
man/
<package …>/
bin/
man/
bin/(管理者用)
doc/(管理者用)
include/(管理者用)
info/(管理者用)
lib/(管理者用)
man/(管理者用)
図3 /optの構造。ただし、現時点では/optはあまり活用されていない

 FHS 2.2では、/optの下にアプリケーションパッケージごとに専用のディレクトリ(以下<package x>で示す)を作ることになっています。なお、/optにはローカルシステムの管理者用に予約された6つのサブディレクトリがあります(図3参照)。

 プログラムは/opt/<package x>/binに配置する必要があります。また、UNIXのマニュアルフォーマットにのっとったファイル(manページ)は、/opt/<package x>/man以下に配置します。このとき、サブディレクトリの構造は後述の/usr/share/man以下と同じようにします。

 なお、パッケージが利用するのは/opt以下だけではありません。例えば、作業用のデータは/var/opt以下に、ホスト固有の設定ファイルは/etc/opt以下に配置します。

巨大な/usrのディレクトリ構造

 /usrには、読み出し可能かつ共有可能なファイルを配置します。一般的にいって、ここには多数のファイルが配置され、ディレクトリ構造も複雑になっています。

 FHS 2.2におけるサブディレクトリは以下のように定義されています。ここでも、ディレクトリによって「必須」と「オプション」に分かれます。

/usr  
bin/(必須) 大部分のユーザーコマンド
perl/(例:オプション)
python/(例:オプション)
tcl/(例:オプション)
など
include/(必須) C言語で使うヘッダファイル
lib/(必須) ライブラリファイル
local/(必須) パッケージシステム管理外
bin/(必須) ローカルにインストールしたプログラム
games/(必須) ゲーム
include/(必須) C言語用ヘッダファイル
lib/(必須) ライブラリとプログラム
man/(必須) /local/bin用manページ
sbin/(必須) 管理者用プログラム
share/(必須) アーキテクチャに依存しないデータ
src/(必須) ソースコード
sbin/(必須) システム用バイナリファイル
share/(必須) アーキテクチャに依存しないデータ
man/(必須) manページ
misc/(必須) さまざまなデータ
X11R6/(オプション) X Window System
games/(オプション) ゲームと教育用
lib<qual>/(オプション) ライブラリの代替形式
src/(オプション) ソースコード
linux/ Linux Kernelのソースコード
図4 /usr以下のサブディレクトリ構造。binやsbin、libなど、他所にもあるディレクトリがあるため始めは混乱させられる

 X Window Systemがインストールされる/usr/X11R6だけはちょっと特別扱いです。これは歴史的な経緯が絡んでいるためです。また、/usr/spool、/usr/tmp、/usr/spool/locksをそれぞれ/var/spool、/var/tmp、/var/lockに対するシンボリックリンクとして設置することもできます。これは古いシステムとの互換性を確保するためなので、できれば使わない方がいいでしょう。

/usr/bin

/usr  
bin/ 大部分のユーザーコマンド
  perl/  
  python/  
  tcl/  
  など  
図5 /usr/bin。ここはインストールするプログラムによって内容が異なる

 /usr/binは、シングルユーザーモードには不要なバイナリファイルを配置するディレクトリで、パッケージの追加や削除によってディレクトリ内のファイルは増減します。この点だけからも、/binと/usr/binでは扱いが違うことが分かるでしょう。なお、複数のバイナリファイルで構成されているアプリケーションの場合は、さらにサブディレクトリを作成します。例を挙げると、mhやperl、python、tcl、wishなどです。

/usr/local

/usr  
local/ パッケージシステム管理外
  bin/ ローカルにインストールしたプログラム
  games/ ゲーム
  include/ C言語用ヘッダファイル
  lib/ ライブラリとプログラム
  man/ /local/bin用manページ
  sbin/ 管理者用プログラム
  share/ アーキテクチャに依存しないデータ
  src/ ソースコード
図6 管理者が自由に使える/usr/local。上記のサブディレクトリは「必須」に指定されている

 /usr/local以下は、システム管理者が自分でアプリケーションをインストールする場所として利用します。ここは、システム関連のソフトウェアをアップデートしても変更されないようになっています。サブディレクトリはbin、games、include、lib、man、sbin、share、srcが必須です。各サブディレクトリの用途は、/usrや/にある同名のディレクトリに準じます。

/usr/sbin

 /usr/sbinは、比較的重要でないシステムバイナリを配置します。「比較的」というのは/sbinと比べた場合です。/sbinには緊急時に必要なプログラム、/usr/sbinは通常運用時に使うプログラム、のように使い分けられています。

/usr/share

 /usr/shareには、アーキテクチャに依存しないデータを収めます。つまり、i386システム、Alphaシステム、PowerPCシステムのいずれでも、同じものがそのまま使えるということです。/usr/share/manと/usr/share/miscが必須、それ以外はオプションです。

/usr  
share/(必須) アーキテクチャに依存しないデータ
  man/(必須) manページ
  misc/(必須) さまざまなデータ
  dict/(オプション) さまざまな辞書
  doc/(オプション) 各種ドキュメントなど
  games/(オプション) /usr/games用の静的なデータ
  info/(オプション) GNU Info用のディレクトリ
  locale/(オプション) ロケール情報
  nls/(オプション) Native Language Support(各国語サポート)用
  sgml/(オプション) SGMLとXMLのデータ
  terminfo/(オプション) terminfoデータベース
  tmac/(オプション) troffマクロ
  zoneinfo/(オプション) タイムゾーン情報
図7 /usr/shareで「必須」とされているのは2ディレクトリのみ。あとはオプション

 /usr/share/man以下にはさらにサブディレクトリがあり、それぞれ

/usr  
share/(必須)  
  man/  
    man1/ ユーザープログラム
    man2/ システムコール
    man3/ Cライブラリ関数
    man4/ スペシャル(デバイス)ファイル
    man5/ ファイルフォーマット
    man6/ ゲーム
    man7/ そのほか
    man8/ システム管理
図8 man以下のサブディレクトリは、それぞれmanページのセクション番号に対応している

のような意味を持っています。

共有できない/var

 /varホスト固有の可変データ(variable data)用領域であり、ホストごとに用意する必要があります。当然、他ホストとの共有はできません

 /varもほかのディレクトリと同様、多くのサブディレクトリを持っています。

/var  
cache/(必須) キャッシュデータ
fonts/(オプション)
man/(オプション)
www/(オプション)
<package>/(オプション)
lib/(必須) 動的状態情報
misc/(必須)
<editor>/(オプション)
<pkgtool>/(オプション)
<package>/(オプション)
hwclock/(オプション)
xdm/(オプション)
local/(必須) /usr/local用動的データ
lock/(必須) ロックファイル
log/(必須) 記録ファイル
opt/(必須) /opt用動的データ
run/(必須) 実行プロセス関連データ
spool/(必須) アプリケーション用スプール
cron/(オプション)
lpd/(オプション)
mqueue/(オプション)
news/(オプション)
rwho/(オプション)
uucp/(オプション)
tmp/(必須) システム再起動時にも保存される一時ファイル
account/(オプション) プロセス課金記録
crash/(オプション) システムクラッシュダンプデータ
games/(オプション) ゲーム用動的データ
mail/(オプション) ユーザーメールボックス
yp/(オプション) NISデータベース
図9 /varにも多くのサブディレクトリがある。あせらず、徐々に覚えていけばいいだろう

/var/cache

 /var/cacheは、一時的な記憶場所です。例えば、インストール直後のRed Hat Linux 7.1にはmanコマンドで表示する整形済みのテキストが入っていたりします。普通は容量に上限を設けて、古いものから順に捨てていきます。これによって、最近参照したデータを再び参照するとき、素早い応答が可能になります。

/var/lock

 /var/lockは、ファイルの読み書きなどで排他制御を行う場合に使います。Linuxはマルチユーザー/マルチタスクシステムですから、1つのファイルに対して同時に書き込み要求が発生する可能性があります。そのままではファイルに不整合が発生するので、書き込み中という目印のファイルを/var/lockに作成します。個々のプロセスは、このファイルを見て自分が書き込めるかどうか、あるいは読み出すデータが信頼できるものかどうかを判断します。本来ならOSに任せたい処理ですが、細かい作業を行うときにはどうしても必要になってきます。

/var/log

 各種プログラムの動作記録を収めているのが/var/logです。例えば、ブート時のメッセージを収めたboot.logを見ることで、起動時に特定のハードウェアを認識しているかどうかを確認したりします。

 また、Linux動作中の各種メッセージはmessagesに記録されます。ここを見ることで、不正なアクセスがないかどうかをある程度は判断できます。実際には、毎日ここをチェックするのは大変なのでswatchやTripwireといったチェックプログラムを使った方がいいでしょう。

 さらに、mailloghttpd-access.logも重要です。それぞれ、sendmailなどのMTA(Mail Transfer Agent)、ApacheなどのWebサーバの動作記録です。記憶に新しいところでは、Code Redによるアクセスがhttpd-access.logに記録されます。自サイトに対する攻撃だけでなく、他サイトに対する攻撃の踏み台になっていないかどうか、このファイルで頻繁にチェックする必要があります。ただし、httpd-access.logに形跡がないからといって、100%安全というわけではありませんが……。

/var/run

 /var/runにあるのは、特定プロセスのプロセス番号を含んだファイルがほとんどです。あるプロセスにシグナルを送る場合、まずpsコマンドでプロセス番号を調べる必要があります。これは面倒ですし、タイプミスの恐れもあります。そこで、

$ kill -HUP `cat /var/run/sendmail.pid`

などとタイプして使います。これならシェルによるファイル名補完などが使えるので、よりタイプが楽になるしミスも少なくなります。ただ、すべてのプログラムがここを利用しているわけではありません。

/var/spool

 spoolはSimultaneous Peripheral Operation On-Lineの省略形で、もともとはIBM用語です。本来は、動作の遅い周辺機器に対して効率よくデータを送るためのバッファです。転じて、FIFO(First In First Out)の、いわゆる「キュー」と呼ばれるバッファとして使われているようです。/var/spool/lpdは、プリンタに送るデータをためておくバッファなので、字義に近い使われ方です。ほかには/var/spool/mqueueや/var/spool/fax、/var/spool/atといったディレクトリもあります。それぞれ、うまく送れなかった電子メールやFAXのデータを保存しておいたり、atコマンドで指定されたコマンドを保存しておいたりする場所です。ここにあるデータは、各デーモンが適当な間隔でサーチすることで処理されます。従って、対応するデーモンが何かの拍子に止まってしまうと、いつまでたっても処理されないことになってしまいます。

 また、sendmailを使ったメールサーバであれば、/var/spool/mailの下に各ユーザー名と同じファイルがあります。これが、いわゆるメールボックスです。ユーザーに送られたメールは、いったんここに保存されます。その後、mailコマンドで読み出したり、POP3でメーラーに読み込んだりするわけです。最近では、MTAとしてqmailを使うサーバもあるようですが、その場合は/var/spool/mailを使わず、直接各ユーザーのホームディレクトリにメールを配送するのが一般的です。

FHSは基本パターン

 以上、2回にわたってLinuxのディレクトリ構造を解説してきました。FHS 2.2をベースとしているので、実際はディストリビューションによって微妙に違います。ですが、基本的な考え方は同じはずですから、FHSを押さえておけばだいたいの類推は可能でしょう。