双启动后,Grub没有显示Windows 8选项。

所以,我已经成功地将我的Windows 8机器与Ubuntu 12.04双启动。然而,我仍然没有一个方便的方法在启动时选择要加载的操作系统。
安装完Ubuntu后,我的电脑仍然直接加载Windows 8。然后,我将grubx64.efi添加到我的引导加载程序的白名单中。但是在那之后,我的机器直接加载Ubuntu,甚至没有出现GRUB的影子!
我使用了boot-repair,并得到了这个paste.ubuntu的URL:paste.ubuntu.com/1326074。在运行boot-repair之后(并重新将grubx64.efi文件加入白名单),GRUB现在显示出来了,但没有任何Windows 8选项!
最后,我运行了sudo fdisk -l命令,得到了以下结果:
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders, total 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x6396389f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1  1465149167   732574583+  ee  GPT
Partition 1 does not start on physical sector boundary.

我猜我的问题与上面的fdisk警告有关,但我不知道该怎么处理。现在我该怎么办?

编辑

我的etc/default/grub文件如下:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

还有,只是为了记录,我在安装双启动时遵循了这个链接的步骤。这个教程(使用的是11.10版本,我必须指出),没有提到任何关于这个问题的内容。我是否做错了什么呢?

阅读这个答案,可能会对你有帮助:http://askubuntu.com/questions/84501/how-can-i-change-convert-a-ubuntu-mbr-drive-to-a-gpt-and-make-ubuntu-boot-from - NickTux
7个回答

首先,你的 `fdisk -l` 输出没有问题;它只是标识你的磁盘使用了GUID Partition Table (GPT)分区系统。要查看你的分区,你必须使用支持GPT的工具,如 `gdisk` 或 `parted` ,而不是无法理解GPT的 `fdisk`。
其次,你可以通过在 `/etc/grub.d/40_custom` 中添加适当的条目,并执行 `sudo update-grub`来让GRUB启动Windows。一个条目可能会类似这样:
menuentry "Windows 8" {
    set root='(hd0,gpt1)'
    chainloader /EFI/microsoft/BOOT/bootmgfw.efi
}

具体细节可能取决于您的安装。

第三,如果您认为rEFInd很丑,您可以尝试其他rEFInd主题或创建您自己的主题,如rEFInd文档中所述。或者,如果您喜欢文本模式的引导加载程序,您可以在refind.conf中设置textonly选项。您也可以切换到gummiboot,实现类似的效果。

第四,如果rEFInd定期报告错误,请记下这些错误或用数码相机拍摄屏幕照片并向我报告(我是rEFInd的维护者)。如果没有人报告错误,那么这些错误将无法修复;如果它们不是rEFInd的错误,这些信息可能会提供有关如何解决问题的线索。

最后,通过rEFInd(或gummiboot)而不使用GRUB,可以启动Linux;你只需要一个不同的EFI引导加载程序。我个人偏好Linux内核的EFI stub loader。这仅在3.3.0及更高版本的内核中可用。由于Ubuntu 12.04使用的是3.2.0内核,所以你需要找到一个预编译的适用于Ubuntu 12.04的3.3.0内核(我听说过有这样的东西,但我手头没有任何链接),或者从源代码构建自己的内核。(你也可以安装Ubuntu 12.10,它带有适用的内核,但可能你想要一个LTS版本,所以这可能不是最佳选择)。请参阅rEFInd文档中关于如何设置的页面上的Linux引导的附加详细信息。你也可以使用ELILO或GRUB Legacy。如果你只是对延迟感到不满意,你可以减少GRUB 2的超时值,并将其默认设置为不显示菜单。

1首先,哇,我没想到你是rEFInd的维护者。接下来,关于GRUB菜单项...我尝试过了,但它不起作用。在其他一些尝试中,我尝试设置我的ESP分区,但没有成功。甚至尝试使用其中一个图形化的GRUB编辑器(忘记名字了)。最后,关于rEFInd,它报告的错误并不重要(我会编辑我的帖子来说明这一点)---在启动时,它只是告诉我找不到某些.efi文件。我不知道它们来自哪里。 - skytreader
检查ESP上是否存在指定的文件。还要确保文件名的大小写是正确的。(虽然这不应该有影响,但我知道有一个有缺陷的EFI会受到影响!)如果这些都没有帮助,当您尝试通过此条目启动Windows时,GRUB返回了什么错误消息(如果有的话)? - Rod Smith

两个答案都可以使用/EFI/Microsoft/Boot/bootmgfw.efi。但是我费了很大的劲才找到正确的设置set root='(hd0,gpt1)'。如果你知道,这很简单。
当GRUB启动时:按下c键 在提示符上输入命令ls。 您会得到一个硬盘上分区的列表,如(hd0,gpt1)等。 键入ls (hd0,gpt1)并尝试其他分区。 查看标签,如果标签上写着EFI,那么你就找对了。
警告:根据您安装Ubuntu的方式,可能会有更多带有EFI标签的分区。请尝试所有分区。

使用光盘启动Ubuntu,


选择“尝试Ubuntu”,


连接到互联网,


使用Ctrl-Alt-t打开终端窗口,然后运行:boot-repair

如果找不到boot-repair,则安装它:

