カーネルは、PID 名前空間内の最初のユーザー空間プロセスを PID 1 として起動します。完全な Linux システムでは、この init プロセスがサービス環境を確立します。コンテナでは小さな init ラッパーやアプリケーション自体が PID 1 になることもありますが、シグナル処理と子プロセス回収に関する特別な責務は変わりません。
システムの起動 · レッスン 5
ブートプロセス:Init
PID 1 がユーザー空間を初期化し、サービスを監督し、子プロセスを回収して、シャットダウンを調整する仕組みを学びます。
PID 1 の責務
init システムは一般に、次の仕事を担います。
- サービス、ログイン、マウントなどの処理を起動・監督する
- 依存関係と設定された目標状態に従って処理順序を決める
- 孤児となった子プロセスを引き取り、終了状態を回収する
- ポリシーに従ってサービス障害へ対応する
- 正常なシャットダウンと再起動を調整する
正確な境界は実装によって異なります。デバイス管理、ネットワーク、ロギング、スケジュール実行は PID 1 に組み込まれず、init が監督する別プログラムの場合もあります。
PID 名前空間内の PID 1 に固有の責務はどれですか?
System V Init とランレベル
従来の sysvinit は /etc/inittab や、ランレベル別の起動・停止スクリプトを使います。ランレベルは動作モードを表しますが、番号の意味はディストリビューションごとに異なる場合があります。スクリプトの順序は規約に基づき、ディストリビューションのツールで拡張や並列化が可能です。
/etc/init.d/ が存在するだけで、稼働中の init システムを断定してはいけません。別の実装が PID 1 のシステムにも互換スクリプトが残っている場合があります。
System V のランレベルは何を表しますか?
イベント駆動および依存関係ベースのシステム
Upstart はイベント駆動のジョブモデルを導入し、古い Ubuntu リリースなどで使われました。現在は主に歴史的な理解やレガシー運用の対象です。
systemd は現在の汎用ディストリビューションで広く使われています。サービス、ソケット、マウント、タイマー、デバイス、ターゲットなどを unit としてモデル化します。宣言的な依存関係とアクティベーションにより、必要な順序を守りながら独立した処理を並行して進められます。
ほかにも OpenRC、runit、s6、BusyBox init などが現役です。「最も新しいもの」を互換性の基準にせず、実際に稼働している実装を確認して、その文書を使ってください。
systemd はサービスやマウントなどの管理対象をどのように表しますか?
稼働中の Init を特定する
インストール済みファイルから推測せず、PID 1 を調べます。
$ ps -p 1 -o pid,comm,args=
$ readlink /proc/1/exe
見える内容は権限、コンテナ、名前空間の影響を受けます。コンテナ内で実行したコマンドが示すのはその名前空間の PID 1 であり、必ずしもホストの init ではありません。特定後は、別系統の init のコマンドを混在させず、その実装固有の状態確認・ログツールを使います。
従来のスクリプトディレクトリの有無より、PID 1 を調べるほうがよいのはなぜですか?
レッスン完了
ブートプロセス:Init を完了しました
これで、init を一つの必須実装ではなく、役割として説明できます。
PID 1 をサービス初期化、子プロセス回収、シャットダウンと関連付ける。
System V のランレベルをディストリビューション定義の動作モードとして認識する。
systemd のリソースと依存関係を unit に関連付ける。
ツールを選ぶ前に、該当する名前空間で実際の PID 1 を調べる。