我克隆了一个 GPT 格式的磁盘,其中包含双启动(Windows + Linux Debian),它在真实机器上运行良好。
我尝试使用 Qemu 创建使用克隆磁盘的 VM,使其在 Debian 分区上启动,但我能做的最好的就是启动 Windows。
这是我使用的命令:
virt-install \
--name "vm-test_dual_boot" \
--boot loader=/usr/share/OVMF/OVMF_CODE.fd \
--vcpus 2 --memory 8192 --osinfo debian11 \
--network bridge=br0 \
--graphics=vnc \
--disk path=/home/user/vm/clone.qcow2 \
--import -v
我无法做与真正的 UEFI 机器一样的事情,将HD(1,GPT,unique_identifier)
文件系统与\EFI\debian\shimx64.efi
文件关联起来。
你能帮助我启动 Debian 吗?
感谢@telcoM,我更改了命令:
boot_config=\
"loader=/usr/share/OVMF/OVMF_CODE_4M.fd,"\
"loader.readonly=yes,"\
"loader.type=pflash,"\
"nvram.template=/usr/share/OVMF/OVMF_VARS_4M.ms.fd,"\
"nvram=/home/user/vm/clone_nvram.fd" ;
virt-install \
--name "vm-test_dual_boot" \
--boot $boot_config \
--vcpus 2 --memory 8192 --osinfo win10 \
--network bridge=br0 \
--graphics=vnc \
--disk path=/home/user/vm/clone.qcow2 \
--import -v
笔记:
从目录
/usr/share/OVMF
loader
必须nvram.template
与然后OVMF_CODE_4M.fd
到匹配OVMF_VARS_4M.ms.fd
,所以在我的情况下,这会触发此错误:“Guest 尚未初始化显示(尚未)”。/etc/libvirt/qemu.conf
(默认值:)中定义的用户libvirt-qemu
必须具有对nvram
文件的读取和执行正确访问权限,否则会触发权限错误。在我的情况下
--osinfo win10
是强制性的,因为默认的 vHD EFI 启动是 Windows(在我尝试之前,以BSODdebian11
结束)。对于该
--network
部分,假设我们有一个br0
桥接设备(有关临时桥接请参见此处Network Manager
,或有关 的请参见此处iproute
,有关永久桥接请参见此处ifup
)。
创建后,配置 VM EFI 以启动正确的分区(请参阅@telcoM 详细解答以暂时或永久实现它)。
您尚未为启动变量定义 NVRAM 存储,因此没有地方可以永久存储 UEFI 启动变量。因此,系统将始终回退到从
\EFI\boot\bootx64.efi
...启动,默认情况下,Windows 会将其备份启动加载程序放在那里。你需要做类似的事情:
这将以位于 的小文件形式为 UEFI 启动设置保留一个空间
/home/user/vm/clone_nvram.fd
。此文件将代表虚拟主板上的持久 NVRAM 存储。双启动 VM 仍将在第一次启动到 Windows,因为后备引导加载程序路径仍保存 Windows 引导加载程序(并且现代 Windows 的“自我修复”可能会保持这种状态)。
下一步是进入虚拟机的 UEFI 固件启动设置菜单。如果你速度够快,你可以F2在虚拟机启动时按下 进入该菜单,但更简单的方法是告诉 Windows 重新启动并在下次启动时进入该菜单(来自Microsoft):
到达那里后,您可以进入
Boot Maintenance Manager
子菜单,选择Boot from File
,选择您的虚拟磁盘,然后选择<EFI>
文件夹,然后选择<debian>
子文件夹,然后选择shimx64.efi
文件。这将允许您在 VM 中启动 GRUB,从而启动 Debian。要为 GRUB 创建持久启动项,请使用
grub-install --target=x86_64-efi /dev/sda
(假设您的系统磁盘是/dev/sda
;如果您的系统磁盘是/dev/vda
,请进行相应调整)重新安装 GRUB 引导加载程序并为其重写 UEFI 启动变量。(您也可以使用命令来执行此操作
efibootmgr
,但使用grub-install
可能更容易。)在克隆非双启动 Linux 系统时,您可以通过执行以下操作来避免 UEFI 系统(无论是否虚拟)出现此类复杂情况:
在克隆原始系统之前
shimx64.efi
。这会将的第二份副本放入 中/boot/efi/EFI/boot/bootx64.efi
,这将有效地使磁盘(及其未来的克隆)可 UEFI 启动,即使 NVRAM 设置丢失……或在克隆系统或将其转换为虚拟机时留在原始系统的 UEFI NVRAM 芯片中。