一、什么是 virsh?
virsh 是 libvirt 项目提供的命令行管理工具,用于管理基于 KVM/QEMU 的虚拟化环境。在 virsh 的术语体系中,虚拟机被称为 Domain(域)。
它的核心价值在于:将复杂的虚拟化操作抽象为简洁的命令行指令,使系统管理员能够通过脚本实现自动化运维,高效管理成百上千的虚拟机实例。
1.1 技术架构定位
virsh 并非直接操控硬件,而是位于整个虚拟化技术栈的用户交互层:
用户/脚本 → virsh → libvirt API → QEMU/KVM → Linux内核(/dev/kvm) → 物理硬件

- libvirt:提供统一的虚拟化管理 API,屏蔽底层 Hypervisor 差异
- QEMU:负责设备模拟与虚拟化执行
- KVM:Linux 内核模块,利用 CPU 硬件虚拟化扩展(Intel VT-x / AMD-V)加速指令执行
- virsh:作为 libvirt 的 CLI 前端,将 API 调用转化为人类可读的命令
1.2 两种工作模式
virsh 支持两种使用方式:
bash
# 1. 直接模式(推荐用于脚本)
virsh list --all
virsh start vm-name
# 2. 交互模式(适合连续操作)
virsh
virsh # list --all
virsh # start vm-name
virsh # quit
二、环境准备与安装
在使用 virsh 之前,需要确保宿主机已启用硬件虚拟化支持并安装相关组件。
2.1 检查虚拟化支持
bash
# Intel CPU
grep -E 'vmx' /proc/cpuinfo
# AMD CPU
grep -E 'svm' /proc/cpuinfo
# 检查 KVM 内核模块
lsmod | grep kvm
2.2 安装虚拟化套件
CentOS/RHEL/Rocky Linux:
bash
sudo dnf install -y qemu-kvm libvirt libvirt-daemon-kvm virt-install virt-manager
sudo systemctl enable --now libvirtd
Ubuntu/Debian:
bash
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER # 免 sudo 执行
验证安装:
bash
virsh version
virt-host-validate
三、virsh 命令分类体系
virsh 提供 100+ 个子命令 ,按功能可分为 12 大类。以下是基于 virsh help 输出的完整分类:

3.1 核心命令分类速查
| 分类 | 帮助关键字 | 典型命令 | 用途 |
|---|---|---|---|
| 域管理 | domain |
start, shutdown, destroy, suspend, resume, migrate |
虚拟机生命周期控制 |
| 域监控 | monitor |
list, dominfo, domstate, dommemstat, domblkstat |
状态与性能监控 |
| 域事件 | events |
event, await |
事件监听与等待 |
| 主机管理 | host |
nodeinfo, capabilities, hostname, version |
宿主机信息查询 |
| 网络管理 | network |
net-list, net-create, net-start, net-destroy |
虚拟网络配置 |
| 存储池 | pool |
pool-list, pool-create, pool-start, pool-delete |
存储池管理 |
| 存储卷 | volume |
vol-list, vol-create, vol-clone, vol-resize |
虚拟磁盘管理 |
| 快照 | snapshot |
snapshot-create, snapshot-revert, snapshot-delete |
快照备份恢复 |
| 备份 | backup |
backup-begin, backup-dumpxml |
在线备份 |
| 接口 | interface |
iface-list, iface-start, iface-dumpxml |
物理网络接口 |
| 节点设备 | nodedev |
nodedev-list, nodedev-detach, nodedev-reattach |
PCI/USB 设备管理 |
| 密钥 | secret |
secret-define, secret-set-value |
加密密钥管理 |
四、虚拟机生命周期管理
生命周期管理是 virsh 最频繁使用的功能。虚拟机在其生命周期中会经历多种状态:

