KVM 虚拟机管理程序 - Windows 32 位 VM,可用 RAM 高达 2GB

KVM 虚拟机管理程序 - Windows 32 位 VM,可用 RAM 高达 2GB

我有一个 Debian 10 KVM 虚拟机管理程序,没有 libvirt 或其他工具来管理它,使用 QEMU 脚本。我需要一个 32 位 Windows VM 来运行旧版应用程序,但需要在受支持的操作系统(不是 XP)上运行,即 Windows 8.1 或 10 32 位。当分配了 3GB RAM(我想这是 32 位机器在没有其他技术的情况下能够处理的最大内存)时,Windows 8.1 和 10 都会在系统属性上显示一条消息“2GB 可用”。相反,Win XP 似乎使用 3GB RAM,表明已启用 PAE。

您知道如何在 32 位 Win 8.1 或 10 上使用 3GB RAM 吗?


以下是具有 3GB RAM 的 Win 8.1 VM 的屏幕截图(一些在 Win 10 上): 在此处输入图片描述


这是启动 VM 的 QEMU 脚本(我也尝试过主机 CPU,没有区别):

#!/bin/sh
SPICE_PORT=3010
MONITOR_PORT=2330
QEMU_AUDIO_DRV=alsa

kvm \
    -M q35 \
    -nodefaults \
    -cpu qemu64 \
`#  -cpu host` \
    -m 3G \
    -mem-path /dev/hugepages \
    -device virtio-balloon-pci \
    -rtc base=localtime \
    -vga qxl \
    -drive file=win8.qcow2,if=virtio,cache-size=16M,cache=writethrough \
    -device virtio-net-pci,netdev=diktyo0 \
    -netdev user,id=diktyo0 \
    -monitor telnet:localhost:${MONITOR_PORT},server,nowait \
    -device virtio-serial \
    -device virtserialport,chardev=vdagent,name=com.redhat.spice.0 \
    -chardev spicevmc,id=vdagent,debug=0,name=vdagent \
    -spice port=${SPICE_PORT},addr=127.0.0.1,disable-ticketing \
    -device virtserialport,chardev=charchannel1,id=channel1,name=org.spice-space.webdav.0 \
    -chardev spiceport,name=org.spice-space.webdav.0,id=charchannel1 \
    -soundhw ac97 \
    -name "Windows 8.1 x86" \
    -daemonize \

根据 shodanshok 的建议,我发布了资源监视器的输出(总共 4GB RAM): 在此处输入图片描述

一半的内存由硬件保留。

我还将 RAM 增加到了 4GB: 在此处输入图片描述

为了防止 QXL 视频驱动程序保留过多内存,我还将配置视频的行更改为:

-device qxl-vga,vgamem_mb=64,ram_size_mb=64,vram_size_mb=64

我可能会尝试更改 Seabios,至少是版本。不幸的是,Debian Stable QEMU 版本是 3.1.0;它相当旧了,我想知道在较新版本中是否会出现相同的行为。

答案1

更新答案:如评论和更新的问题所示,具体问题与特定机器类型导致的 2 GB 硬件内存预留有关。切换到 i440fx 机器类型解决了该问题。

原始答案(留在这里是因为它可以帮助其他在 32 位 Windows 上遇到类似问题的人):

尝试使用以下命令增加用户空间内存分配(并重新启动):

bcdedit /set IncreaseUserVa 3072

请务必对虚拟机进行快照执行上述命令(并确保有一个有效的备份)。

答案2

我怀疑您的问题出在大页面(hugepages)上,您已明确要求 KVM 使用它。

    -mem-path /dev/hugepages \

您是否真的有足够的大页面来为虚拟机提供整个 4GB 的 RAM?我认为您可能没有。检查:

# grep Huge /proc/meminfo           
AnonHugePages:   1325056 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

总共有多少个大页面,有多少个可用?注意每个大页面为 2MB。1024 个大页面总共可用 2GB。

因此,增加大页面的数量以满足您的虚拟机(或多个虚拟机!)将使用的所有内存的要求。

# sysctl vm.nr_hugepages
vm.nr_hugepages = 1024

# sysctl vm.nr_hugepages=2048
vm.nr_hugepages = 2048

现在您应该有足够的大页面来为虚拟机提供所有的内存。

# grep Huge /proc/meminfo 
AnonHugePages:   1327104 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    2048
HugePages_Free:     2048
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         4194304 kB

相关内容