linux內核崩潰之kdump機制

kdump相關概念html

standard(production) kernel   生產內核    ,是指咱們正在使用的kernel。linux

Crash(capture)kernel             捕獲內核     ,linux系統崩潰後使用的內核。ios

Kdump須要配置兩個不一樣目的的kernel,其中一個咱們在這裏稱做standard(production) kernel;另一個稱之爲Crash(capture)kernel。生產內核是捕獲內核服務的對像。捕獲內核會在生產內核崩潰時啓動起來,與相應的 ramdisk (虛擬內存盤:將內存模擬成硬盤的技術)一塊兒組建一個微環境,用以對生產內核下的內存進行收集和轉存。nginx

 

什麼是kdumpsql

Kdump 的概念出如今 2005 左右,是迄今爲止最可靠的內核轉存機制,主要是用來捕獲kernel crash時候產生的crash dump。shell

kdump 的優點

高可靠性bash

崩潰轉儲數據可從一個新啓動內核的上下文中獲取,而不是從已經崩潰內核的上下文。工具

 

kdump的實現原理ui

kdump機制主要包括兩個組件:kdump和kexec編碼

kdump 使用 kexec 啓動到捕獲內核,以很小內存啓動以捕獲轉儲鏡像。生產內核保留了內存的一部分給捕獲內核啓動用。因爲 kdump 利用 kexec 啓動捕獲內核,繞過了 BIOS,因此第一個內核的內存得以保留。這是內核崩潰轉儲的本質。

簡單來講,standard kernel會正運行時發生crash,而crash(capture) Kernel 會被用來捕獲production kernel crash時候產生的crash dump。

 

 

什麼時kexec

kexec 原來的目的是爲了節省 kernel 開發人員重啓系統的時間,誰能想到這個「偷懶」的技術卻孕育了最成功的內存轉存機制。

kexec 是一個快速啓動kernel的機制,它運行在某一正在運行的kernel中,啓動一個新的kernel(這裏是crash kernel),並且不用從新通過BIOS 就能夠完成啓動。由於通常BIOS都會花費很長的時間,尤爲是在大型而且同時鏈接許多外部設備的Server上的環境下,BIOS會花費更多的時間

它包括 2 個組成部分:一是內核空間的系統調用 kexec_load,負責在生產內核(production kernel 或 first kernel)啓動時將捕獲內核(capture kernel 或 sencond kernel)加載到指定地址。二是用戶空間的工具 kexec-tools,他將捕獲內核的地址傳遞給生產內核,從而在系統崩潰的時候可以找到捕獲內核的地址並運行。沒有 kexec 就沒有 kdump。先有 kexec 實現了在一個內核中能夠啓動另外一個內核,才讓 kdump 有了用武之地。

如何訪問捕獲內存

在內核崩潰以前全部關於核心映像的必要信息都用 ELF 格式編碼並存儲在保留的內存區域中。ELF 頭所在的物理地址被做爲命令行參數(fcorehdr=)傳遞給新啓動的轉儲內核。

在 i386 體系結構上,啓動的時候須要使用物理內存開始的 640K,而無論操做系統內核轉載在何處。所以,這個 640K 的區域在從新啓動第二個內核的時候由 kexec 備份。

在第二個內核中,「前一個系統的內存」能夠經過兩種方式訪問:

1. 經過 /dev/oldmem 這個設備接口。

一個「捕捉」設備可使用「raw」(裸的)方式 「讀」這個設備文件並寫出到文件。這是關於內存的 「裸」的數據轉儲,同時這些分析 / 捕捉工具應該足夠「智能」從而能夠知道從哪裏能夠獲得正確的信息。ELF 文件頭(經過命令行參數傳遞過來的 elfcorehdr)可能會有幫助。

2. 經過 /proc/vmcore。

這個方式是將轉儲(生產內存)輸出爲一個 ELF 格式的文件,而且可使用一些文件拷貝命令(好比 cp,scp 等)將信息讀出來。同時,gdb 能夠在獲得的轉儲文件上作一些調試(有限的)。這種方式保證了內存中的頁面都以正確的途徑被保存 ( 注意內存開始的 640K 被從新映射了 )。

kdump的實現流程

kdump的安裝配置

rhel5,rhel7

目前RHEL 五、6和SLES 10  linux distribution都會默認安裝kdump。

可是咱們仍是首先簡單瞭解下安裝kdump須要哪些條件:

首先,須要在編譯standard(production) kernel 以前,須要指定kernel crash dumping 相關的一組compile 選項

其次,須要在編譯好的standard kernel之上,安裝kernel-kdump package,這個package包含了crash(capture)kernel,crash kernel在standard kernel crash的時候被啓動,所以提供了環境用來capture正處於crash中的standard kernel的dump信息。

軟件包說明

package name                              package info      

kdump            kdump軟件包

kexec-tools                                   kexec 軟件包,kdump用到的各類工具都在此包中

kernel-debuginfo                           crash analysis package  用來分析 vmcore 文件

配置Kdump:

1 肯定kdump相關的package已經安裝好:

