virsh list --all 查看全部已定义虚拟机(含running、shut off等所有状态),默认virsh list仅显示运行中虚拟机;--all列表中id为“-”表示未运行但定义仍存在,virsh undefine才真正删除定义。

virsh list --all 查看全部虚拟机(含运行和关闭状态)
直接执行 virsh list --all 就能列出宿主机上所有已定义的虚拟机,无论当前是 running、shut off 还是其他状态(如 paused、crashed)。这是最常用也最可靠的全量查看方式。
常见错误现象:只输 virsh list,结果发现列表为空或只显示一两个——那是因为它默认只列 running 状态的虚拟机,容易误判“没虚拟机”。
-
virsh list→ 仅运行中(running)的虚拟机 -
virsh list --all→ 所有已定义的虚拟机(推荐日常使用) -
virsh list --inactive→ 仅已关闭(shut off)的虚拟机
为什么有些虚拟机在 --all 列表里却“找不到”?
列表里出现 - 或空 ID,说明该虚拟机当前未运行,但它的 XML 定义仍存在 libvirt 中。这属于正常状态,不是丢失。真正“消失”的情况只发生在执行过 virsh undefine 后。
注意:如果某台虚拟机曾被 virsh destroy 强制关机,只要没执行 virsh undefine,它仍会出现在 --all 列表里,状态为 shut off。
容易踩的坑:
- 误把
virsh destroy当成“删除”,其实只是关机;virsh undefine才是删定义 - 用普通用户执行
virsh list --all可能看不到 root 下定义的虚拟机,权限隔离导致 —— 检查是否漏了sudo或是否在正确的 libvirt 连接上下文(如qemu:///system) - 某些精简镜像(如 Cloud-init 启动的实例)可能因未正确关机而卡在
running状态,实际已无响应;此时dominfo会显示异常 CPU/内存值,需配合virsh domstate <vm-name></vm-name>确认真实状态
想确认某台虚拟机是否真在跑,别只看 list
virsh list --all 显示状态是 libvirt 记录的“名义状态”,不等于实际进程存活。更稳妥的做法是交叉验证:
- 查进程:
ps aux | grep qemu看对应虚拟机名的qemu-system-进程是否存在 - 查状态细节:
virsh domstate <vm-name></vm-name>返回纯文本状态(如running、shut off),比list输出更可靠 - 查资源占用:
virsh dominfo <vm-name></vm-name>中的CPU 时间和使用的内存若长期为 0,可能已僵死
复杂点在于:libvirt 的状态缓存有时滞后,尤其在宿主机异常重启后。这时 virsh list --all 可能残留 “ghost domain”,需要用 virsh domstate 或手动清理 /var/run/libvirt/qemu/ 下残留 pid 文件来修正。











