読むStephenの素晴らしい答えの1つ、違いが何なのか知りたいです。
いつオペレーティングシステム閉鎖。 ...
そして
いつコアshutdown、...(...カーネルではなく外部コマンドを使用して終了するバリエーションを検討しています。)
?
「外部コマンドを使用して終了するバリアント」は、「オペレーティングシステムを終了するとき」ですか、それとも「カーネルを終了するとき」ですか?
つまり、「外部コマンドを使用してシャットダウンを検討しているバリエーションがカーネルではありません」とはどういう意味ですか?
システムコールかどうか再起動()OSまたはカーネルを再起動しますか?
このコマンドはreboot
カーネルの代わりにOSを再起動しますか?
ありがとうございます。
答え1
あなたが引用した投稿には、実際には次のようなものがあります。
カーネルがシャットダウンまたは再開されたときにプロセスを気にせず、プロセスを終了しません(バラより
reboot()
詳細はこちら外部コマンド出口の使用を検討しているバリアントはカーネルではありません。)。
あなたの選択編集者は無関係な文章をつなぎ、間違った印象を作りました。
保持した部分(セミコロンの後ろ)は、セミコロンの前部分(削除)に関連付けられます。つまり、変種再起動()Stephenの目的に応じて、LINUX_REBOOT_CMD_RESTART2
外部コマンドを使用して閉じることは考慮対象から除外されます(文書からリンクされています)。
最初の引用は関係ありません。
答え2
彼はカーネル自体と残りのオペレーティングシステム(カーネルの上に構築されたユーザースペース構造)との違いに気づいたようです。
または、それに対応するコマンド(systemdまたはいくつかの初期化スクリプトなどを呼び出す)を使用してシステムをシャットダウンすると、/sbin/reboot
単にカーネルにシャットダウンを要求する以上の操作が実行されます。ユーザースペースツールは、ファイルシステムのマウント解除、SIGTERM
他のプロセスにシャットダウン要求などを送信するなど、ほぼすべてのクリーンアップ操作を実行します。
代わりに行って電話するとreboot()
システムコールルートとして直接実行するとクリーンアップは発生せず、カーネルは指示されたタスクのみを実行してすぐに終了します(おそらく再起動またはシステムをシャットダウンします)。マニュアルページにはreboot()
同じことをしないので、カーネルsync()
内で実行できるクリーンアップ作業も行っていません。
マニュアルページの例は次のとおりです。
LINUX_REBOOT_CMD_RESTART
(RB_AUTOBOOT, 0x1234567). The message "Restarting system." is
printed, and a default restart is performed immediately. If
not preceded by a sync(2), data will be lost.
だから、
システムコールはオペレーティング
reboot()
システムまたはカーネルを再起動しますか?
カーネルをシャットダウンまたは再起動し、オペレーティングシステムもシャットダウンする必要があります。
このコマンドは
reboot
カーネルの代わりにOSを再起動しますか?
終了するには、ユーザー空間プロセス、追加のクリーンアップ、およびタスクが必要です。その時カーネルのシャットダウンまたは再起動が必要です。
システムコールreboot()
モード(LINUX_REBOOT_CMD_RESTART2
)があり、これを「コマンド文字列の使用」と説明します。ただし、これはユーザーモードコマンドではなくカーネル内部コマンドを意味し、x86でも使用されません。
カーネルとカーネルの上にあるオペレーティングシステムの違いを考慮しながら、原則としてオペレーティングシステムを再起動し、カーネルは引き続き実行できます。カーネルの再起動を要求するのではなく、ユーザースペースによって設定されたすべてをクリーンアップし、別のユーザースペースプロセスを終了してから再起動してすべてをinit
復元します。ただし、これはあまり役に立たない可能性があり、カーネルに残っているすべての状態を確実にリセットすることは困難です(すべてのネットワークインタフェースを手動でリセットし、iptablesルールをクリーンアップし、RAIDとループデバイスをリセットするなどの作業が必要です)一部を見逃す可能性が非常に高いです。