我在 Windows 10 上使用 Hyper-V 管理器。我创建了一个虚拟机和一个虚拟硬盘,并在其上安装了操作系统和其他软件。
现在我正尝试将此硬盘用于其他虚拟机。我已将其复制到另一个位置,在创建新虚拟机时,我将此副本指定为现有驱动器。当我启动新虚拟机时,出现黑屏,显示PXE Network Boot using IPv4 (ESC to cancel) Performing DHCP Negotiation....
。几分钟后,我又出现黑屏,显示DHCP failed
和no x64-based UEFI boot loader was found
。
我遗漏了什么?
我创建了第二代虚拟机,并且我还禁用了安全启动选项,如果重要的话...创建时我使用了相同的设置,我只更改了新虚拟机的主机名。
答案1
答案2
我遇到的问题是我在 .vhdx Ubuntu 上安装了。如果 .efi 文件不存在,这个操作系统似乎不会自动创建它(.efi 是 VM 启动的文件)。因此,解决方案是:
1. add DVD drive to the VM
2. specify the same image file from which is loaded the OS on the .vhdx
3. boot in rescue mode
4. after a few quick setups(language, time zone, etc.), you'are asked
for device to use as root file system, then choose **/dev/sda2/**
(I'm not sure why is that :( )
5. click Yes to mount separate /boot/efi partition
6. from the rescue operation menu, choose
**Force GRUB installation to the EFI removable media path**
7. confirm this choice
8. you are ready to reboot and disconnect the image file :)
答案3
当 UEFI 启动时,它会搜索存储在 NVRAM 中的启动变量(它在 Hyper-V 中模拟)并搜索任何启动变量。当您创建新的 VM 时,其 NVRAM 为空,并且 UEFI 不知道磁盘上哪个文件可用作引导加载程序。您必须手动创建启动条目(在 Hyper-V 中显示为文件启动选项)。Hyper-V 无法从主机执行此操作,但您可以从客户机本身执行此操作。您只需要知道引导加载程序位于何处。它something.efi
(通常bootx64.efi
)是位于 EFI 系统分区(ESP)某处的文件,该分区是普通的 FAT32 分区并包含一些文件。在 Linux 中,此分区挂载到 /boot 目录。您可以在原始机器上查找它。例如对于 debian 它在EFI/debian/shimx64.efi
,但您可以尝试在原始安装有 linux 的计算机上查找并尝试在 /boot 文件夹中找到的任何 efi 文件。
您需要使用 UEFI Shell(又名 EDK II)创建小型可启动媒体,并使用它手动创建启动项。您可以按照以下方式进行操作。
1) 从以下网址下载最新版本的 EDK II UEFI SHELL(撰写本文时,其名称为 ShellBinPkg.zip)GitHub
2)使用磁盘管理器创建新的小型 VHDX 磁盘(容量 100MB 就足够了)。
3)初始化该磁盘。
4)创建新的FAT32分区
5)在新创建的分区中(在我的情况下字母是 E:,如您在前面的屏幕截图中所见)创建目录EFI
和EFI\boot
。
6)从下载的 zip 存档中将UefiShell/X64/Shell.efi
文件复制到EFI\boot
文件夹并将其重命名为bootx64.efi
7)分离虚拟磁盘。
8)将虚拟磁盘添加到您的虚拟机。
9)暂时禁用虚拟机的安全启动。
9)转到固件选项卡并将 edkii.vhdx 移动为第一启动选项。
10) 启动虚拟机。您将看到 EDK II UEFI SHELL。
11)输入包含引导加载程序路径的以下命令。
bcfg boot add 0 fs0:\EFI\debian\shimx64.efi` NAME_OF_DISTRIBUTION
12) 使用reset
命令重新启动。现在您将成功启动,并且在 Hyper-V 中的固件设置中,您将看到所需的文件启动选项。
13)分离带有 EFI 外壳的磁盘并恢复 SecureBoot 设置。