在我的上一篇博文《Linux內核的Oops》的最后介紹到一個Linux內核轉儲工具Kdump,這個工具可以在發(fā)生kernel panic時把現(xiàn)場dump到一個文件里,以供后續(xù)分析之用。本文主要介紹在Ubuntu下如何使用kdump。 Kdump是一個通用的Linux內核轉儲工具,詳細的用法說明可以參考這篇Kdump Tutorial。這篇教程洋洋灑灑幾十頁(鏈接里有pdf文件可以下載),詳細介紹了內核配置的參數(shù),以及實現(xiàn)內核崩潰轉儲的一系列工具的用法以及可能出現(xiàn)的問題,過程看上去有點繁瑣。是不是每臺需要調試的機器都要這么設置呢?其實是沒有必要的。Linux發(fā)行版已經(jīng)幫我們做了很大一部分工作,我們需要做的只是安裝幾個包,啟動一下Kdump服務就可以了。很多發(fā)行版比如Ubuntu默認在內核里已經(jīng)支持了Kdump,我們并不需要重新配置內核,kdump的一系列工具也做成了service可以直接啟用。接下來,我們就會看到在Ubuntu上使用kdump真的非常簡單。但是,我還是建議大家在完成這個簡單的流程后,再回過頭來仔細閱讀上面提到的教程,畢竟,知道真正的細節(jié)才能有助于我們更好的理解這個系統(tǒng)。
Kdump簡介Kdump是一個Linux內核崩潰轉儲機制,這個機制的原理是在內存中保留一塊區(qū)域,這塊區(qū)域用來存放capture kernel,當前的內核發(fā)生crash后,通過kexec把保留區(qū)域的capture kernel運行起來,由capture kernel負責把crash kernel的完整信息--包括CPU寄存器、堆棧數(shù)據(jù)等--轉儲到文件中,文件的存放位置可以是本地磁盤,也可以是網(wǎng)絡。
安裝Ubuntu的crashdump工具包在Ubuntu下實現(xiàn)Kdump只需要安裝linux-crashdump這個包就可以了,可以在新立得下搜索linux-crashdump或者用命令:
linux-crashdump實際上安裝了三個工具,分別是:crash,kexec-tools,以及makedumpfile。 安裝完畢以后,我們檢查一下grub2的啟動選項,會發(fā)現(xiàn)在引導內核的命令linux后面多了一個參數(shù):
crashkernel用來指定保留內存的大小,語法定義如下:
其中,start包含在指定范圍內,而end不包含在指定范圍內。 參考這個語法定義,我們就可以知道linux-crashkernel幫我們設定的保留區(qū)域的大小是:如果內存小于384M,不保留內存;如果內存大于等于384M但小于2G,保留64M;如果內存大于2G,保留128M。 在/etc/init.d中還會有一個kdump的service腳本,我們可以打開這個腳本看一看,內容很簡單,主要是用kexec把/boot下的linux內核鏡像當作capture kernel放入保留內存里。
試用Kdump在下面的實例中,所有的操作都需要root權限,所以請先用sudo su切換到root。 我們需要首先啟動kdump service,命令如下:
下面是啟動成功的畫面: 寫一個讓內核崩潰的模塊還是比較麻煩的,我們可以通過SysRq來實現(xiàn)這個目的。注意,在進行下面的操作前,請保存好自己的數(shù)據(jù)。
或者按這個組合按鍵: Alt+SysRq+c 通過上面的操作,你的系統(tǒng)會立刻崩潰。不出意外的話,系統(tǒng)很快就會重啟,然后在/var/crash這個目錄下我們就可以找到轉儲的crash鏡像。
到這里,利用kdump進行Linux內核轉儲的實驗就結束了,比起Kdump Tutorial里的步驟簡單很多,這都是Ubuntu的功勞。
使用Crash分析轉儲文件接下來我們要面對的是如何分析這個crash文件。這里還有一個教程,為了敘述方便,我把它叫做Crash Tutorial。Crash Tutorial主要介紹在Open SUSE和CentOS下如何利用crash工具來分析轉儲文件,這與Ubuntu還是有點差別的。在上述兩個發(fā)行版里,kdump生成的crash鏡像文件是vmcore,這個文件可以用直接拿來用crash工具分析。Ubuntu提供了一個叫做Apport的工具,Apport用于收集崩潰時所有OS認為有用的信息,并把它們打成一個包,就是上面看到的linux-image-2.6.32-25-generic.0.crash,我們需要的vmcore就在這個包里。下面這個命令用于解包:
我們把crash壓縮包解到~/tmp中: 得到vmcore之后,我們還不能立刻進行分析,crash工具需要內核調試信息dbgsym才可以工作。我們可以先看看/usr/lib下有沒有debug目錄,如果沒有,則需要下載安裝,下載的地址在這里。注意,下載前先用uname -r命令確定當前內核的確切版本號,dbgsym的版本一定要和內核版本完全匹配才可以。 安裝好dbgsym之后,我們就可以使用crash來分析vmcore了,命令如下:
在crash里,我們可以用bt查看內核崩潰時的call trace: 詳細的crash用法大家可以參考Crash Tutorial,或者用Google搜索一下相關資料。
注: 1. 本文采用的操作系統(tǒng)環(huán)境是 Kubuntu 10.04,在Ubuntu 10.04下實驗應該同樣是沒有問題的。 2. 我有用過Ubuntu 10.10來實驗kdump,但是很不幸,capture kernel沒有跑起來,如果大家有在Ubuntu 10.10下的成功經(jīng)驗,麻煩告訴我。 |
|