Init

initは、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。デーモンとして動作し、一般にPID 1 を付与される。ブートローダがカーネルを起動し、カーネルがinitを起動する。代替手段を用意せずにinitを削除すると、次回のリブート時にシステムはカーネルパニックに陥る可能性がある。

init の機能はBSD系とSystem V系では大きく異なるため、ユーザーは自分のシステムがどちらのバージョンを使っているかをマニュアルで調べる必要がある。多くのLinuxディストリビューションで使われていたinitはSystem Vと互換性がある。SlackwareのようなLinuxディストリビューションではBSD系のinitを使っていた。Gentoo Linuxなどでは独自のinitを使用していた。ISO/IEC 23360-1:2006の国際規格になったLinux Standard Baseではinitを定義している。

他にもいくつかinitの設計上の限界に対処した代替として、systemdやUpstartがあり、Ubuntuや他のLinuxディストリビューションで採用している。

1. System V系のinit
-----------------

System Vのinitは、/etc/inittabファイル内の:initdefault:エントリを調べて既定のランレベルがあるかチェックする。既定のランレベルがない場合、コンソール端末に何らかの表示がなされるので、ユーザは手でランレベルを入力しなければならない。

//利点:// 柔軟で拡張性がある。
//欠点:// 複雑である。

1.1. ランレベル
----------

System Vのランレベル  は、マシンの状態を実行するプロセス群によって分類したものである。一般に 0 - 6とSまたはsという8段階のランレベルがある。Sとsは同じランレベルの別名である。この8段階のうち、以下の3つは予約されたランレベルである。

0. 停止  1. シングルユーザーモード 6. 再起動 これら以外のランレベルは、各システムによってそれぞれ意味が異なる。一般に、/etc/inittabファイルで、各ランレベルで何をするかを定義している。

1.2. デフォルトのランレベル
----------------

上記表でデフォルトのランレベルを5としているLinuxディストリビューションでは、5というランレベルはマルチユーザーのグラフィカル環境である。しかし、Solarisでは、ランレベル5はシャットダウンと電源オフの自動化のために予約されている。

現在のランレベルは以下のようなコマンドを使って調べることができる。

$ runlevel$ who -r通常、ランレベルはrootがtelinitコマンドまたはinitコマンドを実行することで変更することができる。デフォルトのランレベルは/etc/inittabファイルの:initdefault:エントリにある。

2. BSD系のinit
------------

Berkeley Software Distribution  のinitは、/etc/rcにある初期化用シェルスクリプトを実行し、/etc/ttysの制御下にあるテキストベース端末用のgettyを起動したり、グラフィックス端末用にXなどを起動したりする。ランレベルという概念は無く、/etc/rcファイルでinit の動作を決定している。

//利点:// 手で変更・修正するのが容易である。
//欠点:// ブート時にサードパーティーのパッケージの初期化スクリプトを実行する必要がある場合、上記のスクリプトのいずれかを編集する必要があるが、ちょっとした間違いでブート不可能な状態になってしまう。BSDの子孫では、伝統的に/etc/rc.localファイルをブート処理の最後近くに実行することでブート不可となる危険性を和らげていた。

NetBSD 1.5では完全にモジュール化したシステムを導入し、それがFreeBSD 5.0およびそれ以降にも移植されている。このシステムは、/etc/rc.d ディレクトリ配下にあるスクリプト群を実行するものである。System Vでのスクリプト実行順は各スクリプトのファイル名の順番だが、BSD系では各スクリプトファイルに明示的な依存関係を示すタグを置いている。スクリプトの実行順序は、それらタグに基づいて//rcorder//スクリプトが決定する。

3. initをスキップする
--------------

initはマシンを立ち上げる唯一の方法ではない。最近のブートローダでは、カーネルが初期化の最後に何を起動するかを指定することができる。これは、ブートローダのプロンプトにinit=/foo/barなどと打ち込むことで実現される。これは直接シェルを使いたい場合に便利な機能である。たとえば、init=/bin/bashを使えば、シェルが使える状態で立ち上がり、パスワードを入力する必要もない。システム管理者がこれを安全でないと判断する場合は、ブートローダのパスワードを設定すればよい。

BSD系では、ブート処理は途中で割り込むことができ、boot -sコマンドでシングルユーザーモードで立ち上げることができる。シングルユーザーモードは技術的にはinitをスキップするわけではない。/sbin/initはやはり実行されるが、この場合execに指定するプログラムのパスを聞いてくる。ブートが行われている端末が/etc/ttysファイルで "insecure" とされている場合、initは最初にrootのパスワードを聞いてくる。このプログラムが終了させられた場合、カーネルはマルチユーザーモードでの再立ち上げを行う。通常動作中にマルチユーザーモードからシングルユーザーモードへ移行させようとしたときも同様のことが起きる。カーネルのブート処理後、initを起動できない場合はパニックが発生して、システムは利用できなくなる。initのパス指定方法はオペレーティングシステム  によって異なる。

4. initの代替
----------

initに比較して何らかの長所を持つ代替がいくつも開発されてきた。

GoboLinuxのBootScripts
eINIT - initを完全に置き換えるものであり、非同期なプロセス開始処理が特徴。シェルスクリプトを全く使わない方法をとることも可能。
Initng - initを完全に置き換えるものであり、非同期なプロセス開始処理が特徴。
launchd — macOS でのプロセス開始処理。古いrc.localはSystemStarterで扱う。
Mudur - PardusというLinuxディストリビューションで採用しているPythonで書かれたinit代替で、非同期なプロセス起動が可能。
OpenRC - Gentoo Linuxのデフォルトのinitシステム
Service Management Facility - Solaris 10から導入されたinitの置換/再設計
systemd - Fedora 15からデフォルトで使用しているinitの代替。サービスを並列に起動でき、シェルのオーバーヘッドを低減している。
Upstart - initを完全に置き換えるものであり、非同期なプロセス開始処理が特徴。Ubuntuが起源。

5. 脚注
-----

6. 関連項目
-------

pidof

7. 外部リンク
--------

[1]
[2]
[3]
[4]
[5]
[6]