KVM 故障排查与最佳实践
本章节涵盖 KVM 常见故障排查、日志分析、性能瓶颈定位,以及生产环境配置规范、安全加固和备份策略。
故障排查
常见问题汇总
虚拟机无法启动
症状:执行 virsh start 失败,提示错误。
排查步骤:
bash
# 1. 查看详细错误信息
virsh start vm01 --debug
# 2. 检查虚拟机配置
virsh dumpxml vm01
# 3. 检查磁盘文件是否存在
ls -l /var/lib/libvirt/images/vm01.qcow2
# 4. 检查磁盘镜像是否损坏
qemu-img check /var/lib/libvirt/images/vm01.qcow2
# 5. 检查 KVM 模块是否正常加载
lsmod | grep kvm
# 6. 检查 /dev/kvm 权限
ls -l /dev/kvm常见原因:
- 磁盘镜像文件不存在或损坏
- 内存不足
- CPU 资源不足
- XML 配置错误
虚拟机运行缓慢
症状:虚拟机响应慢,性能明显下降。
排查步骤:
bash
# 1. 检查宿主机资源使用
top
htop
free -h
df -h
# 2. 检查虚拟机资源分配
virsh dominfo vm01
virsh vcpuinfo vm01
# 3. 检查 I/O 瓶颈
iostat -x 1 5
# 4. 检查网络延迟
virsh domifstat vm01
# 5. 检查 KVM 统计信息
cat /proc/interrupts解决方法:
- 增加虚拟机内存
- 增加 vCPU 数量
- 使用 VirtIO 驱动
- 使用 QCOW2 格式的镜像
- 配置 CPU Pinning
虚拟机网络不通
症状:虚拟机无法连接网络或无法被外部访问。
排查步骤:
bash
# 1. 检查虚拟机内部网络配置
virsh console vm01
# 登录后执行:ip addr, ping 8.8.8.8
# 2. 检查宿主机网桥
brctl show
ip addr show br0
# 3. 检查 NAT/DHCP 服务
ps aux | grep dnsmasq
virsh net-list
# 4. 检查防火墙规则
iptables -L -n
firewall-cmd --list-all
# 5. 检查虚拟机网卡配置
virsh dumpxml vm01 | grep -A 5 interface日志分析
系统日志
bash
# 查看 libvirtd 日志
journalctl -u libvirtd -n 100
# 查看 KVM 相关系统日志
dmesg | grep -i kvm
dmesg | grep -i qemu
# 查看系统日志
tail -f /var/log/messages虚拟机日志
bash
# 查看虚拟机日志
virsh console vm01
# 查看 qemu 日志
ls -l /var/log/libvirt/qemu/
# 查看虚拟机 XML 中的日志配置
virsh dumpxml vm01 | grep -i log启用详细日志
bash
# 在 /etc/libvirt/qemu.conf 中启用调试
log_level = 1
# 在虚拟机 XML 中启用调试
virsh edit vm01
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/internal/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-d'/>
<qemu:arg value='guest_errors'/>
</qemu:commandline>
</domain>性能瓶颈定位
CPU 瓶颈
bash
# 检查 CPU 使用率
mpstat 1 5
# 检查每个 CPU 核心使用情况
sar -P ALL 1 5
# 检查虚拟机 CPU 使用
virsh cpu-stats vm01内存瓶颈
bash
# 检查内存使用
free -m
vmstat 1 5
# 检查内存交换
sar -B 1 5
# 检查大页内存
cat /proc/meminfo | grep HugeI/O 瓶颈
bash
# 检查 I/O 等待
iostat -x 1 5
# 检查磁盘队列
iostat -x 1 | grep avgqu-sz
# 检查虚拟机磁盘 I/O
virsh blkiotune vm01网络瓶颈
bash
# 检查网络流量
sar -n DEV 1 5
# 检查网络错误
netstat -s
# 检查虚拟机网络统计
virsh domifstat vm01生产环境最佳实践
配置规范
资源分配建议
| 虚拟机类型 | CPU | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| 小型应用 | 1-2 核 | 1-2 GB | 20-40 GB | VirtIO |
| 中型应用 | 2-4 核 | 4-8 GB | 40-100 GB | VirtIO |
| 大型应用 | 4-8 核 | 8-16 GB | 100-500 GB | VirtIO/桥接 |
| 数据库 | 4-16 核 | 16-64 GB | 100-1000 GB | SR-IOV |
存储配置规范
bash
# 1. 使用独立的存储池
virsh pool-create-as images dir --target /var/lib/libvirt/images
# 2. 使用 QCOW2 格式(支持快照)
qemu-img create -f qcow2 /var/lib/libvirt/images/vm01.qcow2 50G
# 3. 预留足够的存储空间(建议 20% 空闲)
df -h /var/lib/libvirt/images
# 4. 定期检查磁盘镜像
qemu-img check /var/lib/libvirt/images/vm01.qcow2网络配置规范
bash
# 1. 使用 VirtIO 网络驱动
# 在 XML 中配置:
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
# 2. 为生产虚拟机使用桥接网络
# 配置独立的网桥用于生产流量
# 3. 配置 VLAN 隔离
# 在网桥上配置 VLAN安全加固
访问控制
bash
# 1. 限制 libvirtd 监听地址
vim /etc/libvirt/libvirtd.conf
listen_addr = "127.0.0.1"
# 2. 启用 SASL 认证
vim /etc/libvirt/libvirtd.conf
auth_tcp = "sasl"
# 配置 SASL 用户
saslpasswd2 -a libvirt admin
# 3. 禁用不必要的协议
vim /etc/libvirt/libvirtd.conf
listen_tls = 1
listen_tcp = 0虚拟机安全
bash
# 1. 启用 SELinux
getenforce
# 应该显示:Enforcing
# 2. 配置 AppArmor(Ubuntu)
aa-status
# 3. 禁用不必要的设备
virsh edit vm01
# 移除:
# <graphics type='vnc'...> # 生产环境禁用 VNC
# <video>...</video> # 如不需要显示
# <channel type='spice'...> # 生产环境禁用 SPICE加密存储
bash
# 1. 使用 LUKS 加密磁盘
cryptsetup luksFormat /dev/sdb1
# 2. 使用 QCOW2 加密
qemu-img create -f qcow2 -o encryption=on /path/to/encrypted.qcow2 20G
# 3. 配置 TLS 加密迁移
virsh migrate --live --tls vm01 qemu+tls://target-host/system备份策略
虚拟机备份
bash
# 1. 完整备份(导出 XML + 磁盘镜像)
# 导出配置
virsh dumpxml vm01 > /backup/vm01.xml
# 复制磁盘
cp /var/lib/libvirt/images/vm01.qcow2 /backup/vm01.qcow2
# 2. 使用快照备份
virsh snapshot-create-as vm01 --name "backup-$(date +%Y%m%d)"
virsh snapshot-list vm01
# 3. 增量备份(使用 QCOW2 backing file)
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 backup.qcow2自动备份脚本
bash
#!/bin/bash
# backup-vms.sh
BACKUP_DIR="/backup/vms"
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 备份所有运行中的虚拟机
for vm in $(virsh list --name --running); do
echo "Backing up $vm..."
virsh dumpxml $vm > $BACKUP_DIR/$DATE/${vm}.xml
qemu-img convert -O qcow2 \
/var/lib/libvirt/images/${vm}.qcow2 \
$BACKUP_DIR/$DATE/${vm}.qcow2
done
# 清理 7 天前的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;恢复流程
bash
# 1. 恢复配置
virsh define /backup/vm01.xml
# 2. 恢复磁盘
cp /backup/vm01.qcow2 /var/lib/libvirt/images/vm01.qcow2
# 3. 启动虚拟机
virsh start vm01
# 4. 从快照恢复
virsh snapshot-revert vm01 --snapshotname backup-20240101监控与告警
资源监控
bash
# 1. 使用 virsh 监控
virsh dominfo vm01
virsh domstats vm01
# 2. 使用脚本收集指标
#!/bin/bash
for vm in $(virsh list --name); do
echo "$vm: $(virsh dominfo $vm | grep 'CPU time')"
done
# 3. 集成 Prometheus + node_exporter
# 部署 libvirt_exporter 收集 KVM 指标告警阈值建议
| 指标 | 警告阈值 | 严重阈值 |
|---|---|---|
| CPU 使用率 | 80% | 95% |
| 内存使用率 | 85% | 95% |
| 磁盘使用率 | 80% | 90% |
| 磁盘 I/O 延迟 | 50ms | 100ms |
| 网络延迟 | 50ms | 100ms |
常见问题
Q: 虚拟机突然停止工作
原因:可能是宿主机资源耗尽或 KVM 模块异常。
解决方法:
bash
# 检查宿主机资源
df -h
free -h
top
# 检查 KVM 模块
lsmod | grep kvm
# 检查 libvirtd 状态
systemctl status libvirtd
# 重启服务
systemctl restart libvirtdQ: 迁移后虚拟机无法启动
原因:目标主机缺少必要的配置或资源。
解决方法:
bash
# 检查目标主机配置
virsh nodeinfo
# 检查网络配置
virsh net-list
# 检查存储池
virsh pool-list
# 重新迁移或回滚
virsh migrate --live --reverse vm01 qemu+ssh://source-host/systemQ: 磁盘空间不足导致虚拟机无法运行
原因:存储池空间耗尽。
解决方法:
bash
# 查看存储使用
virsh pool-info default
# 清理不需要的文件
rm -rf /var/lib/libvirt/images/old-vm/*
# 扩展存储池
# 如果使用 LVM:
lvextend -L +100G /dev/vg_kvm/lv_libvirt
# 如果使用 NFS:
# 在 NFS 服务器上扩展导出目录Q: 如何监控 KVM 虚拟化性能
建议方案:
- 使用 Prometheus + Grafana 搭建监控平台
- 部署 libvirt_exporter 收集指标
- 配置告警规则
- 定期分析性能趋势
总结
KVM 虚拟化是企业级应用的重要基础设施。通过本章节的学习,您应该能够:
- 熟练进行故障排查和日志分析
- 识别和解决性能瓶颈
- 遵循生产环境配置规范
- 实施安全加固措施
- 建立有效的备份策略
持续监控和定期维护是确保 KVM 环境稳定运行的关键。
