用kexec迅速切换内核

转载 2008年10月03日 08:05:00


先始声明

本文旨在技术探讨,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责,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

kexec

概述: 快速启动机制:允许通过已经运行的内核的上下文启动另一个Linux内核,不需要经过BIOS。BIOS可能会消耗很多时间,特别是带有众多数量的外设的大型服务器。这种办法可以为经常启动机器的开发者...
  • velanjun
  • velanjun
  • 2012年11月30日 14:52
  • 3398

使用 kexec 快速重启 Linux

http://www.ibm.com/developerworks/cn/linux/l-kexec/
  • junmuzi
  • junmuzi
  • 2014年11月03日 22:41
  • 460

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

    最近由于需要经常和内核打交道,所以发现老是重启感觉巨麻烦,这时想起上次RSS上看到一个将有方法可以不用重启而切换内核的。以前倒是觉得没有什么作用,但现在发现有用了。所以学习下1.kexec  ...
  • leisure512
  • leisure512
  • 2009年10月12日 18:56
  • 3611

Kexec,Linux kernel dump

  • 2011年01月11日 00:37
  • 584KB
  • 下载

用kexec迅速切换内核

先始声明本文旨在技术探讨,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责,You are at your own risks!前言很早以前就希望实现如何不重置起动(冷起动 S...
  • magicbreaker
  • magicbreaker
  • 2008年10月03日 08:05
  • 1068

linux系统双内核的快速切换机制(kexec)

概述: 快速启动机制:允许通过已经运行的内核的上下文启动另一个Linux内核,不需要经过BIOS。BIOS可能会消耗很多时间,特别是带有众多数量的外设的大型服务器。这种办法可以为经常启动机器的开发者节...
  • hunanchenxingyu
  • hunanchenxingyu
  • 2014年02月27日 14:44
  • 4903

Linux内核调试工具

原文地址:http://blog.csdn.net/ariesjzj/article/details/8244333 一些Linux Kernel的分析调试工作,主要包换qemu,kprobes和t...
  • ariesjzj
  • ariesjzj
  • 2012年11月30日 19:02
  • 5667

内核调试工具 — kdump & crash

kdump kdump是系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。 如果系统一旦崩溃,那么正常的内核就没办法工作了,这个时候将由kdump产生一个用于capture 当前...
  • zhangskd
  • zhangskd
  • 2014年10月23日 11:43
  • 21445

用kexec迅速切换内核

用kexec迅速切换内核作者:d00m3d来自: LinuxSir.Org声明:本文旨在技术探讨,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责,You are at you...
  • gracioushe
  • gracioushe
  • 2011年02月19日 21:01
  • 641

Kexec 引导内核内幕

目录目录 前言 基本概念 基本用法 Kexec 如何引导内核 加载到内存 运行新内核的完成跳转 Kexec 技术应用场景 Kexec 技术展望 前言Linux 的引导流程,基本可以概括为两个阶段:分别...
  • ongoingcre
  • ongoingcre
  • 2017年07月19日 10:13
  • 221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用kexec迅速切换内核
举报原因:
原因补充:

(最多只允许输入30个字)