init

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

init の機能はBSD系とSystem V系では大きく異なるため、ユーザーは自分のシステムがどちらのバージョンを使っているかをマニュアルで調べる必要がある。多くのLinux系システムで使われている init は System V と互換性があるが、Archのようなディストリビューションでは BSD系の init を使っており、Gentoo Linuxなどでは独自の init を使用している。

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

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 ファイルで、各ランレベルで何をするかを定義している。

デフォルトのランレベル[編集]

OS デフォルトのランレベル
AIX 2
Arch Linux 3
CentOS 3 または 5
Debian 2[5]
Gentoo Linux 3[6]
HP-UX 3
Mac OS X 3
Mandriva Linux 5
Red Hat Linux / Fedora Core 3 または 5
Slackware 3
Solaris 3[7]
SUSE Linux 5
Ubuntu 2[5]

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

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

$ runlevel
$ who -r

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

BSD系の init[編集]

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系では各スクリプトファイルに明示的な依存関係を示すタグを置いている[8]。スクリプトの実行順序は、それらタグに基づいて rcorder スクリプトが決定する。

init をスキップする[編集]

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

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 というローダー変数である)。

initの代替[編集]

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

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

脚注[編集]

  1. ^ Know Thy Ubuntu”. Help.ubuntu.com (2009年8月7日). 2011年6月13日閲覧。
  2. ^ since we have no /etc/inittab”. Linuxquestions.org (2006年11月30日). 2011年6月13日閲覧。
  3. ^ Upstart Plans to Ease Linux Management — Streamlining the init Processes”. Reports. LinuxPlanet (2007年3月8日). 2011年6月13日閲覧。
  4. ^ Remnant, Scott James (2006年8月26日). “Upstart in Universe”. Netsplit.com. 2011年6月13日閲覧。
  5. ^ a b Debian and Ubuntu Linux Run Levels”. Debianadmin.com (2009年4月2日). 2011年6月13日閲覧。
  6. ^ Initscripts”. Gentoo Linux Documentation. Gentoo.org (2011年3月2日). 2011年6月13日閲覧。
  7. ^ Oracle Documentation”. Docs.sun.com (2010年9月7日). 2011年6月13日閲覧。
  8. ^ Andrew Smallshaw (2009年12月7日). “Unix and Linux startup scripts, Part 2”. 2012年4月6日閲覧。
  9. ^ Gürer Özen, Görkem Çetin. “Speeding Up Linux: One Step Further With Pardus Pardus”. Pardus.org.tr. 2011年6月13日閲覧。

関連項目[編集]

外部リンク[編集]