VirtualBox只能在UEFI交互式Shell中启动。

我在VirtualBox中使用UEFI安装了Ubuntu 14.10。但现在我重新启动这个操作系统,它却进入了一个UEFI交互式Shell v2.0。我该如何正常地再次引导到Grub?

大家好,好消息!使用VirtualBox 5.1之后,不再需要这些解决方法了。你可能只需要添加一个新的EFI条目(可以通过手动使用efibootmgr或者重新安装grub来自动添加),这样就可以立即启动Ubuntu了。 - phk
2即使使用5.1版本,对efi变量的更改(例如使用efibootmgr设置所需的引导设置)在关机后会丢失(但在重新启动后会保留)。 - chappjc
15.1.30仍然存在。尽管修复很简单,但每次安装Debian和Ubuntu后我都必须进行修复。 - CallMeLaNN
13个回答

我遇到了同样的问题,并发现如果我在交互式shell中输入以下命令,虚拟机就会启动到Ubuntu系统:
fs0:\efi\ubuntu\grubx64.efi

(使用反斜杠,前斜杠无效。UEFI交互式Shell中的命令不区分大小写。)

我的VirtualBox版本是4.3.20 r96997,Ubuntu版本是14.10 AMD64。我不知道为什么会出现这个问题,也不知道如何解决。只是发现这个方法不太优雅,还有一点麻烦。

更新1:

我阅读了this,跟踪到a bug report,并找到了一个更好的解决方法

更新2:

更新1中的解决方法失败了。我关闭了虚拟机,重新启动它。然后它又进入了UEFI交互式Shell。根据this的说法,问题可能是由于VirtualBox的一个bug引起的。我仍在寻找更进一步的解决方案。

更新3:
终于找到了一个解决方案。根据this所述,您需要手动创建一个startup.nsh脚本。除了上述帖子中提到的方法外,您还可以这样做:
$ sudo mount /dev/sda1 /mnt
$ cd /mnt
$ sudo sh -c "echo '\EFI\ubuntu\grubx64.efi' > startup.nsh"

3目前无法在运行中的虚拟机内部操作EFI变量。根据您在第二次更新中提供的解决方案,将所需的引导加载程序移动到\EFI\boot\bootx64.efi似乎比等待启动.nsh 5秒钟更好。请注意:您可以在启动过程中按F12键或在EFI shell中输入“exit”来访问固件设置并修改各种内容,包括终端分辨率,但这些修改不会永久保存。 - LiveWireBT
在交互式shell中输入命令后,您可以安装refind来修复EFI问题。 - Eduardo
1很高兴知道这是一个错误。只需编辑startup.nsh文件。+1 它正在寻找\EFI\boot\bootx64.efi以跳过5秒的等待时间。 - CallMeLaNN
1\EFI\ubuntu\shimx64.efi复制并重命名为\EFI\boot\bootx64.efi是最好的做法。来源 - CallMeLaNN
更新3对我来说解决了问题... - cljk
EFI通常被挂载在/boot/efi,所以不需要挂载/dev/sda1 - Philip Couling

我遇到了同样的问题(因为我无法以其他方式运行它,所以启用了EFI)。奇怪的是,尽管Ubuntu 14.04.2的安装没有出错,但安装Kubuntu 15.04未能完成。当要求移除DVD时,它在最后一刻冻结了。重启后,它可以正常启动,但关机后会进入shell。
所以,为了避免进入shell,请执行以下操作:
``` fs0: edit startup.nsh ```
在打开的窗口中添加以下两行:
``` FS0: \EFI\ubuntu\grubx64.efi ```
按下Ctrl + s保存,然后按下Ctrl + q退出。然后重新启动虚拟机。
或者,您始终可以使用这两行命令退出shell并启动操作系统。但第二次重新启动后,您将再次进入shell,为了避免这种情况,请编辑`startup.nsh`文件。

输入命令确实有效,但问题是在下次重新启动时它会再次进入那个shell,并且似乎没有保存startup.nsh文件。 - Igor Čordaš
为了保存startup.nsh文件,你需要使用Ctrl+S进行保存,并按Enter键写入文件。 - Willoczy
2如果您没有使用Ubuntu,您可以在UEFI shell中使用ls命令找到适合您机器的正确路径。例如,执行ls FS0:\EFI,然后执行ls FS0:\EFI\redhat,以了解在CentOS上路径为FS0:\EFI\redhat\grub.efi - ntc2
1@ntc2 谢谢,这正是我想要的!对于我的 Slackware 安装来说,路径是 FS0:\EFI\Slackware\elilo.efi - fabiomaia

