我查看了其他一些有类似问题的帖子,但没有一个与我遇到的问题完全相同,而且,我找不到一个令人满意的答案。所以我想我应该发布自己的帖子。
我最近买了一台新笔记本电脑,华硕 Zenbook ux303LB,并立即首先安装了 Windows 10(使用计算机附带的免费升级;Windows 8 已预装),然后使用 Unetbootin 和实时 USB(无光驱)安装了 Ubuntu 14.04 LTS。
使用 BIOS 从 USB 启动有点麻烦,但最终还是成功了。然而,在我完成 Ubuntu 安装并重新启动后,grub 开始出现问题。首先,它将 Windows 10 分区注册为“Windows Vista”,这很奇怪,但据我所知,这本身并不是一个问题(当我对驱动器进行分区时,它也这样做了,默认的“与 Windows 一起安装”选项也将注册为 Windows Vista)。
当我启动 grub 时,它显示的完整选项列表如下:
Ubuntu
Advanced options for Ubuntu
Memory test
Windows Vista (loader)
Windows Recovery Environment (loader)
按“e”编辑“Windows Vista”命令得到以下内容:
setparams 'Windows Vista (loader) (on /dev/sda3)'
insmod part_gpt
insmod ntfs
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 944CC9654CC9432A
else
search --no-floppy --fs-uuid --set=root 944CC9654CC9432A
fi
chainloader +1
尝试使用上述“Windows Vista”命令启动 Windows 时,我得到了一个非常模糊(坦率地说非常无用)的错误消息,它只是说An error has occurred. Press ctrl+alt+delete to restart.
这是输出我从 得到sudo parted -l
。
Basic data partition
请注意,用标志“命名”的分区msftdata
是 Windows 10 分区。
幸运的是,如果我修改 BIOS 中的启动顺序,将 Windows 启动管理器置于驱动器本身之前,我仍然可以启动 Windows。但是,如果能够使用 grub 来启动 Windows 或 Ubuntu,而不必每次切换时都修改 BIOS,那就太好了。
有想法吗?任何帮助都将不胜感激!如果有人需要任何额外的信息,请告诉我。
编辑:我还忘了说,我确实尝试过运行启动修复。不幸的是,它告诉我会话处于传统模式,无法运行启动修复。我相信这是因为我必须Launch CSM
在 BIOS 中启用该选项。禁用此选项会使我无法完全启动 grub/Ubuntu,因此似乎无法进行启动修复?这种情况似乎很奇怪,但是当我禁用时,Launch CSM
我能看到的唯一启动选项是 Windows 启动管理器。
答案1
在 UEFI 模式下,您只能看到 Windows 引导程序,因为这是为 UEFI 模式安装的唯一引导程序,位于 MBR 中的 grub 被完全忽略。由于 UEFI 引导程序只是文件,因此您可以将它们复制到需要它们的地方。启动 Ubuntu(在 CSM 模式下,因为这是您可以做的全部),然后安装软件包:
apt-get install shim-signed grub-efi-amd64-signed
这至少应该将引导加载程序的副本放入以下位置:
/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
/usr/lib/shim/shim.efi.signed
(由于您在关闭安全启动的情况下运行,因此您可以忽略 shim.efi,但我会将其设置为无论哪种方式都可以运行)您可以尝试运行 grub-install,但它可能不是 UEFI grub2-common 版本,因此请执行以下操作:在 /boot/efi 中为 EFI 分区创建一个挂载点(假设它不在那里),然后将其放入您的 fstab(使用您的 UUID,而不是下面的 UUID,或者只使用 /dev/sda1)。
sudo mkdir /boot/efi
UUID=7A11-7B8B /boot/efi vfat defaults 0 1
将分区挂载在那里:
sudo mount -tvfat /dev/sda1 /boot/efi
将引导加载程序复制到硬盘的默认位置,保留现有的(即 Windows 的)
sudo mv /boot/efi/EFI/Boot/bootx64.efi /boot/efi/EFI/Boot/bkpbootx64.efi
sudo cp /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed /boot/efi/EFI/Boot/grubx64.efi
sudo cp /usr/lib/shim/shim.efi.signed /boot/efi/EFI/bootx64.efi
将 grub.cfg 存根文件放入 /boot/efi/EFI/ubuntu/grub.cfg。此文件只是从 /boot/grub 位置引入维护的 grub.cfg。以下是示例(更改 UUID 和磁盘分区)
search.fs_uuid 4e9797fa-2b51-4c8f-9a5c-37ee2cbf88ad root hd0,gpt4
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
这可能足以实际启动(它位于 USB 等可移动媒体上)。尝试在 UEFI 模式下启动,选择硬盘条目。
通常的安装会将引导加载程序放入 /boot/efi/EFI/ubuntu 并设置一个 nvram 条目来运行它们。将 grub 和 shim 的签名版本复制到 /efi/EFI/ubuntu,删除“.signed”和 grub.cfg 文件,如上所述。使用 efibootmgr 设置条目。有时,您可能想要清除旧的 grub-pc 并安装 grub-efi-amd64 包,但上述内容足以让您开始运行。
答案2
正如我上面的评论所述:
好的,搞定了。您列出的步骤帮助我将 grub 添加为可识别的 EFI 启动选项,然后我便能够运行启动修复……它告诉我,我运行的不是与 UEFI 兼容的 Linux 版本,而是安装 64 位版本 - 尽管我在 Unetbootin 中明确选择了 x64 版本的 Ubuntu,但它还是安装了 32 位版本。将 Ubuntu 重新安装为 x64 解决了我的所有问题。
哦,好吧,我想,我们已经吸取了教训——从头开始排除故障。
如此简单的修复我从未考虑过,只是因为我认为 Unetbootin 做对了一切(并且我使用得正确)。
建议检查同样的事情 - 你没有安装 32 位操作系统 - 对于遇到 UEFI 双启动 Windows 和 Linux 问题的任何人来说... 32 位 Linux 发行版不会安装与 UEFI 兼容的 grub 版本,因为 32 位架构不支持 EFI(显然)。