1. 程式人生 > >kdump回顧總結實踐(doing,去南京看漫展,舒服)

kdump回顧總結實踐(doing,去南京看漫展,舒服)

capture kernel:捕捉核心

production kernel:生產核心

crash:崩潰

kexec_load:核心空間的系統呼叫,負責在生產核心啟動時將捕獲核心載入到指定地址。

kexec-tools:使用者空間的工具,將捕獲核心的地址傳遞給生產核心,從而在系統崩潰的時候找到捕獲核心的地址並執行。

kexec:核心崩潰轉儲機制

ramdisk:虛擬記憶體盤,是通過軟體將一部分記憶體(RAM)模擬為硬碟來使用的一種技術。所謂的RAM驅動器,實際上是把系統記憶體劃出一部分當作硬碟使用。對於作業系統來講記憶體的存取速度遠遠大於機械磁碟,所以RAM驅動器肯定要比機械的硬碟快得多。

system pancis :系統宕機

grub :多作業系統啟動程式

grub.conf是grub的主配置檔案,通過這個配置檔案,grub才能找到kernel,系統才能正常啟動,其中關鍵字:

     kernel:用於指定系統的核心檔案的位置

     initrd:幫助kernel完成系統的啟動,例如載入根檔案系統所在分割槽的驅動等。如果kernel本身有相應強大的功能,則不需要initrd

     [email protected],Y是為kdump捕獲核心保留的記憶體,X是保留部分記憶體的起始位置。

預設為crashkernel=auto,可自行設定如crashkernel=256M

/etc/grub.conf (一般為/boot/grub/grub.conf的軟連結)

  安裝kexec-tools 時會修改grub(/boot/grub/grub.cfg),增加以下引數

  crashker nel=384M-2G:64M,2G-:128M

crashkernel用來指定保留記憶體的大小,我們可以知道crashkernel幫我們設定的保留區域的大小是:如果記憶體小於384M,不保留記憶體;如果記憶體大於等於384M但小於2G,保留64M;如果記憶體大於2G,保留128M。

我的電腦自動新增:

crashkernel=384M-:128M

kdump簡介

    kdump是系統崩潰的時候,用來轉儲執行記憶體的一個工具。

    kdump是RHEL5之後才支援的,2006被主線接收為核心的一部分,是迄今為止最可靠的核心轉存機制,已經被主要的 linux 廠商選用。kdump 是一種先進的基於 kexec 的核心崩潰轉儲機制。當系統崩潰時,kdump 使用 kexec 啟動到第二個核心。第二個核心通常叫做捕獲核心,以很小記憶體啟動以捕獲轉儲映象。第一個核心保留了記憶體的一部分給第二核心啟動用。由於 kdump 利用 kexec 啟動捕獲核心,繞過了 BIOS,所以第一個核心的記憶體得以保留。這是核心崩潰轉儲的本質。

kdump 需要兩個不同目的的核心,生產核心和捕獲核心。生產核心是捕獲核心服務的對像。捕獲核心會在生產核心崩潰時通過kexec啟動起來,負責把產品核心的完整資訊 - 包括CPU暫存器、堆疊資料等轉儲到指定位置的檔案,與相應的 ramdisk 一起組建一個微環境,用以對生產核心下的記憶體進行收集和轉存。

kdump機制主要包括兩個元件:kdump和kexec

    kexec是一個快速啟動機制,允許通過已經執行的核心的上下文啟動一個Linux核心,不需要經過BIOS。BIOS可能會消耗很多時間,特別是帶有眾多數量的外設的大型伺服器。這種辦法可以為經常啟動機器的開發者節省很多時間。Kexec是實現kdump機制的關鍵,它包括2個組成部分:一是核心空間的系統呼叫kexec_load,負責在生產核心(production kernel 或 first kernel)啟動時將捕獲核心(capture kernel或sencond kernel)載入到指定地址。二是使用者空間的工具kexec-tools,他將捕獲核心的地址傳遞給生產核心,從而在系統崩潰的時候能夠找到捕獲核心的地址並執行。沒有kexec就沒有kdump。先有kexec實現了在一個核心中可以啟動另一個核心,才讓kdump有了用武之地。

    kdump是一種先進的基於kexec的核心崩潰轉儲機制。當系統崩潰時,kdump使用kexec 啟動到第二個核心。第二個核心通常叫做捕獲核心,以很小記憶體啟動以捕獲轉儲映象。第一個核心保留了記憶體的一部分給第二核心啟動用。由於kdump利用kexec啟動捕獲核心,繞過了 BIOS,所以第一個核心的記憶體得以保留。這是核心崩潰轉儲的本質。kdump需要兩個不同目的的核心,生產核心和捕獲核心。生產核心是捕獲核心服務的對像。捕獲核心會在生產核心崩潰時啟動起來,與相應的ramdisk一起組建一個微環境,用以對生產核心下的記憶體進行收集和轉存。注意,在啟動時,kdump保留了一定數量的重要的記憶體,為了計算系統需要的真正最小記憶體,加上kdump使用的記憶體數量,以決定真正的最小記憶體的需求。

