【home88一必发】干活流程,RHEL7系统管理之内核管理

by admin on 2019年2月7日
  1. Kdump工具
  1. Kdump工具

什么是Kdump?

Kdump是一个按照kexec的根本崩溃转储机制,当系统崩溃时,kdump使用kexec启动到第一个基础。地热个水源叫做捕获内核或者又叫“2nd
kernel”,它以很少的内存启动捕获内核,并抓获转储镜像。Kdump的概念是当下最有限协理的水源转储技术,已被器重的linux厂商使用。(例如Red
Hat体系)

某天挂载了一个新硬盘后,我的centos7系列第二天就涌出了崩溃现象,报错如题“failed
to start crash recovery kernel arming”.

  Kdump的干活体制是在根本崩溃时, 通过kexec 工具由BIOS启动一个备用水源,
由备用水源执行一名目繁多任务,保存内存中崩溃内核的气象, 供后续故障分析用.

home88一必发,  Kdump的做事机制是在基本崩溃时, 通过kexec 工具由BIOS启动一个备用水源,
由备用水源执行一多元任务,保存内存中崩溃内核的事态, 供后续故障分析用。

什么是Kexec?

Kexec是一种可以基于现已运行基本的上下文连忙启动新水源的一种体制,而不通过BIOS。BIOS的起步在一部分重型机器或者有恢宏外设的机械上时特意耗时。那种机制可以节约需求在不一样基础之间切换的开发人员的日子。
【home88一必发】干活流程,RHEL7系统管理之内核管理。Kexec在基础空间和用户空间都有对应的机件,内核提供了多少个kexec重启功效的系统调用。用户空间的软件包”kexec-tools”使用这么些系统调用,并履行加载和指点第四个水源(捕获内核)。
Kexec由两有的构成,一是水源空间的连串调用kexec_load,负责在生育基础(或者叫首个基本)启动时将捕获内核(或者叫第三个基础)加载到指定的职责。而是用户空间的kexec-tools,它将捕获内核(second
kernel)的地方传递给生产基础(first
kernel),让系统在崩溃的时候可以找到捕获内核(second
kernel)的地址并运行。

意思大概为“内存崩溃捕获机制未能成功启动”,一搜才清楚这是因为一个叫做kdump的劳动不可能启动导致的。

  本文默认英特尔或INTEL X86_64架构, RHEL7系统环境. 

  本文默许英特尔或INTEL X86_【home88一必发】干活流程,RHEL7系统管理之内核管理。64架构, RHEL7系统环境.

Kdump怎么工作?

在脚下系统发生崩溃时,新的抓获内核被加载,然后根据已安装的指令去将如今事头阵生崩溃的连串的内存保存到一个破例的文件(vmcore)中。

下边以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

那么什么样是kdump呢?

1.1 内核管理工具Kdump安装

1.1 内核管理工具Kdump安装

kdump 是一种升高的按照 kexec 的木本崩溃转储机制。当系统崩溃时,kdump
使用 kexec
启动到第三个水源。第三个水源经常称为捕获内核,以很小内存启动以捕获转储镜像。首个基本保留了内存的一部分给第二内核启动用。由于
kdump 利用 kexec 启动捕获内核,绕过了
BIOS,所以首先个根本的内存得以保存。那是水源崩溃转储的本色。详细的在:http://www.ibm.com/developerworks/cn/linux/l-cn-kdump1/index.html\#major3

  Kdump是RHEL7中自带的基石管理工具.在RHEL7.1以前的本子,kdump作为安装到位之后的可选组件自动安装,从RHEL7.1开头kdump被植入安装界面,作为系统基础工具供安装拔取.

  Kdump是RHEL7中自带的木本管理工具.在RHEL7.1往日的本子,kdump作为安装落成将来的可选组件自动安装,从RHEL7.1初阶kdump被植入安装界面,作为系统基础工具供安装拔取.

那接下去查找未果的原委:

可以透过上面发号施令直接RPM包安装.

可以经过下边发号施令直接RPM包安装.

探望一个博文中说与开行文件配置有关

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

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

查看/etc/grub.conf 文件,发现crashkernel=auto,

还要,Kdump还配置了图形化管理工具,可以通过上面发号施令安装.

并且,Kdump还布署了图形化管理工具,可以由此上边发号施令安装.

系统对crashkernel=auto的定义为:

yum -y install system-config-kdump

yum -y install system-config-kdump

如果系统的内存 <= 8 GB 对kdump
kernel不会保留任何内容;也就是说,crashkernel=auto 等

  对于RHEL7.4及随后的本子,kdump协助INTEL IOMMU.
而不支持RHEL7.3及前边的版本.

  对于RHEL7.4及将来的版本,kdump协理INTEL IOMMU.
而不援救RHEL7.3及前边的版本.

于关闭了机械上的kdump功能;

1.2 通过命令行配置kdump内存容量

1.2 通过命令行配置kdump内存容量

如果系统的内存> 8 GB可是<= 16
GB,crashkernel=auto会保留256M,等同于crashkernel=256M;

  kdump能监督系统基本运行意况,其地位比较特殊.
kdump的内存空间是在系统启动时,由指引程序分配的,相对于系统基本,kdump内存是一个独门的空间.

  kdump能监督系统基本运行情状,其地方比较特殊.
kdump的内存空间是在系统启动时,由指点程序分配的,相对于系统基本,kdump内存是一个单独的空间.

如若系统内存> 16GB, crashkernel=auto会保留512M,
等同于crashkernel=512M

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

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

设置虚拟机时,给虚拟机设置的内存为1G,所以说系统关闭了kdump。

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

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

