`

ubuntu下使用kexec免重启切换系统内核

阅读更多

最近由于需要经常和内核打交道,所以发现老是重启感觉巨麻烦,这时想起上次RSS上看到一个将有方法可以不用重启而切换内核的。以前倒是觉得没有什么作用,但现在发现有用了。所以学习下
1.kexec
    kexec是要使用到的工具,怎么说呢?在kernel2.6.13及以后版本都支持kexec了,编译时有一个选项
Processor type and features --->
    [*]kexec system call (EXPERIMENTAL)
    另外,可以使用下面命令来查看当前内核是否是否支持kexec系统调用
$grep -i "kexec" /boot/config-2.6.28-15-generic
我电脑上输出
CONFIG_KEXEC=y
CONFIG_KEXEC_JUMP=y
只要看到是y就可以了。
2.安装kexec-tools
    这里要安装一个用户空间工具kexec-tools来使用kexec系统调用,kexec-tools很好安装,如果使用源码安装,即是经典的configure,make,make install三部曲,这里我使用
$sudo apt-get install kexec-tools命令来安装
3.kexec-tools用法
$sudo kexec -l /boot/vmlinuz-2.6.28-13.generic --append="root=/dev/sda7 ro"
$sudo kexec -e
执行上面命令后,系统会瞬间僵死,不要惊慌,等待一小会儿就会重新到gdm登录界面,重新登录。

部骤

首先,有两个先要满足条件(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/kernel/people/horms/kexec-tools/

今天为止,最新版本是 2.0.0:
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools-2.0.0.tar.bz2

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

再以 root 身分执行

make install

以上会把下列东西安装:
/usr/lib/kexec-tools/kexec_test
/usr/sbin/kdump
/usr/sbin/kexec

一般发行版或教材都是将命令放在 /sbin 里的,没关系,就移一下吧:

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 里安装了哪些内核:

d00m3d@BlackMesa:~$ 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
d00m3d@BlackMesa:~$

再检查下 /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 来切换。执行情况如下:

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

当前内核是 2.6.25.14,准备切换成 2.6.25.4

root@BlackMesa:~# kexec -e

经过一轮热起动系统设置後,系统会再次进入登陆状态。重新登陆:

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

嘿嘿,大功告成!

补充一句,新加载的内核也可以是:

1. 当前内核本身,不停变更都可以的
2. 或者是旧版没有编入 kexec 系统呼叫支援的内核,只不过 warm boot 启动後再无法执行 /sbin/kexec 去变更另一版了

结语

很多时候,冷启动重启系统是很讨厌的,花时甚长,有了 /sbin/kexec,只要当前内核加入了 kexec 系统呼叫的支援,就能随意切换另一版本的内核,对经常调试内核或想尝鲜的人提供了方便,好不快哉!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics