想要了解 Linux 內(nèi)核轉(zhuǎn)儲(chǔ)機(jī)制,就要從 kexec - > kdump - > crash 這個(gè)遞進(jìn)過(guò)程去分析葬项。
??只有清楚他們?cè)诟鱾€(gè)過(guò)程負(fù)責(zé)的任務(wù)啸如、功能缘挑,搞通了工作原理、功能后绍刮,就去實(shí)際環(huán)境中使用温圆,最后再去分析其源碼,只有這樣你是真正的知道了整個(gè)轉(zhuǎn)儲(chǔ)機(jī)制孩革。
一. 工具介紹及其所負(fù)責(zé)任務(wù)
- kexec
- kdump
- crash
1. kexec工具
kexec是內(nèi)核更換岁歉,免于再次經(jīng)歷固件的工具,節(jié)省了內(nèi)核開發(fā)者的時(shí)間膝蜈。kexec實(shí)現(xiàn)了在一個(gè)內(nèi)核里啟動(dòng)另一個(gè)內(nèi)核刨裆。
安裝
yum install kexec-tools
kexec兩種使用方式
kexec -l /boot/vmlinuz+ --initrd=/boot/initramfs+ --append="root=/dev/sdaX ro"
2. kdump
kdump是內(nèi)核轉(zhuǎn)儲(chǔ)工具,kexec是實(shí)現(xiàn)kdump機(jī)制的關(guān)鍵彬檀。kdump是基于kexec的內(nèi)核崩潰轉(zhuǎn)儲(chǔ)機(jī)制帆啃。內(nèi)存轉(zhuǎn)存機(jī)制。
安裝
# yum install kexec-tools
# yum install kernel-debuginfo #包管理器會(huì)解決其依賴common包
需要檢測(cè)本系統(tǒng)內(nèi)核是否已經(jīng)選中支持kexec system call努潘,若在“/boot/config-XXXXX”中CONFIG_KEXEC=y則是本版本號(hào)的內(nèi)核已開啟;若=n坤学,則需要重新編譯內(nèi)核疯坤,選中CONFIG_KEXEC。
替換內(nèi)核的兩個(gè)步驟深浮,第一個(gè)把新內(nèi)核的模塊目錄(在編譯內(nèi)核時(shí)創(chuàng)建一個(gè)臨時(shí)目錄安裝編譯好內(nèi)核的模塊)
# 編譯好內(nèi)核之后压怠,建立一個(gè)臨時(shí)目錄lib
mkdir -pv lib-kexecKdump-kernel
# 安裝內(nèi)核模塊
make modules_install INSTALL_MOD_PATH=./lib/
- 復(fù)制lib/下編譯好內(nèi)核版本號(hào)目錄的模塊,到/lib/modules/下飞苇。
一.內(nèi)核崩潰轉(zhuǎn)儲(chǔ)的本質(zhì)
當(dāng)系統(tǒng)崩潰時(shí)菌瘫,kdump利用kexec啟動(dòng)另一個(gè)內(nèi)核,這一個(gè)內(nèi)核叫捕獲內(nèi)核布卡,以很小的內(nèi)存啟動(dòng)捕獲內(nèi)核雨让,第一個(gè)內(nèi)核保留了內(nèi)存的一部分給捕獲內(nèi)核啟動(dòng)用。kdump利用kexec啟動(dòng)捕獲內(nèi)核忿等,免去啟動(dòng)BIOS(繞過(guò)BIOS栖忠,沒(méi)有經(jīng)歷BIOS,節(jié)省了系統(tǒng)啟動(dòng)的時(shí)間),所以第一個(gè)內(nèi)核的內(nèi)存得以保留庵寞。
捕獲內(nèi)核只會(huì)使用分配給他的內(nèi)存空間狸相,不會(huì)污染第一內(nèi)核的內(nèi)存數(shù)據(jù)。
二.kdump由兩部分組成
內(nèi)核空間的系統(tǒng)調(diào)用捐川,由kexec_load在生產(chǎn)內(nèi)核啟動(dòng)時(shí)把捕獲內(nèi)核加載到指定地址脓鹃。
用戶空間的工具kexec-tools,將捕獲內(nèi)核的地址傳遞給生產(chǎn)內(nèi)核属拾,在系統(tǒng)崩潰時(shí)能找到捕獲內(nèi)核地址将谊,并運(yùn)行它冷溶。
三.如何使用kdump
定制自定義的轉(zhuǎn)儲(chǔ)捕獲內(nèi)核(編譯內(nèi)核前開啟kdump渐白、vmcore),即捕獲內(nèi)核逞频。
或者將第一個(gè)內(nèi)核本身作為轉(zhuǎn)儲(chǔ)捕獲內(nèi)核使用纯衍,但此方法只支持可重定位內(nèi)核的體系結(jié)構(gòu)。
四.觀察前一個(gè)內(nèi)核內(nèi)存方式
通過(guò)/dev/oldmem設(shè)備接口苗胀。
通過(guò)/proc/vmcore
五.修改內(nèi)核引導(dǎo)參數(shù)襟诸,為啟動(dòng)捕獲內(nèi)核預(yù)留內(nèi)存
- 在grub啟動(dòng)時(shí),修改/boot/grub.cfg;若EFI啟動(dòng)則在/boot/efi/EFI/fedora/grub.cfg基协。其實(shí)只是在里面加入了捕獲內(nèi)核的預(yù)留內(nèi)存值的關(guān)鍵字“crashkernel=X@Y”歌亲,修改位置在類似:“l(fā)inux linuxefi /vmlinuz-4.17.7-200.fc28.x86_64 root=/dev/mapper/fedora-root ro”之后的位置,X:捕獲內(nèi)核預(yù)留的內(nèi)存大小澜驮,Y:代表保留內(nèi)存的起始位置地址陷揪。
要設(shè)置好“Y保留內(nèi)存的起始位置地址”,則需要知道你編譯捕獲內(nèi)核時(shí)的內(nèi)核載入地址(會(huì)在在編譯內(nèi)核開啟kdump杂穷、vmcore時(shí)的第二行會(huì)有設(shè)置修改)悍缠。
### 修改后的文件
menuentry 'Fedora (4.17.7-200.fc28.x86_64) 28 (Workstation Edition)' --class fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-4.16.3-301.fc28.x86_64-advanced-56130196-332b-4c5d-8387-67bba2d45054' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root crashkernel=auto --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 9cc3b942-1abe-4b8e-98fb-c0cd1186223e
else
search --no-floppy --fs-uuid --set=root 9cc3b942-1abe-4b8e-98fb-c0cd1186223e
fi
linuxefi /vmlinuz-4.17.7-200.fc28.x86_64 root=/dev/mapper/fedora-root ro resume=/dev/mapper/fedora-swap crashkernel=auto rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet LANG=zh_CN.UTF-8
initrdefi /initramfs-4.17.7-200.fc28.x86_64.img
}
-
開啟kdump服務(wù)
- x86平臺(tái):
systemctl start kdump && systemctl enable kdump
- mips平臺(tái):不用自己手動(dòng)啟動(dòng)此服務(wù)。
第一個(gè)內(nèi)核啟動(dòng)后耐量,載入轉(zhuǎn)儲(chǔ)捕獲內(nèi)核
載入轉(zhuǎn)儲(chǔ)捕獲內(nèi)核飞蚓,命令規(guī)范:
kexec -p <dump-capture-kernel-vmlinux-image> \
--initrd=<initrd-for-dump-capture-kernel> --args-linux \
--append="root=<root-dev> <arch-specific-options>"
- 當(dāng)執(zhí)行“kexec -p”后,可能會(huì)有root沒(méi)有掛載的情況廊蜒。是因?yàn)閕nitrd參數(shù)未起作用趴拧,然后在“root=”變量使用設(shè)備號(hào)(/dev/sdaX),不要使用“hd0山叮,msdogs”或“UUID”八堡,則可以成功。若系統(tǒng)裝有crash聘芜,則“/var/crash/”有vmcore;若未裝vmcore存在于“/proc/vmcore”兄渺。
- 測(cè)試配置是否有效
- 使用sysrq-c中斷將系統(tǒng)崩潰,讓kdump捕獲崩潰時(shí)產(chǎn)生的vmcore汰现,默認(rèn)存放位置在/var/crash/host@time挂谍,配置文件/etc/dump.conf叔壤。
echo c > /proc/sysrq-trigger
- 成功,重新進(jìn)入穩(wěn)定系統(tǒng)口叙。若系統(tǒng)裝有crash炼绘,則“/var/crash/”有vmcore;若未裝vmcore存在于“/proc/vmcore”。
編譯內(nèi)核時(shí)小技巧
make menconfig
- 啟用或者禁用某項(xiàng)時(shí)妄田,可按“/”搜索某項(xiàng)模塊或服務(wù)俺亮,搜索結(jié)果會(huì)顯示出此服務(wù)的地址,與此服務(wù)模塊依賴的模塊是否啟用疟呐。
參考文獻(xiàn):linux kdump.txt:https://www.kernel.org/doc/Documentation/kdump/kdump.txt
crash
對(duì)內(nèi)核崩潰轉(zhuǎn)儲(chǔ)文件做分析的工具脚曾,更好的使用此工具,請(qǐng)認(rèn)真閱讀man crash启具。
crash kernel-debuginfo vmcore