Linux のランレベルについて
MECHANISM
ランレベル一覧
Linux はランレベルによって、稼動するサービスを切り替えることが出来るようになっています。
0 システム終了 1 シングルユーザーモード 2 マルチユーザーモード (ネットワークなし) 3 マルチユーザーモード (テキストログイン) 4 (未使用) 5 マルチユーザーモード (グラフィカルログイン) 6 システム再起動 ランレベルごとに起動するプログラムとそうでないプログラムとが指定されていて、ランレベルを指定することでその状態に Linux を持って行くことができます。Linux はランレベルを、0 に切り替えることでシャットダウンを、6 に切り替えることで再起動を実行します。
また、"telinit" コマンドを使って、途中でランレベルを切り替えることもできます。なお "runlevel" コマンドを実行することで、現在のランレベルを確認することも出来ます。
ランレベルの詳細
Red Hat 系 Linux のお話
一般的な Linux は、/etc/rc.d/ ディレクトリの中にさらにランレベルごとのディレクトリが用意されています。たとえばランレベルを 3 とすると、それようのディレクトリは rc3.d/ で、その中に起動スクリプトが詰め込まれています。
スクリプトの命名規則
詰め込まれている起動スクリプトには規則があります。
まず、先頭の文字が "S" ならば起動、"K" ならば停止という約束があります。これはシステムによって、先頭の文字が "S" の場合には引数に "start" を付け加えてそのスクリプトを起動して、逆に "K" ならば "stop" を付け加えて実行してくれます。
また先頭の一文字に続いて、続く2文字は数字となります。これは起動スクリプトの優先順位を示すもので、数字の小さい順 (昇順) でスクリプトが実行されます。
追加登録する際の注意
起動スクリプトは上でも軽く触れたように、起動のみならず停止も担っていますので、もし独自にスクリプトを登録したい場合には、上記の命名規則を守ると同時に、すべてのランレベルに対してスクリプトを登録するように気をつけましょう。
そのような性格上、スクリプトはどこかに 1 つ用意して、各ランレベルのディレクトリからそのスクリプトへシンボリックリンクを張るのが都合が良い感じです。
スクリプトを用意する際の注意
ランレベルごとのディレクトリへ配置したいスクリプトを作成する場合、システムによって渡される "start" と "stop" という二つの引数を的確に処理できるようにしておく必要があります。
雛形とすると、次のような感じでしょうか。
#!/bin/sh
proc_start()
{
/usr/sbin/syslogd
}
proc_stop()
{
killall syslogd
}
proc_restart()
{
proc_stop
sleep 1
proc_start
}
case "$1" in
'start')
proc_start
;;
'stop')
proc_stop
;;
'restart')
proc_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
これは Slackware Linux 9.0 に付属していた syslog の起動スクリプトから抜粋・やや改変したものなのですけど、このような感じでスクリプトを作成すれば良さそうです。
Slackware 9.0 のお話
個人的にはよく Slackware Linux を利用するのですけど、このディストリビューションの場合、ランレベルの管理が上記とは異なるようでした。調べたのは Slackware 9.0 なのですけど、この場合はディレクトリで明確に分けられていることもなければ、命名規則で起動状態を調整するといった仕組みは備わっていないようです。
Slackware 9.0 では、次のようなランレベルそれぞれに該当するスクリプトが /etc/rc.d/ ディレクトリに用意されていました。
rc.0 ランレベル 0 のときに実行されるスクリプトだそうです。実際には rc.6 へのシンボリックリンクとなっていました。 rc.4 ランレベル 4 用のスクリプトだそうです。 rc.6 ランレベル 6 のときに実行されるスクリプトだそうです。実際には rc.0 も担当していて、どちらのファイル名で呼び出されたかによって、最後にシステムを終了させるか再起動させるかを切り替えるようになっていました。 rc.K ランレベル 1 のときに実行されるスクリプトだそうです。 rc.M マルチユーザ環境用のスクリプトだそうです。内部では rc.net1 などその他の主な起動スクリプトが呼び出されるように作られていました。そして最後に rc.local が実行されるようになっています。 rc.S システムの初期化時に実行されるスクリプトだそうです。スワップファイルの有効化や、定期的なディスクチェックなどの処理が成されるようでした。 このような感じですから独自にスクリプトを追加する場合には、該当するランレベルそれぞれについて、実行したいタイミングで、起動スクリプトを追記する必要があるようでした。
rc.local ファイルについて
起動時にプログラムを実行したい場合に rc.local ファイルへ追記することがよくあるように思うのですけど、この rc.local は、このランレベル関連に登録されたスクリプトを実行した最後に呼び出されるようになっているようでした。
ランレベルを変更する
Linux 起動時のランレベルを変更したい場合、/etc/inittab ファイルの次のような行を変更します。
id:3:initdefault:
上記の行の "3" の部分がランレベルで、たとえばグラフィカルログインにしたい場合は "5" とするなど、適切なものに書き換えてあげれば良いようです。