kdump(核心崩潰傾印)
/ KAY-dump /
核心傾印捕捉的是單一個崩潰的「行程」。但如果是整個「核心」崩潰呢——一次把整台機器都拖垮的核心恐慌(kernel panic)?你沒辦法叫死掉的核心寫一個關於它自己死亡的檔案,因為負責寫的那個核心,正是剛剛壞掉的那個東西。kdump 是 Linux 用來「照樣」捕捉崩潰核心記憶體映像的巧妙機制,好讓那次恐慌能在事後被分析。
用淺白步驟說明這個訣竅。早在任何崩潰之前、在開機時,系統就保留一小片實體記憶體,並把「第二個」獨立的「捕捉」核心載入其中,平常它閒置不動。當主核心恐慌時,它不只是停住,而是用一個叫 kexec 的機制,不經完整硬體重開機,就直接跳進那個已載入的捕捉核心。因為捕捉核心住在自己保留的記憶體裡,崩潰核心的記憶體被原封不動地保留下來。捕捉核心接著做最小程度的開機,把舊核心的整片記憶體寫出到磁碟(或經網路)成為一個慣稱 vmcore 的檔案。等機器正常重開機後,工程師把那個 vmcore 載入一個核心除錯器(crash 工具,或帶有對應核心符號的 gdb),檢視那次恐慌:核心堆疊、暫存器、每顆 CPU 當時在做什麼、以及各資料結構,全都如同恐慌那一刻的原樣。
它之所以重要,是因為核心恐慌否則幾乎不可能診斷——沒有 kdump,你在機器消失前只看到一則訊息在主控台上捲過,這很少足以找出驅動程式或核心本身裡的深層 bug。kdump 把一個致命、稍縱即逝的事件變成一份你能從容研究的耐久產物。誠實的提醒:它必須「事先」設定好,並預先保留好捕捉核心與 crashkernel 記憶體——你不能在恐慌已經發生之後才決定要用 kdump;那片保留的記憶體對運行中的系統永久不可用;而分析一個 vmcore 是專家工作,需要那個確切核心建置的精確除錯符號,所以它是用於嚴肅核心與驅動除錯的嚴肅工具,不是日常便利品。
# 開機時透過核心命令列保留:crashkernel=256M # 恐慌後,捕捉核心寫出 /var/crash/.../vmcore $ crash vmlinux /var/crash/127.0.0.1-2026.../vmcore crash> bt # 恐慌任務的呼叫堆疊回溯,凍結於恐慌那一刻
一個預先保留的捕捉核心把恐慌核心的記憶體存成 vmcore;事後 crash 工具重建恐慌那一刻的核心狀態。
kdump 必須在崩潰之前就設好:捕捉核心與它的 crashkernel 記憶體在開機時就保留好了,所以一台沒設定 kdump 的機器恐慌時,除了一則主控台訊息什麼也留不下。