ひとりAdvent Calendar 17日目です。
Azure上のRHELマシンで仮想マシンが応答しなくなった場合、従来はせいぜいBoot Diagnosticsによるスクリーンショットくらいしか取得できず調査が難しい状況がありました。仮想マシンのシリアルコンソール接続がサポートされたことで、NMI 呼び出しを発行できるため、RHELのkdumpを組み合わせてクラッシュダンプを仮想マシンにログインすることなく取得できるようになりました。
まずkexec-tools
をインストールしてkdumpサービスを有効化していきます。
# yum install kexec-tools
/etc/kdump.conf
で、pathが指定されていることを確認します。pathで指定する場所はOSディスク内がよいでしょう。
/etc/default/grub
を見て、GRUB_CMDLINE_LINUX
にcrashkernel
の値がautoではなく256M
などと明示的に指定してあることを確認してください。仮想マシンのメモリが7GBのとき256M
で動作しましたが、仮想マシンのメモリがおおきくなったり利用するソフトウェアによってここの値を大きくする必要があります。変更した場合は以下の手順でgrub設定ファイルを再生成して、サービスの有効化、再起動までやっておきます。
# vi /etc/default/grub GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300 crashkernel=256M"
# grub2-mkconfig -o /boot/grub2/grub.cfg
# systemctl enable kdump # reboot
ここまでの手順で# echo c > /proc/sysrq-trigger
などの手動によるvmcoreの取得が可能になりました。次にNMI呼出に応答するように設定していきます。/etc/sysctl.conf
に次の行を追加して、NMI関連のパニックオプションを有効にします。
kernel.unknown_nmi_panic=1 kernel.panic_on_io_nmi=1 kernel.panic_on_unrecovered_nmi=1
再起動もしくは次のコマンドで有効化します。
# sysctl -p
これで利用可能になりました。Azureポータルの仮想マシンメニューからSerial Consoleを開き、NMI呼出を送信してみます。
仮想マシンはクラッシュして再起動するはずなので、再起動後ログインするとvmcoreが生成されているのが確認できるはずです。