Ubuntu-Crash Dump Mechanism

536 阅读6分钟

当发生kernel panic,kernel依赖于kexec机制,在系统启动时预留的内存分区中,重新启动一个内核的新实例。这允许现有的内存区域保持不变,以便安全地将其内容复制到存储中。

Installation

apt install linux-crashdump

: 针对16.04,kernel crash dump机制是默认的。在安装过程中,将出现以下类似的对话框。

image.png 选择该选项会触发重启。重启之后内核的加载由kexec代替系统启动程序的加载。选择Yes为所有的reboot连接kexec-tools。

image.png 选择Yes启用kdump-du,但是需要通过重启才能生效crashkernel kernel parameter。 如果你需要通过手动的方式来启用,可通过命令:

dpkg-reconfigure kexec-tools dpkg-reconfigure kdump-tools

也可通过编辑/etc/default:

#Load a kexec kernel (true/false)

LOAD_KEXEC=true

同时,编辑/etc/default/kdump-tools添加如下行:

USE_KDUMP=1

需要通过重启来启用参数crashkernel=boot,如果已经重启,则可以通过kdump-config load命令行来启用kdump mechanism。

可通过kdump-config show命令来查看kdump的状态,就像下面的类容一样:


USE_KDUMP: 1 

KDUMP_SYSCTL: kernel.panic_on_oops=1 

KDUMP_COREDIR:/var/crash

crashkernel addr : 

/var/lib 

/kdump/vmlinuz kdump initrd : 

/var/lib/kdump/initrd.img 

current state : ready to kdump 

kexec command : 

/sbin/kexec −p −−command−line = ” . . . ” −−initrd = ...

上面的则告诉我们可以在/var/crash下面看到core dumps。

Configuration

除了本地转储之外,现在还可以使用远程转储功能,使用SSH或NFS协议将内核崩溃转储发送到远程服务器。

Load Kernel Crash Dumps

本地转储是自动配置的,除非选择远程协议,否则将一直使用。存在许多配置选项,并且详细记录在/etc/default/kdump−tools文件中。

Remote Kernel Crash Dumps using the SSH protocol

使用SSH协议远程转储时,需要修改/etc/default/kdump−tools:

# Remote dump faclities : 
# SSH − username and hostname of the remote server that willreceiv e the dump 
# and dmesg f i l e s .
# SSH_KEY − Full path of the ssh private key to be used to login to the remote 
# server. use kdump−config propagate to send the public key to the 
# remote server 
# HOSTTAG−Select if hostname of IP address will be used as a prefix to the 
# timestamped directory when sending filesto the remote server . 
# ’ ip ’ is the default. 
SSH=”ubuntu@kdump−netcrash ”

要定义的惟一强制变量是SSH。必须包含远程服务器的用户名和主机名,格式为{username}@{remote server}

SSH_KEY可用于提供一个可用的现有私钥。否则,kdump−config propagate命令将创建一个新的密钥对。

HOSTTAG变量可以使用系统主机名作为要创建的远程目录的前缀,而不是IP地址。

下面的示例显示了如何使用kdump−config propagate来创建并将新的keypair传播到远程服务器:

sudo kdump−config propagate

Need to generate a new ssh key . . . 
The authenticity of host ’kdump−netcrash ( 192.168.1.74 ) ’ can ’ t be establish ed . ECDSA key fingerprintis SHA256 : iMp+5Y28qhbd+tevFCWrEXykDd4dI3yN4OVlu3CBBQ4 . Are you sure you want to continue connecting ( yes/no ) ? yes 
ubuntu@kdump−netcrash’s password :

propagated ssh key /root/.ssh /kdump_id_rsa to server

ubuntu@kdump−netcrash 
The password of the account used on the remote server will be required in order to successfully send the public key to the server 
The kdump−config show command can be used to confirm that kdump is correctly configured to use the SSH protocol : 

kdump−config show

DUMP_MODE: kdump 
USE_KDUMP: 1 
KDUMP_SYSCTL: kernel.panic_on_oops=1 
KDUMP_COREDIR: /var/crash 
crashkernel addr : 0x2c000000 
/var/lib /kdump/vmlinuz: symbolic link to /boot/vmlinuz−4.4.0−10−generic kdump i nitrd : /var/lib /kdump/initrd.img : symbolic link to /var/lib/kdump/i nitrd.img −4.4.0−10− generic 
SSH : ubuntu@kdump−netcrash SSH_KEY: /root/.ssh /kdump_id_rsa HOSTTAG: ip current state : ready to kdump

Remote Kernel Crash Dumps using the NFS protocol

