Linux內(nèi)核轉(zhuǎn)儲(chǔ)機(jī)制分析:從kexec到crash

想要了解 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ù)

  1. kexec
  2. kdump
  3. 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ī)制。

引用自:深入探索 Kdump窍帝,第 1 部分:帶你走進(jìn) Kdump 的世界 過(guò)程邏輯圖
安裝
# 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由兩部分組成

  1. 內(nèi)核空間的系統(tǒng)調(diào)用捐川,由kexec_load在生產(chǎn)內(nèi)核啟動(dòng)時(shí)把捕獲內(nèi)核加載到指定地址脓鹃。

  2. 用戶空間的工具kexec-tools,將捕獲內(nèi)核的地址傳遞給生產(chǎn)內(nèi)核属拾,在系統(tǒng)崩潰時(shí)能找到捕獲內(nèi)核地址将谊,并運(yùn)行它冷溶。

三.如何使用kdump

  1. 定制自定義的轉(zhuǎn)儲(chǔ)捕獲內(nèi)核(編譯內(nèi)核前開啟kdump渐白、vmcore),即捕獲內(nèi)核逞频。

  2. 或者將第一個(gè)內(nèi)核本身作為轉(zhuǎn)儲(chǔ)捕獲內(nèi)核使用纯衍,但此方法只支持可重定位內(nèi)核的體系結(jié)構(gòu)。

四.觀察前一個(gè)內(nèi)核內(nèi)存方式

  1. 通過(guò)/dev/oldmem設(shè)備接口苗胀。

  2. 通過(guò)/proc/vmcore

五.修改內(nèi)核引導(dǎo)參數(shù)襟诸,為啟動(dòng)捕獲內(nèi)核預(yù)留內(nèi)存

  1. 在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
}
  1. 開啟kdump服務(wù)

    • x86平臺(tái):
    systemctl start kdump && systemctl enable kdump
    
    • mips平臺(tái):不用自己手動(dòng)啟動(dòng)此服務(wù)。
  2. 第一個(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”兄渺。
  1. 測(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本讥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鲁冯,更是在濱河造成了極大的恐慌拷沸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薯演,死亡現(xiàn)場(chǎng)離奇詭異撞芍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)跨扮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門序无,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人好港,你說(shuō)我怎么就攤上這事愉镰。” “怎么了钧汹?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵丈探,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拔莱,道長(zhǎng)碗降,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任塘秦,我火速辦了婚禮讼渊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尊剔。我一直安慰自己爪幻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挨稿,像睡著了一般仇轻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奶甘,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天篷店,我揣著相機(jī)與錄音,去河邊找鬼臭家。 笑死疲陕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钉赁。 我是一名探鬼主播蹄殃,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橄霉!你這毒婦竟也來(lái)了窃爷?” 一聲冷哼從身側(cè)響起邑蒋,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姓蜂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后医吊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钱慢,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年卿堂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了束莫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡草描,死狀恐怖览绿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穗慕,我是刑警寧澤饿敲,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站逛绵,受9級(jí)特大地震影響怀各,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜术浪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一瓢对、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胰苏,春花似錦硕蛹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)僵腺。三九已至,卻和暖如春壶栋,著一層夾襖步出監(jiān)牢的瞬間辰如,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工贵试, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琉兜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓毙玻,卻偏偏與公主長(zhǎng)得像豌蟋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桑滩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 單例模式:保證一個(gè)類僅有一個(gè)實(shí)例梧疲,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。單例模式分為懶漢式和餓漢式 懶漢式是當(dāng)該實(shí)例第一次...
    狗尾巴草敗了閱讀 245評(píng)論 0 0
  • 此次美國(guó)游的主要目的是走訪科羅拉多大峽谷运准。 所以我們第三天要驅(qū)車去威廉姆斯小鎮(zhèn)幌氮,以方便第四天走訪大峽谷。 已經(jīng)去了...
    田園讀書人閱讀 5,192評(píng)論 5 12
  • 可愛(ài)的孩子 請(qǐng)把你的窗戶玻璃擦一擦 調(diào)皮的太陽(yáng)就要來(lái)到你的家胁澳, 它會(huì)變成一本書 爬上你的書架 它會(huì)變成一對(duì)鞋子 躲...
    測(cè)謊儀閱讀 521評(píng)論 1 0
  • 前些天该互,微信公眾號(hào)推送了一則電影推薦,是李軍虎導(dǎo)演的《父親》韭畸。與那些平時(shí)推送的商業(yè)電影不同宇智,這部拍攝于2007年的...
    super汗閱讀 255評(píng)論 3 7