virsh start需先用virsh define定义虚拟机,否则报“Domain not found”;shutdown依赖客户机acpid服务;destroy是强制断电;autostart需手动禁用防宿主机重启后自动启动。

启动虚拟机用 virsh start,但必须先确保已定义
没被 libvirt “认识”的虚拟机,virsh start 会直接报错 error: Domain not found。这通常是因为只用 qemu-kvm 命令直接启过虚拟机,没走 virsh define 或 virt-install 流程。
实操建议:
- 检查是否已定义:
virsh list --all中能看到该虚拟机名称(哪怕状态是shutoff) - 如果完全没出现,得先导入配置:
virsh define /path/to/vm.xml - 启动时加
--console可立即接入串口,适合调试启动卡住问题:virsh start vm-name --console - 启动后不会自动连控制台,要手动进需再执行
virsh console vm-name
virsh shutdown 不生效?大概率缺 acpid 或未响应 ACPI
virsh shutdown 发的是标准 ACPI 信号,不是“喊一声就关”,它依赖虚拟机内部的 acpid 服务监听并执行关机流程。CentOS/RHEL 默认装了,但 Ubuntu 22.04+、Alpine、或精简镜像常默认不带。
验证与补救:
- 登录虚拟机检查:
systemctl is-active acpid,若返回inactive,需安装并启用:sudo apt install acpid && sudo systemctl enable --now acpid(Debian/Ubuntu) - 临时测试是否通路:在客户机内运行
sudo systemctl mask sleep.target后再试virsh shutdown,可排除 systemd suspend 干扰 - 别用
shutdown -h now替代 —— 这是本地命令,virsh shutdown不会触发它
强制断电只能用 virsh destroy,virsh reboot 不是“重启”而是“重置”
virsh destroy 是唯一真正等效于拔电源的操作:立刻杀掉对应 QEMU 进程,不给客户机任何保存机会。但它不是“万能备用方案”——比如虚拟机卡死在 kernel panic、I/O hang 或 virtio 驱动异常时,destroy 也可能卡住几秒甚至失败(此时需查 ps aux | grep qemu 手动 kill -9)。
注意两个常见误解:
-
virsh reboot≠ 客户机里敲reboot;它是向 QEMU 发送 reset 信号,类似按机箱重启键,不经过客户机 OS,可能跳过 shutdown hook - 没有
virsh force-shutdown这种命令;所谓“强制关机”就是destroy,别试图组合其他参数 - 执行
destroy后,虚拟机状态变为shutoff,但配置仍保留在 libvirt 中,下次start仍可用
别忽略 autostart 和状态残留问题
很多人反复遇到“明明关机了,重启宿主机后虚拟机又自己起来了”,根源是开了 autostart 却忘了关。而 virsh shutdown 或 destroy 都不会影响 autostart 设置。
关键动作:
- 查是否启用自启:
virsh autostart --print-uri vm-name(输出yes表示已开) - 关闭自启:
virsh autostart --disable vm-name,否则每次宿主机 reboot,它都会被拉起来 -
shutoff状态不是“消失”,只是关机;误删配置要用virsh undefine vm-name,但该操作不可逆,且不删磁盘文件
最易被忽略的一点:virsh 的所有操作都基于 libvirt 的 domain 定义,而不是进程或磁盘存在与否。状态混乱、命令不响应、找不到虚拟机,八成是定义丢失或 URI 指向错误(比如用了 qemu:///session 而非默认的 qemu:///system)。

















