【问题1】
- 启动虚拟机报错
unsupported machine type
[root@localhost ~]# virsh start xxx-05
setlocale: No such file or directory
error: Failed to start domain xxx-05
error: internal error: process exited while connecting to monitor: 2021-03-16T05:48:03.459659Z qemu-kvm: -machine virt-rhel7.6.0,accel=kvm,usb=off,dump-guest-core=off,gic-version=3,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format: unsupported machine type
Use -machine help to list supported machines
【原因】
- qemu版本升级,而qemu存在qemu--ma、qemu--ev等多个系列,不同系列所支持的machine type并不相同,qemu升级后原本创建的虚机的machine type不被支持。
【解决方法】
- 使用命令
/usr/libexec/qemu-kvm -machine help
查看支持的类型
[root@localhost ~]# /usr/libexec/qemu-kvm -machine help
Supported machines are:
virt RHEL 8.2.0 ARM Virtual Machine (alias of virt-rhel8.2.0)
virt-rhel8.2.0 RHEL 8.2.0 ARM Virtual Machine (default)
none empty machine
- 使用
virsh edit {vm_name}
命令将虚拟机配置中的machine修改为所支持的类型。
【问题2】
- machine类型修改完成后,使用命令
virsh start {vm_name}
再次启动虚拟机,报以下错误
[root@localhost ~]# virsh start xxx-05
setlocale: No such file or directory
error: Failed to start domain xxx-05
error: internal error: process exited while connecting to monitor: ERROR cluster 501158 refcount=0 reference=1
ERROR cluster 501159 refcount=0 reference=1
ERROR cluster 501160 refcount=0 reference=1
ERROR cluster 501161 refcount=0 reference=1
ERROR cluster 501162 refcount=0 reference=1
【解决方法】
- 这部分报错只是类似于警告的信息,没有什么其他作用,暂时可以无视,再重新启动就行
【问题3】
- 再次启动后,报错
Cannot allocate memory
[root@localhost ~]# virsh start xxx-05
setlocale: No such file or directory
error: Failed to start domain xxx-05
error: internal error: qemu unexpectedly closed the monitor: 2021-03-16T05:40:53.512455Z qemu-kvm: cannot set up guest memory 'mach-virt.ram': Cannot allocate memory
【原因】
- 一般是因为分配的内存大于实际的内存。
【解决方法】
- 执行
free -g
查看宿主机内存空间;
[root@localhost ~]# free -g
total used free shared buff/cache available
Mem: 510 468 24 2 17 6
Swap: 0 0 0
- 使用
virsh edit {vm_name}
,修改VM配置xml文件,调整内存为可以分配的内存大小:
<memory unit="GiB">64</memory>
【问题4】
- 将内存修改成小于宿主机内存空间的数值,但还是启动失败,依旧报
Cannot allocate memory
【原因】
- 使用命令
sysctl -a | grep overcommit
查看一下主机确保可以分配多少内存
[root@localhost ~]# sysctl -a | grep overcommit
vm.nr_overcommit_hugepages = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
内核参数overcommit_memory
- 即内存分配策略,可选值:0、1、2。
- 0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
- 2: 表示内核允许分配超过所有物理内存和交换空间总和的内存
【解决方案】
- 可以看到设置中vm.overcommit_memory为0,所以需要将vm.overcommit_memory设为1。有三种方式修改内核参数,但要有root权限:
(1)编辑/etc/sysctl.conf
,改vm.overcommit_memory=1,然后sysctl -p
使配置文件生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory
【参考文档】