天天看點

用kexec迅速切換核心

先始聲明 本文旨在技術探讨,任何人如因本文而引起任何損毀,資料及精神損失等,或一切問題,本人絕不負責,You are at your own risks! 前言

很早以前就希望實作如何不重置起動(冷起動 System reboot)就使用建立成或者測試不同版本的核心,這個話題好像比較少人探讨,我以前曾經提問過, http://www.linuxsir.org/bbs/showthread.php?t=211738

也很感謝有兄弟提供正面的回覆,可是因為當時水準有限,未能成功。今天為了紀念 linuxsir 重光,特書本文以示熱烈慶祝,歡賀一番:)

部驟

首先,有兩個先要滿足條件(Pre-requisites):

代碼:

1.  核心版本必需為 2.6.13 或以上,因為自該版本起内置了 kexec 系統呼叫的程式。

2.  系統需要安裝 kexec-tools
           

核心方面,主流發行版的核心其實都已加入支援,是以用發行版核心的話,基本不用擔心支援問題。

隻要檢查 /boot/config-2.6.xxxxxxxx 就知道了

代碼:

egrep KEXEC /boot/config-2.6.xxxxxxx

或者

cat /boot/config-2.6.xxxxxxx |grep KEXEC
           

答案是 y 便行。

如果核心是自己動手編譯的話,請謹記加入 kexec 系統呼叫的支援:

代碼:

Processor type and features --->
[*] kexec system call (EXPERIMENTAL)
           

至於安裝 kexec-tools 方面,可以編譯源碼或者用發行版提供的:

如要編譯就先下載下傳 kexec-tools 源碼,可以到核心官方網站,路徑是:

http://www.kernel.org/pub/linux/kern...s/kexec-tools/

今天為止,最新版本是 2.0.0:

http://www.kernel.org/pub/linux/kern...-2.0.0.tar.bz2

PHP 代碼:

tar xf kexec-tools-2.0.0.tar.bz2 cd kexec-tools-2.0.0 ./configure --prefix=/usr make  

再以 root 身分執行

PHP 代碼:

make install  

以上會把下列東西安裝:

/usr/lib/kexec-tools/kexec_test

/usr/sbin/kdump

/usr/sbin/kexec

一般發行版或教材都是将指令放在 /sbin 裡的,沒關系,就移一下吧:

PHP 代碼:

mv /usr/sbin/kdump /sbin/kdump mv /usr/sbin/kexec /sbin/kexec  

如果用發行版的就簡單一點,直接 apt-get,yum 回來,比如:

apt-get install kexec-tools 或 emerge -av kexec-tools 之類,總之就是為了加入 /sbin/kexec 這個系統指令。

如果一切順利,現在就有戲了。先檢查一下 /boot 裡安裝了哪些核心:

代碼:

[email protected]:~$ ll /boot
total 11224
-rw-rw-r-- 1 root root  794675 Sep 24  2007 System.map-2.6.22.7
-rw-rw-r-- 1 root root  853714 Jan 26  2008 System.map-2.6.24
-rw-rw-r-- 1 root root  858565 Sep 16 16:13 System.map-2.6.25.14
-rw-rw-r-- 1 root root  856752 May 27 13:15 System.map-2.6.25.4
-rw-rw-r-- 1 root root   44436 Sep 24  2007 config-2.6.22.7
-rw-rw-r-- 1 root root   47026 Jan 26  2008 config-2.6.24
-rw-rw-r-- 1 root root   54631 Sep 16 16:13 config-2.6.25.14
-rw-rw-r-- 1 root root   54581 May 21 10:49 config-2.6.25.4
drwxr-xr-x 2 root root    4096 May 28 09:06 grub
-rw-rw-r-- 1 root root 1866424 Sep 24  2007 lfskernel-2.6.22.7
-rw-rw-r-- 1 root root 1947800 Jan 26  2008 lfskernel-2.6.24
-rw-rw-r-- 1 root root 2024732 Sep 16 16:13 lfskernel-2.6.25.14
-rw-rw-r-- 1 root root 2017244 May 27 13:15 lfskernel-2.6.25.4
[email protected]:~$
           

再檢查下 /boot/grub/menu.lst 裡加載核心的語句,如:

代碼:

title           LFS-SVN-20060528, kernel 2.6.25.4
root            (hd0,5)
kernel          
      /boot/lfskernel-2.6.25.4 
      root=/dev/sda6 ro nomce vga=0x317
boot
           

這是待加載核心 2.6.25.4 的内容及相關選項。

要用 /sbin/kexec 加載另一核心,文法是:

代碼:

kexec -l 
      <kernel-image> --append="
      <command-line-options>"
           

也就是将核心映像的名稱跟選項對号入座,我的情況就寫成:

代碼:

kexec -l 
      /boot/lfskernel-2.6.25.4 --append="
      root=/dev/sda6 ro nomce vga=0x317"
           

即可加載。

我一直不喜歡使用 ramdisk 或者 initramfs 之類,是以沒有 initrd,如果系統需要使用 initrd,就将其正确路徑加入便行,如:

代碼:

kexec -l /boot/lfskernel-2.6.25.4 --append="root=/dev/sda6 ro nomce vga=0x317" 
      --initrd=xxxxxxxxxxx
           

想重新開機核心,就以 kexec -e 來切換。執行情況如下:

代碼:

[email protected]:~$
[email protected]:~$ su -
Password:
[email protected]:~#
[email protected]:~# kexec -l /boot/lfskernel-2.6.25.4 --append="root=/dev/sda6 ro nomce vga=0x317"
setup_linux_vesafb: 1024x768x16 @ e0000000 +300000
[email protected]:~# cat /proc/version
Linux version 2.6.25.14 ([email protected]) (gcc version 4.3.2 (GCC) ) #1 SMP PREEMPT Tue Sep 16 16:10:50 HKT 2008
[email protected]:~#
           

目前核心是 2.6.25.14,準備切換成 2.6.25.4

代碼:

[email protected]:~# kexec -e
           

經過一輪熱起動系統設定後,系統會再次進入登陸狀态。重新登陸:

代碼:

BlackMesa login: root
Password:
Last login: Wed May 28 09:40:34 +0800 2008 on tty1.
No mail.
[email protected]:~#
[email protected]:~# cat /proc/version
Linux version 2.6.25.4 ([email protected]) (gcc version 4.3.1 20080523 (prerelease) (GCC) ) #1 SMP PREEMPT Tue May 27 12:33:36 HKT 2008
[email protected]:~#
           

嘿嘿,大功告成!

補充一句,新加載的核心也可以是:

1. 目前核心本身,不停變更都可以的

2. 或者是舊版沒有編入 kexec 系統呼叫支援的核心,隻不過 warm boot 啟動後再無法執行 /sbin/kexec 去變更另一版了

結語

很多時候,冷啟動重新開機系統是很讨厭的,花時甚長,有了 /sbin/kexec,隻要目前核心加入了 kexec 系統呼叫的支援,就能随意切換另一版本的核心,對經常調試核心或想嘗鮮的人提供了友善,好不快哉!

d00m3d 敬上

(2008年9月25日 Linuxsir 重光紀念)

參考文獻

http://www.ibm.com/developerworks/li...y/l-kexec.html

http://gentoo-wiki.com/TIP_kexec

http://code.google.com/p/atv-bootloa...rstandingkexec

PS:

還有其他小貼士集合在此 【毀滅小貼士】集合 :)

http://www.linuxsir.org/bbs/thread329032.html