解決方法:
概述
kexec是一個快速啟動機制,允許通過已經運行的內核的上下文啟動一個Linux內核,不需要經過BIOS。BIOS可能會消耗很多時間,特別是帶有眾多數量的外設的大型服務器。這種辦法可以為經常啟動機器的開發者節省很多時間。
kdump是一個新的,而且非常可信賴的內核崩潰轉儲機制。崩潰轉儲數據可以從一個新啟動的內核的上下文中獲取,而不是從已經崩潰的內核的上下文。當系統崩潰時,kdump使用kexec啟動到第二個內核。第二個內核通常叫做捕獲內核(capture kernel),以很小內存啟動,並且捕獲轉儲鏡像。
第一個內核保留了內存的一部分,第二個內核可以用來啟動。注意,在啟動時,kdump保留了一定數量的重要的內存,這改變了紅帽企業Linux 5最小內存需求。為了計算系統需要的真正最小內存,可以參看 http://www.RedHat.com/rhel/details/limits/ 上列出的最小內存需求,加上kdump使用的內存數量,以決定真正的最小內存的需求。
因為第一個內核的內存內容已經被保留,所以kexec可以不經過BIOS,啟動捕獲內核。這是內核崩潰轉儲的根本。
怎樣配置kdump
1.確認kexec-tools已經安裝:
#rpm -q kexec-tools
2.配置/etc/kdump.conf文件,指定vmcore將被轉儲的路徑。可以通過scp拷貝到另一個服務器,也可以是裸設備,或者本地的文件系統。
3.修改一些啟動參數,為捕獲很保留一塊內存。對於i386和x86_64架構,編輯/etc/grub.conf,在內核行的末尾添加 crashkernel=128@16M。
下面是一個帶有kdump選項的/etc/grub.conf文件:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/hda1
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Client (2.6.17-1.2519.4.21.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.17-1.2519.4.21.el5 ro root=LABEL=/ rhgb quiet crashkernel=128M@16M
initrd /boot/initrd-2.6.17-1.2519.4.21.el5.img
4.修改之後,重啟系統。128M內存(從16M開始)不被正常的系統使用,為捕獲內核保留。注意,free -m的輸出會顯示內存比不加參數時少了128M,這就是我們所期望的。
注意:可以使用小於128M,但是只使用64M做測試被證實是不可靠的。
5.現在,保留內存已經設置了,打開kdump初始腳本,啟動服務:
# chkconfig kdump on
# service kdump start
6.可以通過kexec加載內核鏡像,讓系統准備捕獲一個崩潰時產生的vmcore。可以通過sysrq強制系統崩潰:
# echo "c" > /proc/sysrq-trigger
這造成kernel panic,緊跟著系統重啟kdump內核。當啟動進程進入到啟動kdump服務器時,vmcore將會被拷貝到你在/etc/kdump.conf文件中指定的位置。
注意:
終端frame-buffer和X將運行不正常。在運行一些類似於在內核配置上添加了"vga=791"或者運行X的系統,在通過kexec啟動內核時,終端顯示將不清楚。記住,kdump內核仍舊能夠創建轉儲。當系統重啟,顯示將會恢復到正常狀態。