不重启,动态切换Linux内核版本

继上次自己一时鸡动,无法抗住内心的火热,于是自己编译了 Linux-Kernel-2.6.38 之后,随之而来了一些问题。

毕竟鹚还算得上比较懒,然后也比较菜,所以编译出来的内核,有不少bug。

懒人的结果,懒得管那些蛋疼的编译选项,所以搞到后面,才发现。

这个名为 “linux-image-2.6.38-mucid_2.6.38-mucid-10.00.Custom_i386” 的内核。

貌似不认识我的U盘,也不认识我的移动硬盘。。

不过好在,鹚一天也用不鸟几下USB,所以影响不大。

于是鹚就说了一句:“嗯,等要用U盘的时候,就切换到其他的kernel吧。”

额,殊不知一不小心被 小邪 发现了。

囧,也许是鹚说话有点迷糊糊,可爱的 小邪 来了一句:“Linux换内核很方便么?怎么弄哇? 看你说要用USB很方便就能把内核换回去的样子。。”

额,哪里有这么方便的东东,若是要不重启计算机就可以实现 Linux内核 的切换的话,这就相当于 —— 在不脱掉 “牛仔裤” 的前提下,你给我把 “三角Ku” 脱了。。

虽然这让鹚感到压力很大,但是鹚却没有忘记这个的问题。

鹚想,到底可不可以在不重启Computer的情况下,切换 Linux-Kernel 的版本,比如从 linux-kernel-2.6.38 换回 linux-kernel-2.6.35-28。

到底行不行,到底行不行?

鹚在沉思,忽然想起……

在三年前,鹚在么个地方看到一条消息 —— Linus Torvalds 说: “我们已经实现了将CPU断电之后,又成功的将CPU唤醒!”

对啊,断电的CPU都可以唤醒,更不用说在不重启Computer的情况下切换Linux的内核版本了。

一定行的,一定行的 —— 因为它是 Linux!

马上疯狂Google,还真的有办法。

这便是 kexec 。

从 linux-kernel2.6.13 之后,Linux内核便内置了这一功能,就是让系统对该版本的内核进行呼叫,然后激活!

当然,基本上 Ubuntu 目前的版本,其内核都支持 kexec 功能。如果你要检测么个版本的内核是否支持 kexec 的话,只需在shell打下:

grep -i “kexec” /boot/config-2.6.35-28-generic

返回如下信息就OK了:

CONFIG_KEXEC=y
CONFIG_KEXEC_JUMP=y

接着,我们勇敢的尝试吧!

注意,在实验前,请保存好所有正在运行的资料!!

首先,我们需要 kexec 这个命令:

sudo apt-get install kexec-tools

然后,鹚简单说一下命令的使用参数。

kexec命令,有三个重要参数:

-l //你要切换的内核版本

–append //内核启动参数

–initrd //内核model(模块)

可是如何获得这些参数呢?很简单的说:

cat /boot/grub/grub.cfg

直接查看 grub 启动菜单就知道的说!

好吧,来一个示例,鹚目前的内核版本为 linux-kernel-2.6.38-mucid 而我想切换到 linux-kernel-2.6.35-28:

su – //注意,必须切换到ROOT!

kexec -l /boot/vmlinuz-2.6.35-28-generic --append="root=UUID=26024aeb-e0f6-418d-8820-6da4c5740724 ro quiet splash" --initrd=/boot/initrd.img-2.6.35-28-generic

//设置将要切换的内核版本。

kexec -e //执行此命令前,请保存好正在打开的文档,正式切换内核版本!

如果顺利的话,那么在最后一条命令打下之后,屏幕会突然僵死。

但是不要怕,大约15秒过后,熟悉的 GDM 登录界面就会再次出现了。

这时你打开一个 shell ,来一句 uname -a 看看现在的内核版本如何o(∩∩)o…哈哈

是不是很快呢。

或许,你看了鹚这篇文章,内心会很“鸡动”。

但是请马上冷静下来!!

注意事项:

此方法成功率不高。

因为在内核版本切换过程中,有很多问题。

第一次,切换的时候还算顺利,不到15秒就出现了 GDM登录界面,鹚马上登录进去,但是鼠标却卡着不动,桌面也半天无法载入。

鹚马上意识到是 GDM 出了问题,于是急忙按下 “Ctrl+Alt+F3 进入 文本 tty,然后来了一句:

sudo service gdm restart

将 GDM 重启了一下,然后再次登录图形界面,OK!

第二次进行测试,依然看到 “硬盘灯狂闪一阵” 后,图形界面被关闭。

可是这时,我的Y450显示器却 黑屏断电 了。

额,怎么回事?

正当我焦急万分了时候,突然听到了 Ubuntu 熟悉的 “咚咚咚” 登录窗声音。

