KVM虚拟机使用过程中的问题集
2017-05-05 15:51:08 阿炯

一、动态迁移时报镜像文件不存在



一、动态迁移时报镜像文件不存在

迁出主机:vm41
迁入主机:vm16

即将vm41上面的虚拟机迁移到vm16这台主机上。

[root@vm41 ~]# virsh migrate vm-centos6-1.70 --live --copy-storage-all --verbose --unsafe qemu+ssh://vm16/system
error: Failed to open file '/data/kvm_img/vm-centos6-1.70.img': No such file or director

[root@vm41 ~]# virsh migrate --live --persistent --undefinesource --copy-storage-all --verbose --desturi qemu+ssh://vm16/system vm-centos6-1.70
error: Failed to open file '/data/kvm_img/vm-centos6-1.70.img': No such file or directory

[root@vm41 ~]# qemu-img info /data/kvm_img/vm-centos6-1.70.img
image: /data/kvm_img/vm-centos6-1.70.img
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 78G
cluster_size: 65536

[root@vm16 ~]# dd if=/dev/null of=/data/kvm_img/vm-centos6-1.70.img bs=1M seek=81920

[root@vm41 ~]# virsh migrate --live --copy-storage-all vm-centos6-1.70 qemu+ssh://192.168.40.16/system
error: internal error process exited while connecting to monitor: char device redirected to /dev/pts/0
2017-05-03T08:18:17.539375Z qemu-kvm: -drive file=/data/kvm_img/vm-centos6-1.70.img,if=none,id=drive-virtio-disk0,format=qcow2,cache=none: could not open disk image /data/kvm_img/vm-centos6-1.70.img: Invalid argument

[root@vm41 ~]# virsh migrate --live --persistent --undefinesource --copy-storage-all --verbose --desturi qemu+ssh://vm16/system vm-centos6-1.70
报错同上

虽然报错了,但错误不一样了,初步分析用dd创建的文件格式与qemu-img生成的不一样导致的,那用qemu-img创建呢?

[root@vm16 ~]# qemu-img create -f qcow2 vm-centos6-1.70.img 80G

再重新调用上面的指令进行迁移呢,发现是可以成功的。
Migration: [100 %]

迁移完成后,源主机(迁出)上会将该虚拟机关闭,但镜像及配置文件依然保留着,目标主机(迁入)会自动将该虚拟机开启,并处于工作状态。

注意:两台宿主机上的镜像文件的路径是一样的,目前在迁移的过程中无法更改的。迁入的机器要在迁出的机器上做一个简单ip与hostname的映射。


迁移命令:

virsh migrate --live GuestName DestinationURI  # (--live :迁移过程中虚拟机一直保持运行状态)

设置ssh的连接方式
GuestName指虚拟机名称,DestinationURI:目的主机的URI。可以是TCP也可以是ssh方式连接。
TCP连接uri:qemu+tcp://ip/system
 SSH连接uri : qemu+ssh://ip/system
这里采用ssh方式。首先设置A到B的ssh无密码登录,这个比较简单。验证一下ssh是否生效

# virsh -c qemu+ssh://ip/system nodeinfo

如果现实物理机的配置信息,表示设置成功

查看本机虚拟机列表:
virsh --connect qemu:///system list --all

查看其它主机的:
virsh -c qemu+ssh://vm16/system list --all


参考来源

libvirt live migrate error, cannot open file

这篇文章中提到要加上'--copy-storage-all'这个参数,结果依然不行。

CentOS6.5部署KVM及实现在线迁移

国人总结的使用经验,其中提到的动态迁移是基于共享存储的,但没有提出上述问题的解决办法。

Live migrating a virtual machine with libvirt without a shared storage

这是目前能找到的最相近的文章,不过文章中提到方法我在使用中也不能解决问题,但原理一样,借鉴了其处理方法,终于能成功迁移。

Debian KVM Wiki


4. KVM Live Migration

RHEL KVM 官方迁移文档

KVM 虚拟机在物理主机之间迁移的实现

IBM工程师所写的文档,有很高参考价值。

在用的实际中的操作实例

将一台迁出机的虚拟机平分并迁移到其它几台机器,迁入机上加了新的存储,迁移过去放到新的存储上,所以在迁之前需要对被迁出的虚拟机镜像文件路径做一些更改:

修改与新环境相同的路径(不然会写到修改前的相同路径下,如果分区够用还好说,不够的话就必须用下面的方法修改了)
perl -i -pe 's/data/sdb/g' vm-centos6-1.*.xml

perl -ne 'print if /kvm/' vm-centos6-1.*.xml

批量停止
for i in {75..89};do virsh destroy vm-centos6-1.$i;done

移动文件
mv -fv /data/kvm_img/vm-centos6-1.* /sdb/kvm_img/

