Skip to main content

银河麒麟 + KVM + WebVirtCloud 虚拟机内存不足8G原因与解决方法

非常好的问题,这种情况在 银河麒麟 + KVM + WebVirtCloud 环境里非常常见。你配置虚拟机为 4 核 8 GB 内存,但虚拟机内系统只显示 6.5 GB 左右,可能由以下几种原因造成👇


🧩 一、宿主机层面:内存超分配或 NUMA 限制

🔹 1. 宿主机可用内存不足

如果宿主机剩余可分配内存小于 8 GB,libvirt 会自动削减虚拟机内存上限。

👉 检查宿主机实际内存:

free -m

若宿主机内存使用已接近上限(例如总 16 GB、已被多台 VM 占用),则虚拟机可能只分到部分物理内存。


🔹 2. NUMA 分区未正确分配

某些 CPU 平台或 BIOS 启用 NUMA(非统一内存访问),虚拟机若被绑定到单个 NUMA 节点,可能只能访问节点局部内存。

👉 检查宿主机 NUMA 拓扑:

numactl --hardware

👉 查看虚拟机 NUMA 绑定情况:

virsh dumpxml vmname | grep -A5 numa

若看到 <numatune><vcpu placement='static'> 一类的限制,可以删掉或修改为动态。


🧩 二、虚拟机配置层面(Libvirt/QEMU)

查看虚拟机定义文件:

virsh dumpxml vmname | grep -A5 memory

可能会看到:

<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>6815744</currentMemory>

💡 关键区别:

  • memory 表示最大分配内存(8 GB)

  • currentMemory 表示当前生效内存(6.5 GB)

🛠️ 解决方法:
修改 XML 或使用命令同步:

virsh setmem vmname 8G --config
virsh setmaxmem vmname 8G --config

然后重启虚拟机:

virsh destroy vmname
virsh start vmname

🧩 三、模板或镜像层面

如果你使用的是 WebVirtCloud 模板镜像(内置系统模板)

  • 某些模板镜像里预设了 cloud-init 或 virt-sysprep 的限制,自动下调虚拟内存;

  • 特别是从 qcow2 模板克隆出来时,currentMemory 通常被固定为镜像生成时的值。

👉 你可以用以下命令验证:

grep -A5 "<memory" /etc/libvirt/qemu/*.xml | grep -B1 currentMemory

如发现模板都只配置 6815744 KiB(≈ 6.5 GB),需要更新模板 XML。


🧩 四、虚拟机内部系统

确认不是系统层限制:

dmesg | grep -i memory

如果看到类似:

Memory limited to 6G due to ACPI or BIOS setting

说明虚拟 BIOS (OVMF/SeaBIOS) 或 grub 配置限制了内存。

检查:

cat /proc/cmdline

若存在 mem=6G,删除此参数并更新 grub:

vi /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

✅ 综合建议(推荐修复顺序)

  1. 检查虚拟机 XML 配置:

    virsh dumpxml vmname | grep -A5 memory
    

    currentMemory < memory → 按上面方法调整。

  2. 确认宿主机资源是否足够free -m)。

  3. 重新启动虚拟机后再查看:

    free -mh
    
  4. 如果仍不对,可清理模板继承:

    virsh undefine vmname
    virsh define /path/to/vmname.xml
    

如果你愿意,我可以帮你写一个 自动检测+修复虚拟机内存配置的小脚本(一键同步 currentMemory 和 memory),以便后续新建虚拟机不再出现这种情况。是否帮你生成?