上篇聊了下KVM的安全知识:TLS?有什么用?我们这次聊聊怎么追查KVM故障,以及KVM的故障应该怎么处理。

1、 libvirt的运行日志

在运行libvirt的时候,我们需要获得lbivirt的运行信息,所以我们需要找到他的日志文件。一般情况下,它是在/var/log/libvirt/libvirtd.log路径下。

如果在这个目录下没有发现这个的日志文件,那么就要配置一些libvit的参数了:

(1)编辑文件/etc/libvirt/libvirtd.conf

# 将日志级别设置为1(调试)

log_level = 1

# 指定日志输出文件名称

log_outputs="1:file:/var/log/libvirt/libvirtd.log"

以上的日志的输出级别为debug级别。这个级别的日志是最多的,一般只在开发以及测试的时候使用。

具体输出的格式可以是以下4种形式之一:

x:stderr    输出转到stderr

x:syslog:name    使用syslog作为输出并使用给定name的ident作为标识

x:file:file_path    使用给定的文件路径输出到文件

x:journald    输出转到systemd日志

在所有情况下,x前缀都是最小级别,充当过滤器,在生产运行环境中,日志的级别为info、warn、error、fatal。 以下前面的数字为他们的level:

1 debug

2 info

3 warn

4 error

5 fatal

注意:libvirt日志文件可能会飞速增长。 用户应配置logrotate ,否则您的 /var 文件系统最后会装满内容。


(2)重启libvirt 。

虚拟机Guest操作系统正在运行时可重启 libvirt:

# /etc/init.d/libvirtd restart

如果在目录下还是没发现日志文件,那么你可能需要使用一下命令来运行libvirt:

libvirtd --daemon --listen --config /etc/libvirt/libvirtd.conf



2、 查看virsh管理qemu虚拟机的信息  

在使用virsh管理qemu的虚拟机时候,也是有日志的输出的。

PS: 具体的log在目录/var/log/libvirt/qemu/ 下面,具体的log文件名与虚拟机名字关联。

$ sudo tail -f /var/log/libvirt/qemu/test.log


输出如下:

2016-11-0817:14:46.909+0000: starting up libvirt version: 1.3.1, package: 1ubuntu10.5(Stefan Bader Thu, 06 Oct 2016 13:07:20+0200), qemu version: 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.5), hostname:server1.cyberciti.biz

....

.....

..

=29,id=hostnet1,vhost=on,vhostfd=30-device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:8f:31:5f,bus=pci.0,addr=0x4-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0-vnc 127.0.0.1:1 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -devicevirtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on

char device redirectedto /dev/pts/8 (label charserial0)



3、 libvirt的常见错误

问题1:error: Cannot access storage file '/root/x.qcow2' (as uid:107, gid:107): Permission

解决2

查看qemu用户

1)cat /etc/passwd

qemu:x:107:107:qemu user:/:/sbin/nologin

2)ll /root/x.qcow2

-rwxrwxrwx 1 qemu qemu 1957691392 Dec  1 14:16 /root/x.qcow2

3)在各种权限都对的情况下,依然不能create,这样就需要重新调整libvirt的默认权限

sed -i 's/#group = "root"/group ="root"/g' /etc/libvirt/qemu.conf

sed -i 's/#user = "root"/user ="root"/g' /etc/libvirt/qemu.conf

4)最后重启libvirt

service libvirtd restart



问题2:error: Cannot read CA certificate '/etc/pki/CA/cacert.pem': No such file or directory

解决2

这个是由于libvirt使用了TLS机制,但是没有配置好相关的公钥和私钥。

关于libvirt的TLS机制,见这里:http://wiki.libvirt.org/page/TLSDaemonConfiguration。

1)一个简单的解决办法是将TLS机制关掉,更改/etc/libvirt/libvirtd.conf为:

listen_tls = 0

listen_tcp = 1

2)最后重启libvirt

service libvirtd restart



问题3:virsh start vm1error: Failed to start domain vm1error: Unable to read from monitor: Connection reset by peer

解决3

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

# virsh managedsave-remove vm1

# virsh start vm1



问题4:查看/var/log/libvirt/qemu/vm1.log下log还报如下错误,Cannot set up guest memory 'pc.ram': Cannot allocate memory

解决4

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



问题5:Define虚拟机时无/usr/bin/kvm

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

解决5

# ln -s /usr/libexec/qemu-kvm /usr/bin/kvm



问题6: Unable to load library 'virt': libvirt.so

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

解决6: 

在linux下:   

ln -s /usr/lib/libvirt.so.0   /usr/lib/libvirt.so

在windows下:

      将libvirt-0.dll改名为virt.dll



问题7: error: Refusing to undefine while domain managed save p_w_picpath exists

# virsh undefine vm1error: Refusing to undefine while domain managed save p_w_picpath

解决7

virsh undefine $domain  --managed-save



问题8: 启动虚拟机报错

# virsh start vm1 error:

Failed to start domain vm1error: 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 directoryNo accelerator found!

解决8

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

1)# modprobe kvm   #载入指定的模块

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

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



问题9: 虚拟机迁移问题一

# 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

解决9:

在URI后面加上/system,‘system’相当于root用户的访问权限



问题10: 虚拟机迁移问题二

#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

解决10: 

加上--unsafe参数



问题11: 虚拟机迁移问题三

#virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled --unsafe

error: Timed out during operation: cannot acquire state change lock

解决11: 

启动虚拟机有时也会遇此错误,需要重启libvirt进程



问题12: virsh连接问题

error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Connection refused(libvirt 进程没有启动,libvirt是一个监听客户端请求的进程)# virsh -c qemu:///system listerror: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied

error: failed to connect to the hypervisor

解决12

1)当前用户没有权限,修改/etc/libvirt/libvirtd.conf

unix_sock_rw_perms = 0777

使所有用户都有权限读写

2)最后重启libvirt

service libvirtd restart



问题13鼠标不同步问题

在安装windows 8,windows 10和windows server 2012 R2的时候发现VNC的鼠标不同步。这给我带来了巨大的麻烦。

解决13

在经过一番Google后找到了解决办法。对于已经安装好的虚拟机,可以在devices区块添加以下内容并重启虚拟机即可:

<input type='tablet' bus='usb'/>

在安装虚拟机的时候添加以下内容即可解决鼠标不同步的问题:

--input tablet,bus=usb



问题12vnc无法传输声音?

解决12

1)修改  /etc/libvirt/qemu.conf

vnc_allow_host_audio = 1

2)重启libvirt

service libvirtd restart