[Linux]Kdump簡介&配置、觸發


0、Kdump 的概念出現在 2005 左右,是迄今為止最可靠的內核轉存機制,已經被主要的 linux™ 廠商選用

 

      LKCD(Linux Kernel Crash Dump),netdump,diskdump 已被納入 LDPs(Linux Documen-tation Project) 內核。SUSE 和 RedHat 都對 kdump 有技術支持。

 

 

1、kdump是在系統崩潰、死鎖或者死機的時候用來轉儲內存運行參數的一個工具和服務;

2、安裝&配置

      安裝:sudo apt-get install linux-crashdump    ubuntu版本

 

 

      配置/etc/kdump.conf文件,指定vmcore 將被轉儲的路徑。可以通過scp拷貝到另一個服務器,也可以是裸設備,或者本地的文件系統。

 

 

      啟動kdump服務:service kdump start

調節內存大小

 

 

 

查看是否調解成功

 

 更新內核存儲

 

 

 重啟生效

 

查看kdunp狀態

 

 

 

     觸發:可以通過kexec加載內核鏡像,讓系統准備捕獲一個崩潰時產生的vmcore。可以通過sysrq強制系統崩潰

 

 

 

 

     此圖為失敗的案例,成功的出發kdump系統會重啟。

                echo "c" > /proc/sysrq-trigger
                這造成kernel panic,緊跟着系統重啟kdump內核。當啟動進程進入到啟動kdump服務器時,vmcore將會被拷貝到你在/etc/kdump.conf文件中指定的位置

 

      注意:當系統崩潰 時,kdump使用kexec啟動到第二個內核。第二個內核通常叫做捕獲內核(capture kernel),以很小內存啟動,並且捕獲轉儲鏡像。

3、 配置保留內存用來轉儲

      對於i386和x86_64架構,編輯/etc/grub.conf啟動配置文件,在內核行的末尾添加 crashkernel=128@16M,例如:

      root (hd0,0)        kernel /boot/vmlinuz-2.6.17-1.2519.4.21.el5 ro root=LABEL=/ rhgb quietcrashkernel=128M@16M         initrd /boot/initrd-2.6.17-1.2519.4.21.el5.img

 

      128M內存(從16M開始)不被正常的系統使用,為捕獲內核保留。注意,free -m的輸出會顯示內存比不加參數時少了128M,這就是我們所期望的。

       注意:可以使用小於128M,但是只使用64M做測試被證實是不可靠的。

 

4、如何訪問捕獲內存

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

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

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

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

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

2. 通過 /proc/vmcore。

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

 

5、關於轉儲內核

 

需要引導系統內核時,可使用如下步驟和命令載入“轉儲捕獲”內核:

 kexec -p <dump-capture-kernel> \ 
           --initrd=<initrd-for-dump-capture-kernel> --args-linux \ 
           --append="root=<root-dev> init 1 irqpoll"

裝載轉儲捕捉內核的注意事項:

轉儲捕捉內核應當是一個 vmlinux 格式的映像(即是一個未壓縮的 ELF 映像文件),而不能是 bzImage 格式;
默認情況下,ELF 文件頭采用 ELF64 格式存儲以支持那些擁有超過 4GB 內存的系統。但是可以指定“--elf32-core-headers”標志以強制使用 ELF32 格式的 ELF 文件頭。這個標志是有必要注意的,一個重要的原因就是:當前版本的 GDB 不能在一個 32 位系統上打開一個使用 ELF64 格式的 vmcore 文件。ELF32 格式的文件頭不能使用在一個“沒有物理地址擴展”(non-PAE)的系統上(即:少於 4GB 內存的系統);
一個“irqpoll”的啟動參數可以減低由於在“轉儲捕獲內核”中使用了“共享中斷”技術而導致出現驅動初始化失敗這種情況發生的概率 ;
必須指定 <root-dev>,指定的格式是和要使用根設備的名字。具體可以查看 mount 命令的輸出;“init 1”這個命令將啟動“轉儲捕捉內核”到一個沒有網絡支持的單用戶模式。如果你希望有網絡支持,那么使用“init 3”。

下面是redhat和susue的流程圖

 

 

 

http://www.dedoimedo.com/computers/kdump.html

Kdump official website

Kdump official documentation

Debugging Linux kernel using Kdump (pdf)

 

 

 

 

 

 


免責聲明!

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



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