Kernel printk输出级别,默认是4, INFO也会在LOG_BUF里,从0-7级别越来越低。
echo 【0-7】 > /proc/sys/kernel/printk
centos7上无法通过yum直接安装debuginfo
从下面的网址下载debuginfo的packages:
http://debuginfo.centos.org/7/x86_64/
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-123.el7.x86_64.rpm
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-123.el7.x86_64.rpm
安装下载的rpm包。
之后就可以分析了crash的dump文件了。
kdump的安装和配置:
yum install kexec-tools
yum install system-config-kdump
service kdump start or systemctl start kdump
systemctl enable kdump
打开魔法键:
把/etc/sysctl.conf 中kernel.sysrq = 1
echo 1 > /proc/sys/kernel/sysrq
手动触发panic
echo c > /proc/sysrq-trigger
# echo b > /proc/sysrq-trigger reboot命令不起作用了试试这个,这个就类似与ctrl+alt-del 的重启
/etc/kdump.conf 相关的配置。
1. /proc/sys/kernel/sysrq
向sysrq文件中写入1是为了开启SysRq功能。根据linux/Documentations/sysrq.txt中所说:SysRq代表的是Magic System Request Key。开启了这个功能以后,只要内核没有挂掉,它就会响应你要求的任何操作。但是这需要内核支持(CONFIG_MAGIC_SYSRQ选项)。向/proc/sys/kernel/sysrq中写入0是关闭sysrq功能,写入1是开启,其他选项请参考sysrq.txt。需要注意的是,/proc/sys/kernel/sysrq中的值只影响键盘的操作。
那么怎么使用SysRq键呢?
在x86平台上,组合键"<ALT> + SysRq + <command key>"组成SysRq键以完成各种功能。但是,在一些键盘上可能没有SysRq键。SysRq键实际上就是"Print Screen"键。并且可能有些键盘不支持同时按三个按键,所以你可以按住"ALT键",按一下"SysRq键",再按一下"<command key>键",如果你运气好的话,这个会有效果的。不过放心,现在的键盘一般都支持同时按3个或3个以上的键。
<command key>有很多,这里只挑几个来说,其他的可以参考sysrq.txt文件。
-- 'b' ―― 将会立即重启系统,并且不会管你有没有数据没有写回磁盘,也不卸载磁盘,而是完完全全的立即关机
-- 'o' ―― 将会关机
-- 's' ―― 将会同步所有以挂在的文件系统
-- 'u' ―― 将会重新将所有的文件系统挂在为只读属性
2. /proc/sysrq-trigger
从文件名字就可以看出来这两个是有关系的。写入/proc/sysrq-trigger中的字符其实就是sysrq.txt中说的键所对应的字符,其功能也和上述一样。
所以,这两行命令先开启SysRq功能,然后用'b'命令让计算机立刻重启。
/proc/sysrq-trigger该文件能做些什么事情呢?
# 立即重新启动计算机 (Reboots the kernel without first unmounting file systems or syncing disks attached to the system)
echo "b" > /proc/sysrq-trigger
# 立即关闭计算机(shuts off the system)
echo "o" > /proc/sysrq-trigger
# 导出内存分配的信息 (可以用/var/log/message 查看)(Outputs memory statistics to the console)
echo "m" > /proc/sysrq-trigger
# 导出当前CPU寄存器信息和标志位的信息(Outputs all flags and registers to the console)
echo "p" > /proc/sysrq-trigger
# 导出线程状态信息 (Outputs a list of processes to the console)
echo "t" > /proc/sysrq-trigger
# 故意让系统崩溃 ( Crashes the system without first unmounting file systems or syncing disks attached to the system)
echo "c" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统 (Attempts to sync disks attached to the system)
echo "s" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统为只读 (Attempts to unmount and remount all file systems as read-only)
echo "u" > /proc/sysrq-trigger
此外还有两个,类似于强制注销的功能
e ― Kills all processes except init using SIGTERM
i ― Kills all processes except init using SIGKILL
Crash的使用方法
crash 内置命令简介
crash 命令行启动后,可以通过一些内置命令来打印系统崩溃前的信息。
bt - backtrace
bt 命令用于查看系统崩溃前的堆栈等信息,这是系统调试中非常常用和好用的一个命令。
以“# 数字”开头的行为调用堆栈,即系统崩溃前内核依次调用的一系列函数,通过这个可以迅速推断内核在何处崩溃。
log - dump system message buffer
log 命令可以打印系统消息缓冲区,从而可能找到系统崩溃的线索。
ps - display process status information
ps 命令用于显示进程的状态,带 > 标识代表是活跃的进程。如果没有表示当前没有活跃的进程
dis - disassembling instruction
dis 命令用于对给定地址的内容进行反汇编。
#4 [c0000000f8ce37c0] .get_vmalloc_info at c000000000255900
[Link Register ] [c0000000f8ce37c0] .get_vmalloc_info at c0000000002558dc (un
reliable)
crash> dis -l c000000000255900
/usr/src/debug/kernel-ppc64-3.0.8/linux-3.0/fs/proc/mmu.c: 47
0xc000000000255900 <.get_vmalloc_info+112>: ld r10,8(r11)
用 struct 命令查看数据结构
crash> struct -o vm_struct
struct vm_struct {
[0] struct vm_struct *next;
[8] void *addr;
[16] long unsigned int size;
[24] long unsigned int flags;
[32] struct page **pages;
[40] unsigned int nr_pages;
[48] phys_addr_t phys_addr;
[56] void *caller;
}
SIZE: 64
crash>
kdump is the Linux kernel's built-in crash dump mechanism. In the event of a kernel crash, kdump creates a memory image (also known as vmcore) that can be analyzed for the purposes of debugging and determining the cause of a crash. Dumped image of the main memory, exported as an Executable and Linkable Format (ELF) object, can be accessed either directly during the handling of a kernel crash (through /proc/vmcore), or it can be automatically saved to a locally accessible file system, to a raw device, or to a remote system accessible over the network.
In a "dual kernel" layout, kdump uses kexec to boot another kernel and obtain a memory dump.
To implement this "dual kernel" layout, kdump uses kexec for booting into the dump-capture kernel immediately after the kernel crash, using kexec's ability to boot "over" the currently running kernel while skipping the bootloader and hardware initialization by the system's firmware (BIOS or UEFI).
Send Magic SysRq to a KVM guest using virsh
virsh send-key vm-machine-name KEY_LEFTALT KEY_SYSRQ KEY_C