如果要使用NFS协议远程转储,需要修改/etc/default/kdump−tools:

# NFS − Hostname and mount point of the NFS server configured to receive 
# the crash dump. The syntax must be {HOSTNAME}:{MOUNTPOINT} # ( e.g . remote:/ var/crash) 
#
NFS=”kdump−netcrash:/var/crash”

HOSTTAG同SSH一致。通过kdump−config show命令可以确认kdump配置NFS协议是否正确:

kdump-config show

DUMP_MODE: kdump 
USE_KDUMP: 1 KDUMP_SYSCTL: kernel.panic_on_oops=1 
KDUMP_COREDIR: /var/crash crashkernel addr : 0 x2c000000 
/var/lib/kdump/vmlinuz:symboliclink to /boot/vmlinuz−4.4.010−generic kdump init rd:
/var/lib/kdump/initrd.img : symbolic link to /var/lib/kdump/ initrd.img −4.4.010−generic 
NFS: kdump−netcrash : /var/crash 
HOSTTAG: hostname current state : ready to kdump

Verfication

要确认内核转储机制已启用,需要进行一些验证。首先,确认存在crashkernel引导参数(注意:为了符合本文档的格式,下面一行被分成了两行:

cat /proc/cmdline

BOOT_IMAGE=/vmlinuz−3.2.0−17−server root=/dev/mapper/PreciseS−root ro crashker nel=384M−2G:64M,2G−:128M

crashkernel参数语法:

crashkernel=<range1>:<size1>[,<range2>:<size2> , . . . ] [ @offset ] 
range=start −[end ] ’ 
start ’ is inclusive andend ’ is exclusive.

解释:crashker nel=384M−2G:64M,2G−:128M

  • 如果RAM<384M,则不保留任何东西(救援模式)。
  • 如果386M<RAM<2G(exclusive),预留64M。
  • 如果RAM>2G,预留128M

其次,通过执行dmesg | grep −i crash,验证内核已经为kdump内核保留了请求的内存区域。

. . . [ 0.000000] Reserving 64MB of memory at 800MB for crashkernel ( System RAM: 1023MB)

最后,如前所述,kdump−config show命令显示kdump-tools配置的当前状态:

DUMP_MODE: kdump 
USE_KDUMP: 1 KDUMP_SYSCTL: kernel.panic_on_oops=1 
KDUMP_COREDIR: /var/crash crashkernel addr : 0 x2c000000 
/var/lib/kdump/vmlinuz:symboliclink to /boot/vmlinuz−4.4.010−generic kdump init rd:
/var/lib/kdump/initrd.img : symbolic link to /var/lib/kdump/ initrd.img −4.4.010−generic 
NFS: kdump−netcrash : /var/crash 
HOSTTAG: hostname current state : ready to kdump

Testing the Crash Dump Mechanism

Warning

测试崩溃转储机制将导致系统重新启动。在某些情况下,如果系统负载过大,可能会导致数据丢失。如果要测试机制,请确保系统处于空闲状态或负载非常轻。

通过查看内核参数/proc/sys/kernel/sysrq的值,验证SysRQ机制是否启用: cat /proc/sys/kernel/sysrq

如果返回值为0,则禁用转储和重启功能。大于1表示启用了sysrq特性的子集。选项说明和默认值请参见/etc/sysctl .d/10−magic−sysrq.conf。使用以下命令启用dump,然后重新启动测试:

sysctl −w kernel . sysrq=1

完成后,您必须成为root用户,因为仅使用sudo是不够的。作为根用户,必须发出命令echo c > /proc/sysrq−trigger。如果您正在使用网络连接,您将与系统失去联系。这就是为什么最好在连接到系统控制台时进行测试。这样做的好处是使内核转储进程可见。 典型的测试输出应该如下所示:

image.png 输出的其余部分被截断,但是您应该看到系统重新启动,并且在日志的某处,您将看到下面一行:

Begin : Saving vmcore from kernel crash . . .

一旦完成,系统将重新启动到其正常操作模式。然后你会在/var/crash目录下发现crashkernel Dump文件及相关子目录。

ls /var/crash 
201809240744 kexec_cmd linux−image−4.15.0−34−generic −201809240744.crash

如果由于内存不足导致转储失败,可以通过编辑/etc/default/grub.d/kdump−tools.cfg来增加内存预留。例如,要预留512mb:

GRUB_CMDLINE_LINUX_DEFAULT=”$GRUB_CMDLINE_LINUX_DEFAULT cra shk ern el =384M−:512M ”

执行update−grub命令,然后重新启动,然后再次测试。