批量拉起
for i in {75..89};do virsh create /etc/libvirt/qemu/vm-centos6-1.$i.xml;done

在目标主机上创建虚拟镜像文件:
for i in {75..79};do qemu-img create -f qcow2 /sdb/kvm_img/vm-centos6-1.$i.img 80G;done
记得将文件属主修改为qemu用户的。
chown -R qemu.qemu /sdb/kvm_img/vm-centos6-1.*

同步5台到一台宿主机:
for i in {75..79};do virsh migrate --live --persistent --undefinesource --copy-storage-all --verbose --desturi qemu+ssh://192.168.40.17/system vm-centos6-1.$i;done

error: internal error hostname on destination resolved to localhost, but migration requires an FQDN

在/etc/hosts文件中建一个别名映射

放到tmux中,这样在家中也能看到操作的进度,一夜可以迁好20-30台不等的虚拟机。


其他网友总结的kvm常见故障及解决方法


启动虚拟机Connection reset by peer

# virsh start vmhost1
error: Failed to start domain vmhost1error: Unable to read from monitor: Connection reset by peer

在虚拟机运行过程中关闭宿主服务器就有可能导致这种情况出现,由于宿主服务器中的kvm虚拟机控制器与安装在kvm中的虚拟机会话被异常重置,所以我们可以如下解决:
# virsh managedsave-remove vmhost1
# virsh start vmhost1

如果启动查看/var/log/libvirt/qemu/vmhost1.log下log还报如下错误:
Cannot set up guest memory 'pc.ram': Cannot allocate memory

这个问题可能是分配给vmhost1分配的内存过大(甚至超过的物理主机的内存大小),或者可能是宿主机没有足够的内存分配给此虚拟机,导致无法启动!

重Define虚拟机时无/usr/bin/kvm

error: Failed to define domain from hostname.xml
error: Cannot find QEMU binary /usr/bin/kvm: No such file or directory

解决方法:
# ln -s /usr/libexec/qemu-kvm /usr/bin/kvm

error: internal error process exited while connecting to monitor

# virsh start vmhost1  

error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: kvm: -drive file=/dev/sp1368155439693/v1368544020461,if=none,id=drive-virtio-disk0,format=qcow2: could not open disk image /dev/sp1368155439693/v1368544020461: Invalid argument

分析:镜像格式错误,用qemu-img info 检查镜像和xml配置文件中指定的type是否一致!

Unable to load library 'virt': libvirt.so

Unable to load library 'virt': libvirt.so: cannot open shared object file: No such file or directory

Linux下解决:ln -s /usr/lib/libvirt.so.0   /usr/lib/libvirt.so

windows下解决:将libvirt-0.dll改名为virt.dll

error: Refusing to undefine while domain managed save image exists

# virsh undefine vmhost1
error: Refusing to undefine while domain managed save image exists http://www.redhat.com/archives/libvir-list/2011-July/msg01219.html

解决方法:virsh undefine $domain --managed-save


启动libvirtd进程出错

# /usr/local/sbin/libvirtd -d -l --config /usr/local/etc/libvirt/libvirtd.conf (编译安装的启动方式)

error:/usr/local/sbin/libvirtd: initialization failed
try to install libpcap-devel RPM and rebuild libvirt
apt-get install libpcap-dev
上面的方法好像都没有效果,但是尝试了http://wiki.libvirt.org/page/The_daemon_cannot_be_started说的,把配置文件里的
listen_tls = 0注释取消


启动虚拟机报错

# virsh start vmhost1
error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: Could not access KVM kernel module: No such file or directoryfailed to initialize KVM: No such file or directory No accelerator found!

上面的提示信息就是因为QEMU在初始化阶段因为无法找到kvm内核模块。

# modprobe kvm   #载入指定的模块

重启电脑,进入bios界面,设置advance选项里面的virtualization标签为Enabled。

通过命令 lsmod | grep kvm  #显示已载入的模块


虚拟机迁移

# virsh migrate --live 1 qemu+tcp://192.168.0.121 --p2p --tunnelled --unsafe
error: operation failed: Failed to connect to remote libvirt URI qemu+tcp://192.168.0.121(在URI后面加上/system,'system'相当于root用户的访问权限)

# virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled
error: Unsafe migration: Migration may lead to data corruption if disks use cache != none(加上--unsafe参数)

# virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled --unsafe
error: Timed out during operation: cannot acquire state change lock (启动虚拟机有时也会遇此错误),需要重启libvirtd进程

virsh

error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Connection refused(libvirtd 进程没有启动,libvirtd是一个监听客户端请求的进程)
# virsh -c qemu:///system listerror: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
error: failed to connect to the hypervisor(当前用户没有权限,修改/etc/libvirt/libvirtd.conf,unix_sock_rw_perms = 0777,使所有用户都有权限读写)


kvm虚拟化

