SysVinit とは?
SysVinit は、1980 年代に AT&T が開発した UNIX System V リリースから生まれました。これは、UNIX の標準を確立する試みの一環として設計され、システムの起動プロセスを管理するための新しい方法を導入しました。SysVinit は、システムの各段階 (runlevels) を定義し、それぞれの段階でどのサービスが起動または停止するかを制御する機能を提供しました。このアプローチは、より柔軟で管理しやすいシステム起動プロセスを実現し、多くの商用 UNIX システムや Linux ディストリビューションで採用されることとなりました。
SysVinit の基本概念
Init プロセスとは何か?
SysVinit システムにおいて、init プロセスはシステム起動時に最初に実行されるプロセス (PID 1) です。このプロセスは、オペレーティングシステムが起動する際に他のすべてのプロセスの親となります。init プロセスは、システムの起動、再起動、シャットダウンを管理し、システムの健全性と安定性を維持するための重要な役割を果たします。
Runlevels の概念とその役割
SysVinit では、runlevel と呼ばれる複数の運用モードを用意しています。これらはシステムの異なる状態を示し、それぞれに応じたサービスやプロセスが起動します。runlevel の詳細は「実行レベルの管理」を参照してください。
サービス管理の基本
SysVinit におけるサービス管理は、主にスクリプト(init スクリプト)を用いて行われます。これらのスクリプトは /etc/init.d
ディレクトリに配置され、各サービスを起動、停止、再起動、状態確認するためのコマンドが含まれています。SysVinit は、これらのスクリプトを利用して、指定された runlevel で必要なサービスを適切に管理します。
設定ファイルとスクリプト
/etc/inittab の解説
SysVinit の中心的な設定ファイルは /etc/inittab
です。このファイルは、システムの起動時に init プロセスによって読み込まれ、どの runlevel でどのサービスを起動するかを定義します。inittab
ファイルは複数のフィールドで構成され、各エントリは特定のタスクやサービスの起動条件を指定します。例えば、システムのデフォルトの runlevel を設定するエントリや、特定の runlevel で実行するスクリプトへの参照が含まれます。
Init スクリプトの構造と例
Initスクリプトは、サービスの起動、停止、再起動などを管理するためのシェルスクリプトです。これらは通常、/etc/init.d
ディレクトリ内に配置され、SysVinitによって直接呼び出されます。スクリプトは特定の標準に従って書かれ、start
、stop
、restart
、status
といった引数を受け取るように設計されています。例として、Apache HTTP サーバーを管理するスクリプトを紹介します:
#!/bin/sh
case "$1" in
start)
echo "Starting Apache..."
/usr/sbin/apachectl start
;;
stop)
echo "Stopping Apache..."
/usr/sbin/apachectl stop
;;
restart)
echo "Restarting Apache..."
/usr/sbin/apachectl restart
;;
status)
echo "Checking status of Apache..."
/usr/sbin/apachectl status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
Runlevel に応じたスクリプトの管理
SysVinit は、runlevel の変更に伴い、関連する init スクリプトを適切に呼び出します。/etc/rc.d
ディレクトリ内には、各 runlevel に対応するディレクトリ(例:rc0.d
, rc6.d
など)があり、これらのディレクトリ内のスクリプトが、システムの起動時や runlevel の変更時に自動的に実行されます。これらのスクリプトは通常、S
(start) やK
(kill, stop) で始まるシンボリックリンクで、対応するサービスを制御します。
その他
/etc/inittab
はシステムの起動時に読み込まれ、ctrl+alt+del
キーを押下した際のシステムの動作やデフォルトのランレベルを設定します。- 稼働中のシステムで
/etc/inittab
の変更を即時反映するには、init
またはtelinit
コマンドにq
またはQ
オプションを指定して実行します。
実行レベルの管理
各 Runlevel の詳細と使い分け
SysVinit における runlevel は、システムの異なる動作状態を定義します。以下は一般的な runlevel とその用途です。
- 0: システム停止。このレベルに設定するとシステムはシャットダウンします。
- 1: シングルユーザーモード。主にシステムメンテナンスのために使用され、ネットワークサービスなどは起動しません。
- 2: マルチユーザーモードでネットワークなし。一部の環境で使用される設定です。
- 3: フルマルチユーザーモード。ほとんどのシステムサービスが起動し、CLI ベースでフルアクセスが可能です。
- 4: 未使用。特定のカスタム用途に設定することが可能です。
- 5: グラフィカルユーザーインターフェース (GUI) を持つマルチユーザーモード。多くのデスクトップ環境ではこのレベルが使用されます。
- 6: システム再起動。このレベルに設定するとシステムはリブートします。
各 runlevel は、特定のサービスを起動または停止するためのスクリプトを /etc/rc.d
内の対応するディレクトリに配置することで管理されます。
Runlevel の変更方法
SysVinit システムにおいて、runlevel を変更する基本的な方法は、init
コマンドを使用することです。例えば、システムを runlevel 3 に変更する場合は、以下のコマンドを実行します。
init 3
このコマンドは、システムを安全に runlevel 3 に変更し、対応するサービスを起動または停止します。
非常時の Runlevel 操作
システムが予期せぬ状態になった際には、安全モードやメンテナンスモード (runlevel 1) への切り替えが推奨されます。これにより、最小限のサービスのみが動作し、システムのトラブルシューティングや修復が行いやすくなります。
その他
スクリプトファイル名(実際はシンボリックリンク)の 1 文字目は S
(Start:サービスを起動)または K
(Kill:サービスを停止)、数字は実行の優先順位を示し、数字が小さいほど先に実行され、サービス名は任意の名前が付けられます。
システムの起動とシャットダウン
システム起動プロセスの詳細
SysVinit を使用するシステムの起動プロセスは以下のステップで構成されます。
- ブートローダーの実行: システムが電源を入れられた後、ブートローダー(例えば GRUB)が初期化され、カーネルをメモリにロードします。
- カーネルの初期化: カーネルがロードされると、ハードウェアの検出、ドライバのロード、必要なシステムサービスの初期化が行われます。
- init プロセスの起動: カーネルの初期化が完了すると、最初のプロセスとして init プロセス (PID 1) が起動されます。このプロセスがシステムのさらなる起動プロセスを管理します。
- Runlevel スクリプトの実行: init プロセスは
/etc/inittab
ファイルを読み込み、設定されたデフォルトの runlevel に基づいて対応する runlevel スクリプト(/etc/rc.d
内)を実行します。これにより、必要なシステムサービスが起動します。
シャットダウンプロセスと再起動の手順
SysVinit を使用するシステムのシャットダウンや再起動は、以下の手順に従って安全に行われます。
- シャットダウンコマンドの発行:
shutdown
コマンドを使用してシャットダウンまたは再起動を開始します。例えば、shutdown -h now
はシステムを停止し、shutdown -r now
は再起動を行います。 - サービスの停止: init プロセスは各サービスの停止スクリプトを順番に実行し、システムサービスを適切に停止します。
- ユーザーのログアウト: ログインしているすべてのユーザーがログアウトされます。
- ファイルシステムのアンマウント: システムは全てのファイルシステムを安全にアンマウントし、データの整合性を保ちます。
- 電源の切断または再起動: 最後にシステムは電源を切断するか、カーネルを再起動します。