[root@bl25p-19 sysconfig]# rpm -qa | grep kdump (rhel7 中默認已安裝)
system-config-kdump-1.0.14-4.el5

[root@bl25p-19 sysconfig]# rpm -qa | grep kexec
kexec-tools-1.102pre-126.el5
[root@bl25p-19 sysconfig]# rpm -qa | grep debuginfo (rhel7 中默認已安裝)
kernel-debuginfo-common-2.6.18-238.el5
kernel-debuginfo-2.6.18-238.el5

配置grub,在啓動時爲內核傳遞參數,來告知內核如何爲crash kernel預留內存

title Red Hat Enterprise Linux Server (2.6.18-238.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M #(XXX@YYY, xxx爲大小, yyy爲offset)
        initrd /initrd-2.6.18-238.el5.img

配置/etc/kdump.conf,來設定crash dump最終爲存在何處,具體參見man 5 kdump.conf。默認是存放在/var/crash/[crash generated date]/vmcore

4 設置kdump服務開機是自動啓動

chkconfig kdump on #開機自啓動

service kdump start # 啓動kdump服務

5 能夠經過 kexec 加載內核鏡像,讓系統準備好去捕獲一個崩潰時產生的 vmcore。能夠經過 sysrq 強制系統崩潰。

echo 「c」 > /proc/sysrq-trigger

這形成內核崩潰,如配置有效,系統將重啓進入 kdump 內核,當系統進程進入到啓動 kdump 服務的點時,vmcore 將會拷貝到你在 kdump 配置文件中設置的位置。RHEL 的缺省目錄是 : /var/crash;SLES 的缺省目錄是 : /var/log/dump。而後系統重啓進入到正常的內核。一旦回覆到正常的內核,就能夠在上述的目錄下發現 vmcore 文件,即內存轉儲文件。
 
 
rhel7

一、安裝kexec-tool

使用kdump服務,就必須安裝kexec-tools工具包。安裝命令以下:

yum update yum install kexec-tools

二、配置grub

須要配置爲kdump kernel的內存區域。kdump要求操做系統正常使用的時候,不能使用kdump kernel所佔用的內存,配置這個須要修改/etc/dedfault/grub文件。文件內容以下:

GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=128M vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 rhgb quiet" GRUB_DISABLE_RECOVERY="true"

修改文件中GRUB_CMDLINE_LINUX這行,能夠設置kdump kernel的大小,通常都是128M或者256M。修改完成之後運行下面的命令更新grub的配置

#grub2-mkconfig -o /boot/grub2/grub.cfg

而後重啓系統,使上面對系統的配置有效。

三、配置kdump類型

上面咱們已經按照kdump的要求對系統進行了一系列的配置,下面就是配置kdump,配置文件是/etc/kdump.conf。默認的vmcore文件存儲在/var/crash目錄下。能夠修改這個路徑:

path /usr/local/cores  //這裏必需要保證這個路徑是存在的,不然啓動kdump服務會失敗

或者你直接把core dump文件寫入一個設備中,把配置文件中的#raw /dev/vg/lv_kdump這一行的#符號去掉而後把後面的改爲本身的設備路徑,以下

raw /dev/sdb1

若是要把dump文件存儲在一個使用NFS協議的遠程機器上,把配置文件中的#nfs my.server.com:/export/tmp這行前面的#符號刪除,而後後面參數部分替換成本身的主機名和路徑名。以下

nfs penguin.example.com:/export/cores

四、配置core收集器

爲了減小爲vmcore轉儲文件的大小,內核轉儲容許你指定一個外部應用程序(一個core收集器)對數據進行壓縮,和可選的刪除全部不相關的信息。目前,惟一徹底支持的core收集器是makedumpfile。

爲了啓用core收集器,在root權限下修改/etc/kdump.conf配置文件,刪除#core_collector maledumpfile -l --message-level 1 -d 31 這行前面的#符號,而後修改成以下(啓動dump文件的壓縮,加上-c參數):

core_collector makedumpfile -c

爲了刪除dump文件中的某些頁(寫0的或者空閒的頁),加上-d參數,-d參數後面的數字表示你想要省略的頁面總數。以下:

core_collector makedumpfile -d 17 -c

五、配置kdump的默認操做

當kdump在指定的位置建立core文件失敗,root文件系統會被掛在,kdump會試圖把dump文件保存在本地。能夠經過修改/etc/kdump.conf配置文件修改這個默認操做。修改#default shell這行,而後把shell替換爲本身想要的默認動做。例如:

default halt

如何啓用kdump?

在系統boot時候啓動kdump服務

systemctl enable kdump.service

如今應該爲多用戶啓用了kdump服務,相對的systemctl stop kdump能夠禁用這個服務。在root權限下,使用下面的命令可使kdump服務在當前會話可用:

systemctl start kdump.service

這裏要注意的是當kdump服務啓動時候,前面定義爲內核轉儲目標目錄必須存在, 不然服務將失敗。此時kdump服務已經開啓成功了,可使用下面命令來查看是否開啓成功。

systemctl status kdump.service
 
可使用以前安裝的 kernel-debuginfo 中的 crash 工具來進行分析
相關文章
相關標籤/搜索