Kdump 工作流程

什么是Kdump券犁?

Kdump是一個基于kexec的內(nèi)核崩潰轉(zhuǎn)儲機制油吭,當系統(tǒng)崩潰時矫钓,kdump使用kexec啟動到第二個內(nèi)核。地熱個內(nèi)核叫做捕獲內(nèi)核或者又叫“2nd kernel”铁瞒,它以很少的內(nèi)存啟動捕獲內(nèi)核妙色,并捕獲轉(zhuǎn)儲鏡像。Kdump的概念是目前最可靠的內(nèi)核轉(zhuǎn)儲技術(shù)慧耍,已被主要的linux廠商使用身辨。(例如Red Hat系列)

什么是Kexec?

Kexec是一種能夠根據(jù)已經(jīng)運行內(nèi)核的上下文快速啟動新內(nèi)核的一種機制芍碧,而不經(jīng)過BIOS煌珊。BIOS的啟動在一些大型機器或者有大量外設(shè)的機器上時特別耗時兼蜈。這種機制能夠節(jié)省需要在不同內(nèi)核之間切換的開發(fā)人員的時間固灵。
Kexec在內(nèi)核空間和用戶空間都有對應(yīng)的組件,內(nèi)核提供了幾個kexec重啟功能的系統(tǒng)調(diào)用锣光。用戶空間的軟件包"kexec-tools"使用這些系統(tǒng)調(diào)用踪危,并執(zhí)行加載和引導第二個內(nèi)核(捕獲內(nèi)核)蔬浙。
Kexec由兩部分組成,一是內(nèi)核空間的系統(tǒng)調(diào)用kexec_load贞远,負責在生產(chǎn)內(nèi)核(或者叫第一個內(nèi)核)啟動時將捕獲內(nèi)核(或者叫第二個內(nèi)核)加載到指定的位置畴博。而是用戶空間的kexec-tools,它將捕獲內(nèi)核(second kernel)的地址傳遞給生產(chǎn)內(nèi)核(first kernel)蓝仲,讓系統(tǒng)在崩潰的時候能夠找到捕獲內(nèi)核(second kernel)的地址并運行俱病。

Kdump怎么工作官疲?

在當前系統(tǒng)發(fā)生崩潰時,新的捕獲內(nèi)核被加載亮隙,然后根據(jù)已設(shè)置的命令去將當前之前發(fā)生崩潰的系統(tǒng)的內(nèi)存保存到一個特殊的文件(vmcore)中途凫。

下面以Fedora26做為測試演示。(Fedora和CentOS系列的系統(tǒng)已經(jīng)在kenrel中打開了CONFIG_KEXEC*選項咱揍。)

首先需要在系統(tǒng)啟動時預(yù)留出給第二個內(nèi)核運行的內(nèi)存颖榜。內(nèi)核參數(shù)"crashkernel=160M"會在系統(tǒng)啟動時預(yù)留出160M內(nèi)存的空間給捕獲內(nèi)核運行使用。"crashkerel=xM"還支持其他的參數(shù)煤裙,詳細的可以參考內(nèi)核參數(shù)文檔 內(nèi)核參數(shù)掩完。

# dmesg | grep -i reserving
[    0.000000] Reserving 160MB of memory at 656MB for crashkernel (System RAM: 2047MB)

系統(tǒng)啟動后我們可以從上面的命令中看到已經(jīng)預(yù)留出了160M的內(nèi)存從內(nèi)存的656M處。

安裝用戶態(tài)的包"kexec-tools"硼砰,軟件包中會提供kdump所需的服務(wù)和"kexec"快速內(nèi)核啟動命令且蓬,和壓縮過濾內(nèi)存的"makedumpfile"命令。

[root@localhost ~]# dnf install -y kexec-tools

配置题翰,修改kdump相關(guān)的配置文件恶阴。

[root@localhost ~]# grep -v ^# /etc/kdump.conf 

path /var/crash
core_collector makedumpfile -l --message-level 1 -d 31


