日志分几层
虚机启动失败时,libvirt 与 QEMU 分两层记录日志:域级日志 /var/log/libvirt/qemu/<域名>.log 记录设备创建、磁盘与网络后端、权限等具体报错;守护进程日志(journalctl -u libvirtd,模块化部署下可能是 virtqemud 等)记录连接、配置校验与调度过程。排错顺序一般是先看域日志定位设备问题,再看守护日志判断是配置错误还是运行环境不满足。需要更多细节时用 LIBVIRT_DEBUG=1 提升 virsh 命令自身的日志级别。
基本信息
| 域日志 | /var/log/libvirt/qemu/<域名>.log |
|---|---|
| 守护日志 | journalctl -u libvirtd(或 virtqemud) |
| 调试输出 | LIBVIRT_DEBUG=1 提升 virsh 命令日志级别 |
| 常见线索 | Permission denied、No space、Failed to load、Cannot access storage file |
| 日志滚动 | 域日志按大小与次数滚动,旧日志带序号后缀 |
典型使用场景
- 虚机启动直接报错,需要定位到底哪个设备创建失败
- 热插拔磁盘或网卡失败,确认是设备名冲突还是权限问题
- 迁移失败后查源端与目标端的报错原文
- 虚机网络不通,确认 tap 设备与网桥绑定是否成功
- 镜像或磁盘路径错误导致启动失败,需要拿到原始报错
排查组合
排查组合
tail -n 100 /var/log/libvirt/qemu/vm1.log # 域日志:设备级报错在这里
journalctl -u libvirtd --since '10 min ago' # 守护进程侧:配置与连接问题
LIBVIRT_DEBUG=1 virsh start vm1 # 提升命令侧日志级别再复现
grep -iE 'permission denied|no space|failed to' /var/log/libvirt/qemu/*.log
dmesg | grep -i denied # 确认是否被 SELinux/AppArmor 拒绝高频报错对照
| 线索 | 含义 | 处置方向 |
|---|---|---|
| Permission denied | SELinux/AppArmor 或文件属主限制,QEMU 进程读不到磁盘 | 检查标签、安全策略与文件权限 |
| No space left on device | 所在文件系统或存储空间不足 | 清理空间或迁移磁盘到其他存储 |
| Cannot access storage file | 磁盘路径不存在或外置存储未挂载 | 确认存储挂载与路径拼写 |
| Failed to load / 无法打开镜像 | 格式与驱动配置不一致,或镜像损坏 | 核对 subdriver 与 qemu-img info 结果 |
| 设备名冲突 | 目标设备名已被占用 | 用 domblklist/domiflist 核对空闲名 |
| 地址或端口占用 | VNC/SPICE 等监听端口冲突 | 更换端口或排查残留进程 |
生产环境避免长期开高日志级别:磁盘与性能开销明显,只应在复现问题时临时开启,定位完立即关闭。
权限类问题优先怀疑安全模块:RHEL 系用 ausearch -m avc -ts recent 查审计记录,Debian 系看 dmesg 中的 AppArmor 拒绝信息,确认后再调整策略而不是直接关闭模块。