# 章 1. はじめに

私の作った System V init エディタへようこそ。これは ksysv という名で知られています (以下でもそう呼びます)。 この節では概念的なことを少し紹介し、ksysv でできることを 説明します。

以下の説明は `tksysv` (ksysv の着想のきっかけです) から「借りて」きました:

# 1.1. System V Init の概略説明

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" を付けてそのスクリプトを呼び出します。

## 1.1.1. なぜいくつもラン レベルがあるのか ?

世の中にはマシンを多目的にセットアップする簡単な 手段を必要としている人がいます。"サーバ" ランレベルでは httpd、sendmail、ネットワーク機能等だけを実行し、 別に "ユーザ" ランレベルを用意して xdm、ネットワーク機能 等を実行することができます。