sudo add-apt-repository ppa:yannubuntu/boot-repair &&
sudo apt-get update &&
sudo apt-get install -y boot-repair &&
boot-repair

点击“推荐修复”。在纸上写下将出现的新URL。 重新启动电脑,您应该会看到一个GRUB菜单,可以访问Ubuntu和Windows。 如果有任何问题,请提供新的URL。

尝试运行sudo update-grub。 这样应该能自动识别Windows 8并将其添加到GRUB并重新配置菜单。
如果失败,请在此处分享您的/etc/default/grub文件,我们会查看一下。

1嗨。sudo update-grub没有起作用。我编辑了我的问题,包括了我的/etc/default/grub文件。与此同时,我正在研究NikTh提供的答案。 - skytreader

尝试创建一个名为/etc/grub.d/30_windows的文件,其中包含以下内容:
#! /bin/bash
cat << EOF
menuentry "Windows 8" {
    insmod part_gpt
    insmod chain
    set root='(hd0,gpt1)'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF
然后运行sudo update-grub并重新启动。

完整教程


我的终极解决方案

(*因为汤姆的方法不起作用,尼克斯的链接太复杂了。但是,还是谢谢你的关心!)

安装rEFInd


我接受自己的答案,直到有人指出可能的缺陷和修复方法,或者解决我的问题(不幸的是,只是问了一个问题:“如何将Windows 8轻松地放入GRUB中?”)。

(编辑于2017年8月6日:最终我使用rEFInd解决了这个问题(请参见上面接受的答案)。

远非完美的解决方案,使用rEFInd似乎是一个很糟糕的工作。首先,它看起来很丑陋(对不起rEFInd),并告诉我在启动时拒绝访问某些.efi文件({ext2_x64,hfs_x64,iso9660_x64,reiserfs_x64}.efi)---虽然没有什么关键性的问题,并且按下按钮后就会消失。最后,选择Ubuntu efi仍然加载GRUB,这是一个完全不必要的步骤,至少从我不打算保留多个内核版本开始。

总结一下...

优点:我的系统现在基本上像我之前的UEFI双启动一样工作。缺点:它看起来很丑陋,而且启动时间更长。

*我必须注意的是,这个rEFInd是通过我的Ubuntu分区的install.sh安装的。之前使用Windows设置的rEFInd没有这个问题。


如果之前通过Windows进行的rEFInd安装没有出现找不到文件的错误,但是当前从Linux进行的安装却出现了这样的错误,那么我猜测可能是以下两种情况之一:1)您的主板存在大小写敏感的错误,这种情况下更改文件或目录的大小写可能会改善问题;或者2)您的ESP(FAT16 vs. FAT32或某些轻微的文件系统损坏等)存在一些奇怪的问题。一些EFI似乎对其ESP上的文件系统非常挑剔。确切的文件名可能有助于缩小问题范围。 - Rod Smith
好的,我错了。它并不是说找不到某些efis,而是说在某些efis上被拒绝访问(所以我理解这些efis是存在的,只是无法访问?)。我已经记录下这些文件了,但我仍然不知道它们来自哪里。 - skytreader
在我的经验中,“访问被拒绝”是EFI上一个不寻常的错误。据我所知,EFI不像Linux那样支持所有权或权限,所以这个错误并没有太多意义,除非出现了磁盘读取错误。我曾经在EFI下遇到过一些奇怪的磁盘“写入”错误,在下次重启时就消失了。如果这个问题持续存在,你可以考虑对你的磁盘运行SMART测试,以防硬件故障,并备份和重新写入ESP,以防dosfsck无法修复的一些奇怪的文件系统损坏。除此之外,报告哪些文件出现问题可能会有帮助。 - Rod Smith
1“访问被拒绝”的消息几乎肯定与安全启动有关。如果在安全启动模式下,rEFInd尝试加载未签名的EFI二进制文件,就会出现这样的消息。令人困惑的是,你能够启动rEFInd,因为它本身并没有签名。我猜测你的固件中可能存在一些奇怪的、有缺陷的半激活安全启动设置。目前最简单的解决方案是完全禁用安全启动,但也有其他方法。请参考我的网页http://www.rodsbooks.com/efi-bootloaders/secureboot.html获取更多信息。 - Rod Smith
在我的惠普笔记本上,我必须按下F9键,然后GRUB启动,否则Windows会加载。此外,还有一个选项可以从GRUB引导启动Windows,尽管我从未使用过它。如果我只是要进入Windows,我只需打开电脑等待Windows启动即可。如果我计划引导Ubuntu,我只需一打开就立即按下F9键。 - geoffmcc
@skytreader 你可能需要修改这个回答。它说你接受了它,但是截至今天,你已经接受了一个不同的答案。 - WinEunuuchs2Unix

请下载超级 Grub 并按照其指示操作。我从不离开家时都会带上它。当 grub 菜单没有显示出来时,它非常有帮助。
你需要将其加载到光盘并启动。只需按照附带的说明进行操作即可。
它还可以用于修复 Windows。由于只能引导进入 Windows 8,所以你需要选择 Linux 修复选项。
尽情尝试吧,但一定要仔细阅读说明。过一段时间后,你会感觉自己像个专家一样。
RS