另一个选择是在您的虚拟机中取消选中名为“启用EFI”的扩展功能选项,该选项位于“主板”下。
在Gnome Ubuntu 12.04.2 amd64bit安装中遇到了这个问题。
在更改硬件加速设置后发现了这个问题。我只剩下VT-x/AMD-V和嵌套分页启用。我的虚拟机参考配置是2个CPU和8GB内存。
取消选中后,Gnome Ubuntu完全绕过了这个问题,可以正常启动。在Windows 7 64位主机上运行Virtual Box 4.3.18 r96516。

1这仅能工作是因为Grub还具有传统支持(MBR)。 - Paul Stelian

我最近遇到了这个问题。请检查您的虚拟操作系统设置。右键点击虚拟操作系统->系统->扩展功能->启用EFI(取消选中此项)。enter image description here

8如果有人想使用UEFI,这怎么能算是一个解决方案呢? - zygimantus
+1:这解决了我的问题。我曾经试验性地勾选了“启用EFI”,然后忘记了它。 - wallyk
如果我在那个选项后禁用它,它将无法找到可引导的介质,即使手动操作也不起作用。 - Prasad.Developer

grubx64.efi 复制到 /EFI/boot/bootx64.EFI
VirtualBox 使用该 bootx64.efi 进行引导。
参考:Archlinux Virtualbox wiki

这个方法是有效的,但如果 grubx64.efi 被更新了,那么 bootx64.efi 的日期也会改变。以下是源代码的链接:https://github.com/mdaniel/virtualbox-org-svn-vbox-trunk/blob/166037dcf8564e1d13a3750cd691d4e4597de16d/src/VBox/Devices/EFI/Firmware/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.uni - philcolbourn
这种方法比编辑_startup.nsh_更无缝,但确实不会自动更新,而且由于它是一个FAT32分区,你也不能使用符号链接。 - Giorgi Gzirishvili

使用启用了EFI的Ubuntu 16.04.4版本,在启动虚拟机时发现无法引导,只停留在EFI交互式Shell界面。
以下是我修复引导问题的方法:
首先,我发现grubx64.efi位于BLK2分区中, 所以为了一次性引导,我只需在交互式Shell中输入以下命令:
BLK2:/EFI/ubuntu/grubx64.efi

嘿,Ubuntu已经启动了。
为了永久解决这个问题,系统启动后,我将以下命令行输入到/boot/efi/startup.nsh文件中。
sudo echo 'BLK2:/EFI/ubuntu/grubx64.efi' > /boot/efi/startup.nsh

就是这样,系统会正确启动。

为此,您需要按照以下方式编写:
fs0:
cd EFI
cd ubuntu
grubx64

这是我让它正常工作的方法,如果你以其他方式写,它就不会起作用。

我可以通过将VirtualBox中的cdrom设备从IDE更改为SATA来解决这个问题。我在设备配置中删除了虚拟cdrom驱动器的标准映射。
只需将cdrom设备添加到要用于安装介质的现有SATA控制器即可。
Et voila,EFI问题解决,不再出现其他问题。

另一个解决方法: 在UEFI Shell中,临时使用以下命令启动Ubuntu:
fs0:
cd EFI
cd ubuntu
grubx64

然后,在Ubuntu中,像下面这样编辑startup.nsh文件:
打开终端Ctrl+Alt+T
输入:
sudo nano /boot/efi/startup.nsh

请输入您的密码。
现在使用删除键或退格键删除所有内容。
然后按照以下方式输入:(FS0 - 这是数字 0,不是字母 O
FS0:
\EFI\ubuntu\grubx64.efi

现在按下 Ctrl+O(即字母 O)。
然后,按下 Alt+D(将文本更改为MS-DOS格式)。
然后按下 Enter
然后按下 Ctrl+X
现在重新启动。
sudo reboot

一切现在应该都没问题了。

对于在Virtualbox上的ArchLinux,以下方法对我起了作用。 在EFI Shell中输入以下内容。
Shell> bcfg boot add 0 FS0:\EFI\GRUB\grubx64.efi "GRUB"

在这里,我们正在设置EFI引导顺序。 我假设这对于任何其他具有EFI引导的Linux客户端也适用。 注意:您的目录结构可能不同。您可以在EFI提示符上执行ls命令,以检查进入FS0:并按回车后到达grubx64.efi的目录结构。
希望这能帮到您!