额,莫非,在切换内核版本的时候 —— Ubuntu 把我的显示器给关闭了?

于是鹚想到笔记本的 Fn 开关,由于我的是Y450所以按下 “Fn+F2” 果然,显示器被打开,Ubuntu 桌面出来了!

好吧,总共15次测试,其中有 5次宕机 。

当然,依鹚的总结,最可能的是 Linux的 kexec 功能与 X 或者 GDM 兼容不好,或者 显卡驱动崩溃,内核接替总线时也有问题。

所以,依鹚的判断,如果你是用的 Server 版 Linux 的话 ,那么这个方法的成功率应该是比较高的,毕竟就一个黑框框的 Shell 界面……

为了获得最真实的测试效果,有很多次宕机时,鹚只有心痛的按下 Power 键强行关机。

可怜的小y,跟着鹚从没有怨言……

最后,按照鹚的理解,鹚在此补充一点小知识,如有错误请指正:

在不重启计算机的情况下,想实现 Linux-kernel 版本的切换,就需要 Linux 内核版本支持 kexec 功能,大部分 Linux 发行版 Kernel 都有这个功能,最新的内核更不用说。

其实,这本质上,就是一种重启。首先将要切换到的内核缓冲到内存,呼叫它。

然后,正在运行的内核开始杀死所有进程,以实现交替。

最后,正在运行的内核杀死自己。将要切换到的内核被唤醒。

新内核,开始接管计算机,直到启动出 Ubuntu 的图形登录界面 。

其实,本质上,这种切换 Linux 版本的方式,与普通的 “冷启动” 不同之处在于,其不需要经过 “bootload”(启动引导) 阶段,不需要进行总线检查,与硬件检查,所以当然启动得快。

但鹚发现,其在 桌面Linux发行版 上工作的不是很好,所以,除非你用的是服务器,想实现快速重启,或者 你是一位 Linux kernel developer,否则,鹚不建议你使用这个方法!

About Mucid

My life is brilliant !
This entry was posted in Technology and tagged , , , . Bookmark the permalink.

83 Responses to 不重启,动态切换Linux内核版本

  1. 我是来看看 says: Firefox 12.0 Firefox 12.0 Ubuntu x64 Ubuntu x64

    我是来看看我的浏览器版本显示正常不。

  2. lianjiefly says: Unknown Unknown Unknown Unknown

    Linux支持cpu热插拔.Ps.你把内核选项中的uhci和ehci选上应该能够用Usb了

  3. bedook怎么样 says: Internet Explorer 8.0 Internet Explorer 8.0 Windows XP Windows XP

    厉害厉害,这样也行啊

  4. 小邪 says: Google Chrome 11.0.686.3 Google Chrome 11.0.686.3 Windows 7 Windows 7

    嘿嘿嘿嘿嘿 o(* ̄▽ ̄*)ゞ,在文章里面看到自己了,好开心。 :idea: :idea: :idea: :idea: :idea:

  5. DaZuoo says: ChromePlus 1.6.0.0 ChromePlus 1.6.0.0 Windows 7 Windows 7

    发现M这边ad还真是很文明的发啊,呼呼,
    话说这两篇都是持续技术贴呢,这让咱咋插话呢 :arrow:

  6. 保健品 says: Internet Explorer 8.0 Internet Explorer 8.0 Windows XP Windows XP

    很不错,支持一下,不错!

  7. mens asics running shoes says: Firefox 3.6.15 Firefox 3.6.15 Windows XP Windows XP

    那么多人用博客 写的东西一样也正常的

  8. ELISA试剂盒 says: Internet Explorer 7.0 Internet Explorer 7.0 Windows Vista Windows Vista

    很好,学习了

  9. david says: Google Chrome 9.0.597.16 Google Chrome 9.0.597.16 Windows XP Windows XP

    嘿嘿,发现你也挺能折腾的哈。不过你这个方法还是蛮不错的。支持了。

  10. 秋上书 says: Google Chrome 11.0.696.16 Google Chrome 11.0.696.16 Windows XP Windows XP

    :arrow: 不太晓得这都是什么意思,俺就有个vps,安装额lnmp一键包 就基本不管了,对于Linux还是云里雾里 估计要自己的电脑上用的话 会研究研究 :twisted:

  11. 左旋三合一减肥咖啡 says: Internet Explorer 8.0 Internet Explorer 8.0 Windows XP Windows XP

    专家就是专家的啦,呵呵

  12. 宁波LED says: Google Chrome 8.0.552.224 Google Chrome 8.0.552.224 Windows XP Windows XP

    这个刚刚已经看到过了哈。

  13. OSMSG says: Firefox 4.0 Firefox 4.0 GNU/Linux GNU/Linux

    果然是 kexec……………