查看cpu是否支持虚拟化(grep vmx /proc/cpuinfo),如果查询的结果中包含有vmx,那么就可以证明服务器是支持虚拟化的。

安装对应的软件包
yum -y groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform"

查看内核是否加载对应的模块
modprobe kvm
lsmod |grep kvm

ln -sv /usr/libexec/qemu-kvm /usr/bin/

加入到自启动服务中
service libvirtd start
chkconfig --level 2345 libvirtd on
chkconfig libvirtd  --list
 
配置网卡桥接
virsh iface-bridge eth0 br0

安装
virt-install --connect  qemu:///system --virt-type kvm --name rhel6 --ram=1024  --disk path=/var/lib/libvirt/images/rhel6.img,size=8,sparse --os-type=linux --accelerate -c /sdb1/CentOS-6.6-x86_64-bin-DVD.iso --network bridge=br0,model=virtio --vnc --vncport=5991 --vnclisten=0.0.0.0 --force

--vncport 端口可以自己改,不指定的话自动获取

--boot network,cdrom,menu=on  这个是启动顺序可以不用加

当出现下面提示的时候用vnc客户端连接即可(端口:5991)

netstat -tnlp |grep kvm
tcp        0      0 0.0.0.0:5991                0.0.0.0:*                   LISTEN      3016/qemu-kvm

开始安装......
创建域......                                                                     |    0 B     00:00     

无法打开显示:

运行 'virt-viewer --help' 来查看可用命令行选项的完整列表

域安装仍在进行,可以重新连接到控制台以便完成安装进程。

注意: 如果安装完成后,ifconfig只能看到本地回环网卡,到/etc/sysconfig/network-scripts/目录下将ifcfg-eth0的ONBOOT改为yes,然后启动网卡即可。

virsh uri: 查看当前主机上hypervisor的连接路径;

virsh connect:

virsh define: 创建一个虚拟机,根据事先定义的xml格式的配置文件;创建以后不会自动启动;

virsh create: 创建,创建完成后会自动启动;

virsh undefine: 删除

virsh list  --all 查看

virsh destroy rhel6  删除rhel6

virt-install --os-variant list

virsh start rhel66 开启rhel66 或 virsh create /etc/libvirt/qemu/rhel66.xml

virsh shutdown rhel66

virsh reboot rhel66

virsh console rhel66

virsh suspend rhel66  挂起

virsh resume  rhel66 恢复挂起

/etc/libvirt/qemu/ 虚拟机xml配置文件目录

virsh edit rhel66 编辑xml配置文件,vi编辑的不会立即生效

解决virsh shutdown无法关闭KVM虚拟机,以下操作都在客户机,不是宿主机

yum -y install  acpid
service acpid restart
chkconfig --level 2345 acpid on
chkconfig acpid --list

解决KVM中宿主机通过console无法连接客户机,以下操作都在客户机,不是宿主机

1、添加ttyS0的安全许可,允许root登录:
echo "ttyS0" >> /etc/securetty

2、在/etc/grub.conf文件中为内核添加参数:
console=ttyS0

这步要注意:console=ttyS0一定要放在kernel这行中(大约在第16行),不能单独一行,即console=ttyS0是kernel的一个参数,不是单独的。

3、在/etc/inittab中添加agetty:
S0:12345:respawn:/sbin/agetty ttyS0 115200

4、重启客户机:
reboot

kvm虚拟机的重命名

1、查看所有的kvm虚拟机

virsh list --all

 Id    名称                         状态
----------------------------------------------------
 -     rhel6                        关闭

2、重命名kvm虚拟机最好是将虚拟机先关机,然后再导出其xml文件

cd /etc/libvirt/qemu

virsh dumpxml rhel6 > CentOS2.xml

3、为了让重命名后的虚拟机名字与磁盘文件名一致、我们可以先将之前的磁盘文件命名成CentOS2.img

cd /var/lib/libvirt/images

mv rhel6.1.img CentOS2.img

4、编辑CentOS2.xml文件,修改<name>标签对以及磁盘文件,这里我们将磁盘文件修改成CentOS2.img

<domain type='kvm'>
  <name>CentOS2</name>
      ......  
   ...省略......
      ......
  <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
  <source file='/var/lib/libvirt/images/CentOS2.img'/>

5、使用virsh undefine命令删除之前的虚拟机,根据新的xml文件定义新的kvm虚拟机

virsh undefine  rhel6 ////删除rhel6虚拟机

virsh define /etc/libvirt/qemu/CentOS2.xml    //重新定义新的kvm虚拟机

6、最后我们可以再次使用virsh list --all命令查看,结果如下所示

Id    名称                         状态
----------------------------------------------------
 -     CentOS2                       关闭

经过如上方法重命名的kvm机直接启动使用即可,不会影响udev动态管理设备的文件,和之前的虚拟机相比、仅仅就是名字变了而已。