[root@localhost ~]# grep -v ^# /etc/sysconfig/kdump
KDUMP_KERNELVER=""

KDUMP_COMMANDLINE=""

KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"

KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr"

KEXEC_ARGS=""

KDUMP_IMG="vmlinuz"

KDUMP_IMG_EXT=""

配置文件/etc/kdump.conf設(shè)置了kdump發(fā)生時vmcore文件的存儲方式,此文件修改后需要重啟kdump的服務(wù)豹障。

配置文件/etc/sysconfig/kdump冯事,如果只是修改了COMMANDLINE相關(guān)的參數(shù),則不需要去重新build生成新的initramfs文件血公。

啟動kdump服務(wù):

[root@localhost ~]# systemctl restart kdump
[root@localhost ~]# systemctl status kdump
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2017-07-15 10:46:22 UTC; 36s ago
  Process: 2172 ExecStop=/usr/bin/kdumpctl stop (code=exited, status=0/SUCCESS)
  Process: 2180 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
 Main PID: 2180 (code=exited, status=0/SUCCESS)

Jul 15 10:46:21 localhost dracut[4264]: -rw-r--r--   1 root     root          127 Mar 28 02:15 usr/share/zoneinfo/Etc/UTC
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   3 root     root            0 Jun 22 13:38 var
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root           11 Jun 22 13:38 var/lock -> ../run/lock
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root            6 Jun 22 13:38 var/run -> ../run
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   2 root     root            0 Jun 22 13:38 var/tmp
Jul 15 10:46:21 localhost dracut[4264]: ========================================================================
Jul 15 10:46:21 localhost dracut[4264]: *** Creating initramfs image file '/boot/initramfs-4.11.9-300.fc26.x86_64kdump.img' done ***
Jul 15 10:46:22 localhost kdumpctl[2180]: kexec: loaded kdump kernel
Jul 15 10:46:22 localhost kdumpctl[2180]: Starting kdump: [OK]
Jul 15 10:46:22 localhost systemd[1]: Started Crash recovery kernel arming.

所有的服務(wù)都配置完成昵仅,如果此時系統(tǒng)發(fā)生了panic或者其他的一些導致系統(tǒng)崩潰的現(xiàn)象,這是kdump服務(wù)會將當時的內(nèi)存鏡像按照用戶的配置保存起來累魔。一個簡單的方式是通過命令來觸發(fā):

[root@localhost ~]# echo c > /proc/sysrq-trigger

[some console log]
... ...
         Starting Kdump Vmcore Save Service...
kdump: dump target is /dev/vda1
kdump: saving to /sysroot//var/crash/127.0.0.1-2017-07-16-04:21:36/
[    2.718001] EXT4-fs (vda1): re-mounted. Opts: data=ordered
kdump: saving vmcore-dmesg.txt
kdump: saving vmcore-dmesg.txt complete
kdump: saving vmcore
Copying data                       : [100.0 %] -
kdump: saving vmcore complete
... ...
[/some console log]

當系統(tǒng)重啟后就能在指定的目錄下看到生成的vmcore文件摔笤。可以參考配置文件"/etc/kdump.conf"里的"path"字段垦写。

[root@localhost ~]# ls -lt /var/crash/*/
total 33492
-rw-------. 1 root root 34253115 Jul 16 04:21 vmcore
-rw-r--r--. 1 root root    40360 Jul 16 04:21 vmcore-dmesg.txt

轉(zhuǎn)儲文件被保存后可以用"crash"這個軟件包來分析這個"vmcore"文件吕世。

開始提到了Kexec內(nèi)核部分提供了一些系統(tǒng)調(diào)用,"kexec_load()" 和 "kexec_file_load()"梯投,其中一個用來加載捕獲內(nèi)核 - "kexec -l"命辖,另外一個來提供系統(tǒng)重啟 - "kexec -e"。

系統(tǒng)調(diào)用"kexec_load()"可以加載一個新的內(nèi)核并之后能夠被"reboot()"調(diào)用分蓖。它是被這樣定義的:

