virsh 使用指南:KVM 虚拟化管理的命令行艺术

一、什么是 virsh?

virshlibvirt 项目提供的命令行管理工具,用于管理基于 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 是管理大规模虚拟化基础设施的必备技能。

相关推荐
行走的大喇叭2 小时前
Linux kernel目录、配置文件介绍
linux·单片机·嵌入式硬件
STDD2 小时前
OpenRA 服务器搭建:开源重制经典红色警戒和命令与征服
运维·服务器·开源
AIDF20262 小时前
动态大模型 Prompt 生成技术解析
服务器·llm·prompt·agent
学困昇2 小时前
Linux 动静态库制作与原理:从 .a、.so 到 ELF 加载一次讲透
linux·运维·服务器·c语言·开发语言·c++·人工智能
ALINX技术博客2 小时前
【黑金云课堂】FPGA技术教程Linux开发:电压温度检测/USB/eMMC
linux·fpga开发
wxmtwfx2 小时前
Googletest Mock示例
linux·mock·googletest
历程里程碑2 小时前
56 . 高效ET非阻塞IO服务器设计指南
java·运维·服务器·开发语言·数据结构·c++·排序算法
翼龙云_cloud3 小时前
云代理商:Hermes Agent在量化交易中的实战应用
运维·服务器·人工智能·ai智能体·hermes agent
七夜zippoe3 小时前
DolphinDB时间序列引擎:实时聚合计算
服务器·前端·时间序列·dolphindb·实时聚合