继上次自己一时鸡动,无法抗住内心的火热,于是自己编译了 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,否则,鹚不建议你使用这个方法!
我是来看看我的浏览器版本显示正常不。
Linux支持cpu热插拔.Ps.你把内核选项中的uhci和ehci选上应该能够用Usb了
厉害厉害,这样也行啊
@bedook怎么样 , Linux就是很神奇的哦
嘿嘿嘿嘿嘿 o(* ̄▽ ̄*)ゞ,在文章里面看到自己了,好开心。
@小邪 , 鹚看到小邪很开心的说,话说就是小邪问鹚,鹚才去解决的说,小邪可以试试哦。
@Mucid , 恩恩,一定要试试脱三角裤不脱牛仔裤的高端方法。
@小邪 , 小邪你太坏啦
发现M这边ad还真是很文明的发啊,呼呼,
话说这两篇都是持续技术贴呢,这让咱咋插话呢
@DaZuoo , 抱抱,下次不搞连发了的说
很不错,支持一下,不错!
那么多人用博客 写的东西一样也正常的
很好,学习了
嘿嘿,发现你也挺能折腾的哈。不过你这个方法还是蛮不错的。支持了。
@david , 你没试过就知道不错哦
不太晓得这都是什么意思,俺就有个vps,安装额lnmp一键包 就基本不管了,对于Linux还是云里雾里 估计要自己的电脑上用的话 会研究研究
@秋上书 , I‘am crazy
专家就是专家的啦,呵呵
这个刚刚已经看到过了哈。
果然是 kexec……………
@OSMSG , 兄台有更好的方法么