LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 08-09-25, 21:13 第 1 帖
d00m3d
 
d00m3d 的头像
 
 
资深版主  
  注册日期: Nov 2004
  帖子: 14,367
  精华: 10
 

标题: 【毁灭小贴士】用 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 里安装了哪些内核:

代码:
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 系统呼叫的支援,就能随意切换另一版本的内核,对经常调试内核或想尝鲜的人提供了方便,好不快哉!

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







__________________
nO ^^4+73R wH1<h d!5+R0z j00 42E U$1N9 7r% LpHZ 4+ l3457 oN(&

此帖于 08-09-27 09:27 被 d00m3d 编辑.
  d00m3d 当前离线   回复时引用此帖
旧 08-09-25, 22:52 第 2 帖
tfkdmwmqtr
 
tfkdmwmqtr 的头像
 
 
注册会员  
  注册日期: Aug 2007
  帖子: 668
  精华: 1
 

顶,沙发。
收藏







__________________
CLFS : All Packages http://cross-lfs.org/files/wget/svn/all.list
openSUSE-Factory KDE4 2.6.31-rc9-7-desktop x86_64
  tfkdmwmqtr 当前离线   回复时引用此帖
旧 08-09-25, 23:16 第 3 帖
jarryson 帅哥
 
jarryson 的头像
 
 
注册会员  
  注册日期: Jul 2004
  我的住址: 湖北武汉
  帖子: 5,659
  精华: 3
 

好像非常复杂的样子,目前没有这个需求。谁没事换内核玩啊。哈哈







__________________
AMD Turion MT-34 1.8G,1G+256M ddr333,VIA,AMD-ATI X700 128M,160G IDE,15.4宽...

Archlinux -- 最新,最快,最方便
  jarryson 当前离线   回复时引用此帖
旧 08-09-26, 07:43 第 4 帖
whitelilis
 
whitelilis 的头像
 
 
版主  
  注册日期: Jul 2004
  帖子: 739
  精华: 1
 

d00m3d 兄一出手,果然就是大手笔,赞一个。







__________________
我的博客:http://drunkedcat.cublog.cn

新机器:HP6535sNH361PA:Athlon 64x2(2.1Gx2),2G Ram, 集成 ati3200, 320G硬盘,bcm4312 b/g 无线,
OS:gentoo 基本系统
X: xorg + xmonad + conky + urxvt
开发:emacs + vim + texlive2005 + svn + ghc + jdk
网络:firefox-bin + pidgin
多媒体:mplayer

Haskell : type代表一种数据collection,class代表一种结构,instance只是让数据与某种结构结合后的结果,让一个type instance了某个class就构成了一个范畴。从范畴论的思维来说,联系是普遍的,变是不变的.它的意思是说,对象与对象之间不是孤立而是普遍联系的,我们所研究的对象总是千变万化的,但是连接对象之间的关系是永恒不变的。
fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)]
  whitelilis 当前离线   回复时引用此帖
旧 08-09-26, 07:52 第 5 帖
d00m3d
 
d00m3d 的头像
 
 
资深版主  
  注册日期: Nov 2004
  帖子: 14,367
  精华: 10
 

谢谢赞赏。

刚刚排了一下版,应该看起来不再覆杂了。
  d00m3d 当前离线   回复时引用此帖
旧 08-09-26, 09:00 第 6 帖
wsw
 
wsw 的头像
 
 
注册会员  
  注册日期: Aug 2005
  帖子: 468
  精华: 2
 

很久以前就看到这个kexec了,觉得想法好夸张,一直没有敢玩。今见LZ文章,测试了一下,果然很好用。
这样在Linux测试就不用冷启动了。







__________________
在未上大学时,我一直以为自己是个天才。
正在上大学时,我以为自己将是个天才。
读完大学后,我才发现自己是并且从来就是一个彻头彻尾的傻瓜,
自大。。。浮躁。。。终究一无是处。
  wsw 当前离线   回复时引用此帖
旧 08-09-26, 09:01 第 7 帖
wsw
 
wsw 的头像
 
 
注册会员  
  注册日期: Aug 2005
  帖子: 468
  精华: 2
 

很久以前就看到这个kexec了,觉得想法好夸张,一直没有敢玩。今见LZ文章,测试了一下,果然很好用。
这样在Linux测试就不用冷启动了。
  wsw 当前离线   回复时引用此帖
