Gentoo Linux は依存性をコントロールするinitsystem を使用しています。 どんな種類のセットアップにおいてもパワフルで柔軟性があり、管理しやすいはずです。 この文章は Gentoo の initsystem についてのクイックガイドにすぎません。 内部の動作を詳しく知りたい場合はソースコードを読んで下さい。
他の初期化システムと違い、 Gentoo のrunlevelは固定の名前や数字を持っては いませんが標準的なrunlevelに対応したよりわかりやすい名前を持っています。
注意: "boot", "default", "nonetwork" の 3 つのrunlevelが標準で存在します。 |
"boot" runlevelはほとんどのセットアップで標準であるべきです。 また、名前が示す通り起動時に最初に実行されるrunlevelです。 次の "default" は起動後のメインrunlevelです。 最後の "nonetwork" はサンプルです。
/etc/runlevels にrunlevelの名前のサブディレクトリがあり その中にはそのrunlevelで起動させるサービスへのシンボリックリンクがあります。
注意: サービスの追加、削除については "Utilities/helper scripts" のセクションで説明します。 |
既に述べたように名前は変更することが出来ます。ただし、併せて /etc/inittab も変更する必要があります。
重要: runlevel "boot" だけは例外ですので注意が必要です。 |
警告: runlevel "boot" の名前は絶対に変更しないでください。システムを壊してしまいます。 |
これらの作業は全て /sbin/rc が行ってくれます、そしてそれは システム稼働中にランレベルを切替える為に起動させることも出来ます。
runlevelは init に静的に関連付けられているわけではないので init の対応する数以上に設定することが可能です。このことは必要に応じてプロファイルや仮想のrunlevelを作成することを可能にします。
例えばラップトップユーザは "online" と "offline" という2つのデフォルトrunlevelを持つことが出来ます。 これにより PCMCIA の NIC が挿さっている場合とそうでない場合とでrunlevelを分けることが出来ます。 "/sbin/rc online" もしくは "/sbin/rc offline" というコマンドで PCMCIA の NIC の有無に依存したサービスの開始、停止を制御出来ます。
Gentoo の方法では X 専用のrunlevelを用意する必要はありません。 代わりに "xdm" という起動スクリプトをユーザが望むrunlevelに追加するだけです。
注意: ユーザーが望むメインのrunlevelが選択されるべきです。 |
警告: boot runlevelに追加すると望まない副作用があるかもしれません。 |
標準でそうなっていますが、getty が起動する前に xdm, gdm もしくは kdm が 実行されると X は次の利用可能なコンソールで起動されるでしょう。 遅い PC の場合、デスクトップマネージャサービスがrunlevelの初期化プロセスの終りの方にあればこれは問題になりません。 X よりも前に getty が起動され、そして X はコンソール 7 で起動されるでしょう。 しかし、速い PC の場合そうはなりません。 X はコンソール 2 で起動されてしまいます。 その後 getty が起動されるとそれはキーボードを制御し、デスクトップマネージャはキーボードサポートを失います。
これはデスクトップマネージャの起動スクリプトを 'a' などの別のrunlevelに置くことで解決できます。 runlevel 'a' は実際のrunlevelではなく "xdm" スクリプトを "telinit a" とするだけです。 runlevel 'a' の全てのサービスは現在のrunlevelの開始後、したがって getty 起動後に起動させます。
注意: runlevel 'a' についてさらに詳しく知りたい場合は init の man ページを参照してください。 |
RC-Scripts は依存性を考えた各サービスの起動の為の関数を定義したスクリプトです。 それらは /etc/init.d/ にあります。
コード表示 3.1: rc-script layout |
#!/sbin/runscript
depend() {
need bar
}
start() {
ebegin "Starting foo"
/sbin/foo
eend $? "Failed to start foo"
}
stop() {
ebegin "Stopping foo"
kill $(cat /var/run/foo.pid)
eend $? "Failed to stop foo"
}
|
注意: インタープリタは "/sbin/runscript" です。 |
注意: "depend" 関数はオプションです。 |
注意: 全ての rc-script は少なくとも "start" 関数を必要とします。 |
runlevelの中のサービスの起動順は基本的にはアルファベット順です。 ですから /bin/ls で表示される順番と同じです。
サービスには依存関係がそんざいするのでその為に起動の順番を変更することが 出来ます。方法は2種類ありますがどちらか一方しか使用できません。
ほとんどのサービスは他のなんらかのサービスに依存しています。
たとえば Postfix はネットワークとシステムロギングのサービスが必要です。
samba はネットワークサービスを必要とします。 もし印刷に CUPS を利用するのであれば samba より先に cupsd が起動している 必要があります。ただし、 cups が起動していないことは samba の起動に致命的 な問題が発生するわけではありません。
このように異なる依存関係を設定する2つの方法があります。 runlevelが変更されたり、手動でサービスを起動させたり停止させたりしても この依存関係は有効です。
サービス起動に必ず必要なサービスがある場合に使用します。
コード表示 4.1: adding logger and net as a NEED dependency |
depend() {
need net logger
}
|
注意: NEED の後に列挙するサービスはそのサービスの起動に必ず必要となります。 それらのサービスの起動に失敗した場合はそのサービスの起動にも失敗します。 |
重要: NEED の後に並べられているサービスはそのrunlevelと "boot" runlevelに追加されていなくても起動されます。 |
起動されていなくても現在のサービスは起動可能であるが、もし起動させるのであれば 現在のサービスの前に起動させるべきもの。
コード表示 4.2: adding portmap as a USE dependency to netmount |
depend() {
use portmap
}
|
netmount は標準で NFS マウントが可能であるが portmap に依存しています。 現在のrunlevelか boot runlevelに portmap が追加されていれば先に起動されます。 netmount には USE を使って先に portmap を起動させるべきです。
重要: USE に使われる全てのサービスはそのrunlevelか boot runlevelに追加されていなければなりません。 |
注意: USE に指定されているサービスが起動に失敗しても、そのサービスは起動されます。USE に指定するサービスは起動に必須であるべきではありません。 |
2 つのサービスの間に関連はないがどちらかを明示的に先または後に起動させたい場合は AFTER と BEFORE を使います。
注意: これら 2 つのタイプはrunlevelの変更時にのみ有効です。 |
これら 2 つはその他の全てのサービスを示す "*" のグラブをサポートしています。
コード表示 5.1: a glob example for AFTER |
depend() {
after *
}
|
このサービスは他の全てのサービスの *後* に起動されるでしょう。
サービスは BEFORE にリストされたサービスより前に起動されます。
コード表示 5.2: let foo start before bar (snippit of foo) |
depend() {
before bar
}
|
サービスは AFTER にリストされたサービスより後に起動されます。
コード表示 5.3: let bar start after foo (snippit of bar) |
depend() {
after foo
}
|
サービスには様々なものが存在します。通常、どれを使うかはユーザか管理者が選択します。
system loggerサービスは一例です。 この文章を書いている時点で Gentoo Linux ユーザは 4 つの中から選択することが可能です。 system loggerが先に起動されている必要のある全てのサービスは NEED に 4 つ全てを設定することは出来ません。 USE では弱すぎます。
ここが仮想サービスと PROVIDE タイプを使用する場面です。
PROVIDE は他のサービスが NEED や USE で使用する仮想サービスを定義します。
コード表示 6.1: sysklogd providing logger |
depend() {
provide logger
}
|
LOGGER は全てのsystem loggerであらかじめ設定されている仮想サービスです。 これは NEED や USE で使用できます。
NET サービスはもう一つの仮想サービスですが、 LOGGER とは違い、 明示的な PROVIDE サービスではありません。
重要: NET 仮想サービスを提供するには To provide the NET virtual, a service must:
|
全ての有効な net.* サービスで $IFACE にネットワークインターフェイスの名前がセットされます。(例: net.eth0 に "eth0" がセットされる。)
全てのサービスは標準のオプションを付けて起動されます。 ユーザの rc-script で定義する関数のうちここで言及しているものは START と STOP 以外は全て既に定義されています。
重要: start() 関数は必ず定義されてなければなりません。 |
注意: stop() 関数はそれほど重要ではなく、省略することが可能です。 |
注意: 一般的にユーザは start() 、 stop() および restart() だけを定義します。残りはそのままにしておくべきでしょう。 |
コード表示 7.1: start the httpd service |
# /etc/init.d/httpd start
|
注意: コマンドラインオプションは複数与えることが可能です。 |
コード表示 7.2: pause/start net.eth0 |
# /etc/init.d/net.eth0 pause start
|
依存するものを含むサービスの START。
依存するものを含むサービスの STOP。
RESTART が機能するにはにはサービスが起動されていなければなりません。 依存するサービスも同じように再起動されます。
重要: カスタム restart() 関数を定義する場合、サービスの開始、停止には "svc_start()" と "svc_stop()" を使用するべきです。 |
注意: 依存するサービスをこれは正しく扱うためです。 |
これはサービスを停止させますが、 STOP と違い依存サービスは停止しません。
サービスのステータスを停止にリセットします。
注意: stop() 関数の中のコマンドはどれも実行されないことに注意してください。 必要なクリーンアップ処理をユーザが行うべきです。 |
INEED そのサービスに設定してある NEED のリストを表示します。
NEEDSME そのサービスを NEED に設定しているサービスのリストを表示します。
IUSE そのサービスに設定してある USE のリストを表示します。
USESME そのサービスを USE に設定しているサービスのリストを表示します。
NEED に設定してあるサービスにもし見つからないものがあればリストを表示します。
カスタムコマンドラインオプションの追加は比較的簡単です。 rc-script にオプションの名前の関数を定義し、次のように $opts 変数に追加します。
コード表示 8.1: foo as a custom option |
opts="${opts} foo"
foo() {
............
}
|
基本的に設定には環境変数を用いますが、 rc-script の中で定義するのではなく、個別の設定ファイルに記述します。
一つ目は各 rc-script 毎のファイル、後の2つは全体の設定ファイルです。
コード表示 9.1: config files for rc-scripts |
/etc/conf.d/<name of rc-script> /etc/conf.d/basic /etc/rc.conf |
注意: これらの3つのファイルはリストの順に読み込まれます。 |
重要: 全ての NET サービスは /etc/conf.d/net も読み込みます。 |
rc-update はrunlevelのサービスを追加、削除するツールです。 rc-pudate は依存関係のキャッシュを更新する為に内部で "depscan.sh" も呼び出します。
コード表示 10.1: add metalog to the default runlevel |
# rc-update add metalog default
|
コード表示 10.2: remove metalog from the default runlevel |
# rc-update del metalog default
|
注意: オプションなしで rc-update を実行するともう少し詳しい説明が表示されます。 |
depscan.sh について言及しておきます。 これはサービス間の依存関係マップのキャッシュを作成するのに使用します。
新しい rc-script を /etc/init.d/ に追加した際に実行する必要があります。しかし rc-update が自動的に呼び出すのでほとんどのユーザは実行する必要はありません。
このドキュメントの内容は Creative Commons - Attribution / Share Alikeライセンスです。