什么是Kdump
Kdump是在系統崩潰、死鎖或死機時用來轉儲內存運行參數的一個工具和服務,是一種新的crash dump捕獲機制,用來捕獲kernel crash(內核崩潰)的時候產生的crash dump。Kdump 的概念出現在 2005 左右,是迄今為止最可靠的內核轉存機制。
kdump相關概念
standard(production) kernel 生產內核,是指我們正在使用的kernel。
Crash(capture)kernel 捕獲內核 ,linux系統崩潰后使用的內核。
kdump 的優勢
高可靠性
崩潰轉儲數據可從一個新啟動內核的上下文中獲取,而不是從已經崩潰內核的上下文。
Kdump工作原理
Kdump需要配置兩個不同目的的kernel,其中一個我們在這里稱作standard(標准的)(production)kernel;另一個稱之為Crash(崩潰的)(capture)kernel。
生產內核是捕獲內核服務的對像:如果系統一旦崩潰,那么正常的內核就沒有辦法工作了,在這個時候將由kdump產生一個用於(capture)捕獲當前運行信息的內核,該內核會與相應的 ramdisk (虛擬內存盤:將內存模擬成硬盤的技術)一起組建一個微環境,將此時的內存中的所有運行狀態和數據信息收集到一個dump core文件中,一旦內存信息收集完成,系統將會自動重啟這和以前的diskdump、netdump同理。
kdump的實現原理
kdump機制主要包括兩個組件:kdump和kexec。
kdump 使用 kexec 啟動到捕獲內核,以很小內存啟動以捕獲轉儲鏡像。生產內核保留了內存的一部分給捕獲內核啟動用。由於 kdump 利用 kexec 啟動捕獲內核,繞過了 BIOS,所以第一個內核的內存得以保留。這是內核崩潰轉儲的本質。
什么是kexec
kexec 是一個快速啟動kernel的機制,它運行在某一正在運行的kernel中,啟動一個新的kernel(這里是crash kernel),而且不用重新經過BIOS 就可以完成啟動。因為一般BIOS都會花費很長的時間,尤其是在大型並且同時連接許多外部設備的Server上的環境下,BIOS會花費更多的時間
kexec 原來的目的是為了節省 kernel 開發人員重啟系統的時間,誰能想到這個“偷懶”的技術卻孕育了最成功的內存轉存機制。
它包括 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需要的條件:
首先,需要在編譯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 namepackage info
Kdumpkdump軟件包
kexec-toolskexec 軟件包,kdump用到的各種工具都在此包中
kernel-debuginfocrash analysis package 用來分析 vmcore 文件
kernel-debuginfo-common kernel-debuginfo依賴包
1、安裝kexec-tool
使用kdump服務,就必須安裝kexec-tools工具包。安裝命令如下:
2、配置grub
配置kdump kernel的內存區域。kdump要求操作系統正常使用的時候,不能使用kdump kernel所占用的內存,配置這個需要修改/etc/dedfault/grub文件。文件內容如下:
修改文件中GRUB_CMDLINE_LINUX這行,可以設置kdump kernel的大小,一般都是128M或者256M。修改完成以后運行下面的命令更新grub的配置
然后重啟系統,使上面對系統的配置有效。