本文将演示如何在 Linux 下利用 kexec 工具无重启切换内核。 如直接按本文操作造成的一切损失 概与本文作者无关!

在 Windows 下安装和升级过显卡驱动都知道,机子需要重启。 而在 Linux 下完全可以通过卸载原有的驱动模块,然后加载新的模块达到与”重启”相同的效果。 可是还有一个问题没有解决: 如果更新了内核 怎么办? 其实内核已经提供了一个名为 kexec 的工具来完成这件事。

Let’s do it!

、需要无重启切换内核(冷起动 System reboot), 在配置内核选项时必须把 CONFIG_KEXEC 选项置为 y。

# 查看你的内核是否已经开启 kexec
user@~$ grep “KEXEC” /boot/your-kernel-config-file
CONFIG_KEXEC=y #支持

# 或者在编译内核时添加
user@~/linux-2.6.25$ make menuconfig
# 选择 “Processor type and features
“标签下的 “kexec system call”选项 (参考下图)

make menucnfig option 编译内核时的配置选项

编译内核时的配置选项

、安装 kexec ; make、apt-get、yum、pacman… 只要装上 kexec 即可;

# 搜索 kexec 软件包的名字
user@~$ pacman -Ss kexec
extra/kexec-tools 1.101-7
      Load another kernel from the currently executing Linux kernel

# 安装 kexec
user@~$ sudo pacman -S kexec-tools

、安装完 kexec 后,查看帮助(kexec –help),了解 kexec 的基本操作参数。 我这里初始内核为 2.6.27-ARCH , 而替换的内核是 2.6.25-kldoo9。 ……省略内核的安装。

# -l 载入内核镜像
# –command-line 系统基本设置
# –initrd 载入内核模块镜像
# -e 执行重载内核

# 我要切换的内核镜像是 vmlinuz26-kldoo9, 内核模块镜像是 kernel26-kldoo9.img, 而系统分区是 sda3, 那么可以这么写:(下面使用 root 用户)
root@~# kexec -l /boot/vmlinuz26-kldoo9 –command-line=”root=/dev/sda3 ro vga=773″ –initrd=”/boot/kernel26-kldoo9.img”
# 执行 kexec 重载内核
root@~# kexec -e
# 经过一系列内核操作后,你就能看到加载完新内核的控制台了

最下面的是操作过程的截图(终端截图工具 snapscreenshot)。请不要在执行图形环境的状况下操作,保持整个过程在纯终端下完成。 如需重设终端的分辨率,需要加上 –reset-vga 参数; 要加载默认以外的模块,加上参数 –module=”MOD arg1 arg2…”。 更多的设置请 kexec –help OR man kexec。

参考: LinuxSir.Org -> 【毁灭小贴士】用 kexec 迅速切换内核

原有内核 Linux Kernel 2.6.27-ARCH 的信息

原有内核 Linux Kernel 2.6.27-ARCH 的信息

执行 kexec 命令

执行 kexec 命令

重置内核 Linux Kernel 2.6.25-kldoo9 的信息

重置内核 Linux Kernel 2.6.25-kldoo9 的信息