読者です 読者をやめる 読者になる 読者になる

φ(・・*)ゞ ウーン Archでkdumpをちょっと便利に

arch linux

Arch Linuxでkdumpを設定する場合はArchのWikiの説明を見ればOKです。ただFedoraのkdumpの設定と比べるとちょっと手間がかかる部分もあります。どうせならkexecの実行時に使うカーネル名、initramfs名あたりは決め打ちじゃなくて動的にできるようにしたほうが便利ですよね。(Fedoraの場合はkdumpctlというシェルスクリプトがkdump.serviceのExecStart、ExecStopから呼ばれます。)

ということで、シェルスクリプトを用意してsystemdのユニットから実行するようにすれば今動いているカーネルと同じカーネルが使われるのですが、ただしカーネルは以下の設定になっている必要があります。

  • CONFIG_DEBUG_INFO=y
  • CONFIG_CRASH_DUMP=y
  • CONFIG_PROC_VMCORE=y

ArchのカーネルはCONFIG_DEBUG_INFO、CONFIG_CRASH_DUMPはデフォルトがnなのでArchのカーネルを使っている場合はcrashkernel用にカーネルを作った方が良いかと思います。
crashkernel専用のカーネルを作らない利点としては/bootに余計なファイルが置かれないのでgrub-mkconfigをしたときに不要なエントリが追加されないなどがあったりします。

スクリプトはこんな感じです。

#!/bin/bash

kernname=`uname -r`
boot_dir=/boot
vmlinuz="$boot_dir/vmlinuz-$kernname"
initramfs="$boot_dir/initramfs-$kernname.img"
root_dev=`cat /proc/cmdline  | sed 's/ /\n/g' | grep ^root= | cut -f2- -d'='`

echo /usr/bin/kexec -p "$vmlinuz" --initrd="$initramfs" --append="root=$root_dev single irqpoll maxcpus=1 reset_devices"
/usr/bin/kexec -p "$vmlinuz" --initrd="$initramfs" --append="root=$root_dev single irqpoll maxcpus=1 reset_devices"
echo "kexec comman executed"

exit 0

systemdのunitはこちら。

[Unit]
Description=Load dump capture kernel
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/bin/run-kexec.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

これでoops発生時にカーネルが立ち上がるので適当な方法でダンプを保存すればOKです。

ダンプの取得まで自動で行いたいなどの場合はFedoraのkexec-toolsのコードを読むと参考になるかと思います。
kexec-toolsはgitで管理されていてwebからも参照できます。