![使用 KVM 运行嵌套 BIOS VM 时如何使用超过 2GB 的 RAM](https://linux22.com/image/784401/%E4%BD%BF%E7%94%A8%20KVM%20%E8%BF%90%E8%A1%8C%E5%B5%8C%E5%A5%97%20BIOS%20VM%20%E6%97%B6%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%B6%85%E8%BF%87%202GB%20%E7%9A%84%20RAM.png)
我有一台运行 Debian 11 的 Linux 主机,该主机上有一个 Ubuntu 22.04 VM。我想在该 VM 内使用嵌套虚拟化运行 Windows 10 VM。Ubuntu VM 使用 EFI 启动,嵌套虚拟化运行良好。
当在 Ubuntu VM 内部运行的 Windows VM 也使用 EFI 启动时,一切正常,我给它的所有 RAM 都被检测到并且可用,并且 VM 具有良好的性能,因此嵌套虚拟化工作正常。
我的问题是,在使用 EFI 时,vibvirt 尚不支持快照,因此我必须使用 BIOS。但是,当我将虚拟机更改为 bios 时,除了现在客户机只能看到 2GB 的内存之外,一切都运行正常。我尝试在该虚拟机中启动 Linux 和 memtest,它们都只能看到 2GB。我尝试创建新的虚拟机,它们也表现出完全相同的行为(在 EFI 中启动时工作正常,但在 BIOS 中则不行)
我已将虚拟机磁盘和配置 1:1 复制到主机,它可以很好地检测到整个 8GB(或我设置的任何值)。因此,只有在运行嵌套并使用 BIOS 时才会出现此问题。
此时,我已经尝试了许多不同的配置,甚至运行超级简单的 qemu 命令,但由于某种原因,在没有 EFI 嵌套运行时仍然无法突破 2GB 的限制。
是否存在我不知道的限制?
软件版本(在嵌套的 Ubuntu VM 中):
QEMU 模拟器版本 7.2.0
libvirtd (libvirt) 9.0.0
Linux 5.19.0-35-generic
答案1
是的,使用 BIOS 模式的嵌套虚拟化存在限制。您遇到的问题可能是由于虚拟机中的 BIOS 固件无法向客户操作系统公开超过 2GB 的 RAM。
这是基于 BIOS 的虚拟化的已知限制,是由 BIOS 固件映射内存的方式引起的。相比之下,现代虚拟机中使用的 UEFI 固件支持内存映射 I/O,这允许客户操作系统访问更多内存。
要解决此限制,您可以继续使用 EFI 模式下的嵌套虚拟化,或切换到使用支持 EFI 模式下快照的其他虚拟化技术。或者,您可以尝试调整虚拟机 BIOS 固件中的内存设置,尽管这可能并不总是可行或有效的。
总之,基于 BIOS 的虚拟化与嵌套虚拟化的限制在于客户操作系统可能只能访问最多 2GB 的 RAM。