リモートのLinuxでハングアップした時に強制的にホストを再起動する方法

リモートのLinuxで作業している時に,ホストが不安定でrebootもshutdownもできなくなってしまう場合に強制的にリモートのホストを再起動できるよというお話。

お使いのPCには「SysRq」と刻印されている謎のキーが有るだろうか?

Windowsを使っている場合はほとんど役に立たないキーであるため,大抵はPrintScreenキーに割り当ててあったりするのだが,Linuxの場合は結構役立つ場合がある。

SysRqとはその名前の通り「System Request」キーの省略であり,Wikipediaによれば,IBMのPC/AT規格マシンで導入されたOSより低レベルシステムを直接呼び出すための割り込みを発生させるキーである。

したがって,SysRqキーを用いることで,OSがハングアップしてしまった場合でもシステムの再起動等を行うことができるのだが,いずれにせよ使用頻度の問題で使い方を忘れるので備忘録として残しておく。

LinuxでSysRqキーを有効化する

LinuxでSysRqキーを有効化するには /etc/sysctl.conf に

kernel.sysrq=1

を追加し,sysctl -p とかで再読込させると設定できる。

設定したら,SysRqキー(*1)とEnterを同時に押すことでヘルプが出る(*2)はずである。

*1 … ちなみに,普通のキーボードではSysRqはAlt+PrtScに割り当たっているらしい。。
*2 … X11上でやると普通にスクリーンショットが起動してしまうので,フレームバッファの端末に切り替えてやりましょう。(Ctrl+Alt+F2等)

ちなみに,Linuxの場合のSysRqコマンドの全容は以下の通りである。

KeyBehavior
0-9ログレベルの操作
bシステムリブート
cシステムクラッシュ(強制的カーネルパニックを起こす)
e, iinit以外の全プロセスにSIGTERMを送信する
k仮想端末上の全プロセスにSAKを実行。
(要するにログアウトしてログインプロンプトに戻るハズ?)
mメモリ情報表示
pカレントプロセス情報の表示
rキーボードのrawモードをXLATEに設定
sマウント中のファイルシステムのsync
t全プロセス情報の表示
ureadonlyで全ファイルシステムの再マウント
w全CPUのトレースコール情報を表示

(実際やってみるとちゃんと動くものもあるが,実際にはキーが押された事を示すカーネルメッセージが出るだけで,多分なんかカーネルパラメータを有効化しておかないと効かないのかもしれない。。)

sshから使う

もちろん上記の方法は,ホストにローカルで繋がっているキーボードとかでのみ有効であり,ssh等で繋がったリモートホストの場合は /proc/sysrq-trigger に上記のコマンドをechoで書き込んでやれば良いらしい。

具体的には, echo b > /proc/sysrq-trigger すると間髪入れずにホストがリブートする。

ただし,あくまでこれは電源をいきなり落とすのと何ら変わらないので,以下の手順でディスクを同期してから再起動するのが良さそうである。

$ echo s > /proc/sysrq-trigger (ディスクをsync(同期)する)
$ echo u > /proc/sysrq-trigger (ディスクをreadonlyで再マウントする)
$ echo b > /proc/sysrq-trigger (reboot)

あと,sysctl.confでkernel.sysrq=1を設定しても良いのだが,一時的に設定したい場合はecho 1 > /proc/sys/kernel/sysrq でも良いらしい。

Leave a Reply

Your email address will not be published.