
次のように起動するとどうなるでしょうか:
INIT=/bin/sh(or /bin/bash)
GRUB コマンドラインまたは同様の方法でカーネルにパラメータを渡し、起動します。
シェルがロードされると、すぐに終了します。その後、コンピューターはどのキーを押しても応答しなくなります。
私はとても興味があります状態現時点でのシステムの。カーネルがロードされ、他のプロセスがすべてそこからinit
実行される最初のプロセスであることがわかったので、通常のブート手順ではなく上記のように実行すると、システムにはプロセスがなくなり、何もすることがないようです。fork
/bin/sh
init
走っているようにアイドル状態ですか
while (1) {
sleep(1);
}
他には何がありますか?
皆様のアドバイスに感謝します。おそらくもっと詳しい情報が役に立つでしょう。以前は不必要だと思っていました。
最近 CentOS 7.2 サーバーで作業していたのですが、XFS ディスク パーティションの 1 つが異常で、システム起動時にチェックとリカバリに膨大な時間がかかりました。/etc/fstab
このパーティションの自動マウントをオフにする編集を計画しました。通常の起動手順が停止したため、init=/bin/bash
システムを bash で起動するようにしました。編集後、うっかりfstab
シェルを実行しました。exit
その後、どのキーを押しても画面に反応がなくCtrl-Alt-Del
、カーネルパニックも表示されず、情報も表示されません。(その部屋はとても騒がしかったので、CPU が一生懸命働いているかどうかはわかりませんでした。)私は CPU を何もすることがないアイドル状態と見なしていました。この現象は、私が最初に書き留めた質問について考えさせられました。
そして今夜、Debian 8 を搭載した自分のノートパソコンでいくつかテストをしました。明らかにカーネルパニック。
答え1
驚きました。私の理解では、PID 1を終了するとカーネルパニックを引き起こす。その場合何が起こったのかお話しします。
パニック時の挙動は設定可能です。デフォルトのオプションでは、ループまさにあなたの言う通りですね。
使用される遅延関数は文書化された「ビジー待機」として扱われます。ないOS が通常アイドル状態にあるときに使用される省電力 CPU スリープ状態に入ることが予想されます。
パニックによって出力されたバックトレースを見ると、このすべてが 内で起こっていることがわかると思いますsys_exit()
。技術的には PID 1 は破棄されず、そのシステム コールの実行から戻らないだけだと思います。他の CPU は最初に停止されます。
(いわゆる「アイドルスレッドを起動する」。このプロセスに関係しているとは思えません。私の知る限り、このスレッドを見ることはできません。また、これをアイドル スレッドとして理解したい場合、オンラインになった他の CPU にアイドル スレッドを提供するものは何なのかも尋ねる必要があります。
答え2
ユーザーレベルのプロセスが実行されていない場合、システムは何もしないというのは真実ではありません。システムにはカーネルスレッドカーネル自体が開始したプロセスです。これらはほとんどスリープ状態ですが、定期的に起動してタスクを実行します。カーネル スレッドはカーネル空間コードのみを実行します。つまり、ユーザー レベルのメモリ マッピングはありません。これらは独立してスケジュールされ、一意のプロセス ID を持つという点で、独立したプロセスです。
を実行するとps aux
、スレッド名を囲む角括弧によってカーネル スレッドを認識できます。
答え3
システムではプロセスが実行されていません。したがって、記述したようなビジー ループ (CPU が 100% になる) は発生しません。割り込みはカーネルによって処理されますが、プロセスはありません。CPU はアイドル状態になります。
詳細は、kernel_init() のソースの場合、プログラムは と同様に実行されますexecve()
。つまり、実行は返されないことを意味します ( を参照execve(3p)
)。