UEFI模式+GPT硬盘实现Windows 8与Ubuntu双系统启动

2013-03-24 • 技术文章评论

在部分使用GPT硬盘并启用(U)EFI模式已安装Windows 8/Server2012的计算机上,在未分配空间追加安装Ubuntu操作系统时(12.04.2和12.10以后的64位版本支持EFI),可能发生Ubuntu安装后无法实现Grub引导Ubuntu启动的问题。如果想转换GPT为MBR降低事情的难度,请参考这篇博客;如果想继续用GPT,请继续向下阅读。
这种情况发生时,我们可以利用LiveCD模式进行处理,从而实现双启动。但是这必须破坏Windows原有的启动引导来完成,尚不清楚这是否违反微软的用户协议,但为了解决Ubuntu启动的问题,暂时仅能这样处理了。
在UEFI模式下,在GPT硬盘(GPT硬盘对分区有特别要求,但只要使用支持GPT的新系统安装包重新分区一般可以解决)分区情况一例如下:
1
2
3
4
5
6
7
/dev/sda1 (恢复分区)
/dev/sda2 efi (boot分区)
/dev/sda3 
/dev/sda4 Windows
/dev/sda5 /boot 
/dev/sda6 /
/dev/sda7 linux-swap
在使用Ubuntu可引导安装介质照常安装完Ubuntu(启动引导器放在/dev/sda,若放在他处可能需要根据需要改变下面的操作步骤)后,我们挂载/dev/sda2会发现在该分区中,Ubuntu已经将自己的EFI启动文件grubx64.efi写入了ubuntu目录中,但仍然仅有Windows可以启动。部分网上的方案是使用EasyBCD 2.2进行处理,虽然该版本自称可以支持EFI,但事实并非如此,请直接略过该软件。在/dev/sda2分区中,我们可以发现共有三个文件夹:Boot、Microsoft、ubuntu,下面为了能够让ubuntu顺利启动,我们要用先重命名Windows本身的efi文件并用ubuntu的efi文件将其替换掉。
以上就是我们的思路,下面是利用LiveCD启动并进入Try Ubuntu(试用)后的终端处理步骤(#后为注释):
1
2
3
4
5
6
7
8
sudo -i #提权
mkdir /mnt/temp #新建挂载目录
mount /dev/sda2 /mnt/temp #挂载efi分区,根据实际情况选择sda的分区号
cd /mnt/temp/EFI/Microsoft/Boot/ #进入Windows启动文件所在目录
cp bootmgfw.efi win.efi #备份Windows启动引导文件
cd ../..
cp ubuntu/grubx64.efi Microsoft/Boot/bootmgfw.efi #用ubuntu启动文件替换掉Windows引导文件
exit
此时,重启移除引导设备,你应该就可以看到Grub启动菜单了,即使你看到了Windows启动菜单,请不要选择,ubuntu生成的那个启动项并不能真正的启动Windows 8以及更新的操作系统,因为这些新系统的启动方式已经变动,而ubuntu仍然使用了旧的方法生成Windows启动项。选择ubuntu系统进入,然后提权编辑/etc/grub.d/40_custom文件,在文件尾部追加以下几行:
1
2
3
4
5
6
menuentry "Windows 8" { #引号内的内容随便填,总之就是新启动条目的名字
    insmod part_gpt
    insmod ntfs
    set root='(hd0,gpt2)' #这里的GPT2的2就是efi分区的sda编号
    chainloader /EFI/Microsoft/Boot/win.efi #这里指定我们先前备份的Windows引导文件
}
在终端中执行sudo update-grub即可更新启动菜单。重新启动后,Windows的系统时间可能发生问题,采用太平洋时间而不是东八区,这时需要在/etc/default/grub中将UTC=yes改为UTC=no。之后,重新启动你就会看到支持双启动的Grub菜单。
如果是更多重启动,也可采用类似方式进行编辑。