玩转KVM:怎么追查KVM故障
我们这次聊聊怎么追查KVM故障,以及KVM的故障应该怎么处理。
在运行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
在使用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 <stefan.bader@canonical.com> 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
问题12:vnc无法传输声音?
解决12:
1)修改 /etc/libvirt/qemu.conf
vnc_allow_host_audio = 1
2)重启libvirt
service libvirtd restart
睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032