Init

**init**は、UNIXおよびUnix系システムのプログラムのひとつである。UNIXの起動処理上最初に実行されるユーザモードのプロセスであり、他の全てのユーザモードのプロセスの直接ないしは間接的な親プロセスとしてそれらを起動および管理する役目を持つ。デーモンとして動作し、一般にPID 1 を付与される。ブートローダがカーネルを起動し、カーネルがinitを起動する。代替手段を用意せずにinitを削除すると、次回のリブート時にシステムはカーネルパニックに陥る可能性がある。initプロセスが終了するとユーザモードのプロセスは実行を続けられなくなり、カーネルはシャットダウン処理を実行する。

カーネル専用のプロセスなど、ユーザモードに依存しないプロセスはinitに依存しない。ただし、初期のNFSサーバなどのようにカーネル内に閉じたプロセスを作成することが困難だった頃には代替実装としてユーザモードのプロセスを起動し、それがシステムコールを呼び出してカーネルに戻っていたため、副作用として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ディストリビューションで採用している。

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

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

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

: 0. 停止 (Halt)
: 1. シングルユーザーモード
: 6. 再起動 (Reboot)

これら以外のランレベルは、各システムによってそれぞれ意味が異なる。一般に、`/etc/inittab`ファイルで、各ランレベルで何をするかを定義している。

### デフォルトのランレベル

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

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

:`$ runlevel`
:`$ [[Who (UNIX)|who]] -r`

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

## BSD系のinit
Berkeley Software Distribution (BSD) の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*スクリプトが決定する。

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

BSD系では、ブート処理は途中で割り込むことができ、`boot -s`コマンドでシングルユーザーモードで立ち上げることができる。この場合も`/sbin/init`は実行されるが、`exec()`に指定するプログラムのパスを聞いてくる（デフォルトでは`/bin/sh`）。

ブートが行われている端末が`/etc/ttys`ファイルで "insecure" とされている場合（システムによっては現在の "securelevel" も関係する）、initは最初にrootのパスワードを聞いてくる（あるいは、ユーザーが`CTRL+D`を押下すると通常のマルチユーザー立ち上げに戻る）。このプログラムが終了させられた場合、カーネルはマルチユーザーモードでの再立ち上げを行う。通常動作中にマルチユーザーモードからシングルユーザーモードへ移行させようとしたときも同様のことが起きる。

カーネルのブート処理後、initを起動できない場合はパニックが発生して、システムは利用できなくなる。initのパス指定方法はオペレーティングシステム (OS) によって異なる（NetBSDでは`boot -a`、FreeBSDでは`init_path`というローダー変数である）。

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

## 脚注

## 関連項目
*pidof

## 外部リンク
* man pages for init
* 
* Paper summarizing Unix init schemes
* runit
* minit
* rc.d
* busybox