CentOS7 內(nèi)核崩潰后處理
關(guān)于kdump 和 crash
kdump是一種kernel crash dump的機制,它可以在內(nèi)核crash時保存系統(tǒng)的內(nèi)存信息用于后續(xù)的分析。kdump是基于kexec的。
crash是一個用于交互式地分析正在運行的Linux系統(tǒng)或者kernel crash后的core dump數(shù)據(jù)的工具。
在CentOS 7 中配置kdump
需要在kernel啟動命令行參數(shù)中添加crashkernel參數(shù),并啟動kdump服務(wù)。
一般設(shè)置為 crashkernel=auto 表示根據(jù)系統(tǒng)內(nèi)存自動reserve一些內(nèi)存給kernelcrash用,在x86_64系統(tǒng)中內(nèi)存大于等于2GB時會reserve內(nèi)存,最小保留內(nèi)存計算方法是:160 MB + 2 bits for every 4 KB of RAM.
當(dāng)然,也可以設(shè)置crashkernel=512M這樣的固定保留內(nèi)存。
用 yum install kexec-tools 安裝kdump工具和服務(wù)
用 systemctl start kdump 命令可以啟動kdump.service,用 systemctl enable kdump 讓dump服務(wù)在開機時自動啟動。
kdump.service 相關(guān)的配置文件 /etc/kdump.conf 里面可以修改一些默認(rèn)的配置,比如dump完成后的動作(默認(rèn)是reboot)、dump文件存放的方式(本地目錄、NFS、scp到另外服務(wù)器等)。
測試kdump
用root權(quán)限執(zhí)行如下命令,可以讓kernel crash。
1 echo 1 > /proc/sys/kernel/sysrq
2 echo c > /proc/sysrq-trigger
kernel dump完成后,系統(tǒng)重啟,進(jìn)入到 /var/crash/ 目錄下可以看到保存下來的crash時系統(tǒng)的內(nèi)存數(shù)據(jù)文件。 (默認(rèn)保存在/var/crash目錄)
- 用crash工具分析
首先需要安裝對應(yīng)的kernel-debuginfo軟件包,比如:
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-327.el7.x86_64.rpm
安裝好kernel-debuginfo包后,執(zhí)行類似這樣的crash命令即可進(jìn)入交互式的分析:
crash /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux /var/crash/127.0.0.1-2016-03-28-15\:28\:59/vmcore
在輸入bt可以展示kernel-stack的backtrace,更多crash中的命令見 man crash。
RIP是函數(shù)中panic時的地址,可以看到是netlink,進(jìn)行反編譯查看
發(fā)現(xiàn)是cmp操作,通過查看源碼對應(yīng)行,解決問題。
