kdump是專門用來進行崩潰轉儲,我第一次看到它的時候可是吃了不少苦頭,本文首先談談我吃的那些苦頭,然后談談之后的事情。
記得有一次,那時還在長春,我們經理讓我將linux內存映像轉儲到磁盤,我當時的第一反應就是grep內核源代碼,查找dump,結果找到的除了注釋就 是不相關的東西,我想這下可麻煩了,然后我就開始在網上找資料,后來還是查linux的內核Documents的時候找到了kdump,這個項目是專門進 行內核轉儲的,它是基于kexec的,之后的事情就很明了了,我迫不及待的想看看它是怎么實現的,辦法呢?當然是查源代碼了,當時我想實現肯定在源代碼里面有所體現,不過這次我不再傻乎乎的grep了,我似乎“聰明”了一些,我知道內核崩潰的時候最后好多都是panic,于是我就在panic里面找 linux的轉儲代碼,結果呢,當然是一無所獲。
項目緊迫,索性不找了,先實現了再說,也做一次知其然不知其所以然了。一切做完之后,還是覺得不甘心,一定要把原理搞清楚不可,猛然間想到了 kexec,kdump用的就是kexec,而kexec我是嗷嗷熟悉的啦,就是用一個新內核覆蓋原有的內核,然后啟動這個新內核,當然也可以不覆蓋原內 核,也就是新內核可以載入到不同的位置,這樣的話兩個內核就可以同時存在了。這些我都明白,明白得很,可是,kdump畢竟是一種轉儲機制,而機制是要在 內核中實現的,心想kdump一定會在內核中實現,放心不下于是再查內核代碼,還是沒有找到,我對內核代碼結構已經非常熟悉了,前后除了驅動和體系相關的部分讀了好幾遍了,我幾乎時刻在跟蹤linux的內核發展,這怎么可能呢?怎么可能有我找不到的代碼呢,心里十分崩潰,內核還沒有崩潰我先崩潰了...
在繼續崩潰之前,回頭想想內核的架構,想想內核設計的多么完美,這最起碼能使我不再把自己崩潰歸罪于內核,只能怪自己沒有悟道內核的真諦而已。linux 的內核確實實現了機制,然后把策略留給用戶來完成,但是機制就一定用代碼實現嗎?我之所以這么認為一看我就很嫩,代碼只是一種表達的方式而已,有的時候如果能用一句話說情的事情而又可以用別的機制實現的事情,內核就沒有必要再提供一種機制了,linux的緊湊性也就在此體現。實際上,kexec完全實現了 kdump,只是因為kexec和linux內核本身設計得簡直好的沒得說。
既然kexec可以將新的內核加載到任何一個位置,那么完全可以在需要轉儲的系統上預留一塊連續的內存,然后等到需要轉儲這個系統的時候,比如系統崩潰,比如手動轉儲,在這個時候,我們可以將一個新的干凈的內核載入到預留的那塊內存,新內核本身用不完這塊預留的內存,這個新內核啟動以后要用很多內存,特別 是啟動到用戶空間時也需要內存,實際上以新內核為系統內核的系統內存就是這塊預留的內存,但是新內核可以訪問整個系統物理內存,這當然指的是需要轉儲的系統的內存加上新的內核的系統內存,這樣的話就可以用kexec機制啟動一個新的內核到一個不同的預留的位置,然后轉儲整個物理內存,這比以前的內核崩潰轉儲好的多,以前是在崩潰的內核中進行轉儲的,這個內核已經崩潰了,它的內部狀態以及硬件狀態是極其不確定的,在這種不確定的情況下,專儲的映像難道可靠 嗎?新的kdump機制巧妙的利用了kexec機制進行了安全的內核轉儲,設計上巧妙至極,既實現了和kexec并列的內核機制,又利用了已有的 kexec機制的代碼,避免了冗余,kdump純粹是kexec在新的邏輯上的運用,但是對于用戶而言,它確實是一種機制,我們來看一幅圖,簡單的說明了內核轉儲時的情形:
新的內核在需要轉儲的系統預留的內存啟動以后,照樣啟動到/sbin/init程序,也就是到了用戶空間,到了用戶空間就等于解放了系統,因為內核只提供 機制,真正的策略是用戶空間實現的,既然到了用戶空間,那么就可以應用各種策略了,比如我們可以用自己的方式轉儲內核,也可以直接訪問/dev /oldmem或者/proc/vmcore來訪問轉儲的內核,這就可以隨意了。
技術很多時候只是一種技術,如果一種技術可以稱為藝術的話,那么你千萬不要把研究它認為是在工作,浪費時間,更多的是,研究它或者說僅僅欣賞它是對你情操的一種陶冶,如果非要我舉個例子的話,那么我首推linux
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
