既に色々記事がありますが、実際に手を動かしてやってみたのでメモ。
参考
環境
- CentOS Linux release 7.0.1406 (Core)
- VirtualBox 5.0.4
- Vagrant
そもそもカーネルパニックとは
カーネルパニックとは、オペレーティングシステム(OS)のカーネル部分において、何らかの理由で致命的なエラーが発生し、安全に復旧することができなくなった状態のことである。
カーネルパニックが発生すると、OSは完全に停止してしまい、強制終了を行って再起動する以外に対応方法がなくなる。
カーネルパニックは主にUNIX系OSにおいて用いられる表現であるが、UNIXから派生したLinux系OSやMac OS Xにおいても、同上の状況をカーネルパニックと呼ぶことがある。Windows系OSでは、同様の状況はブルースクリーンと呼ばれることが多い。
Linuxで実際にカーネルパニックが発生したことを見たことはないのですが、Windowsのブルースクリーンだと見たことがあります。
OSは完全に停止し、強制終了を行って再起動する以外の方法がなくなると。では以下より実際に色々触ってみたいと思います。
カーネルパニックを発生させる
以下でカーネルパニックを発生させることができます
$sudo sh -c "echo c > /proc/sysrq-trigger"
上記をsshログインしているVM上で実行すると、 恐らくOSが停止してしまい、Ctrl+Cなどを実行して反応がなくターミナルを削除せざるをえなくなりました。
なお、上記の状態でVirtualBoxを見ると仮想マシンの状態はrunningとなったままです。ただし、再度ターミナルからsshによるリモートログインを試みてもエラーとなってしまいます。
再起動によって事象改善が見込める場合もあるということでOSの再起動をします。
$vagrant reload
再起動完了後は無事sshログインができるようになりました。
カーネルパニック発生時に再起動するようにする
デフォルトの状態ではカーネルパニック発生時に何も起きず、利用者側で明示的に再起動を行う必要があります。
上記についてカーネルパラメーター(kernel.panic)を設定することでカーネルパニック発生時に自動的に設定した秒数後に再起動する事が出来るとのことなのでやってみます。
まずは、現在の設定を確認します。
# ファイルでkernelパラメーターを確認
$cat /proc/sys/kernel/panic
0
# sysctlコマンドでkernelパラメーターを確認
$sysctl kernel.panic
kernel.panic = 0
上記の値を0より大きい値で設定すると設定した秒数後に再起動します。
一時的に設定する
以下のコマンドで一時的にカーネルパニック時の再起動を設定できます。一時的とは今起動しているOSが再起動するまでで、再起動した場合には設定が無効化されています。
# 設定
$echo 5 > /proc/sys/kernel/panic
# 確認
$cat /proc/sys/kernel/panic
5
$sysctl kernel.panic
kernel.panic = 5
設定ができてそうなので、同じ方法でカーネルパニックを発生させてみます。
今度はsshで確立していた通信のコネクションが切断され、VirtualBoxの画面を見ているとどうやら再起動していることも分かりました。
少し時間を待ってからsshログインを試みると無事ログインができました、
また、/var/log/boot.log
についても追記がされており、再起動したことが確認できました。
なお、カーネルパラメーターを確認すると設定が元に戻っていることも確認できます。
$cat /proc/sys/kernel/panic
0
$sysctl kernel.panic
kernel.panic = 0
恒久的に設定する
sysctlコマンドや/proc/sys/kernle/panicファイルによって設定した場合一時的な設定となるため、恒久的な設定が必要です。
以下のファイルを変更した対応します。
kernel.panic = 5
また、上記はreboot後に有効かとなるため、明示的に設定を行います。
# 設定が反映されていない
$sysctl kernel.panic
kernel.panic = 0
# 反映
$sysctl -p
#確認
$sysctl kernel.panic
kernel.panic = 5
この状態で再度カーネルパニックを発生させます。
先ほどと同じようにVMが再起動し、sshログインができるようになった後、カーネルパラメーターを確認してみます。
$sysctl kernel.panic
kernel.panic = 5
今度は無事設定内容がreboot後も設定されていました。