接下去就是改写配置,不过没能在系统中找到博文中所说的/etc/grub.conf这么些文件,后来想到从Centos
7之后启动就动用grub2 了,所以vi
/etc/grub2.cfg把内部的crashkernel=auto改成crashkernel=256M重启就成功了。

   crashkernel的值可以设置成“auto”,在一部分享有较大内存的连串中,利于完结Kdump的自动化管理.

   crashkernel的值可以设置成“auto”,在一部分独具较大内存的系统中,利于落成Kdump的自动化管理.

crashkernel=auto

crashkernel=auto

  当然,crashkernel的值还是能够通过如下格局落到实处更灵敏的配置.

  当然,crashkernel的值还能通过如下格局落到实处更灵敏的配置.

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

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

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

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

  还是能够如此:

  仍能这么:

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

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

1.3 Kdump的存储

1.3 Kdump的存储

  Kdump的配置在/etc/kdump.cnf中.
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

#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文件可以被削减,以节约存储空间.

  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

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)在RHEL7以前的本子中,kdump的仓储目录会随着kdump服务的启动而由系统活动创造.
RHEL7中,倘诺改变了kdump的蕴藏目录,则必须在起步kdump服务此前,手动创制kdump的贮存目录,否则kdump服务会启动退步.

  需求注意的是

  (2)如若在装置界面禁用了kdump, 而安装完毕未来再经过systemctl start
kdump启动kdump, 会报内存不足无法起动的错误.
kdump的内存空间是在基本加载往日由boot分配的, 所以必须修改boot.
最好利用kdump的图片管理工具 system-config-kdump 加载kdump的默许配置,
使kdump处于可用状态, 然后重启系统, systemctl status kdump
服务处于激活状态(active).

  (1)在RHEL7从前的本子中,kdump的贮存目录会随着kdump服务的启航而由系统活动创造.
RHEL7中,假诺改动了kdump的囤积目录,则必须在启动kdump服务之前,手动创设kdump的存储目录,否则kdump服务会启动战败.

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

  (2)即使在设置界面禁用了kdump, 而安装到位之后再经过systemctl start
kdump启动kdump, 会报内存不足不能启动的错误.
kdump的内存空间是在基础加载在此之前由boot分配的, 所以必须修改boot.
最好应用kdump的图纸管理工具 system-config-kdump 加载kdump的默许配置,
使kdump处于可用状态, 然后重启系统, systemctl status kdump
服务处于激活状态(active).

  利用crash功效组件可以分析linux内核崩溃时的网络、磁盘、CPU、系统基本状态,火速稳定故障点.

1.4 利用crash功能分析内核崩溃

crash组件可以经过RPM包安装.

  利用crash成效组件能够分析linux内核崩溃时的互连网、磁盘、CPU、系统基本状态,飞速稳定故障点.

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

crash组件可以通过RPM包安装.

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

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

测试一下:

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

home88一必发 1

测试一下:

home88一必发 2

home88一必发 3

crash基本调试命令:

home88一必发 4

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

crash基本调试命令:

2 linux内核调校

crash>log    #崩溃时日志记录
crash>bt     #崩溃时的堆栈新闻
crash>vm     #崩溃时的内存状态
crash>ps     #崩溃时的历程情状
crash>files   #崩溃时的开拓的文本
crash>exit   #退出crash

2.1 kernel的调校途径

2 linux内核调校

  RHEL7中提供二种基础调校方法:

2.1 kernel的调校途径

  (1)使用sysctl 命令;

  RHEL7中提供二种基本调校方法:

  (2)修改/etc/sysctl.d/ 目录下的内核配置文件;

  (1)使用sysctl 命令;

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

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

2.2 sysctl命令可以列出、读取、设置基本参数,
还足以将参数设置为临时或永久.

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

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

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

2.2 sysctl命令可以列出、读取、设置基础参数,
还是能将参数设置为临时或永久.

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

sysctl -a        #列出具有可调校的项
sysctl kernel.version    #列出kernel的版本音讯

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 命令载入新的内核参数配置

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

2.4 sysctl 调校内核参数

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

(1)调整最大请求的aio数量.

cp /etc/sysctl.d/99-sysctl.conf
/etc/sysctl.d/99-sysctl.conf.bak    #备份系统默许的基础参数文件
vim /etc/sysctl.d/99-my.conf    #创制新的基石参数文件

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


<tunable class>.<tunable> = <value>
  #写入要调校的参数类和值
 <tunable class>.<tunable> = <value>

save    #封存文件
reboot\ sysctl -p /etc/sysctl.d/99-my.conf  #重启系统或者应用sysctl
-p 命令载入新的基础参数配置

home88一必发 5

2.4 sysctl 调校内核参数

(2)开启本地ipv4转发功效.

(1)调整最大请求的aio数量.

sysctl net.ipv4.ip_forward = 1

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

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

home88一必发 6

sysctl vm.max_map_count = 65530

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

(4)设定系统中并且运行的最大进度数.

sysctl net.ipv4.ip_forward = 1

sysctl kernel.threads-max = 16161

(3)设定进程能被分配到的最大内存空间.

  在root权限下,通过sysctl 命令的基础参数调校, 基本上能一向控制linux
的基业所有行为, 满意实际生育中的绝一大半需要.

sysctl vm.max_map_count = 65530

  

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

sysctl kernel.threads-max = 16161

在root权限下,通过sysctl 命令的基业参数调校, 基本上能直接控制linux
的基石所有行为, 满足实际生产中的绝大部分需要.

Linux公社的RSS地址:

正文永久更新链接地址

home88一必发 7

发表评论

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

网站地图xml地图