KVM hypervisor – Windows 32bit VM, RAM up to 2GB usable

Krackout asked:

I’ve got a Debian 10 KVM hypervisor, no libvirt or other tool to administrate it, using QEMU scripts. I need a 32bit Windows VM for a legacy app, but on a supported OS (not XP), either Windows 8.1 or 10 32bit. Both Windows 8.1 & 10 present a message Ā«2GB usableĀ» on system properties when 3GB RAM is assigned (the max capable of handling for a 32 bit machine without other techniques I suppose). On the contrary Win XP seems to use 3GB RAM, stating PAE enabled.

Any ideas how to use 3GB RAM on Win 8.1 or 10, 32 bit?

Here’s the screenshot of Win 8.1 VM with 3GB RAM (some on Win 10):
enter image description here

Here is the QEMU script to start the VM (I’ve also tried host CPU, no difference):


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=,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 \

Following shodanshok’s advice, I post resource monitor’s output (with 4GB total RAM):
enter image description here

Half the memory is reserved by hardware.

I’ve also increased RAM to 4GB:
enter image description here

Just in case of QXL video driver reserving too much memory, I also changed the line configuring video to:

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

I may try to change the Seabios, at least the version. Unfortunately in Debian Stable QEMU version is 3.1.0; it’s quite old, I wonder if the same behaviour appears in newer versions.

My answer:

I suspect your problem is with hugepages, which you’ve explicitly asked KVM to use.

    -mem-path /dev/hugepages \

Do you actually have enough hugepages to give the VM the entire 4GB of RAM? I think you probably don’t. Check with:

# 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

How many total hugepages and how many free? Notice each hugepage is 2MB. With 1024 of them all you have available is 2GB.

So increase the number of hugepages to account for all the memory that your VM (or VMs!) will use.

# sysctl vm.nr_hugepages
vm.nr_hugepages = 1024

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

Now you should have enough hugepages to give the VM all of the memory.

# 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

View the full question and any other answers on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.