カーネルパニック

カーネルパニック (kernel panic; KPとも呼ばれる) とは、コンピュータのオペレーティングシステムのカーネルが内部の致命的なエラーを検出したときに取る安全対策である。このエラーでは、安全に回復できないか、システムを実行し続けることができず、大規模なデータ損失のリスクが大幅に高くなる。この用語は主にUnixおよびUnixライクなシステムに特有のものである。Microsoft Windowsオペレーティングシステムの場合、これに相当する用語は「ストップエラー」であり、Windowsの初期バージョンでは青背景でバグチェック画面が表示され、バグチェックコードが表示される (口語的には「死のブルースクリーン」またはBSoDとして知られている)。Xbox Oneプラットフォームでは緑背景で表示され、Windows 10プレビュービルドでも表示される。
AT&Tに由来するBSD Unixソースコードでは、codice_1として知られる、codice_1を処理するカーネルルーチンは、一般的にコンソールにエラーメッセージを出力し、事後デバッグのためにカーネルメモリのイメージをディスクにダンプし、その後、システムが手動で再起動されるのを待つか、自動再起動を開始するように設計されている。提供される情報は高度に技術的なものであり、システム管理者やソフトウェア開発者が問題を診断するのを支援することを目的としている。カーネルパニックは、カーネル空間の外部で発生したエラーによって引き起こされることもある。例えば、多くのUnixオペレーティングシステムは、ユーザ空間で実行されるinitプロセスが終了するとパニックになる。
歴史.
Unixカーネルは、障害検出メカニズムとしてアサーションを用いて、内部の一貫性と実行時の正確性を維持する。基本的な前提は、ハードウェアとソフトウェアが正しく動作し、アサーションが失敗するとパニックが発生する、つまりシステムの全ての活動が自発的に停止することである。カーネルパニックはUnixの初期バージョンで導入され、Unixとその前身であるMulticsの設計思想の間に大きな違いを示した。Multicsの開発者のは、Unixの開発者のデニス・リッチーとこの変更について議論したことを思い出している。
私はデニスに、私がMulticsで書いていたコードの半分はエラー回復コードだと言った。彼は言った「全てを省略した。エラーが発生した場合、パニックと呼ばれるルーチンがあり、それが呼ばれるとマシンがクラッシュし、『おい、再起動しろ』と廊下で大声で叫ぶ。」。元々のcodice_1関数は、UNIX第5版からVAXベースのUNIX 32Vまで基本的には変更されておらず、エラーメッセージだけを出力してそれ以外の情報を何も表示せず、システムを無限のアイドルループに落とした。
V6 UNIXのcodice_1関数のソースコード:
 * In case console is off,
 * panicstr contains argument to last
 * call to panic.
char *panicstr;
 * Panic is called on unresolvable
 * fatal errors.
 * It syncs, prints "panic: mesg" and
 * then loops.
panic(s)
char *s;
 panicstr = s;
 update();
 printf("panic: %s\n", s);
 for(;;)
 idle();
Unixのコードベースが強化されたので、codice_1関数も拡張され、さまざまな形式のデバッグ情報がコンソールにダンプされる。
原因.
オペレーティングシステムのハードウェア障害やソフトウェアバグの結果として、パニックが発生する場合がある。多くの場合、オペレーティングシステムは、エラーが発生した後も動作を継続することができる。ただし、システムは不安定な状態にあり、セキュリティ侵害やデータ破損のリスクを冒すよりも、オペレーティングシステムが停止することで、さらなる損傷を防ぎ、エラーの診断を容易にし、通常は再起動する。
ソースコードからカーネルのバイナリイメージを再コンパイルした後、カーネルが正しく構成、コンパイル、またはインストールされていない場合、結果のカーネルを起動中にカーネルパニックが発生することは一般的な問題である。追加されたハードウェアやRAMの誤動作も、OSとの非互換性やデバイスドライバの欠落により、起動時に致命的なカーネルエラーの原因となる可能性がある。ルートファイルシステムを見つけることができない場合、カーネルはcodice_1を実行する可能性もある。カーネルユーザ空間の初期化の最終段階では、通常、initプロセスの生成が失敗するとパニックが発生する。initプロセスが終了すると、システムが使用不能になるため、パニックが発生する可能性もある。
以下は、codice_7におけるLinuxカーネルの最終初期化の実装である<ref name="lxr, init/main.c">linux/init/main.c, LXR Cross Referencer</ref>。
static int __ref kernel_init(void *unused)
 * We try each of these until one succeeds.
 * The Bourne shell can be used instead of init if we are
 * trying to recover a really broken machine.
 if (execute_command) {
 if (!run_init_process(execute_command))
 return 0;
 pr_err("Failed to execute %s. Attempting defaults...\n",
 execute_command);
 if (!run_init_process("/sbin/init") ||
 !run_init_process("/etc/init") ||
 !run_init_process("/bin/init") ||
 !run_init_process("/bin/sh"))
 return 0;
 panic("No init found. Try passing init= option to kernel. "
 "See Linux Documentation/init.txt for guidance.");
 
オペレーティングシステムの詳細.
Linux.
カーネルパニックは、他のUnixライクなシステムと同様にLinuxでも発生するが、kernel oopsとして知られている別の種類のエラー状態を生成することもある。この場合、カーネルは通常、問題のあるプロセスを終了させた後も実行を継続する。oopsにより、いくつかのサブシステムやリソースが利用できなくなる原因となるため、後で完全なカーネルパニックを引き起こす可能性がある。
Linuxでは、カーネルパニックが発生すると、キーボードのLEDが点滅して危機的な状態を視覚的に示す。
macOS.
Mac OS X 10.2～10.7でカーネルパニックが発生すると、コンピュータは、システムを再起動する必要があることをユーザに通知する多言語メッセージを表示する。10.2以前は、より伝統的なUnixスタイルのパニックメッセージが表示されていたが、10.8以降では、コンピュータは自動的に再起動し、再起動後にメッセージが表示されるようになった。メッセージの形式はバージョンによって異なる。