init
initは、UNIX系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。デーモンとして動作し、一般にPID 1 を付与される。
init の機能はBSD系とSystem V系では大きく異なるため、ユーザーは自分のシステムがどちらのバージョンを使っているかをマニュアルで調べる必要がある。多くのLinux系システムで使われている init は System V と互換性があるが、Slackwareのようなディストリビューションでは BSD系の init を使っており、Gentoo Linuxなどでは独自の init を使用している。他にもいくつかのバリエーションが開発されている。
目次 |
[編集] BSD系の init
BSD の init は、'/etc/rc' にある初期化用シェルスクリプトを実行し、テキストベース端末用のgettyを起動するか、グラフィックス端末用にXなどを起動する。ランレベル(runlevel)という概念は無く、'rc' ファイルで init の動作を決定している。
- 利点: 手で変更・修正するのが容易である。
- 欠点: ブート時にサードパーティのパッケージの初期化スクリプトを実行する必要がある場合、上記のスクリプトのいずれかを編集する必要があるが、ちょっとした間違いでブート不可能な状態になってしまう。
BSDの子孫では、伝統的に 'rc.local' ファイルをブート処理の最後近くに実行することでブート不可となる危険性を和らげていた。その後 'rc.d' ディレクトリに各パッケージの start/stop スクリプトを置くようになった。FreeBSD 5.0 と NetBSD 1.5 では rc.d フレームワークを完全に導入し、System V のようにブート処理を多数の小さなスクリプトで行うようになった。
[編集] System V 系の init
System V の init は、'/etc/inittab' ファイル内の 'initdefault' エントリを調べて既定のランレベルがあるかチェックする。既定のランレベルがない場合、コンソール端末に何らかの表示がなされるので、ユーザは手でランレベルを入力しなければならない。
- 利点: 柔軟で拡張性がある。
- 欠点: 複雑である。
[編集] ランレベル
ランレベル(runlevel)は、マシンの状態を実行するプロセス群によって分類したものである。一般に 0~6 と Sまたはs という8段階のランレベルがある。S と s は同じランレベルの別名である。この 8 段階のうち、以下の3つは予約されたランレベルである。
- 0. 停止(Halt)
- 1. シングルユーザーモード
- 6. 再起動(Reboot)
これら以外のランレベルは、各システムによってそれぞれ意味が異なる。一般に、/etc/inittab ファイルで、各ランレベルで何をするかを定義している。
[編集] デフォルトのランレベル
| OS | デフォルトのランレベル |
|---|---|
| AIX | 2 |
| Debian | 2 |
| Gentoo Linux | 3 |
| Mandriva Linux | 5 |
| Red Hat Linux / Fedora Core | 3 or 5 |
| Slackware | 3 |
| Solaris | 3 |
| SUSE | 5 |
| Ubuntu | 2 |
上記表でデフォルトのランレベルを5としている Linux ディストリビューションでは、5 というランレベルはマルチユーザーのグラフィカル環境(X Window System と、その上でディスプレイマネージャが起動される)である。しかし、Solarisでは、ランレベル 5 はシャットダウンと電源オフの自動化のために予約されている。
現在のランレベルは以下のようなコマンドを使って調べることができる。
$ runlevel $ who -r
通常、ランレベルはrootが telinit コマンドまたは init コマンドを実行することで変更することができる。デフォルトのランレベルは /etc/inittab ファイルの :initdefault: エントリにある。
[編集] init をスキップする
"init" は UNIXマシンを立ち上げる唯一の方法ではない。最近のブートローダ(たとえばLILOやGRUB)では、カーネルが初期化の最後に何を起動するかを指定することができる(既定値はもちろん /sbin/init である)。これは、ブートローダのプロンプトに init=/foo/bar などと打ち込むことで実現される。これは直接シェル(bashやzsh)を使いたい場合に便利な機能である。たとえば、init=/bin/bash を使えば、シェルが使える状態で立ち上がり、パスワードを入力する必要もない。システム管理者がこれを安全でないと判断する場合は、BIOSのパスワードを設定すればよい。
BSD系では、ブート処理は途中で割り込むことができ、boot -s コマンドでシングルユーザーモードで立ち上げることができる。シングルユーザーモードは技術的には init をスキップするわけではない。/sbin/init はやはり実行されるが、この場合 exec() に指定するプログラムのパスを聞いてくる(デフォルトでは /bin/sh)。ブートが行われている端末が /etc/ttys ファイルで "insecure" とされている場合(システムによっては現在の "securelevel" も関係する)、init は最初に root のパスワードを聞いてくる(あるいは、ユーザーが CTRL+D を押下すると通常のマルチユーザー立ち上げに戻る)。このプログラムが終了させられた場合、カーネルはマルチユーザーモードでの再立ち上げを行う。通常動作中にマルチユーザーモードからシングルユーザーモードへ移行させようとしたときも同様のことが起きる。カーネルのブート処理後、init を起動できない場合はパニックが発生して、システムは利用できなくなる。init のパス指定方法はOSによって異なる(NetBSD では boot -a、FreeBSD では init_path というローダー変数である)。
[編集] その他のスタイル
- SystemStarter と launchd — Mac OS X (10.4以降)でのプロセス開始処理(10.3以前はInitを使用)
- Initng - init を完全に置き換えるものであり、非同期なプロセス開始処理が特徴。
- Upstart - init を完全に置き換えるものであり、非同期なプロセス開始処理が特徴。Ubuntu が起源。
- Service Management Facility - Solaris 10 から導入された init の置換/再設計
- eINIT - init を完全に置き換えるものであり、非同期なプロセス開始処理が特徴。シェルスクリプトを全く使わない方法をとることも可能。