更换Mac OSX启动内核(XNU)

前面的文章讲述了编译Mac OSX内核的基本步骤,下面的步骤就是更换内核重启了。对于Macbook的同学来说,除了如何把内核启动起来,最关心的恐怕就是如果内核crash的话,怎么样换回来原来的内核文件,至少别把自己的Mac给玩挂了。
网上搜了很多资料,最靠谱的就是这封邮件列表里的邮件了。邮件的标题是“choosing kernel on Intel”,我想很大一部分原因是之前众多的资料是关于PowerPC平台的Open Firmware(连苹果官网里的文章还停留在那个年代)。而现在鸟枪换炮用上了EFI这个新鲜玩意儿,方法自然是大不同了。(而苹果却又没把EFI shell这些东西给提供出来,也给开发者造成了一些麻烦。不过从苹果角度出发的确也没必要给普通用户提供SHELL)。
下面是这些方法:

EFI Shell

装个EFI Shell,比如rEFIt。rEFIt提供了在Macbook上一些方便的安装方法,比如光盘启动、U盘启动或者直接放硬盘上。其中硬盘上的安装一步到位,兼容BootCamp,开机以后看到的就是rEFIt的界面,几个菜单项,如下图,另外每个菜单项还可以有简单的定制,以带入不同的启动选项。左下角就是EFI Shell。

相比于古老的BOIS,EFIShell提供了强大的功能和运行环境,具体的用法可以看Intel的这个手册,或者中文版。常用的命令有:
(EFI Shell进入后分辨率偏低,可以通过mode命令调整。打一个命令往往会超出屏幕的显示范围,这个时候需要在每个命令后加一个“-b“的选项,达到more命令那样的效果。)

  • help/?: 用法很简单,help <command>,类似man
  • fs1:     切换文件系统,类似于DOS下的盘符切换。具体有什么fs可以切换参见map命令
  • map:显示当前映射表,也可以把当前的块设备加上盘符;
  • 简单的文件系统命令,比如cd/rm/mkdir等等,还可以通过edit, hexedit来编辑文件(这个很有用,可以用来改下面步骤里的东西)

而如果需要启动内核的话(就像grub里敲initrd,boot),只需要找到你Mac OSX的挂载盘(我的是fs1)
fs1:/> \System\Library\CoreServices\boot.efi Kernel=mach_kernel.test
我相信应该还可以带一些别的参数,比如调试位,不过目前还没有尝试过。

编辑启动文件

这应该是最简单的办法,也是邮件里最推荐的办法。
打开/Library/Preferences/SystemConfiguration/com.apple.Boot.plist,往里面增加一项

<key>Kernel</key>
<string>mach_kernel.test</string>

如果你自己编译的内核挂了,建议的办法是用rEFIt引导,然后修改配置文件。建议无论如何都要在文件系统里保留一份mach_kernel的备份。

NVRAM变量

修改NVRAM里的boot-args变量,使用以下命令:

$sudo nvram boot-args=”debug=0x144 -v Kernel=mach_kernel.test”

如果玩坏了,办法是在启动时按住“Cmd-Opt-P-R”把NVRAM清空(并载入默认选项)。当然如果你把mach_kernel搞坏了这招估计行不通。

EFI启动选项

$sudo bless –mount / -setBoot –options “Kernel=mach_kernel.test”

这是传给EFI启动的引导选项(显然可以用rEFIt引导来跳过),如果你想暂时用原来的kernel启动,则在启动时按住Opt,进入启动菜单,并选择Mac OSX进行启动。这样会覆盖bless的选项,从而直接启动mach_kernel。同样用上面的办法清空NVRAM也可以达到同样的目的(只不过下次启动就是默认了)。

Leave a comment