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の国際規格[1]になったLinux Standard Baseではinitを定義している[2]。
他にもいくつかinitの設計上の限界に対処した代替として、systemdやUpstartがあり、Ubuntu[3][4]や他のLinuxディストリビューションで採用している[5][6]。
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 |
CentOS | 3(コンソール/サーバ)または5(グラフィカル/デスクトップ)[7] |
Debian | 2[8] |
Gentoo Linux | 3[9] |
HP-UX | 3(コンソール/サーバ/マルチユーザ)または4(グラフィカル) |
macOS | 3 |
Mandriva Linux | 3(コンソール/サーバ)または5(グラフィカル/デスクトップ) |
Red Hat Linux / Fedora Core | 3(コンソール/サーバ)または5(グラフィカル/デスクトップ)[10] |
Slackware | 3 |
Solaris | 3[11] |
SUSE Linux | 3(コンソール/サーバ)または5(グラフィカル/デスクトップ)[12] |
Ubuntu | 2[8] |
上記表でデフォルトのランレベルを5としているLinuxディストリビューションでは、5というランレベルはマルチユーザーのグラフィカル環境(X Window Systemと、その上でディスプレイマネージャが起動される)である。しかし、Solarisでは、ランレベル5はシャットダウンと電源オフの自動化のために予約されている。
現在のランレベルは以下のようなコマンドを使って調べることができる。
$ runlevel
$ 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系では各スクリプトファイルに明示的な依存関係を示すタグを置いている[13]。スクリプトの実行順序は、それらタグに基づいて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代替で、非同期なプロセス起動が可能[14]。
- OpenRC - Gentoo Linuxのデフォルトのinitシステム
- Service Management Facility - Solaris 10から導入されたinitの置換/再設計
- systemd - Fedora 15からデフォルトで使用しているinitの代替。サービスを並列に起動でき、シェルのオーバーヘッドを低減している。
- Upstart - initを完全に置き換えるものであり、非同期なプロセス開始処理が特徴。Ubuntuが起源。
脚注
[編集]- ^ ISO/IEC 23360-1:2006 Linux Standard Base (LSB) core specification 3.1 Part 1: Generic specification https://www.iso.org/standard/43781.html
- ^ Linux Standard Base(LSB) 22.2. Init Script Actions https://refspecs.linuxfoundation.org/lsb.shtml
- ^ “Know Thy Ubuntu”. Help.ubuntu.com (2009年8月7日). 2011年6月13日閲覧。
- ^ “since we have no /etc/inittab”. Linuxquestions.org (30 November 2006). 2011年6月13日閲覧。
- ^ “Upstart Plans to Ease Linux Management — Streamlining the init Processes”. Reports. LinuxPlanet (2007年3月8日). 2011年6月13日閲覧。
- ^ Remnant, Scott James (2006年8月26日). “Upstart in Universe”. Netsplit.com. 2011年6月13日閲覧。
- ^ “SysV Init Runlevels”. 22 September 2012閲覧。
- ^ a b “Debian and Ubuntu Linux Run Levels”. Debianadmin.com (2009年4月2日). 2011年6月13日閲覧。
- ^ “Initscripts”. Gentoo Linux Documentation. Gentoo.org (2011年3月2日). 2011年6月13日閲覧。
- ^ “SysV Init Runlevels”. 22 September 2012閲覧。
- ^ “Oracle Documentation”. Docs.sun.com (2010年9月7日). 2011年6月13日閲覧。
- ^ “SUSE Documentation: The init Process”. suse.com (2014年4月25日). 2014年5月4日閲覧。
- ^ Andrew Smallshaw (7 December 2009). “Unix and Linux startup scripts, Part 2”. 2012年4月6日閲覧。
- ^ Gürer Özen, Görkem Çetin. “Speeding Up Linux: One Step Further With Pardus Pardus”. Pardus.org.tr. 2011年6月13日閲覧。
関連項目
[編集]外部リンク
[編集]- man pages for init
init(8)
– FreeBSD System Manager's Manual Pages (en)- Paper summarizing Unix init schemes
- runit
- minit
- rc.d
- busybox