玩式草子─ソフトウェアとたわむれる日々

第99回 Plamo-7.0とSysvinit

この記事を読むのに必要な時間:およそ 4.5 分

ランレベルごとのサービス起動

その答は/etc/rc.d/以下にあるrc0.dからrc6.dの各ディレクトリにあります。

$ ls /etc/rc.d/
init.d/  rc.initpkg*  rc0.d/  rc1.d/  rc2.d/  rc3.d/  rc4.d/  rc5.d/  rc6.d/  rcS.d/

このrc0.dからrc6.dの各ディレクトリがランレベルごとのサービス起動用スクリプトの置き場になっており,ランレベルに応じてrcスクリプトがそれらを順に実行していくわけです。

サービス起動用スクリプトは本体を/etc/rc.d/init.d/以下に置き,起動したいランレベルへは"S"か"K"を先頭につけた「2ケタの数字」+「スクリプト名」という形のシンボリックリンクを置きます。

$ ls -l /etc/rc.d/rc5.d/
合計 126,976
lrwxrwxrwx 1 root root 18  6月  6日  14:41 S19iptables -> ../init.d/iptables*
lrwxrwxrwx 1 root root 17  6月  6日  14:38 S20network -> ../init.d/network*
lrwxrwxrwx 1 root root 24  6月  7日  19:55 S20vboxdrv -> /etc/rc.d/init.d/vboxdrv*
lrwxrwxrwx 1 root root 17  6月  6日  14:49 S21unbound -> ../init.d/unbound
....

rcスクリプトは,指定されたランレベルに応じて,rc0.dからrc6.dディレクトリ内にある"S"で始まるスクリプトを,2ケタの数字の順に実行し,必要なサービスを起動していきます。サービスの起動順は2ケタの数字を適切に割り振ることで制御できるので,サービス間の依存性にも対応しています。

"S"ではなく"K"で始まるシンボリックリンクもあります。たとえば,rc1.d/以下ではほとんどのリンクが"K"で始まっています。

$ ls -l /etc/rc.d/rc1.d/ 
合計 139,264
lrwxrwxrwx 1 root root 14  6月  6日  14:49 K00cups -> ../init.d/cups*
lrwxrwxrwx 1 root root 17  6月  6日  14:45 K05lightdm -> ../init.d/lightdm*
lrwxrwxrwx 1 root root 15  6月  6日  14:36 K08crond -> ../init.d/crond*
lrwxrwxrwx 1 root root 13  6月  6日  14:41 K10gpm -> ../init.d/gpm
....

これら"K"で始まるリンクはランレベルの切り替え時に使用され,⁠そのランレベルに入った際に終了するサービス」を意味します。

上記で示したrc1.d/はランレベル1,すなわち「シングルユーザモード」用のランレベルで,このランレベルに入ると起動していたほとんどのサービスは終了し,必要最小限の機能のみに切り替わるわけです。

一方,Plamo-6.xまでは/etc/rc.d/rc.Sで行なっていたファイルシステムのマウントやシステムクロック,スワップの設定など,ユーザ領域で必要な初期化処理もそれぞれ独立したスクリプトとして,/etc/rc.d/rcS.d/に置いたシンボリックリンクから実行するようになりました。

$ ls -l /etc/rc.d/rcS.d/
合計 61,440
lrwxrwxrwx 1 root root 21  6月  6日  14:38 S00mountvirtfs -> ../init.d/mountvirtfs*
lrwxrwxrwx 1 root root 17  6月  6日  14:38 S05modules -> ../init.d/modules*
lrwxrwxrwx 1 root root 18  6月  6日  14:38 S08localnet -> ../init.d/localnet*
lrwxrwxrwx 1 root root 15  6月  6日  14:38 S10eudev -> ../init.d/eudev*
...

mountvirtfsはtmpfsやdevfs,sysfsといった仮想ファイルシステムのマウント,modulesはあらかじめ指定しておいたモジュールのロード,localnetはloopbackインターフェイスの設定,eudevは周辺機器を動的に認識するudevデーモンの起動,を意味し,従来はrc.Sで一気にやっていた処理を,1つ1つのコマンドごとに分割して,rcS.d/以下のシンボリックリンクから実行するように変更しています。

rcスクリプトはシンボリックリンクを辿って/etc/rc.d/init.d/以下のコマンドを実行するだけなので,起動スクリプトの実行パーミッションを落せば,シンボリックリンクが張ってあってもそのサービスは起動されなくなります。

Plamo Linuxでは,不要なサービスはできるだけ起動しない,という方針で,httpdやsamba,dovecotなど,パッケージをインストールしても,そのままでは起動しないサービスがいくつかあります。これらは起動スクリプトの実行パーミッションを落としているので、サービスを起動したい場合はchmod +xで実行可能にしてください。

ちなみにrcスクリプトは起動する各コマンドの終了状況をチェックし,起動の成功("OK")⁠失敗("FAIL")を色分けして表示してくれます。下図はPlamo-7.0の起動画面で,黄色で"WARN"になっているのが,実行パーミッションが無いため起動されなかったサービスです。

図1 各種サービスの起動状況

図1 各種サービスの起動状況

なお,SysV形式を採用しているディストリビューションの多くでは,chkconfigやsysv-rc-confと呼ばれるランレベル設定用のツールが用意されていますが,Plamo Linuxでは今のところ,これらのツールは採用していません。


このようにSysV形式の起動処理は,sysvinitパッケージだけではなく,インストールするソフトウェアそれぞれについて起動/終了用スクリプトを用意すると共に,それらを適切な順番で起動するように設定したシンボリックリンクを用意するなど,システム全体に渡る調整が必要になります。

一方,SysV形式が提供する「ランレベル」は面白い概念ではあるものの,一人が一台のLinux環境を専有する時代においては,それほど必要な機能ではありません。

そのような事情から,Plamo Linuxでは長くrc.S/rc.M/rc.localのスタイルを使い続けてきたものの,Plamo-7.0では全パッケージを更新する予定だったので,この機会に,と,正式なSysV形式の起動処理を採用することにした次第です。

Plamo Linuxの場合,開発者リソースが少ないこともあって,⁠あれば便利」な機能を積極的に採用するよりも,⁠そろそろ不便」になってきたから仕方なく移行することが多くなりがちで,前回紹介した文字コードや今回取りあげたSysV形式の起動システムなど,その典型例と言えるでしょう。もう少し新技術にも積極的にならないといけないなぁ,と思うものの,古い皮袋は新しい葡萄酒に馴染みにくいようです(苦笑)⁠

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html