普通用户需加入libvirt组并重登录才能连接宿主机,否则直接拒绝访问;连接须用qemu:///system,XML模板需路径存在、网络类型匹配、磁盘格式一致;销毁VM须先destroy()再undefine();应复用连接对象并显式close()。

用 libvirt 连接宿主机并验证权限是否足够
没权限就根本连不上,不是报错而是直接拒绝访问。常见现象是调用 libvirt.open() 时抛出 libvirt.libvirtError: authentication failed 或 Connection refused。Linux 下必须确保当前用户在 libvirt 组里:sudo usermod -a -G libvirt $USER,然后重新登录或重启 libvirtd 服务。Windows 或 macOS 不支持原生 libvirt 直连 KVM,得换 vagrant 或走 HTTP API(如 oVirt)。连接字符串示例:libvirt.open('qemu:///system') ——别漏了 :///system,用 session 模式只能建临时 VM,无法持久化。
定义 XML 模板时必须显式指定存储路径和网络接口类型
XML 是创建 VM 的唯一输入,写错一个字段就会卡在 domain.createXML() 报 XML error。关键点有三个:<source file='/var/lib/libvirt/images/myvm.qcow2'/> 路径必须提前存在且可写;<interface type='network'><source network='default'/> 不能写成 bridge 类型却没配好 host bridge;磁盘格式必须和实际镜像一致,比如用了 qcow2 却在 XML 里写 raw,启动时会提示 invalid format。建议先用 virt-install --print-xml 生成一次合法模板,再改参数,比手写安全得多。
销毁 VM 前必须先 destroy() 再 undefine()
只调用 undefine() 会失败并报 operation failed: domain is still running。正确顺序是:domain.destroy()(强制关机),等待几秒,再 domain.undefine()(移除配置)。如果还想删磁盘文件,得自己用 os.remove(),libvirt 不负责清理存储。注意:destroy() 是硬关机,类似断电;若需优雅关机,得先用 domain.shutdown(),再轮询 domain.state() 等状态变成 shutoff,否则立刻 undefine() 仍会失败。
批量操作时别在循环里反复 open() 和 close()
每次 libvirt.open() 都建立新连接,开销大还容易触发宿主机连接数限制。实测 10 次连续 open/close 可能导致后续连接被拒绝。应该复用一个连接对象:conn = libvirt.open('qemu:///system') 放在循环外,所有 VM 创建/销毁都用它。另外,Python 进程退出时记得调用 conn.close(),否则连接句柄泄漏,宿主机上 libvirtd 进程可能堆积大量 idle connection。
立即学习“Python免费学习笔记(深入)”;


