旧 08-09-26, 11:35 第 8 帖
7dehao 帅哥
 
7dehao 的头像
 
 
资深版主  
  注册日期: Aug 2002
  我的住址: 上海
  帖子: 4,939
  精华: 4
 

恩,有参考价值!







__________________
新手提问前请先看下面这个链接,谢谢大家配合:
bbs.linuxsir.org/showthread.php?t=112318
我的博客http://blog.chinaunix.net/u/33031/
Intel Core 2 Due E6550/P5K SE/2x1G/NVIDIA 6200LE/WD1600AAJS/NEC LCD195VX/2.6.31-gentoo
  7dehao 当前离线   回复时引用此帖
旧 08-09-26, 21:13 第 9 帖
聚焦深空
 
 
 
注册会员  
  注册日期: Jun 2008
  帖子: 1,106
  精华: 2
 

可不可以把kexec当bootloader使,比如启动freebsd?

PS:还以为这个站点彻底挂了,回来真好。
  聚焦深空 当前离线   回复时引用此帖
旧 08-09-27, 09:46 第 10 帖
d00m3d
 
d00m3d 的头像
 
 
资深版主  
  注册日期: Nov 2004
  帖子: 14,367
  精华: 10
 

引自 http://gentoo-wiki.com/TIP_kexec
引用:
What is kexec?

From the kernel help:

kexec is a system call that implements the ability to shutdown your current kernel, and to start another kernel. It is like a reboot but it is independent of the system firmware. And like a reboot you can start any kernel with it, not just Linux.

The name comes from the similarity to the exec system call.
kexec 只是內核裡的系統呼叫程序來切換當前內核到另一版的內核,它並無 bootloader 功能,但 kexec 可以在別的操作系統下切換內核。簡單說, kexec 能切換相同操作系統下的內核,據說 FreeBSD 下都能用,但不能切換操作系統

我參考 Fedora 資訊新間的時候,http://fedoranews.org/mediawiki/inde...ump_in_Rawhide

發現另一個叫 kboot 的玩意,http://kboot.sourceforge.net/

似乎能滿足深空兄要求,還有一個叫 kexec-loader 的東西,http://www.solemnwarning.net/kexec-loader/

可能也有參考價值
  d00m3d 当前离线   回复时引用此帖
旧 08-09-27, 13:12 第 11 帖
muses2006
 
muses2006 的头像
 
 
注册会员  
  注册日期: Aug 2007
  帖子: 59
  精华: 0
 

什么时候可以直接切换呢? 不用关掉所有的应用程序。
  muses2006 当前在线   回复时引用此帖
旧 08-09-27, 13:39 第 12 帖
北南南北
 
北南南北 的头像
 
 
管理员  
  注册日期: Apr 2002
  帖子: 24,300
  精华: 483
 

d00m3d兄弟宝刀不老,仍在出大作。
哈哈。一会整理一下放到首页喽。

THX了。。







__________________
请弟兄们发帖时要写个好标题,多谢!
签名不支持html和bbcode,请弟兄为了版面的整洁,请更改签名档,谢谢!
请各版版主及初学Linux的弟兄,请在您的签名写上机器的配置,以及您所用的系统(包装版本号,内核),谢谢。

Slackware64 13.x kernel 2.6.29.6
****************************************
因为太笨,所以努力;
****************************************
  北南南北 当前离线   回复时引用此帖
旧 08-09-27, 13:49 第 13 帖
jarodlau
 
jarodlau 的头像
 
 
注册会员  
  注册日期: Feb 2005
  帖子: 64
  精华: 0
 

一直再找的东西,谢谢了
  jarodlau 当前离线   回复时引用此帖
旧 08-09-27, 14:19 第 14 帖
yijun
 
 
 
注册会员  
  注册日期: Mar 2006
  帖子: 36
  精华: 0
 

目前暂无此需求,先作个记号~~~
  yijun 当前离线   回复时引用此帖
旧 08-09-27, 16:10 第 15 帖
demon1984 帅哥
 
demon1984 的头像
 
 
注册会员  
  注册日期: Jun 2008
  我的住址: 北京西城
  帖子: 6
  精华: 0
 

新人 看到此帖正是时候 我正在FC9下 安装vmware 6.0.0 由于FC9内核太新 下载了2.6.17得正在编译
正好不用重启了。。







__________________
用了Linux两年多了 感觉还是很 菜菜。。
  demon1984 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 12:43


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org