long kexec_load(unsigned long entry, unsigned long nr_segments,
                       struct kexec_segment *segments, unsigned long flags);

其中一個比較重要的是"kexec_segment"結(jié)構(gòu)體:

struct kexec_segment {
    void   *buf;        /* Buffer in user space */
    size_t  bufsz;      /* Buffer length in user space */
    void   *mem;        /* Physical address of kernel */
    size_t  memsz;      /* Physical address length */
};

當reboot()的參數(shù)為"LINUX_REBOOT_CMD_KEXEC"并被調(diào)用時吮龄,則啟動新的內(nèi)核時就調(diào)用"kexec_load()"系統(tǒng)調(diào)用。另外“CONFIG_KEXEC”必須在編譯kernel時被打開咆疗。

系統(tǒng)調(diào)用"kexec_load_file()"會設(shè)置2個參數(shù)"kernel"和"initramfs"給"kexec"命令。"kexec"會讀取這些數(shù)據(jù)來創(chuàng)建對應(yīng)的數(shù)據(jù)段母债。

long kexec_file_load(int kernel_fd, int initrd_fd,
                           unsigned long cmdline_len, const char *cmdline,
                           unsigned long flags);

同樣的"CONFIG_KEXEC_FILE"參數(shù)也要在內(nèi)核編譯時被打開午磁。

目前的大多數(shù)發(fā)行版都已經(jīng)打開了"KEXEC"相關(guān)的配置參數(shù)尝抖。

以上就是一個kdump的簡單流程。有關(guān)"kdump"能夠捕獲到的內(nèi)核崩潰時間可以參考文檔"/usr/share/doc/kexec-tools/kexec-kdump-howto.txt"迅皇∶亮桑或者請參考我們寫的測試用例 kdump-test

參考資料:
kdump-paper
kdump-introduction
fedora-kexec-tools

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末登颓,一起剝皮案震驚了整個濱河市搅荞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌框咙,老刑警劉巖咕痛,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喇嘱,居然都是意外死亡茉贡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門者铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腔丧,“玉大人,你說我怎么就攤上這事作烟∮湓粒” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵拿撩,是天一觀的道長衣厘。 經(jīng)常有香客問我,道長绷雏,這世上最難降的妖魔是什么头滔? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮涎显,結(jié)果婚禮上坤检,老公的妹妹穿的比我還像新娘。我一直安慰自己期吓,他們只是感情好早歇,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讨勤,像睡著了一般箭跳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潭千,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天谱姓,我揣著相機與錄音,去河邊找鬼刨晴。 笑死屉来,一個胖子當著我的面吹牛路翻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茄靠,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼茂契,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慨绳?” 一聲冷哼從身側(cè)響起掉冶,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脐雪,沒想到半個月后厌小,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喂江,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年召锈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获询。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡涨岁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吉嚣,到底是詐尸還是另有隱情梢薪,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布尝哆,位于F島的核電站秉撇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秋泄。R本人自食惡果不足惜琐馆,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恒序。 院中可真熱鬧瘦麸,春花似錦、人聲如沸歧胁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喊巍。三九已至屠缭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崭参,已是汗流浹背呵曹。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奄喂。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓之剧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砍聊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理贰军,服務(wù)發(fā)現(xiàn)玻蝌,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,849評論 25 707
  • Ubuntu的發(fā)音 Ubuntu许饿,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音舵盈。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,215評論 9 467
  • OSSIC是由4位羅技前員工組建的音響公司秽晚,熱衷于解決耳機界的一個大難題:如何盡可能準確地將聲音「空間化」瓦糟?團隊的...
    VR看天下閱讀 453評論 0 1
  • 寫在前面 新到一個公司,拉下代碼后赴蝇,發(fā)現(xiàn)編譯時間在10分鐘以上菩浙,不知道為啥這么長時間,之前開發(fā)過程中沒有遇到過這樣...
    vincentgemini閱讀 6,593評論 0 8