虚拟机无法启动的解决方法
现象描述
使用鲲鹏健康检测工具domain命令操作时,对物理机内存大页参数及虚拟机内存大页和内存绑定设置后,虚拟机无法启动,报错结果如下图所示。

可能原因
虚拟机绑定的
处理步骤
内存大页数量不足以满足虚拟机内存要求,有以下两种方式解决。
- 编辑虚拟机配置文件,删除绑定内容。
- 查看当前所有虚拟机,获取无法启动的虚拟机名称。
virsh list --all
返回结果示例如下:
Id Name State ---------------------------------------------- 6 centos8.1-xxx.xxx.xxx.xxx_1 running 16 centos8.1-xxx.xxx.xxx.xxx_2 running 17 centos8.1-xxx.xxx.xxx.xxx_3 running 18 centos8.1-xxx.xxx.xxx.xxx_4 running 19 centos8.1-xxx.xxx.xxx.xxx_5 running 20 centos8.1-xxx.xxx.xxx.xxx_6 running 21 centos8.1-xxx.xxx.xxx.xxx_7 running 22 centos8.1-xxx.xxx.xxx.xxx_8 running 23 centos8.1-xxx.xxx.xxx.xxx_9 running 24 centos8.1-xxx.xxx.xxx.xxx_10 running - centos8.1-xxx.xxx.xxx.xxx shut off
- 编辑State为shut off的无法启动的虚拟机。
virsh edit centos8.1-xxx.xxx.xxx.xxx
请将示例中“centos8.1-xxx.xxx.xxx.xxx”替换为你的实际无法启动的虚拟机名称。
返回结果示例如下:
<domain type='kvm'> <name>centos8.1-xxx.xxx.xxx.xxx</name> <uuid>4140adad-d94e-45c6-951a-ab7d94e70925</uuid> <metadata> <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0"> <libosinfo:os id="http://centos.org/centos/8"/> </libosinfo:libosinfo> </metadata> <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>8388608</currentMemory> <memoryBacking> <hugepages> <page size='xxxxxxx' unit='KiB'/> </hugepages> </memoryBacking> <vcpu placement='static'>8</vcpu> <iothreads>1</iothreads> <cputune> <vcpupin vcpu='0' cpuset='36'/> <vcpupin vcpu='1' cpuset='37'/> <vcpupin vcpu='2' cpuset='38'/> <vcpupin vcpu='3' cpuset='39'/> <vcpupin vcpu='4' cpuset='32'/> <vcpupin vcpu='5' cpuset='33'/> <vcpupin vcpu='6' cpuset='34'/> <vcpupin vcpu='7' cpuset='35'/> <emulatorpin cpuset='0'/> <iothreadpin iothread='1' cpuset='1'/> </cputune> <numatune> <memory mode='strict' nodeset='1'/> </numatune> <os firmware='efi'> <type arch='aarch64' machine='virt-8.2'>hvm</type> <firmware> <feature enabled='no' name='enrolled-keys'/> <feature enabled='no' name='secure-boot'/> </firmware> <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader> <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/var/lib/libvirt/qemu/nvram/centos8.1-xxx.xxx.xxx.xxx_VARS.raw</nvram> <boot dev='hd'/> </os> <features> <acpi/> <gic version='3'/> </features> <cpu mode='host-passthrough' check='none'/> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none' io='native'/> <source file='/home/kvm/images/centos8.1-xxx.xxx.xxx.xxx.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='sda' bus='scsi'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> ... - 按“i”进入编辑模式,修改配置文件,分别找到并删除<numatune>与<memoryBacking>下的“memory mode”与“page size”的内容,如下所示:
<numatune> <memory mode='strict' nodeset='1'/> </numatune> <memoryBacking> <hugepages> <page size='xxxxxxx' unit='KiB'/> </hugepages> </memoryBacking>删除以上memory mode与page size的内容,删除后的配置文件示例如下:
<domain type='kvm'> <name>centos8.1-xxx.xxx.xxx.xxx</name> <uuid>4140adad-d94e-45c6-951a-ab7d94e70925</uuid> <metadata> <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0"> <libosinfo:os id="http://centos.org/centos/8"/> </libosinfo:libosinfo> </metadata> <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>8388608</currentMemory> <memoryBacking> <hugepages> </hugepages> </memoryBacking> <vcpu placement='static'>8</vcpu> <iothreads>1</iothreads> <cputune> <vcpupin vcpu='0' cpuset='36'/> <vcpupin vcpu='1' cpuset='37'/> <vcpupin vcpu='2' cpuset='38'/> <vcpupin vcpu='3' cpuset='39'/> <vcpupin vcpu='4' cpuset='32'/> <vcpupin vcpu='5' cpuset='33'/> <vcpupin vcpu='6' cpuset='34'/> <vcpupin vcpu='7' cpuset='35'/> <emulatorpin cpuset='0'/> <iothreadpin iothread='1' cpuset='1'/> </cputune> <numatune> </numatune> <os firmware='efi'> <type arch='aarch64' machine='virt-8.2'>hvm</type> <firmware> <feature enabled='no' name='enrolled-keys'/> <feature enabled='no' name='secure-boot'/> </firmware> <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader> <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/var/lib/libvirt/qemu/nvram/centos8.1-xxx.xxx.xxx.xxx_VARS.raw</nvram> <boot dev='hd'/> </os> <features> <acpi/> <gic version='3'/> </features> <cpu mode='host-passthrough' check='none'/> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none' io='native'/> <source file='/home/kvm/images/centos8.1-xxx.xxx.xxx.xxx.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='sda' bus='scsi'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> ...
不同虚拟机配置文件内容可能会有一定区别,找到并删除你的虚拟机配置文件中<numatune>与<memoryBacking>下的“memory mode”与“page size”的内容即可。该操作会删除内存绑定NUMA节点和虚拟机设置内存大页的效果,如仍需要该功能,请重新使用domain命令更换其余numa节点绑定。
- 完成后按“Esc”键,输入:wq!再按“Enter”键保存退出。
- 重新尝试启动虚拟机。
- 查看当前所有虚拟机,获取无法启动的虚拟机名称。
- 修改物理机内存大页数量。
- 查看当前物理机内存大页数量。
sysctl -n vm.nr_hugepages
返回示例结果如下:
100
- 临时修改物理机内存大页数量。
sysctl -w vm.nr_hugepages=150
返回示例结果如下:
vm.nr_hugepages = 150
- 示例中物理机内存大页数量结果仅供参考,请以你的实际参数值为准。
- 设置的临时物理机内存大页数量可以参考内存大页总内存(内存大页数量乘内存大页大小后的总值)除以numa节点数量后,需超过当前numa节点上绑定的所有虚拟机的内存总和进行尝试设置,如仍异常可以继续尝试更大的值,直到可以正常启动虚拟机。但需关注内存占用情况,尽量不要超过内存最大值的百分之七十。
- 重新尝试启动虚拟机,若仍异常请继续尝试设置更大的物理机内存大页数量,直到可以正常启动。
- 进入工具所在目录,进入交互式配置界面。
cd devkit-kspect-x.x.x-Linux-aarch64 ./kspect domain
- 选择Financial-ISV-kvm.yaml模板文件后单击“Apply”进入。

- 修改物理机内存大页数量为2中成功启动虚拟机的值,修改不会立刻生效,需要重启服务器后生效,括号内为待生效值。

- 重启服务器后重新尝试启动虚拟机。
- 查看当前物理机内存大页数量。
父主题: FAQ