switch_rootの前に分岐するとどうなりますか?

switch_rootの前に分岐するとどうなりますか?

したがって、通常、initramfs /initスクリプトは次のように終了します。

exec switch_root /newroot /sbin/init

systemdやボートを浮かべているものに効果的に置き換えてください。しかし、その前にフォークするとどうなりますか?新しいinitシステムはまだ分岐したプロセスの親プロセスですか、それともゾンビプロセスですか? systemdの場合、systemdが起動する前に作成されたサブプロセスによって「簿記の問題」が発生したり、他の予期しない副作用が発生したりしますか?

編集:コメントにサンプルコードをリクエストしました。これが答えの背後に隠れた原則をどのように変えるかは実際にはわかりませんが、確かです。

tail -f /dev/urandom &
exec switch_root /newroot /sbin/init

ベストアンサー1

答えは「大きなことが起こらなかった」だ。プロセスをingして交換しますexec。分岐されたプロセスは親プロセスのpidが1であることだけを知り、プロセスがsystemdか一部initramfsかは実際には気にしません/init。唯一の日陰は、システムサービスのないデーモンになるため、ロギング、再起動などが正しく機能しないことです。 - フォークされたプロセスにそれ自体を「接続」する独自のサービスを特別に構築しない限り(おそらくそれほど難しくはないでしょう)、決定的PIDなどがなければならないことを考慮すれば)。

このため、通常の起動後に残りのinitramfsコードを実行することは通常推奨されませんが、システムがクラッシュすることはありません。コメントセクションに興味深い議論があります。https://lwn.net/Articles/657345/これについて簡単に説明します。

おすすめ記事