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からも参照できます。