System V init は通常 SysV init または sysvinit と呼ばれ、従来から使われてきた PID 1 とサービス起動の仕組みです。古いシステムや互換スクリプトを扱ううえで今も重要ですが、SysV 形式のファイルがインストールされているだけでは、実行中の PID 1 が sysvinit であるとは断定できません。
Init · レッスン 1
System V の概要
従来の System V init が、ランレベルと順序付けられたサービススクリプトのリンクをどう使うか学びます。
稼働中の init システムを特定する
実際に動いている PID 1 を調べます。
$ ps -p 1 -o pid,comm,args=
$ readlink /proc/1/exe
/etc/inittab ファイルや /etc/init.d/ ディレクトリがあることは、補助的な証拠にすぎません。systemd などの init システムも互換性のためにこれらを残すことがあり、コンテナではホストと異なる PID 名前空間が見える場合もあります。
sysvinit が稼働中であることを示す最も強い証拠はどれですか?
ランレベル
ランレベルとは、数値で名前を付けた動作モードです。SysV の設定では伝統的に 0 から 6 と特殊なレベルを使いますが、その意味は普遍的な規則ではなく、ディストリビューションの方針で決まります。一般的な慣例は次のとおりです。
0:停止または電源オフへの移行1またはS:シングルユーザーまたはレスキューモード2から5:ディストリビューションが定義するマルチユーザーモード6:再起動への移行
Debian 系では歴史的にレベル 2~5 をほぼ同じように扱い、Red Hat 系の慣例ではテキストモードとグラフィカルモードを区別します。実際のホストで /etc/inittab、init の文書、ランレベルディレクトリを調べてください。
多くの SysV システムで、停止または電源オフを要求するランレベルは慣例上どれですか?
init スクリプトとランレベルのリンク
サービススクリプトは通常 /etc/init.d/ の下にあります。/etc/rc2.d/ や /etc/rc.d/rc2.d/ などのランレベルディレクトリには、移行時の操作と順序を名前に符号化したリンクがあります。
SNNnameのリンクは開始操作を要求します。KNNnameのリンクは停止操作を要求します。NNは、その移行におけるリンクの辞書順を定めます。
正確なアルゴリズムとディレクトリは環境によって異なります。依存関係をスクリプトのヘッダーに記述してディストリビューションのツールで処理する場合や、一部の処理を並列化する実装もあります。SysV を「すべてのサービスが必ず1つずつ順番に起動する仕組み」と単純化してはいけません。
ランレベルへ移行するとき、S20networking というリンクは慣例上何を要求しますか?
ランレベル間を移行する
init がランレベルを変更すると、ディストリビューションの rc 機構は不要になったサービスを停止し、新しいモードで必要なサービスを起動します。スクリプトは、状態確認や移行操作を繰り返しても扱える程度に冪等で、意味のあるステータスを返す必要があります。
ランレベル 0 または 6 の要求は、システム全体の可用性を失わせる操作です。生の init 移行を不用意に呼び出さず、システムのシャットダウン用インターフェースを使い、ユーザーへ通知し、作業中の内容を保存し、リモートコンソールへ接続できることを確認してください。
ランレベル 6 は慣例上何を要求しますか?
互換機能の限界
systemd ホストでは、SysV スクリプトが生成ユニットとしてラップされる場合がありますが、それでも systemd の依存関係、タイムアウト、ログ、状態の意味が適用されます。古いスクリプトを直接実行すると、サービスマネージャーの追跡を迂回することがあります。稼働中のマネージャーを特定し、可能ならそのネイティブなインターフェースを使ってください。
systemd ホスト上の SysV 形式スクリプトを、通常はサービスマネージャー経由で呼び出すべきなのはなぜですか?
レッスン完了
System V の概要 を完了しました
従来の SysV 構成が実際に稼働中だと思い込まず、その内容を解釈できるようになりました。
init コマンドを選ぶ前に、実行中の PID 1 を特定する。
ランレベルの意味を、ディストリビューションが定める慣例として扱う。
ランレベルリンクの
S、K、数字による順序を読み取る。レベル 0 と 6 では、制御されたシャットダウン手順を使う。
互換スクリプトがある場合も、稼働中のマネージャーを尊重する。