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
高可靠性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服務,就必須安裝kexec-tools工具包。安裝命令以下:
yum update yum install kexec-tools
須要配置爲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,配置文件是/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
爲了減小爲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在指定的位置建立core文件失敗,root文件系統會被掛在,kdump會試圖把dump文件保存在本地。能夠經過修改/etc/kdump.conf
配置文件修改這個默認操做。修改#default shell
這行,而後把shell替換爲本身想要的默認動做。例如:
default halt
在系統boot時候啓動kdump服務
systemctl enable kdump.service
如今應該爲多用戶啓用了kdump服務,相對的systemctl stop kdump
能夠禁用這個服務。在root權限下,使用下面的命令可使kdump服務在當前會話可用:
systemctl start kdump.service
這裏要注意的是當kdump服務啓動時候,前面定義爲內核轉儲目標目錄必須存在, 不然服務將失敗。此時kdump服務已經開啓成功了,可使用下面命令來查看是否開啓成功。
systemctl status kdump.service