私の作った System V init エディタへようこそ。これは ksysv という名で知られています (以下でもそう呼びます)。 この節では概念的なことを少し紹介し、ksysv でできることを 説明します。
以下の説明は tksysv (ksysv の着想のきっかけです) から「借りて」きました:
System V init はブート時のソフトウェアの起動を制御する 仕組みとして、Linux の世界で急速に標準になりつつあります。 その理由は、伝統的な BSD init に比べ、使いやすく強力かつ 柔軟であるためです。
ここでは歴史に深入りすることは避けます (それは私が知らないというのが主な理由です :-)。
init のバイナリは /etc ではなく /sbin に配置されます。 これは再インストールや再フォーマットすることなくマシンを System V init にアップグレードしようとする場合に重要な 点です。Linux カーネルは init を探す際にまず /etc を調べますから、古い init がそこにある場合は必ず削除してください。
他に SysV init が BSD init と異なる点は設定ファイルの 配置が /etc の直下ではなく /etc のサブディレクトリの 下にある点です。ディレクトリの名前は rc.d です。そこには rc.sysinit と次のディレクトリがあります:
init.d/ rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ |
init.d にはたくさんの スクリプトが入っています。基本的に、ブート時あるいは他の ランレベルに移行する際にサービスを起動するためのスクリプトは 各サービスにつき 1 つ必要です。ここでサービスには ネットワーク機能、NFS、sendmail、httpd などが含まれます。 また、setserial のように 1 度だけ実行されてそこで終了して しまうものはサービスに含まず、rc.local に記述します。
rc.local が必要な場合は /etc/rc.d に格納します。多くの システムには大したことを行なっていなくてもこのファイルが 入っています。またブート時にシリアル ポートに特化した処理を 行なう必要があれば、rc.serial を /etc/rc.d に含めることが できます。
一連の出来事は次のように起こります:
カーネルがいくつかの場所を調べ、最初に見つけた init を 実行します
init は /etc/rc.d/rc.sysinit を実行します
rc.sysinit は各種の 必須の処理を行ない、rc.serial を (もし存在すれば) 実行します。
init は rc.local を 実行します。
init はデフォルト ランレベル用の全てのスクリプトを 実行します。
デフォルト ランレベルは /etc/inittab で決められます。先頭の方に次の ような行があるはずです:
id:3:initdefault: |
これについて、2 番目の欄を見るとデフォルト ランレベルが 3 であることが分かります (多くのシステムが そうなっています)。これを変更するには、手で /etc/inittab を編集し、 この 3 を書き換えます。inittab に手を入れるときは 細心の注意を払ってください。もしだめにしてしまった場合、 修復のためにはリブートして次のようにして入ることが できます:
LILO boot: linux single |
これによりシングル ユーザ モードで起動する *はず* ですから、inittab を修復することができます。
さて、init はどのようにして適切なスクリプトを 残さず実行しているのでしょうか。rc3.d にて 'ls -l' を実行すると、次の例のような出力が得られると思います:
lrwxrwxrwx 1 root root 13 13:11 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 13:11 S30syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 14 13:32 S40cron -> ../init.d/cron lrwxrwxrwx 1 root root 14 13:11 S50inet -> ../init.d/inet lrwxrwxrwx 1 root root 13 13:11 S60nfs -> ../init.d/nfs lrwxrwxrwx 1 root root 15 13:11 S70nfsfs -> ../init.d/nfsfs lrwxrwxrwx 1 root root 18 13:11 S75keytable -> ../init.d/keytable lrwxrwxrwx 1 root root 23 13:11 S80sendmail -> ../init.d/sendmail.init lrwxrwxrwx 1 root root 18 13:11 S90lpd -> ../init.d/lpd.init lrwxrwxrwx 1 root root 11 13:11 S99local -> ../rc.local |
このディレクトリには "ファイル" の実体がないことに お気付きでしょう。そこにあるのは全て init.d ディレクトリに あるスクリプトのいずれかへのリンクです。しかもこのリンクの 名前は頭に "S" と数字が付いています。"S" はそのリンクが 指す特定のスクリプトを起動することを表します。もし "K" なら 停止することを表します。数字は順序を決めるためにあります。 init は出現する順序にしたがって全てのサービスを開始します。 同じ数字を使うこともできます。あなたは多少戸惑うかも しれません。あなたがここで使わなければならないのは、 2 桁の数字と、必要なサービスの起動または停止を表す 大文字の "S" または "K" だけです。
init はどのようにしてサービスを起動したり停止したり するのでしょうか。簡単です。各スクリプトは "start" や "stop" という引数を取るように書かれています。これらの スクリプトは手で実行することができ、実際次のようなコマンドで:
/etc/rc.d/init.d/httpd.init stop |
httpd サーバを停止させることができます。init は 名前を見て "K" が付いていれば引数 "stop" を付けて そのスクリプトを呼び出します。"S" が付いていれば init は 引数 "start" を付けてそのスクリプトを呼び出します。
世の中にはマシンを多目的にセットアップする簡単な 手段を必要としている人がいます。"サーバ" ランレベルでは httpd、sendmail、ネットワーク機能等だけを実行し、 別に "ユーザ" ランレベルを用意して xdm、ネットワーク機能 等を実行することができます。