virsh list 看不到虚拟机是因为默认只显示运行中的域;应使用 virsh list --all 查看所有定义过的虚拟机,并确认连接 URI、libvirtd 状态、用户权限及虚拟机是否已被 libvirt 正确定义。

virsh list 看不到虚拟机?检查连接 URI 和状态范围
默认 virsh list 只显示运行中的域(running domains),关机或暂停的虚拟机不会出现——这是最常被当成“丢失虚拟机”的原因。实际它们还在,只是没被列出来。
- 查所有定义过的虚拟机(含关机、暂停、未启动):
virsh list --all - 确认你连的是系统级 libvirtd 实例:
virsh -c qemu:///system list --all;如果误用了 session 模式(qemu:///session),就看不到 root 下创建的虚拟机 - 检查 libvirtd 是否真在运行:
systemctl status libvirtd,常见坑是安装后忘了systemctl start libvirtd或没设开机自启 - 权限问题:普通用户需加入
kvm和libvirt组才能操作系统级实例,否则会报错Failed to connect to the hypervisor
virsh start 启动失败?先看 define 和 create 的区别
virsh start 只能启动已“定义”(defined)但未运行的虚拟机;如果你用 virt-install 或 qemu-system-x86_64 手动跑起来的进程,它根本不在 libvirt 管理范围内,virsh 就找不到它。
- 定义一个虚拟机(不启动):
virsh define /etc/libvirt/qemu/centos7.xml - 立即定义并启动:
virsh create /path/to/xml(注意:这种启动是一次性的,关机后配置就丢了) - 真正持久化管理,必须先
define再start;否则virsh shutdown或virsh destroy都会提示 “domain not found” - XML 文件路径不是随便放的:libvirt 默认只认
/etc/libvirt/qemu/下的定义,改路径要用virsh define --file显式指定
磁盘挂载不上?attach-disk 不能直接用裸镜像路径
virsh attach-disk 是热添加磁盘的常用命令,但它要求目标磁盘设备必须是 libvirt 能识别的存储卷(storage volume),不是随便一个 /var/lib/libvirt/images/disk.qcow2 文件就能直接挂。
- 先确认存储池是否激活:
virsh pool-list --all,常见坑是建了池但没virsh pool-start default - 把镜像导入为 volume:
virsh vol-create-as default newdisk.qcow2 10G --format qcow2,再用virsh attach-disk vmname /var/lib/libvirt/images/newdisk.qcow2 vdb --driver qemu --subdriver qcow2 - 如果跳过 volume 直接挂文件路径,多数情况会报错
internal error: unable to execute QEMU command 'device_add': Device 'drive-vdb' could not be initialized - 热添加后,Guest 内要手动
echo 1 > /sys/bus/scsi/devices/.../rescan或重启 udev 才能识别新盘
virsh console 连不上?串口和终端设置缺一不可
virsh console 不是万能终端,它依赖 Guest 内核启动参数 + systemd/getty 配置双生效,否则连上也是黑屏或卡住。
- Host 侧确保 XML 中有串口定义:
<serial type='pty'><target port='0'/></serial>和<console type='pty'><target type='serial' port='0'/></console> - Guest 启动参数必须加
console=ttyS0,115200n8(CentOS/RHEL)或console=tty1(部分 Ubuntu 镜像需额外配getty@ttyS0.service) - 连之前先
virsh start vmname,再virsh console vmname,连上后按回车——如果没反应,大概率是 Guest 没输出到 ttyS0 - 别指望
virsh console支持图形界面或鼠标,它就是纯串口终端;图形需求请用virt-viewer或 VNC
virsh 看似简单,但每个子命令背后都绑着 libvirt 的对象生命周期、存储抽象层和 Guest 协议协商。最容易忽略的是:它不管理“进程”,只管理“定义”;不处理“文件路径”,只处理“volume 抽象”。跨这道坎,靠的不是记命令,而是理解它在哪一层说话。

















