EFI/GPT上的Windows – Linux双系统

很长一段时间都没有鼓捣重装系统了。前些日子旧笔记本坏了,买不起MBP的咱只好入手了一台惠普的win8系统的本本。

近来需要一个linux环境进行线下测试,这台本本就成了实验对象。本以为装个linux还不简单么,装个ubuntu分分钟搞定的事情,没想到居然屡遭挫折。最简单的方法就是通过easybcd软件进行硬盘安装了。然后遇到的第一个难题就是怎么重启机器。win8新的电源管理模式,所谓关机其实只是打瞌睡。网上查到在控制面板-电源管理中可以关闭这个功能。OK,重启。进入引导界面却引导失败,提示找不到文件。这个问题纠结了很久,我以为是自己填写的磁盘号错了,通过存储管理可以看到除了系统可见的C盘D盘E盘外,还有好几个分区,此时我还没了解到这是GPT分区表的特征,从(hd0,0)到(hd0,5)试了个遍,通通无效。

经过这么多纠结我终于决定放弃硬盘安装,转而采取刻录光盘安装,还好新本本光驱还没坏(不得不吐槽下本本光驱的脆弱身板。。)。结果再次挫折。。光驱引导界面进去之后无法进入到liveCD的试用模式,也无法直接安装,于是使用检测光盘那个选项吧,统统黑屏,进去光盘也不转。试用模式的最后会输出两行字,说是无法从cd0的某扇区读取数据。莫非是烧CD烧坏了?于是再烧一张,并且烧写结束的检测光盘步骤也检测正确了,ubuntu的iso检测checksum也检测正确了,应该没问题了吧,用新盘重试,还是一样的问题,甚至提示错误的扇区编号都是一样的,我看着状况应该不是烧写的问题。

只好再度重启去BIOS看看了(其实应当是叫做EFI,这个时候我还没意识到这个问题)。发现boot option中有一个选项是开启legacy support模式。注解中说这个模式用于引导win7及以前版本,推荐不要开启可能会导致(win8)系统无法引导。我晕,估计问题就出在这了。首先先不管一层层的警告先把这个选项开了,然后我也注意到这说明这台机器的引导方式已经与以往不同了,以往的引导方式已经是legacy了。。

重启之后还有提示,说有延迟的修改,不顾各种警告允许修改生效,再次通过liveCD引导,终于可以进入熟悉的ubuntu试用界面了。不管那么多进入安装。根据ubuntu以往的尿性,应该是对windows超级友好兼容,不用担心引导项问题的(我还是没意识到EFI这个问题的严重性)。结果装好发现就是败在这个疏忽上了,grub没有正确地安装,还是直接进入到windows引导界面了。

不过这时候已经知道病因了,那么在网上求医问药就比较顺当,找到了许多文章,介绍了许多不同的解决办法。我采取的是这篇文章中介绍的办法,通过liveCD进入ubuntu后,挂载sda2,这是gpt的引导分区。其文件夹结构为


<DIR> Boot
<DIR> HP
<DIR> Microsoft
<DIR> Ubuntu

其中Boot文件夹中有Bootx64.efi文件,Microsoft/Boot文件夹下有Bootmgfw.efi文件,Ubuntu文件夹下有grubx64.efi文件。可以看出Ubuntu安装程序已经安装了Ubuntu的引导文件,可是EFI系统没有识别出新的引导项,依旧直接启动了windows的引导文件。由于对EFI也是昨天折腾这个事才刚从网上了解,我还说不出所以然,为什么Ubuntu的安装程序无法正确替换windows引导文件,并且事实上ubuntu自动生成的windows引导项也是错的无法启动windows。应该说是新设备加上新系统吧,兼容工作不可能那么快跟得上。

网上提供的另一种解决方案是将linux引导信息写到U盘,通过U盘启动linux,这样做就避免修改windows的引导文件,应该说是方便企业级客户吧。这个方案来自linuxsir.org。可是对我来说太麻烦,不想采用。于是还是使用了上面引用的方案,将Ubuntu引导文件强行替换windows的引导文件,并将ubuntu的grub中增加一个项目,指向原来的windows引导文件(备份更名),从而解决问题。不得不佩服下这个方案的作者,这样强行替换引导文件确实是需要足够的知识和勇气的。。。

这里说明一下,我的系统引导文件分区与文章中一样是sda2,但可能不同系统不同,可以分别挂载查看一下目录结构就能确定具体是哪个。

好吧,长篇的唠叨说完,总结一下要点:

  • windows 8 电源管理关闭快速启动策略
  • EFI(BIOS)设置中启用boot options/legacy support(网上说法还需关闭secure boot,我是后来才看到,没有采用)
  • 完成ubuntu安装后用ubuntu的grubx64.efi文件替换windows的bootmgfw.efi文件(注意备份)
  • 在ubuntu的grub配置中增加指向原bootmgfw.efi的条目
  • 当前版本的easybcd暂不支持efi/gpt引导方式(我使用的是2.0.2,文章中称2.2也不支持)

后记

