初期化プロセス/スクリプトはどこで終了しますか?

初期化プロセス/スクリプトはどこで終了しますか?

私の理解は、少なくとも初期ユーザースペースではinitが終了できないシェルスクリプトであるということです。そうですか?

では終わったらどうなりますか?

通常の起動順序では、初期ユーザースペースのinitシェルスクリプトはルートファイルシステムをマウントし、新しいルートからinitに制御を転送することを知っています。しかし、これが起こらないと仮定すると、ルートはマウントされず、制御は新しいルートinitに移行されません。 initスクリプトが終わったらどうなりますか?

答え1

私の理解は、少なくとも初期ユーザースペースではinitが終了できないシェルスクリプトであるということです。そうですか?

シェルスクリプトである必要はありません。もちろん、initプロセスを終了することもできます。これによりカーネルパニックが発生しますが、完了する可能性があります。

では終わったらどうなりますか?

スクリプトは一般的にexec switch_root /root "$@"exec

したがって、プログラムが変更され、initカーネルはexitinitプロセスの情報を見ることができません。

これにより initramfs がクリーンアップされ、マウントがswitch_root exec.so にバインドされ、PID は常に 1 に保持されます。/sbin/init/root/init

ここでは、BusyBoxのswitch_rootのソースコードを見ることができます。本当に簡単です。https://git.busybox.net/busybox/plain/util-linux/switch_root.c最後に、後ろで何が起こっているのかを説明する長い解説もあります。

答え2

initプロセス/sbin/initはシェルスクリプトではなく、通常は終了しません。
~からhttps://en.wikipedia.org/wiki/Init

Unixベースのコンピュータオペレーティングシステムでは、init(初期化の略語)は、コンピュータシステムの起動プロセス中に開始される最初のプロセスです。 Initは、システムがシャットダウンするまで実行され続けるデーモンプロセスです。
これは他のすべてのプロセスの直接間接的な祖先であり、すべての孤児プロセスを自動的に採用します。

カーネルの初期化後にカーネルが分岐して実行する最初のユーザー空間プロセスです。これがPID1(プロセスID 1)と呼ばれる理由です。

upstartやsystemdなど、さまざまなinitプロセスの実装があり、元の実装はsystemV initに基づいていました。

彼らが基本的に行うことは、起動時に開始される各候補プロセスの設定ファイルを読むことです。通常、これらの設定ファイルはにあります/etc/init/。プロセスが開始としてマークされると、プロセスが開始されます。または、設定に「起動時に起動しない」と表示されている場合は起動しませんが、手動で起動できます。後で。
プロセスが起動用としてマークされている場合(従来)、プロセスが開始される方法は、initシステムがinitシステムのデーモンプロセスに対応するシェルスクリプトを実行することです/etc/init.d/

最新のinitシステムと元のSystem V initとのいくつかの違いは、System Vは数値ランレベル0、1、2などを使用してシステムの状態を決定する一方、systemdまたはupstartですmulit-user.target

また – 私の考えでは – 最新の init システムはシェルスクリプトを呼び出す代わりにデーモン自体を起動し、いわゆる「ユニット」ファイルを使って設定ディレクティブを定義します。

/lib/systemd/system/nginx.serviceたとえば、nginxの場合は、次の起動ガイドラインを定義する設定ファイルがあります。

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

次のコマンドを使用して有効にできます。sudo systemctl enable nginx.serviceこれによりシンボリックリンクが生成されます。

/etc/systemd/system/multi-user.target.wants/nginx.service

単位ファイルを指します。

/lib/systemd/system/nginx.service

sudo systemctl disable nginx.serviceシンボリックリンクが削除され、起動時にサービスが開始されません。

最新のinitシステムはsystemV initスクリプトと逆互換であり、その中の設定を読み、/etc/initシェルスクリプトを起動します。/etc/init.d

関連情報