【www.710.com】让系统在崩溃的时候能够找到捕获内核(second,1.1 内核管理工科具Kdump安装

  1. Kdump工具

什么是Kdump?

Kdump是二个依照kexec的根本崩溃转储机制,当系统崩溃时,kdump使用kexec运营到第三个根基。地球热能个基本功叫做捕获内核只怕又叫“2nd
kernel”,它以超少的内部存款和储蓄器运转捕获内核,并抓获转储镜像。Kdump的概念是时下最保险的水源转储技巧,已被第大器晚成的linux厂家使用。(比如Red
Hat类别卡塔尔

  Kdump的专门的工作体制是在基本崩溃时, 通过kexec 工具由BIOS运转二个备用水源,
由备用水源施行大器晚成多种职务,保存内部存款和储蓄器中崩溃内核的意况, 供后续故障剖析用.

什么是Kexec?

Kexec是风度翩翩种能够依照已经运转基本的上下文飞速运转新水源的后生可畏种机制,而不通过BIOS。BIOS的开发银行在部分巨型机械或然有大气外设的机械上时特别耗费时间。这种体制能够节省须求在分裂基本功之间切换的开辟职员的年月。
Kexec在根本空间和客户空间都有料理的组件,内核提供了多少个kexec重启功用的类别调用。客户空间的软件包”kexec-tools”使用那些系统调用,并实施加载和教导第三个基本(捕获内核卡塔 尔(阿拉伯语:قطر‎。
Kexec由两有个别组成,一是底蕴空间的系统调用kexec_load,肩负在生养幼功(恐怕叫第多少个根本卡塔 尔(阿拉伯语:قطر‎运行时将捕获内核(只怕叫第4个基本卡塔尔国加载到钦定的岗位。而是客商空间的kexec-tools,它将捕获内核(second
kernel卡塔尔国之处传递给分娩根基(first
kernel卡塔尔国,让系统在崩溃的时候能够找到捕获内核(second
kernel卡塔尔国的地点并运营。

  本文暗中认可英特尔或INTEL X86_64架构, 途睿欧HEL7系列情形. 

Kdump怎么职业?

在最近系统一发布出崩溃时,新的捕获内核被加载,然后依据已设置的授命去将眼下早前爆发崩溃的系统的内部存款和储蓄器保存到八个奇特的文书(vmcore卡塔 尔(英语:State of Qatar)中。

上边以Fedora26做为测量试验演示。(Fedora和CentOS连串的系统已经在kenrel中张开了CONFIG_KEXEC*选项。)

先是需求在系统运营时预先流出出给第一个水源运营的内部存款和储蓄器。内核参数”crashkernel=160M”会在系统运行时预先留下出160M内存的空间给捕获内核运转使用。”crashkerel=xM”还帮助其余的参数,详细的能够参谋内核参数文书档案
基本功参数。

# dmesg | grep -i reserving
[    0.000000] Reserving 160MB of memory at 656MB for crashkernel (System RAM: 2047MB)

系统运转后我们得以从地方的一声令下中阅览已经预先流出出了160M的内部存款和储蓄器从内存的656M处。

设置客商态的包”kexec-tools”,软件包中会提供kdump所需的劳动和”kexec”急迅内核运转命令,和压缩过滤内部存款和储蓄器的”makedumpfile”命令。

[root@localhost ~]# dnf install -y kexec-tools

配备,改革kdump相关的配备文件。

[root@localhost ~]# grep -v ^# /etc/kdump.conf 

path /var/crash
core_collector makedumpfile -l --message-level 1 -d 31


[root@localhost ~]# grep -v ^# /etc/sysconfig/kdump
KDUMP_KERNELVER=""

KDUMP_COMMANDLINE=""

KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"

KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr"

KEXEC_ARGS=""

KDUMP_IMG="vmlinuz"

KDUMP_IMG_EXT=""

布局文件/etc/kdump.conf设置了kdump发生时vmcore文件的储存形式,此文件更改后必要重启kdump的服务。

布局文件/etc/sysconfig/kdump,即便只是改善了COMMANDLINE相关的参数,则不必要去重新build生成新的initramfs文件。

启动kdump服务:

[root@localhost ~]# systemctl restart kdump
[root@localhost ~]# systemctl status kdump
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2017-07-15 10:46:22 UTC; 36s ago
  Process: 2172 ExecStop=/usr/bin/kdumpctl stop (code=exited, status=0/SUCCESS)
  Process: 2180 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
 Main PID: 2180 (code=exited, status=0/SUCCESS)

Jul 15 10:46:21 localhost dracut[4264]: -rw-r--r--   1 root     root          127 Mar 28 02:15 usr/share/zoneinfo/Etc/UTC
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   3 root     root            0 Jun 22 13:38 var
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root           11 Jun 22 13:38 var/lock -> ../run/lock
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root            6 Jun 22 13:38 var/run -> ../run
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   2 root     root            0 Jun 22 13:38 var/tmp
Jul 15 10:46:21 localhost dracut[4264]: ========================================================================
Jul 15 10:46:21 localhost dracut[4264]: *** Creating initramfs image file '/boot/initramfs-4.11.9-300.fc26.x86_64kdump.img' done ***
Jul 15 10:46:22 localhost kdumpctl[2180]: kexec: loaded kdump kernel
Jul 15 10:46:22 localhost kdumpctl[2180]: Starting kdump: [OK]
Jul 15 10:46:22 localhost systemd[1]: Started Crash recovery kernel arming.

怀有的劳务都安插实现,若是那个时候系统产生了panic恐怕其余的后生可畏对以致系统崩溃的场地,那是kdump服务会将及时的内部存储器镜像遵照客商的安插保存起来。三个轻巧易行的法子是通过命令来触发:

[root@localhost ~]# echo c > /proc/sysrq-trigger

[some console log]
... ...
         Starting Kdump Vmcore Save Service...
kdump: dump target is /dev/vda1
kdump: saving to /sysroot//var/crash/127.0.0.1-2017-07-16-04:21:36/
[    2.718001] EXT4-fs (vda1): re-mounted. Opts: data=ordered
kdump: saving vmcore-dmesg.txt
kdump: saving vmcore-dmesg.txt complete
kdump: saving vmcore
Copying data                       : [100.0 %] -
kdump: saving vmcore complete
... ...
[/some console log]

当系统重启后就会在钦赐的目录下看见变化的vmcore文件。能够参照布局文件”/etc/kdump.conf”里的”path”字段。

[root@localhost ~]# ls -lt /var/crash/*/
total 33492
-rw-------. 1 root root 34253115 Jul 16 04:21 vmcore
-rw-r--r--. 1 root root    40360 Jul 16 04:21 vmcore-dmesg.txt

转储文件被保留后方可用”crash”那些软件包来分析那一个”vmcore”文件。

始于波先生及了Kexec内核部分提供了某个系统调用,”kexec_load()” 和
“kexec_file_load()”,当中三个用来加载捕获内核 – “kexec
-l”,其它二个来提供系统重启 – “kexec -e”。

系统调用”kexec_load()”能够加载多少个新的基业并自此能够被”reboot()”调用。它是被这么定义的:

long kexec_load(unsigned long entry, unsigned long nr_segments,
                       struct kexec_segment *segments, unsigned long flags);

里面一个相比首要的是”kexec_segment”结构体:

struct kexec_segment {
    void   *buf;        /* Buffer in user space */
    size_t  bufsz;      /* Buffer length in user space */
    void   *mem;        /* Physical address of kernel */
    size_t  memsz;      /* Physical address length */
};

当reboot()的参数为”LINUX_REBOOT_CMD_KEXEC”并被调用时,则运行新的木本时就调用”kexec_load()”系统调用。别的“CONFIG_KEXEC”必得在编写翻译kernel时被张开。

系统调用”kexec_load_file()”会安装2个参数”kernel”和”initramfs”给”kexec”命令。”kexec”会读取这几个多少来成立对应的数据段。

long kexec_file_load(int kernel_fd, int initrd_fd,
                           unsigned long cmdline_len, const char *cmdline,
                           unsigned long flags);

同样的”CONFIG_KEXEC_FILE”参数也要在基本编写翻译时被展开。

当前的大多数批发版都已经展开了”KEXEC”相关的配置参数。

如上正是二个kdump的简约流程。有关”kdump”能够捕获到的水源崩溃时间足以参见文书档案”/usr/share/doc/kexec-tools/kexec-kdump-howto.txt”。恐怕请参见大家写的测量试验用例
kdump-test。

参谋资料:
kdump-paper
kdump-introduction
fedora-kexec-tools

1.1 内核管理工具Kdump安装

  Kdump是大切诺基HEL7中自带的基本管理工科具.在LacrosseHEL7.1从前的本子,kdump作为安装达成未来的可选组件自动安装,从PRADOHEL7.1始发kdump被植入安装分界面,作为系统底蕴工具供安装选用.

能够由此上面施命发号间接RPM包安装.

yum -y install kexec-tools
rpm -q kexec-tools

同一时候,Kdump还配备了图形化管理工科具,能够由此下边发号布令安装.

yum -y install system-config-kdump

  对于途观HEL7.4及事后的本子,kdump援助INTEL IOMMU.
而不帮忙CRUISERHEL7.3及以前的版本.

1.2 通过命令行配置kdump内部存款和储蓄器容积

  kdump能监督系统基本运营状态,其身份相比较特殊.
kdump的内部存储器空间是在系统运维时,由指点程序分配的,相对于系统基本,kdump内部存款和储蓄器是一个独立的空间.

可以通过如下命令内定kdump的内存空间大小.

crashkernel=128M     #为kdump保留128M的内存空间.

   crashkernel的值能够设置成“auto”,在有的独具极大内部存款和储蓄器的体系中,利于完成Kdump的自动化管理.

crashkernel=auto

  当然,crashkernel的值还足以经过如下格局达成越来越灵活的配置.

  crashkernel=<范围1>:<大小1>, <范围2>:<大小2>

crashkernel=512M-2G:64M,2G-:128M    #当系统内存在512M-2G之间时,为Kdump保留64M的内存空间;当系统内存大于2G时,为Kdump保留128M的内存空间.

  仍然是能够如此:

crashkernel=128M@16M    #为Kdump保留128M的内存空间,内存地址从16M(physical address 0x01000000)开始.

1.3 Kdump的存储

  Kdump的布局在/etc/kdump.cnf中.
kdump提供各样主意将捕获到功底崩溃数据本地保存或保存到长途主机.

#path /var/crash    #kdump本地存储目录,默认是存放在/var/crash目录下,可以根据使用习惯设置.
path /usr/local/cores 
...
#raw /dev/vg/lv_kdump    #kdump可以直接写入移动介质.
raw /dev/sdb1
...
#nfs my.server.com:/export/tmp    #kdump可以通过NFS保存到网络上其它存储设备中.
nfs test.example.com:/export/cores
...
#ssh user@my.server.com      #kdump可以通过SSH传输协议,保存远程主机上.
#sshkey /root/.ssh/kdump_id_rsa
ssh user@test.example.com
sshkey /root/.ssh/mykey

  kdump.conf中还能在 core_collector makedumpfile 选项后增进” -c “,
使kdump文件能够被减少,以节省存款和储蓄空间.

core_collector makedumpfile -c

systemctl start kdump.service    #启动Kdump服务
systemctl enable kdump.service    #使Kdump开机自启
systemctl is-active kdump       #检查Kdump是否已启动
active
echo 1 > /proc/sys/kernel/sysrq   #模拟内核崩溃,检查/var/crash/是否自动保存Kdump捕获的内核崩溃数据, 以确定Kdump是否正常工作
echo c > /proc/sysrq-trigger

  须求小心的是

  (1)在酷威HEL7早先的本子中,kdump的蕴藏目录会趁机kdump服务的开行而由系统活动创造.
HighlanderHEL7中,如果改变了kdump的寄存目录,则必得在运营kdump服务早前,手动成立kdump的囤积目录,否则kdump服务会运转失败.

  (2)假若在装置分界面禁止使用了kdump, 而安装到位之后再经过systemctl start
kdump运行kdump, 会报内存不足不可能起动的错误.
kdump的内部存款和储蓄器空间是在基本加载在此以前由boot分配的, 所以必需校勘boot.
最佳利用kdump的图片管理工科具 system-config-kdump 加载kdump的暗许配置,
使kdump处于可用状态, 然后重启系统, systemctl status kdump
服务处于激活状态(active).

1.4 利用crash功效解析内核崩溃

  利用crash功效组件能够剖判linux内核崩溃时的互联网、磁盘、CPU、系统基本状态,快捷牢固故障点.

crash组件能够由此RPM包安装.

sudo yum -y install crash       #安装crash
sudo debuginfo-install kernel    #安装内核调试模块

 sudo crash /usr/lib/debug/lib/modules/<kernel>/vmlinux
/var/crash/<timestamp>/vmcore  #启动crash调试

测量试验一下:

www.710.com 1

www.710.com 2

crash基本调节和测量试验命令:

crash>log    #崩溃时日志记录
crash>bt     #崩溃时的堆栈信息
crash>vm     #崩溃时的内存状态
crash>ps     #崩溃时的进程状态
crash>files   #崩溃时的打开的文件
crash>exit   #退出crash

2 linux内核调校

2.1 kernel的调校渠道

  EnclaveHEL7中提供三种幼功调校方法:

  (1)使用sysctl 命令;

  (2)改革/etc/sysctl.d/ 目录下的木本配置文件;

  (3)通过shell 在/proc/sys 目录下挂载虚构文件系统;

2.2 sysctl命令能够列出、读取、设置根基参数,
还是能将参数设置为有的时候或恒久.

sysctl -a        #列出所有可调校的项
sysctl kernel.version    #列出kernel的版本信息

sysctl <tunable class>.<tunable>=<value>       #使调校参数临时生效
sysctl -W <tunable class>.<tunable>=<value>   #使调校参数永久生效

2.3 改进/etc/sysctl.d/99-sysctl.conf 目录下的99-sysctl.conf文件

cp /etc/sysctl.d/99-sysctl.conf /etc/sysctl.d/99-sysctl.conf.bak    #备份系统默认的内核参数文件
vim /etc/sysctl.d/99-my.conf    #创建新的内核参数文件

...
<tunable class>.<tunable> = <value>   #写入要调校的参数类和值
 <tunable class>.<tunable> = <value>
...
save    #保存文件
reboot sysctl -p /etc/sysctl.d/99-my.conf  #重启系统或者使用sysctl -p 命令载入新的内核参数配置

2.4 sysctl 调校内核参数

(1)调解最大诉求的aio数量.

sysctl -a | grep fs.aio    #查看内核默认的最大aio值
sysctl fs.aio-max-nr=2048576  #临时调整aio最大值

www.710.com 3

(2)开启本地ipv4转载效用.

sysctl net.ipv4.ip_forward = 1

(3)设定进度能被分配到的最大内部存储器空间.

sysctl vm.max_map_count = 65530

(4)设定系统中何况运转的最大进度数.

sysctl kernel.threads-max = 16161

  在root权限下,通过sysctl 命令的根本参数调校, 基本上能一直调整linux
的基本全部行为举止, 满意实际生育中的绝大相当多需要.

  

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图