私の理解は、少なくとも初期ユーザースペースではinitが終了できないシェルスクリプトであるということです。そうですか?
では終わったらどうなりますか?
通常の起動順序では、初期ユーザースペースのinitシェルスクリプトはルートファイルシステムをマウントし、新しいルートからinitに制御を転送することを知っています。しかし、これが起こらないと仮定すると、ルートはマウントされず、制御は新しいルートinitに移行されません。 initスクリプトが終わったらどうなりますか?
答え1
私の理解は、少なくとも初期ユーザースペースではinitが終了できないシェルスクリプトであるということです。そうですか?
シェルスクリプトである必要はありません。もちろん、init
プロセスを終了することもできます。これによりカーネルパニックが発生しますが、完了する可能性があります。
では終わったらどうなりますか?
スクリプトは一般的にexec switch_root /root "$@"
。exec
したがって、プログラムが変更され、init
カーネルはexit
initプロセスの情報を見ることができません。
これにより 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