开发者
资源
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

虚拟机无法启动的解决方法

现象描述

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

可能原因

虚拟机绑定的NUMA节点上,空闲内存大页容量不足,无法满足虚拟机内存需求。

处理步骤

内存大页数量不足以满足虚拟机内存要求,有以下两种方式解决。

  • 编辑虚拟机配置文件,删除绑定内容。
    1. 查看当前所有虚拟机,获取无法启动的虚拟机名称。
      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
    2. 编辑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>
      ...
    3. 按“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节点绑定。

    4. 完成后按“Esc”键,输入:wq!再按“Enter”键保存退出。
    5. 重新尝试启动虚拟机。
  • 修改物理机内存大页数量。
    1. 查看当前物理机内存大页数量。
      sysctl -n vm.nr_hugepages

      返回示例结果如下:

      100
    2. 临时修改物理机内存大页数量。
      sysctl -w vm.nr_hugepages=150

      返回示例结果如下:

      vm.nr_hugepages = 150
      • 示例中物理机内存大页数量结果仅供参考,请以你的实际参数值为准。
      • 设置的临时物理机内存大页数量可以参考内存大页总内存(内存大页数量乘内存大页大小后的总值)除以numa节点数量后,需超过当前numa节点上绑定的所有虚拟机的内存总和进行尝试设置,如仍异常可以继续尝试更大的值,直到可以正常启动虚拟机。但需关注内存占用情况,尽量不要超过内存最大值的百分之七十。
    3. 重新尝试启动虚拟机,若仍异常请继续尝试设置更大的物理机内存大页数量,直到可以正常启动。
    4. 进入工具所在目录,进入交互式配置界面。
      cd devkit-kspect-x.x.x-Linux-aarch64
      ./kspect domain
    5. 选择Financial-ISV-kvm.yaml模板文件后单击“Apply”进入。

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

    7. 重启服务器后重新尝试启动虚拟机。