总结完才意识到可能由于我没有关闭secure boot才导致ubuntu引导项安装失败以及easybcd设置启动项失败。由于昨天经历漫长的战役已经重启笔记本30次以上消耗了一整天的时间,暂时没有心情去继续研究了。附上似乎是比较官方的介绍easybcd双启动linux和win8的文章供参考。
how to dual boot windows 8 and linux

最后是参考来源:

在linux上使用fbterm和ucimf启用中文命令行

昨天说了希望找到一个好用的linux下的中文命令行, 最好还是用framebuffer的, 今天果然就找到了, 其实就是名气响当当的fbterm. 顾明思意, 他是使用framebuffer的, 完全满足了咱那小小的需求.
装这个东西费了我不少时间. 主要也是因为ubuntu没有提供安装包支持的关系. 好在这个东西名气比较响, 网上的讨论比较多, 很快找到了资源.
首先安装fbterm本身. 这个东西ubuntu有安装支持. 接下来是fbterm_ucimf. 这个东西是给fbterm用的中文输入法. 要先装libucimf再装fbterm_ucimf. 这些ubuntu源上都没有, 幸而google code上有他们的项目, 很容易找到. 可惜装完之后他用不了. 网上查了很久也不知道怎么解决. 想想看只好继续往下安装. 就又安装了Openvanilla-modules, ucimf-Openvanilla. 这两个东西google code上的fbterm_ucimf项目那里也有. 全安装完毕之后再打开fbterm, 敲击Ctrl-Space之后, 按F9, 终于看到输入法了!不过那输入法很扯淡, 用不了. 按照网上说的, 到Openvanilla安装目录下面去找那堆输入法.cin文件, 除了pinyin之外全删掉(我是把后缀改成.bak). 世界清静了.
至于前面为何输入法没弄对, 我一直不清楚. 也许是Openvanilla才是真正对输入法的支持吧. 进fbterm之前要设置正确locale: LANG=zh_CN.UTF-8 使用这个命令之后再 fbterm -i fbterm_ucimf 就能正确启动fbterm啦~
顺便说一下fbterm两个小问题的解决: 如果他进入之后说快捷键无法启用, 那是因为权限问题. 根据google code上wiki的提示, 使用chmod u+s /.../fbterm 就好了. 路径请自己whereis查看. 如果无法启动, 说是fb device权限问题, 那请修改/dev/fb0的权限. 我偷懒了, 直接写的chmod  777 /dev/fb0 以后会采用规整的chown的方式来弄好他.

这篇文章就是为了庆祝这个重大胜利在linux console下面写的(在实验室写了一半, 后半篇回寝室在win上写的orz|||). 其实这个fbterm还是有点bug,  屏幕显示有时会刷出些混乱的东西.  不过已经是我能找到的最好的中文命令行了.
借用网上的评价, zhcon和cce都已经停止开发了, 只有fbterm还有人在支持. 从这个角度来说, fbterm已经是最佳选择了. 希望他能越做越好~

ubuntu禁用gdm

通常禁用gdm的方式是修改/etc/inittab文件,将默认起入init 5的设置改成默认起入init 3就好了。
但是这个方式在ubuntu下似乎走不通。因为ubuntu下面根本就没有/etc/inittab文件,并且据网上说ubuntu默认对init [2345]都加上了gdm支持,所以你自己加了一个/etc/inittab文件确实能覆盖ubuntu原始设置但是也没啥用。

网上有介绍,在服务设置中关闭gdm对2345运行级的默认启动设置就行了。但是我自己这台机器它本来就是deactive的,不知为何还能进入x。这点我没有求其所以然。

不过根据网上的另外一些介绍,找到了/etc/init文件夹,下面是一堆各种init脚本。ls | grep gdm,只有一个gdm.conf。他有一句stop on runlevel如何如何,方括号应该是正则的或的关系吧,写成[012346],就只有init 5能进x了,默认进的应该是2,网上有交代,在rc_sysinit.conf里面也能找到。有人说要改成3,其实不是5就行了(当然也不能是0和6)。

起进去我楞了好久。一开始我的grub还是带splash的,它闪啊闪最后不动了,cpu和硬盘都不动了。我就只好重启。后来进safe mode关了splash看他的输出信息,我还以为是他卡死在配置电池什么什么的一个环节出不来了。网上查也查不到怎么回事。只好孜孜不倦地反复重启。其实再怎么重启效果也是一样嘛,但是可能人就不一样了。某次又重启的时候莫名其妙按了ctrl-alt-f1,然后就进命令行了。才知道原来他CPU也不转了硬盘也不叫了其实就是启动完毕了。我傻乎乎反复引导了十多次才搞明白这么回事。

最后说一下进了命令行上不了网怎么办吧,其实很简单。我也是在网上查的,就是sudo dhclient,他就会自动获取IP了。当然如果你的网络是需要手动配ip的那你还是自己ifconfig eth0吧。或者改脚本也行。命令行下怎么用无线网络我还没试过,以后回去试试看。

最后说下,这个Ubuntu Skills的网站相当给力啊。常用工具都指出了。强烈推荐。