KVM虚拟化用着总碰到各种坑,这些常见问题其实不难解决,聊聊经验和方法
- 问答
- 2026-01-02 15:49:18
- 4
综合了知乎专栏“Linux中国”关于KVM故障排查的讨论、个人博客“运维生存指南”的实践经验分享,以及开源社区中一些常见问题汇总)
说起KVM虚拟化,很多刚上手的朋友会觉得,这东西虽然是内核自带的,性能也好,但用起来总没有VMware Workstation那种图形化工具省心,时不时就冒出个奇怪的问题,让人头疼,其实啊,这些问题大部分都有套路可循,解决起来并不像想象中那么难,今天我就聊聊自己踩过的一些坑和解决思路,纯当经验分享。
第一个常遇到的坑:虚拟机开机特别慢,或者卡在启动界面。
这种情况太常见了,你点开机,等了半天,屏幕上要么是黑屏,要么就卡在BIOS启动画面上,进度条一动不动,这时候别急着重启宿主机。
最应该先看日志,KVM虚拟机的日志是个宝库,通过virsh命令就能看,比如你的虚拟机名字叫centos7-test,你就用virsh console centos7-test命令尝试连接一下控制台,如果连不上或者没反应,那就用virsh dumpxml centos7-test > vm.xml把虚拟机的配置文件导出来看看,但更直接的是看系统日志,在宿主机上,运行journalctl -f然后同时启动虚拟机,就能实时看到内核和libvirt服务报了什么错。
根据“运维生存指南”里提到的,最常见的原因之一是虚拟磁盘文件出了问题,比如你用的是qcow2格式的磁盘,如果之前虚拟机非正常关机,这个文件可能会有点小损伤,这时候可以用qemu-img check命令来检查和修复一下,命令是qemu-img check /path/to/your/disk.qcow2,如果提示有错误,可以尝试修复,但修复前一定先备份!另一个原因是虚拟机分配的内存过大,而宿主机当时可用的物理内存或SWAP空间不足,导致系统在拼命地调度内存,也会卡住,这时候可以尝试给虚拟机分配小一点的内存开机试试。

第二个坑:虚拟机网络不通,ping不通网关也上不了网。
网络问题是排障的重灾区,KVM默认创建的是NAT网络,虚拟机通过宿主机上网,如果网络突然不通了,第一步先要理清排查顺序。
先确定问题出在哪一层,在虚拟机内部,用ip addr看看网卡有没有拿到IP地址,如果没拿到,那问题可能出在DHCP上,这时候回到宿主机,用virsh net-info default和virsh net-dhcp-leases default看看默认的虚拟网络是不是激活状态,有没有给这台虚拟机分配IP的记录。
如果虚拟机有IP,但还是不通,很可能是防火墙搞的鬼,宿主机上的iptables或者firewalld,以及虚拟机内部的防火墙,都可能把流量拦住了,有个很实用的笨办法:先把宿主机和虚拟机双方的防火墙都暂时关闭一下,systemctl stop firewalld(针对firewalld),测试一下能不能通,如果能通了,那就说明是防火墙规则的问题,再慢慢去配规则,放行相关流量,知乎专栏“Linux中国”里就强调,很多新手都会忽略宿主机本身的防火墙对虚拟网络的影响。
还有一种情况是,你可能不小心动了虚拟网络配置,比如用virsh net-edit default修改了默认网络,配置错了网段,或者把DHCP服务给关掉了,这时候最简单的办法是销毁并重建这个虚拟网络(注意:这会清空所有DHCP租约)。

第三个坑:虚拟机性能差,尤其是磁盘I/O慢得像蜗牛。
你可能会感觉虚拟机里操作特别卡,装个软件、复制个文件都要等很久,这十有八九是磁盘I/O的瓶颈。
这里有个关键选择:虚拟磁盘的缓存模式,用virsh edit你的虚拟机,找到磁盘配置的<driver>部分,有个cache参数,默认可能是none或者writethrough,这种模式下数据写入很安全,但性能不高,对于对性能要求高、且能接受一点风险(比如宿主机突然断电可能导致少量数据丢失)的测试环境,可以尝试改成writeback或unsafe,性能提升会非常明显,最理想的是用directsync或none配合宿主机的SSD硬盘。
磁盘格式本身也有影响,qcow2格式虽然节省空间、支持快照,但性能上不如raw格式,如果追求极致性能,并且磁盘空间充足,可以考虑使用raw格式,确保虚拟机的VirtIO驱动已经安装好,这能大幅提升磁盘和网络的性能,尤其是在Windows虚拟机中,需要手动加载VirtIO驱动盘。
第四个坑:虚拟机起不来,报各种权限错误或资源不足。

有时候启动虚拟机会报错,Cannot access storage file '/path/to/disk.qcow2': Permission denied”,这明显是权限问题,你要检查那个磁盘文件所在目录以及文件本身的权限,运行libvirtd服务的用户(通常是root或者libvirt-qemu)有没有读写的权利,特别是如果你把磁盘文件放在/home目录下,权限问题很常见。
另一种报错是“internal error: Process exited prior to exec: libvirt: error : cannot execute binary /usr/libexec/qemu-kvm: No such file or directory”,这说明qemu的路径不对或者qemu组件没装全,在一些精简版的Linux系统上,可能只安装了基础包,你需要用包管理器安装完整的qemu-kvm或者qemu-system-x86之类的包。
最后聊聊心态和经验:
用KVM这类开源工具,最大的帮手就是日志,出错了千万别慌,养成看日志的习惯,不管是/var/log/libvirt/qemu/下的虚拟机专属日志,还是用journalctl查看系统日志,90%的问题都能从日志里找到线索。
修改配置前先备份,用virsh dumpxml VM-name > vm-backup.xml备份虚拟机配置,动任何关键参数前都备份一下,几分钟的事,能救急,还有,开源社区的力量很强大,遇到奇怪的错误信息,直接复制到搜索引擎里,很大概率已经有人遇到过并给出了解决方案。
KVM刚开始用会觉得有点“原生态”,但一旦熟悉了它的脾气秉性和排查问题的基本方法,就会发现它非常稳定和强大,这些坑踩过去,就成了你自己的经验了。
本文由寇乐童于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/73166.html