4.1 查看虚拟机状态
bash
# 查看运行中的虚拟机
virsh list
# 查看所有虚拟机(包括已关闭的)
virsh list --all
# 查看详细信息
virsh dominfo vm-name
常见状态说明:
- running:正常运行
- shut off:完全关闭(相当于断电)
- paused:暂停(CPU 停止执行,内存保留)
- pmsuspended:电源管理挂起(S3 状态)
- crashed:虚拟机崩溃
4.2 启动与关闭
bash
# 启动虚拟机(从 shut off → running)
virsh start vm-name
# 优雅关机(发送 ACPI 信号,推荐)
virsh shutdown vm-name
# 强制断电(模拟拔电源,慎用!)
virsh destroy vm-name
# 重启
virsh reboot vm-name
# 重置(硬重启,类似按 Reset 键)
virsh reset vm-name
⚠️ 重要提示 :
destroy命令相当于直接拔掉电源,可能导致文件系统损坏或数据丢失。仅在虚拟机无响应时作为最后手段使用。为确保shutdown有效,虚拟机内必须安装并运行 acpid 服务。
4.3 暂停与恢复
bash
# 暂停虚拟机(running → paused)
virsh suspend vm-name
# 恢复虚拟机(paused → running)
virsh resume vm-name
暂停状态下,虚拟机内存数据完整保留在宿主机中,但不占用 CPU 资源,恢复操作几乎是瞬时的。
4.4 电源管理挂起
bash
# 使用电源管理功能优雅挂起(running → pmsuspended)
virsh dompmsuspend vm-name --target mem # 挂起到内存(S3)
virsh dompmsuspend vm-name --target disk # 挂起到磁盘(S4/休眠)
# 唤醒
virsh dompmwakeup vm-name
4.5 开机自启动配置
bash
# 设置随宿主机启动自动启动
virsh autostart vm-name
# 取消自启动
virsh autostart --disable vm-name
自启动配置会在 /etc/libvirt/qemu/autostart/ 目录下创建配置文件链接。
五、虚拟机配置管理
5.1 创建虚拟机
virsh 支持两种创建方式:
方式一:通过 XML 配置文件定义(持久化)
bash
# 定义虚拟机(仅注册配置,不启动)
virsh define /path/to/vm.xml
# 创建并立即启动(临时,不持久化)
virsh create /path/to/vm.xml
方式二:使用 virt-install 工具(推荐)
bash
virt-install \
--name vm-name \
--ram 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm.qcow2,size=50,format=qcow2 \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0,port=5901 \
--cdrom /path/to/iso.iso \
--os-variant centos8 \
--noautoconsole
5.2 编辑配置
bash
# 交互式编辑虚拟机 XML 配置
virsh edit vm-name
# 导出配置到文件(备份)
virsh dumpxml vm-name > vm-backup.xml
# 从备份文件恢复定义
virsh define vm-backup.xml
修改 CPU、内存等关键参数后,需要重启虚拟机才能生效。
5.3 动态资源调整
bash
# 调整内存(需虚拟机支持内存热插拔)
virsh setmem vm-name 4G --config # 持久化配置
virsh setmem vm-name 4G --live # 立即生效(不持久化)
# 调整最大内存
virsh setmaxmem vm-name 8G --config
# 调整 CPU 数量
virsh setvcpus vm-name 4 --config
virsh setvcpus vm-name 4 --live # 热添加 vCPU
# CPU 亲和性绑定
virsh vcpupin vm-name 0 0 # 将 vCPU 0 绑定到物理 CPU 0
5.4 设备管理
bash
# 附加磁盘
virsh attach-disk vm-name /path/to/disk.img vdb --persistent
# 分离磁盘
virsh detach-disk vm-name vdb --persistent
# 附加网络接口
virsh attach-interface vm-name bridge br0 --model virtio --persistent
# 分离网络接口
virsh detach-interface vm-name bridge --mac 52:54:00:xx:xx:xx
# 更换光驱介质
virsh change-media vm-name sda /path/to/new.iso
六、存储管理
6.1 存储池管理
存储池(Storage Pool)是存放虚拟磁盘卷的容器。
bash
# 列出存储池
virsh pool-list --all
# 查看存储池信息
virsh pool-info pool-name
# 创建目录型存储池
virsh pool-define-as pool-name dir --target /var/lib/libvirt/images/my-pool
virsh pool-build pool-name
virsh pool-start pool-name
virsh pool-autostart pool-name
# 删除存储池(仅删除配置,不删数据)
virsh pool-destroy pool-name # 停止
virsh pool-delete pool-name # 删除目录(谨慎!)
virsh pool-undefine pool-name # 取消定义
6.2 存储卷管理
bash
# 列出卷
virsh vol-list pool-name
# 创建卷
virsh vol-create-as pool-name vm-disk.qcow2 100G --format qcow2
# 查看卷信息
virsh vol-info vm-disk.qcow2 --pool pool-name
# 克隆卷
virsh vol-clone --pool pool-name original.qcow2 clone.qcow2
# 调整卷大小
virsh vol-resize vm-disk.qcow2 200G --pool pool-name
# 删除卷
virsh vol-delete vm-disk.qcow2 --pool pool-name
6.3 磁盘格式对比
| 特性 | QCOW2 | RAW |
|---|---|---|
| 空间分配 | 动态扩展(稀疏文件) | 固定大小 |
| 性能 | 略低于 RAW | 最高性能 |
| 快照支持 | ✅ 原生支持 | ❌ 不支持 |
| 压缩/加密 | ✅ 支持 | ❌ 不支持 |
| 适用场景 | 开发测试、需要快照 | 生产环境高性能需求 |
七、网络管理
7.1 虚拟网络管理
bash
# 列出虚拟网络
virsh net-list --all
# 查看网络详情
virsh net-info network-name
virsh net-dumpxml network-name
# 启动/停止网络
virsh net-start network-name
virsh net-destroy network-name
# 设置开机自启动
virsh net-autostart network-name
# 创建网络(从 XML)
virsh net-define /path/to/network.xml
virsh net-start network-name
7.2 查看虚拟机网络接口
bash
# 列出虚拟机网卡
virsh domiflist vm-name
# 获取虚拟机 IP 地址(需 QEMU Guest Agent)
virsh domifaddr vm-name
# 查看网卡统计
virsh domifstat vm-name vnet0
7.3 桥接网络配置示例
生产环境推荐使用桥接网络,让虚拟机获得与宿主机同网段的 IP:
xml
<!-- /etc/libvirt/qemu/networks/br0.xml -->
<<network>
<name>br0</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
八、快照与备份
8.1 快照管理
快照是虚拟机某一时刻状态的完整记录,包括磁盘状态、内存状态和设备配置。
bash
# 创建快照
virsh snapshot-create-as vm-name snap1 --description "Before upgrade"
# 创建内存快照(包含运行状态)
virsh snapshot-create-as vm-name snap2 --description "Running state" --disk-only
# 列出快照
virsh snapshot-list vm-name
# 查看快照详情
virsh snapshot-info vm-name snap1
virsh snapshot-dumpxml vm-name snap1
# 恢复快照
virsh snapshot-revert vm-name snap1
# 删除快照
virsh snapshot-delete vm-name snap1
# 查看快照树(父子关系)
virsh snapshot-parent vm-name snap2
⚠️ 快照注意事项:
- 快照依赖 QCOW2 格式,RAW 磁盘不支持
- 快照链过长会严重影响 I/O 性能,建议定期合并
- 生产环境关键业务应使用专门的备份方案,而非依赖快照
8.2 虚拟机备份策略
bash
# 方式一:保存运行状态(内存转储)
virsh save vm-name /backup/vm-save.state
virsh restore /backup/vm-save.state
# 方式二:导出 XML 配置 + 复制磁盘文件
virsh dumpxml vm-name > /backup/vm-name.xml
cp /var/lib/libvirt/images/vm-name.qcow2 /backup/
# 方式三:使用备份 API(增量备份)
virsh backup-begin vm-name --backupxml /path/to/backup.xml
九、高级功能
9.1 虚拟机迁移
bash
# 热迁移(Live Migration)- 不中断业务
virsh migrate --live vm-name qemu+ssh://dest-host/system
# 设置迁移带宽限制
virsh migrate-setspeed vm-name 1000 # 1000 MiB/s
# 设置最大允许停机时间
virsh migrate-setmaxdowntime vm-name 300 # 300ms
# 后拷贝迁移(Post-copy)
virsh migrate-postcopy vm-name
9.2 控制台与 VNC
bash
# 连接到虚拟机串口控制台
virsh console vm-name
# 查看 VNC 端口
virsh vncdisplay vm-name
# 查看图形显示 URI
virsh domdisplay vm-name
# 截图
virsh screenshot vm-name /path/to/screenshot.ppm
9.3 QEMU Guest Agent 交互
QEMU Guest Agent 是运行在虚拟机内部的守护进程,允许宿主机执行高级操作:
bash
# 执行 Guest Agent 命令
virsh qemu-agent-command vm-name '{"execute":"guest-info"}'
# 冻结/解冻文件系统(用于一致性快照)
virsh domfsfreeze vm-name
virsh domfsthaw vm-name
# 获取虚拟机信息
virsh guestinfo vm-name
# 设置用户密码
virsh set-user-password vm-name username --password newpass
# 注入 NMI(非屏蔽中断,用于调试内核 panic)
virsh inject-nmi vm-name
9.4 NUMA 与 CPU 调优
bash
# 查看 NUMA 拓扑
virsh numatune vm-name
# 设置 NUMA 内存策略
virsh numatune vm-name --nodeset 0,1 --mode preferred
# 查看 IOThread 信息
virsh iothreadinfo vm-name
# 设置 IOThread CPU 亲和性
virsh iothreadpin vm-name iothread1 0-3
十、实用运维技巧
10.1 批量管理脚本示例
bash
#!/bin/bash
# 批量启动所有标记为 autostart 的虚拟机
for vm in $(virsh list --all --name); do
if virsh dominfo "$vm" | grep -q "Autostart:.*enable"; then
echo "Starting $vm..."
virsh start "$vm"
fi
done
10.2 监控脚本
bash
#!/bin/bash
# 输出所有运行中虚拟机的资源使用
echo "VM_NAME | CPU_TIME | MEMORY(KiB) | VCPUS"
echo "--------|----------|---------------|-------"
for vm in $(virsh list --name); do
info=$(virsh dominfo "$vm")
cpu=$(echo "$info" | grep "CPU time" | awk '{print $3}')
mem=$(echo "$info" | grep "Used memory" | awk '{print $3}')
vcpu=$(echo "$info" | grep "CPU(s)" | awk '{print $2}')
printf "%-8s| %-9s| %-14s| %s\n" "$vm" "$cpu" "$mem" "$vcpu"
done
10.3 故障排查
bash
# 查看虚拟机日志
cat /var/log/libvirt/qemu/vm-name.log
# 检查磁盘镜像完整性
qemu-img check /path/to/disk.qcow2
# 查看 libvirt 服务状态
systemctl status libvirtd
# 验证宿主机虚拟化环境
virt-host-validate
十一、总结
virsh 是 KVM 虚拟化生态中不可或缺的命令行工具。它通过 libvirt API 提供了对虚拟机的全生命周期管理能力,从创建、配置、监控到备份迁移,覆盖了运维工作的方方面面。
核心优势:
- 脚本化:所有操作均可写入脚本,实现自动化运维
- 远程管理:通过 URI 连接远程 libvirt 守护进程
- 功能完整:100+ 子命令覆盖虚拟化管理的每个细节
- 生态兼容:不仅支持 KVM,还可管理 Xen、LXC、VirtualBox 等
对于生产环境运维人员而言,熟练掌握 virsh 是管理大规模虚拟化基础设施的必备技能。