kdump

kdump 又稱為 kernel dump,是 linux 的標準功能,在發生 kernel crash 時,可以儲存當下的記憶體情況,供後續作分析使用。

kdump 的原理是使用兩份 kernel,一個是系統正常使用,可以稱為 system kernel,另一個是在 system kernel 發生 crash 時,用來儲存當下記憶體情況所需要使用的 kernel,可以稱為 dump capture kernel。

可以理解的是,如果開啟 kdump 的功能,則 system kernel 必須要預留一塊記憶體,供載入 dump capture kernel,是的,dump capture kernel 會在開機時就載入到記憶體裡,因為當 system kernel 發生 crash 時,沒有任何方式可以讀取儲存裝置(例如:硬碟、快閃記憶體…)的資料到記憶體中。

當 system kernel 發生 crash 時,kernel crash handler 會使用 Kexec 來啟動 dump capture kernel,當 dump capture kernel 啟動完成後,就可以使用 /proc/vmcore 來存取已經 crashed 的 system kernel 的記憶體。

Kexec 是一種系統呼叫,可以在目前 kernel 執行中的情況下,用來載入及啟動另一個 kernel。




環境設定

在作業環境中,如果要啟用 kdump 的功能,首先要修改 bootloader configuration,告知 system kernel 要預留記憶體給 dump capture kernel 使用,例如:
LABEL arch-kdump
MENU LABEL Arch Linux Kdump
LINUX ../vmlinuz-linux-kdump
APPEND root=/dev/sda1 crashkernel=64M
INITRD ../initramfs-linux-kdump.img


接著再告知 Kexec 載入 dump capture kernel,加上 -p 的作用為不啟動 kernel,例如:
# kexec -p [/boot/vmlinuz-linux-kdump] --initrd=[/boot/initramfs-linux-kdump.img] --append="root=[root-device] single irqpoll maxcpus=1 reset_devices"

開機之後,要確認 dump capture kernel 是否已載入,可以執行:
# cat /sys/kernel/kexec_crash_loaded
如果是 1,則有順利載入,否則為 0。

在 Ubuntu 的環境中,還另外使用 /etc/default/kdump-tools 的改數 USE_KDUMP 來設定是否啟用 kdump,如果是 1,則啟用,否則為 0。

要測試 kdump 是否能順利運作,最好的方式當然是看 kernel crash 時,是否能順利儲存當下的記憶體情況,使 kernel crash 的指令為:
# echo c > /proc/sysrq-trigger




Reference

archlinux - Kdump

Documentation for Kdump

ubuntu manuals - kdump-config

ubuntu manuals - kdump-tools.conf

archlinux - Kexec


文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹
創作者 silverwind1982 的頭像
silverwind1982

拾人牙慧

silverwind1982 發表在 痞客邦 留言(0) 人氣()