Skip to content

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 Huge

I/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 GB20-40 GBVirtIO
中型应用2-4 核4-8 GB40-100 GBVirtIO
大型应用4-8 核8-16 GB100-500 GBVirtIO/桥接
数据库4-16 核16-64 GB100-1000 GBSR-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 延迟50ms100ms
网络延迟50ms100ms

常见问题

Q: 虚拟机突然停止工作

原因:可能是宿主机资源耗尽或 KVM 模块异常。

解决方法

bash
# 检查宿主机资源
df -h
free -h
top

# 检查 KVM 模块
lsmod | grep kvm

# 检查 libvirtd 状态
systemctl status libvirtd

# 重启服务
systemctl restart libvirtd

Q: 迁移后虚拟机无法启动

原因:目标主机缺少必要的配置或资源。

解决方法

bash
# 检查目标主机配置
virsh nodeinfo

# 检查网络配置
virsh net-list

# 检查存储池
virsh pool-list

# 重新迁移或回滚
virsh migrate --live --reverse vm01 qemu+ssh://source-host/system

Q: 磁盘空间不足导致虚拟机无法运行

原因:存储池空间耗尽。

解决方法

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 虚拟化性能

建议方案

  1. 使用 Prometheus + Grafana 搭建监控平台
  2. 部署 libvirt_exporter 收集指标
  3. 配置告警规则
  4. 定期分析性能趋势

总结

KVM 虚拟化是企业级应用的重要基础设施。通过本章节的学习,您应该能够:

  • 熟练进行故障排查和日志分析
  • 识别和解决性能瓶颈
  • 遵循生产环境配置规范
  • 实施安全加固措施
  • 建立有效的备份策略

持续监控和定期维护是确保 KVM 环境稳定运行的关键。