linux內核崩潰之kdump機制


什么是Kdump

Kdump在系統崩潰、死鎖或死機時用來轉儲內存運行參數的一個工具和服務,是一種新的crash dump捕獲機制,用來捕獲kernel crash(內核崩潰)的時候產生的crash dumpKdump 的概念出現在 2005 左右,是迄今為止最可靠的內核轉存機制

kdump相關概念

standard(production) kernel   生產內核是指我們正在使用的kernel

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

kdump 的優勢

高可靠性

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

Kdump工作原理

Kdump需要配置兩個不同目的的kernel,其中一個我們在這里稱作standard(標准的)productionkernel;另一個稱之為Crash(崩潰的)capturekernel

生產內核是捕獲內核服務的對像如果系統一旦崩潰,那么正常的內核就沒有辦法工作了,在這個時候將由kdump產生一個用於(capture)捕獲當前運行信息的內核,該內核會與相應的 ramdisk (虛擬內存盤:將內存模擬成硬盤的技術)一起組建一個微環境將此時的內存中的所有運行狀態和數據信息收集到一個dump core文件中一旦內存信息收集完成,系統將會自動重啟這和以前的diskdumpnetdump同理

 

 

kdump的實現原理

kdump機制主要包括兩個組件:kdumpkexec

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 格式的文件,並且可以使用一些文件拷貝命令(比如 cpscp 等)將信息讀出來。同時,gdb 可以在得到的轉儲文件上做一些調試(有限的)。這種方式保證了內存中的頁面都以正確的途徑被保存 ( 注意內存開始的 640K 被重新映射了 )

 

kdump的安裝配置

安裝kdump需要條件:

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

其次,需要在編譯好的standard kernel之上,安裝kernel-kdump package,這個package包含了crashcapturekernelcrash kernelstandard kernel crash的時候被啟動,因此提供了環境用來capture正處於crash中的standard kerneldump信息。

軟件包說明

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的配置

 

然后重啟系統,使上面對系統的配置有效。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM