`

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

分享到:
评论

相关推荐

    kexec-tools-2.0.9.tar.gz(测试可以编译通过)

    通常,不同版本的kexec-tools可能因为内核API的变化或者其他系统架构的差异而存在兼容性挑战,但此版本由于已经过测试,确保了在各种环境下的编译通过性,降低了用户在使用过程中遇到问题的可能性。 kexec的工作...

    kexec_基于kexec的崩溃转储机制

    kexec工具一个内核转储发生的时候kdump使用kexec启动一个备份的内核。这个备份启动的内核只是使用少量的内存,并且这些内存由第一个内核提供。这样设计保证了第一个内核启动且正在运行中的DMA不会破坏第二个内核的...

    Kexec,Linux kernel dump

    Kexec 是一项重要的 Linux 内核技术,它允许在不重启硬件的情况下加载新的内核版本。这项技术最初由 Simon Horman 和 Magnus Damm 在 VALinux Systems Japan K.K. 开发,并在 2007 年的 Linux.Conf.Au 大会上进行了...

    前端开源库-kexec

    "kexec" 是一个专为Node.js设计的前端开源库,它的主要功能是能够在运行时用另一个进程替换当前的Node.js进程,这在某些场景下非常有用,比如实现进程间的平滑切换或更新服务。这个特性类似于Ruby中的`exec`函数,它...

    linux内核分析.pdf

    * kexec:使用kexec工具来快速重启Linux内核。 Linux内核故障排除: Linux内核故障排除是诊断和修复Linux内核中的错误和故障的技术,包括: * dmesg:使用dmesg命令来查看Linux内核的日志信息。 * syslog:使用...

    arm64加载kdump内核工具kexec

    arm64加载kdump内核工具kexec

    kexec-tools

    它也能在开发环境中快速测试新内核版本,无需每次修改后都进行完整的系统重启。 7. **安全与限制** 虽然kexec-tools带来了诸多便利,但也存在潜在的安全风险。例如,未经许可的内核加载可能被恶意利用。因此,在...

    kexec工具

    总结,kexec工具是Linux系统中一个强大的功能,它简化了内核切换的过程,为系统维护、故障恢复提供了便利。通过熟练掌握kexec工具的使用,我们可以更高效地管理我们的Linux系统,提升其稳定性和可靠性。而Makefile...

    Linux内核崩溃转储机制

    它利用**kexec**系统调用来快速启动另一个内核(通常称为dump-capturekernel),以便在不破坏原有内核数据的情况下捕获核心内存映像。捕获的核心内存映像可以存储在`/proc/vmcore`文件中,之后可通过专门的工具进行...

    machdep.rar_For Real

    1. **kexec技术**: kexec是一种系统重启机制,它允许一个正在运行的操作系统内核加载并启动另一个内核,而无需经历完整的关机过程。这对于故障恢复、系统更新和调试非常有用,因为它减少了重启时间。 2. **实模式**...

    Alucard-Kernel:@Alucard24 带有 kexec-hardboot 补丁的自定义内核(Galaxy S4 Qualcomm 变体)

    在Android设备上,kexec-hardboot可以用于在保持数据完整性的前提下,实现更快的系统重启和恢复。这对于频繁测试不同内核或固件的开发者和高级用户来说非常实用,因为它避免了耗时的正常启动过程。 CM12是...

    ubuntu1204serverguide

    - **工具**:使用 `kdump-config` 工具进行配置,利用 `kexec-tools` 包收集内核崩溃转储文件。 #### 五、包管理 ##### 5.1 dpkg - **基本用法**:通过 `dpkg -i` 安装本地软件包,使用 `dpkg -r` 移除已安装的...

    Xenomai+2.6.5+on+Ubuntu+14.04

    然后,需要下载 Linux 内核和 Xenomai 的源代码,并将其解压缩到 /usr/src 目录下。 接下来,需要 patch 内核,以便 Xenomai 可以正确地工作。 patch 的过程使用 prepare-kernel.sh 脚本来完成,该脚本将 Xenomai ...

    linux内核调试分析指南

    linux内核调试分析指南--下篇 ***第二部分:内核分析*** 内核组织层次和复杂度 内核层次 内核复杂度 复杂度隔离 gdb在内核分析中的用途 数据验证 界面剥离 参数记忆 路径快照 长程跟踪 整理思路 内核编码的艺术 信息...

    Android关机和重启reboot-and-shutdown源码.zip

    4. **内核层面**:在内核层,Android系统使用`reboot()`函数来实现重启,以及`power_off()`或`kexec()`来执行关机。这些函数会触发一系列的系统级回调,确保所有驱动程序和硬件模块都被安全地关闭。例如,内存管理器...

    Debugging Linux Systems

    - **Kexec**:Kexec是一种快速重启内核的技术,能够在几毫秒内切换到一个新的内核镜像,极大地缩短了重启时间。 - **Kdump**:Kdump是一种崩溃转储技术,可以在系统崩溃后收集重要的调试信息,对于分析系统故障原因...

    kexec-tools-2.0.15-21.el7.x86_64.rpm

    kexec-tools-2.0.15-21.el7.x86_64.rpm

    meteor_kexec:npm`kexec`包的流星包装

    通常, Meteor应用可能需要在运行时执行一些系统级别的操作,比如更新或重启应用,这时候`kexec`的能力就显得非常有用,因为它的核心是快速切换进程到新的执行环境,这在服务端重启或者更新过程中可以提高效率。...

Global site tag (gtag.js) - Google Analytics