virsh 可完整管理 KVM 虚拟机全生命周期,需准确理解状态语义:running(QEMU 进程运行)、shutoff(干净关机)、crashed(异常退出)、paused(内存驻留暂停)、undefined(未定义);virsh list --all 是所有操作前提,状态字段反映 domain 阶段而非 OS 可用性。

virsh 能完整管理 KVM 虚拟机从定义、启动、运行中维护到销毁的全过程,但必须理解每个命令对应的真实语义和依赖条件——比如 virsh shutdown 不是“关机按钮”,而是发 ACPI 信号;virsh destroy 也不是普通关机,而是直接 kill QEMU 进程。
如何准确识别虚拟机当前状态
所有操作的前提是看懂 virsh list --all 的输出。状态字段(第三列)不是描述“是否开机”,而是 libvirt 记录的 domain 生命周期阶段:
-
running:QEMU 进程正在运行,客户机 OS 可能卡死或无响应,不等于“系统可用” -
shutoff:虚拟机已干净关机(virsh shutdown成功后进入),配置仍存在,磁盘文件未删 -
crashed:QEMU 异常退出(如内核 panic、内存越界),需检查/var/log/libvirt/qemu/*.log -
paused:CPU 暂停,内存仍驻留宿主机 RAM,virsh resume可毫秒级恢复 -
undefined:该名称未被 libvirt 定义过,virsh start会报错 “domain not found”
注意:virsh list 默认只显示 running 状态,漏掉 shutoff 或 crashed 虚拟机会导致误判“机器全停了”。
启动与关机:别把 shutdown 当 destroy 用
virsh shutdown 和 virsh destroy 表面都是“关机”,但行为和适用场景完全不同:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
virsh shutdown vm-name向客户机发送 ACPI power button 事件,依赖虚拟机内运行acpid服务(CentOS/RHEL 默认启用,Ubuntu 需手动安装);若客户机没响应,命令会卡住 30 秒后超时返回失败 -
virsh destroy vm-name直接向 QEMU 进程发SIGKILL,等效于拔电源,可能损坏 ext4/xfs 文件系统、丢失未刷盘数据 - 生产环境应优先尝试
shutdown;仅当shutdown返回失败或客户机完全无响应时,才用destroy - 启动时加
--console(如virsh start vm-name --console)可串口直连,排查启动卡在 GRUB 或内核参数阶段的问题
批量操作必须绕过 virsh 原生限制
virsh 命令本身不支持 -f *.xml 或 --all 这类批量参数,硬写 virsh shutdown $(virsh list --all | awk '{print $2}') 会把表头(ID 名称 状态)也当虚拟机名执行,导致报错。
- 安全筛选运行中虚拟机:
virsh list | awk 'NR>2 {print $2}' | xargs -r -I{} virsh shutdown {}(NR>2跳过前两行标题) - 按命名规则处理:
for vm in $(virsh list --all | awk '$2 ~ /^web-[0-9]+$/ {print $2}'); do virsh start "$vm"; done(正则过滤比grep web-更准,避免匹配到web-db-backup) - 批量清理关机虚拟机并删磁盘:
virsh list --all | awk '$3=="shutoff" && $2 !~ /^template-/ {print $2}' | xargs -r -I{} sh -c 'virsh undefine {} --remove-all-storage'(--remove-all-storage不可逆,务必加$2 !~ /^template-/排除模板机)
定义、自启与配置持久化容易被忽略的细节
用 virsh define 注册 XML 后,配置就固化在 /etc/libvirt/qemu/ 下,但以下三点常被跳过:
-
virsh create /path/to/vm.xml是临时启动,宿主机重启后配置丢失;必须用virsh define才算“正式建档” -
virsh autostart vm-name设置的是 libvirtd 服务启动时自动拉起,不是宿主机开机就运行——若libvirtd未设为systemctl enable,自启无效 - 修改 XML 后(如调内存、加网卡),必须先
virsh undefine再virsh define,直接virsh edit保存后需virsh destroy && virsh start才生效,热修改部分参数(如 vCPU 数量)需virsh setvcpus --live
最易出问题的是磁盘路径权限:若 XML 中磁盘路径为 /data/vms/web01.qcow2,但 libvirt-qemu 用户对该路径无读写权,virsh start 会静默失败并记录 “cannot open disk image” 到 /var/log/libvirt/qemu/web01.log。

















