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