现象

一台kvm宿主机重启一次后,发现该虚拟机消失了,没法启动。virsh list --all没有找到这台虚拟机,但是镜像文件还存在。

找到虚拟机的xml文件,重新virsh define xml后才恢复。

分析

原因是因为这台虚拟机的persistent参数为no,即非持久的,当destroy掉或者宿主机重启后,虚拟机就不存在了。

通过virsh dominfo可以查看虚拟机的persistent状态。

后面发现原来这台虚拟机有过人工在线迁移的记录,如果virsh migrate迁移命令没有加--persistent参数,则会导致persistent状态为no。

[root@hosttest ~]# virsh dominfo test
Id: 84
Name: test
UUID: 4220702d-6de3-ad1b-8eae-bbdb2bf3b52d
OS Type: hvm
State: running
CPU(s): 1
CPU time: 1464708.3s
Max memory: 8388608 KiB
Used memory: 2097152 KiB
Persistent: no
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0

处理

除了规范在线迁移方法外,对现有虚拟机,如果virsh dominfo发现有persistent状态为no的,直接virsh define xml即可将persistent状态改回yes。

如下命令可以在所有宿主机上执行,找到有问题虚拟机,然后人工去修复

#!/bin/bash
virsh list --all|tail -n +3 |awk '{print $2}' >/tmp/vmlist.txt
i=0
for line in $(cat /tmp/vmlist.txt);
do
result=virsh dominfo $line |grep -i Persistent |awk '{print $2}'
if [ $result = 'no' ]
then
echo "$line"
i=((i+1))
fi
done
if [ $i -gt 0 ]
then
echo "not OK"
else
echo "OK"

fi