kexec和kdump的設計區別:

Kexec的設計是用新核心去覆蓋原核心位置;而KDUMP是預留一塊記憶體來載入第二個核心(和相關資料),Crash後第二個核心在原位置執行(不然就達不到相關目的了),收集第一個核心的相關記憶體資訊

如何使用 kdump

構建系統和 dump-capture 核心,此操作有 2 種方式可選:

1)構建一個單獨的自定義轉儲捕獲核心以捕獲核心轉儲;

2)將系統核心本身作為轉儲捕獲核心,這就不需要構建一個單獨的轉儲捕獲核心。

方法(2)只能用於可支援可重定位核心的體系結構上;目前 i386,x86_64,ppc64 和 ia64 體系結構支援可重定位核心。構建一個可重定位核心使得不需要構建第二個核心就可以捕獲轉儲。但是可能有時想構建一個自定義轉儲捕獲核心以滿足特定要求。

捕獲核心啟動後,會像一般核心一樣,去執行為它建立的ramdisk上的init程式。而各種轉儲機制都可以事先在init中實現。

為了在生產核心崩潰時能順利啟動捕獲核心,捕獲核心以及它的ramdisk是事先放到生產核心的記憶體中的。

生產核心的記憶體是通過/proc/vmcore這個檔案交給捕獲核心的。為了生成它,使用者工具在生產核心中分析出記憶體的使用和

分佈等情況,然後把這些資訊綜合起來生成一個ELF標頭檔案儲存起來。捕獲核心被引導時會被同時傳遞這個ELF檔案頭的

地址,通過分析它,捕獲核心就可以生成出/proc/vmcore。有了/proc/vmcore這個檔案,捕獲核心的ramdisk中的指令碼就

可以通過通常的檔案讀寫和網路來實現各種策略了

kdump優勢:

崩潰轉儲資料可從一個新啟動的捕獲核心的上下文中獲取,而不是從已經崩潰核心的上下文。但是如何具體實現在生產核心中獲取。

如何訪問捕獲記憶體

在核心崩潰之前所有關於核心映像的必要資訊都用 ELF 格式編碼並存儲在保留的記憶體區域中。ELF 頭所在的實體地址被作為命令列引數(fcorehdr=)傳遞給新啟動的轉儲核心。

在 i386 體系結構上,啟動的時候需要使用實體記憶體開始的 640K,而不管作業系統核心轉載在何處。因此,這個 640K 的區域在重新啟動第二個核心的時候由 kexec 備份。

在第二個核心中,“前一個系統的記憶體”可以通過兩種方式訪問:

1. 通過 /dev/oldmem 這個裝置介面。

一個“捕捉”裝置可以使用“raw”(裸的)方式 “讀”這個裝置檔案並寫出到檔案。這是關於記憶體的 “裸”的資料轉儲,同時這些分析 / 捕捉工具應該足夠“智慧”從而可以知道從哪裡可以得到正確的資訊。ELF 檔案頭(通過命令列引數傳遞過來的 elfcorehdr)可能會有幫助。

2. 通過 /proc/vmcore。

kdump原理圖:待補

Ubuntu實踐:

sudo apt-get install linux-crashdump kexec-tools crash
# uname -r
3.13.0-32-generic
下載dbgsym,用來除錯核心資訊
wagt 'http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-3.13.0-32-generic-dbgsym_3.13.0-32.57_amd64.ddeb'

dpkg -i linux-image-3.13.0-32-generic-dbgsym_3.13.0-32.57_amd64.ddeb 

vim /etc/init.d/kdump-tools:可見
VMCORE_FILE=/proc/vmcore
KDUMP_SCRIPT=/usr/sbin/kdump-config
KDUMP_DEFAULTS=/etc/default/kdump-tools

修改kdump配置檔案(/etc/default/kdump-tools):
USE_KDUMP=1

心態爆炸,ubuntu下完全啟動不了。

開機panic:Gave up waiting for root device.

嘗試修改rootdelay時間和將root=UUID改為root=/dev/sda1還是不行,後天在fedora上嘗試一下,去年的時候fedora上是成功的,不行的話看來又是一場苦戰。

明天去南京看漫站,舒服,順便帶一個卡卡西的手辦給老姐。

難受,fedora下4.15.16核心下可以通過shell命令生成vmcore檔案,但是我之前在編譯核心的時候沒有選擇kdump,網上對應的debuginfo包又找不到。

4.15.7核心編譯的時候有選擇kdump,所以有現成的vmlinux,但是通過echo 1 > ..., echo c >..這種方式生不成vmcore檔案,嘗試了好幾次,已經分配crashkernel記憶體,kdump也跑起來了,但是就是崩潰沒有轉儲檔案。。