銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure上のRHELマシンで、Azure PortalからNMIスイッチでvmcoreを取得する

ひとりAdvent Calendar 17日目です。

adventar.org

Azure上のRHELマシンで仮想マシンが応答しなくなった場合、従来はせいぜいBoot Diagnosticsによるスクリーンショットくらいしか取得できず調査が難しい状況がありました。仮想マシンのシリアルコンソール接続がサポートされたことで、NMI 呼び出しを発行できるため、RHELのkdumpを組み合わせてクラッシュダンプを仮想マシンにログインすることなく取得できるようになりました。

docs.microsoft.com

まずkexec-toolsをインストールしてkdumpサービスを有効化していきます。

# yum install kexec-tools

f:id:tanaka733:20181213162828p:plain

/etc/kdump.confで、pathが指定されていることを確認します。pathで指定する場所はOSディスク内がよいでしょう。

f:id:tanaka733:20181213162914p:plain

/etc/default/grub を見て、GRUB_CMDLINE_LINUXcrashkernelの値が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

f:id:tanaka733:20181213164319p:plain

再起動もしくは次のコマンドで有効化します。

# sysctl -p

これで利用可能になりました。Azureポータルの仮想マシンメニューからSerial Consoleを開き、NMI呼出を送信してみます。

f:id:tanaka733:20181213164356p:plain

仮想マシンはクラッシュして再起動するはずなので、再起動後ログインするとvmcoreが生成されているのが確認できるはずです。

f:id:tanaka733:20181213164434p:plain