Skip to content

KVM 命令行参考

KVM(Kernel-based Virtual Machine)通过 virshvirt-installqemu-img 等命令行工具提供完整的虚拟化管理能力。本章节详细介绍这些命令的语法格式、参数选项和经典案例。

virsh list - 列出虚拟机

virsh list 命令用于列出宿主机上的虚拟机及管理程序的节点信息。

语法格式

bash
virsh list [选项]
virsh dominfo <虚拟机名>
virsh vcpuinfo <虚拟机名>
virsh dommemstat <虚拟机名>
virsh domblklist <虚拟机名>
virsh domiflist <虚拟机名>
virsh domstate <虚拟机名>
virsh domstats [选项] <虚拟机名称>

选项

参数说明示例
--inactive列出所有非活跃的虚拟机virsh list --inactive
--all列出所有虚拟机(包括非活跃)virsh list --all
--name仅输出虚拟机名称virsh list --name
--uuid仅输出虚拟机 UUIDvirsh list --uuid
--state-running仅显示运行中的虚拟机
--state-shutoff仅显示已关闭的虚拟机
--state-paused仅显示已暂停的虚拟机
--managed-save列出有托管保存状态的虚拟机
--transient列出临时虚拟机
--persistent列出持久化虚拟机
--table以表格形式输出(默认)
--stats显示额外的统计信息
-c / --connect URI连接到指定的 hypervisorvirsh -c qemu+ssh://host/system list

经典案例

bash
# 列出所有正在运行的虚拟机
virsh list

# 列出所有虚拟机(包括已关闭的)
virsh list --all

# 仅输出虚拟机名称(用于脚本处理)
virsh list --name --all

# 查看虚拟机详细信息
virsh dominfo vm01

# 查看虚拟机 vCPU 信息
virsh vcpuinfo vm01

# 查看虚拟机内存统计
virsh dommemstat vm01

# 查看虚拟机的磁盘列表
virsh domblklist vm01

# 查看虚拟机的网卡列表
virsh domiflist vm01

# 查看虚拟机状态
virsh domstate vm01

# 查看虚拟机详细统计数据
virsh domstats vm01 --state

# 连接到远程宿主机查看虚拟机列表
virsh -c qemu+ssh://root@192.168.1.100/system list --all

virsh create / define / undefine - 虚拟机定义管理

通过 XML 配置来创建、定义和删除虚拟机定义。

语法格式

bash
virsh create <XML文> [选项]
virsh define <XML文>
virsh undefine <虚拟机名> [选项]

选项

参数说明
create
--console创建后自动连接控制台
--paused创建后虚拟机处于暂停状态
--autodestroy当 virsh 退出时自动销毁虚拟机
----
undefine
--nvram同时删除 NVRAM 文件(UEFI 引导用)
--managed-save删除托管保存状态
--snapshots-metadata删除所有快照元数据
--remove-all-storage删除所有关联的存储卷
--storage <卷>删除指定的存储卷

经典案例

bash
# 从 XML 文件创建并启动虚拟机
virsh create vm01.xml

# 从 XML 定义虚拟机(不启动)
virsh define vm01.xml

# 查看当前定义的 XML 配置
virsh dumpxml vm01 > vm01-backup.xml

# 编辑虚拟机 XML 配置(自动语法校验)
virsh edit vm01

# 取消定义虚拟机(保留磁盘文件)
virsh undefine vm01

# 取消定义并删除 NVRAM(UEFI 引导虚拟机)
virsh undefine --nvram vm01

# 取消定义并删除所有关联存储
virsh undefine --remove-all-storage vm01

# 取消定义并删除指定存储
virsh undefine --storage vda,sda vm01

virsh start / shutdown / destroy / reboot - 虚拟机生命周期管理

控制虚拟机的电源状态和生命周期。

语法格式

bash
virsh start <虚拟机名>
virsh shutdown <虚拟机名> [选项]
virsh reboot <虚拟机名> [选项]
virsh destroy <虚拟机名>
virsh reset <虚拟机名>
virsh suspend <虚拟机名>
virsh resume <虚拟机名>
virsh dompmsuspend <虚拟机名> <目标状>
virsh dompmwakeup <虚拟机名>

选项

参数说明
shutdown / reboot
--mode <模式>关机/重启模式:acpi(发送 ACPI 事件,需 guest 支持)、agent(通过 qemu-guest-agent)、paravirt(半虚拟化)

经典案例

bash
# 启动虚拟机
virsh start vm01

# 优雅关机(发送 ACPI 关机信号)
virsh shutdown vm01

# 强制关机(相当于拔电源)
virsh destroy vm01

# 优雅重启
virsh reboot vm01

# 强制重启(相当于按复位键)
virsh reset vm01

# 暂停虚拟机(保存内存状态但不释放资源)
virsh suspend vm01

# 恢复暂停的虚拟机
virsh resume vm01

# 挂起到内存(STR)
virsh dompmsuspend vm01 mem

# 挂起到磁盘(STD)
virsh dompmsuspend vm01 disk
# 注意:挂起到磁盘需要 guest 和 hypervisor 同时支持

# 唤醒挂起的虚拟机
virsh dompmwakeup vm01

virsh setvcpus / setmaxmem / setmem - 虚拟机资源配置

动态调整虚拟机的 CPU 和内存资源。

语法格式

bash
virsh setvcpus <虚拟机名> <CPU数> [选项]
virsh setmaxmem <虚拟机名> <内存大> [选项]
virsh setmem <虚拟机名> <内存大> [选项]

选项

参数说明
--config写入配置文件,下次启动生效
--live立即生效(热调整)
--current影响当前运行的虚拟机
--maximum设置最大 CPU 数量(需配合 --config
--hotpluggable标记 CPU 为可热插拔

经典案例

bash
# 热添加 2 个 vCPU(立即生效)
virsh setvcpus vm01 4 --live

# 添加 vCPU 并持久化配置
virsh setvcpus vm01 4 --config --live

# 设置最大 vCPU 数量(定义上限)
virsh setvcpus vm01 8 --maximum --config

# 热调整内存(需 libvirt 和 guest 支持)
virsh setmem vm01 4G --live

# 设置最大内存限制
virsh setmaxmem vm01 8G --config

# 调整已关闭虚拟机的内存配置
virsh setmaxmem vm01 8G --config
virsh setmem vm01 4G --config

注意事项

  • 热添加 CPU 需要 guest 操作系统支持 CPU 热插拔
  • 热调整内存需要 qemu-guest-agent 配合
  • 缩减内存可能导致 guest 操作系统不稳定

virsh attach-device / detach-device - 设备热插拔

动态添加或移除虚拟机的硬件设备。

语法格式

bash
virsh attach-device <虚拟机名> <XML文> [选项]
virsh detach-device <虚拟机名> <XML文> [选项]
virsh attach-disk <虚拟机名> <源路> <目标设备> [选项]
virsh detach-disk <虚拟机名> <目标设备>
virsh attach-interface <虚拟机名> <网络类> <> [选项]
virsh detach-interface <虚拟机名> <网络类>
virsh update-device <虚拟机名> <XML文>
virsh change-media <虚拟机名> <驱动> [操作] [介质路径]

选项

参数说明
--live热插拔,立即生效
--config持久化配置,下次启动生效
--current影响当前配置
--persistent持久化热插拔的设备
--type <磁盘类型>attach-disk 的磁盘类型
--mode <模式>attach-disk 的缓存模式
--target <总线>attach-disk 的目标总线(virtio/scsi/ide/sata)
--driver <驱动>attach-disk 的驱动类型(qemu/kvm)
--subdriver <子驱动>子驱动类型
--print-xml仅打印 XML 不做实际操作

经典案例

bash
# 热添加一个磁盘(10G QCOW2)
qemu-img create -f qcow2 /var/lib/libvirt/images/vm01-data.qcow2 10G
virsh attach-disk vm01 /var/lib/libvirt/images/vm01-data.qcow2 vdb \
  --live --config --targetbus virtio --driver qemu --subdriver qcow2

# 热添加网卡
cat > /tmp/net-device.xml << EOF
<interface type='network'>
  <source network='default'/>
  <model type='virtio'/>
</interface>
EOF
virsh attach-device vm01 /tmp/net-device.xml --live --config

# 通过 XML 热添加 CDROM
cat > /tmp/cdrom.xml << EOF
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/var/lib/libvirt/images/ubuntu-22.04.iso'/>
  <target dev='hda' bus='ide'/>
  <readonly/>
</disk>
EOF
virsh attach-device vm01 /tmp/cdrom.xml --live

# 热移除磁盘
virsh detach-disk vm01 vdb --live --config

# 热移除网卡
virsh detach-interface vm01 network --live --config

# 更换 CDROM 介质
virsh change-media vm01 hda --eject           # 弹出
virsh change-media vm01 hda --insert /path/to/new.iso  # 插入
virsh change-media vm01 hda --update /path/to/new.iso   # 更新

virsh snapshot-* - 快照管理

创建和管理虚拟机的快照,用于快速恢复。

语法格式

bash
virsh snapshot-create <虚拟机名> [选项]
virsh snapshot-create-as <虚拟机名> <> [选项]
virsh snapshot-list <虚拟机名> [选项]
virsh snapshot-current <虚拟机名> [选项]
virsh snapshot-info <虚拟机名> --snapshotname <快照>
virsh snapshot-revert <虚拟机名> --snapshotname <快照> [选项]
virsh snapshot-delete <虚拟机名> --snapshotname <快照> [选项]
virsh snapshot-dumpxml <虚拟机名> --snapshotname <快照>

选项

参数说明
snapshot-create-as
--name <名称>快照名称
--description <描述>快照描述
--disk-only仅对磁盘创建快照(排除内存状态)
--quiesce使用 guest agent 静默文件系统
--atomic原子操作(全部成功或全部失败)
--print-xml仅打印 XML 不实际创建
----
snapshot-revert
--paused恢复后暂停虚拟机
--running恢复后运行虚拟机(默认)
--force强制恢复(忽略类型不匹配)
----
snapshot-delete
--children同时删除子快照
--children-only仅删除子快照,保留当前快照
--metadata仅删除快照元数据(保留磁盘文件)

经典案例

bash
# 创建快照(包含内存和磁盘)
virsh snapshot-create-as vm01 pre-upgrade --description "Before system upgrade"

# 仅创建磁盘快照(不包含内存)
virsh snapshot-create-as vm01 db-backup --disk-only --description "Database backup before maintenance"

# 使用 qemu-guest-agent 静默文件系统后创建快照
virsh snapshot-create-as vm01 consistent-backup --quiesce --description "Consistent filesystem backup"

# 列出快照
virsh snapshot-list vm01

# 查看当前快照
virsh snapshot-current vm01

# 查看快照信息
virsh snapshot-info vm01 --snapshotname pre-upgrade

# 恢复到快照
virsh snapshot-revert vm01 --snapshotname db-backup

# 恢复到快照并暂停
virsh snapshot-revert vm01 --snapshotname pre-upgrade --paused

# 删除快照
virsh snapshot-delete vm01 --snapshotname pre-upgrade

# 删除快照及其子快照
virsh snapshot-delete vm01 --snapshotname old-backup --children

# 仅删除快照元数据(保留磁盘实际文件)
virsh snapshot-delete vm01 --snapshotname orphaned-snap --metadata

virsh migrate - 虚拟机迁移

在宿主机之间迁移虚拟机,支持冷迁移和热迁移。

语法格式

bash
virsh migrate [选项] <虚拟机名称> <目标URI>
virsh migrate-setmaxdowntime <虚拟机名> <最大停机时间(ms)>
virsh migrate-getmaxdowntime <虚拟机名>
virsh migrate-setspeed <虚拟机名> <带宽(Mbps)>
virsh migrate-getspeed <虚拟机名>
virsh migrate-compcache <虚拟机名> [压缩缓存大小]

选项

参数说明示例
--live热迁移(不停机)默认在线迁移
--offline冷迁移(需要停机)
--p2p点对点迁移(直接连接目标宿主机)
--direct直接迁移(通过 libvirt 通道)
--tunnelled隧道迁移(通过 libvirtd 加密通道)
--persistent持久化迁移后配置
--undefinesource迁移成功后删除源端定义
--suspend迁移后暂停虚拟机
--copy-storage-all迁移所有磁盘(非共享存储)
--copy-storage-inc仅同步增量磁盘数据
--change-protection防止迁移过程中配置变更
--unsafe跳过安全检查(如缓存模式不一致)
--verbose显示详细迁移进度
--compressed启用压缩传输
--comp-methods <方法>压缩方法(mt/zlib)--comp-methods mt
--comp-mt-level <级别>多线程压缩级别--comp-mt-level 9
--comp-mt-threads <数量>多线程压缩线程数--comp-mt-threads 4
--auto-converge自动收敛(减慢 guest CPU 降低脏页率)
--postcopy开启后拷贝迁移模式
--parallel <连接数>并行连接数--parallel 3
--bandwidth <Mbps>最大迁移带宽--bandwidth 1000
--timeout <秒>迁移超时时间--timeout 3600
--timeout-suspend超时后暂停虚拟机
--timeout-postcopy超时后切换为后拷贝模式

经典案例

bash
# 热迁移(共享存储,如 NFS/Ceph)
virsh migrate --live --verbose --persistent --undefinesource \
  vm01 qemu+ssh://root@compute-02/system

# 热迁移并自动收敛
virsh migrate --live --auto-converge --verbose \
  vm01 qemu+ssh://root@compute-02/system

# 非共享存储热迁移(同时拷贝磁盘)
virsh migrate --live --copy-storage-all --verbose \
  vm01 qemu+ssh://root@compute-02/system

# 使用压缩传输迁移
virsh migrate --live --compressed --comp-methods zlib \
  --copy-storage-all --verbose vm01 qemu+ssh://root@compute-02/system

# 设置迁移最大停机时间为 500ms
virsh migrate-setmaxdowntime vm01 500

# 设置迁移带宽为 1Gbps
virsh migrate-setspeed vm01 1000

# 冷迁移(需先关闭虚拟机)
virsh shutdown vm01
virsh migrate --offline --copy-storage-all --verbose \
  vm01 qemu+ssh://root@compute-02/system
virsh start vm01 --connect qemu+ssh://root@compute-02/system

# 查看迁移速度
virsh migrate-getspeed vm01

# 查看迁移压缩缓存
virsh migrate-compcache vm01

virsh pool-* - 存储池管理

管理 KVM 的存储池(存储资源池),包括目录、LVM、iSCSI、NFS 等类型。

语法格式

bash
virsh pool-list [选项]
virsh pool-define-as <> <> [参数]
virsh pool-create-as <> <> [参数]
virsh pool-start <名称/ID>
virsh pool-destroy <名称/ID>
virsh pool-delete <名称/ID>
virsh pool-undefine <名称/ID>
virsh pool-info <名称/ID>
virsh pool-refresh <名称/ID>
virsh pool-autostart <名称/ID>
virsh pool-edit <名称/ID>
virsh pool-dumpxml <名称/ID>
virsh pool-name <UUID>
virsh pool-uuid <>

选项

参数说明
pool-list
--inactive列出未激活的存储池
--all列出所有存储池
--details显示详细信息
----
pool-define-as / pool-create-as
--type <类型>存储池类型:dir(目录)、lvm(LVM 卷组)、iscsi(iSCSI 目标)、nfs(NFS 共享)、disk(物理磁盘)、fs(文件系统)、gluster(GlusterFS)、rbd(Ceph RBD)
--target <路径>存储池目标路径
--source-host <主机>源主机地址
--source-path <路径>源路径
--source-dev <设备>源设备路径
--source-name <名称>源名称
--source-format <格式>源格式

经典案例

bash
# 列出所有存储池
virsh pool-list --all

# 列出所有存储池及详细信息
virsh pool-list --all --details

# 创建目录类型存储池
virsh pool-define-as --name vm-images --type dir --target /data/kvm/images
virsh pool-start vm-images
virsh pool-autostart vm-images

# 创建基于 LVM 的存储池
virsh pool-define-as --name vg-pool --type lvm \
  --source-dev /dev/sdb --target /dev/vg-kvm

# 创建 iSCSI 存储池
virsh pool-define-as --name iscsi-pool --type iscsi \
  --source-host 192.168.1.200 --source-dev iqn.2024-01.example:storage

# 创建 NFS 存储池
virsh pool-define-as --name nfs-pool --type netfs \
  --source-host nfs-server --source-path /exports/kvm \
  --source-format nfs --target /mnt/nfs-kvm

# 查看存储池信息
virsh pool-info vm-images

# 刷新存储池(扫描新卷)
virsh pool-refresh vm-images

# 设置存储池自动启动
virsh pool-autostart vm-images

# 取消自动启动
virsh pool-autostart --disable vm-images

# 销毁存储池(停止,不删除数据)
virsh pool-destroy vm-images

# 删除存储池定义
virsh pool-undefine vm-images

# 导出存储池 XML 配置
virsh pool-dumpxml vm-images

virsh vol-* - 存储卷管理

管理存储池中的存储卷(磁盘镜像)。

语法格式

bash
virsh vol-list <存储池名> [选项]
virsh vol-create-as <存储池名> <> <> [选项]
virsh vol-delete <卷路径/名> --pool <存储>
virsh vol-info <卷路径/名> --pool <存储>
virsh vol-download <卷路径/名> <输出文> [选项]
virsh vol-upload <卷路径/名> <输入文> [选项]
virsh vol-resize <卷路径/名> <新容> [选项]
virsh vol-clone <源卷路径/名> <目标卷> --pool <存储>
virsh vol-wipe <卷路径/名> [算法]
virsh vol-dumpxml <卷路径/名> --pool <存储>

选项

参数说明
vol-create-as
--capacity <容量>卷容量(K/M/G/T)
--allocation <容量>初始分配大小
--format <格式>磁盘格式:rawqcow2vmdkvhd
--backing-chain使用 backing file
--prealloc-metadata预分配元数据(qcow2)
--print-xml仅打印 XML
----
vol-resize
--capacity <新容量>新容量
--allocate立即分配所有空间
--delta相对于当前容量增加(如 +10G)
--shrink缩减容量(谨慎使用)
----
vol-wipe
算法参数zero(填充0)、scrub(符合NIST标准)、doe(符合DOD标准)、bsi(德国标准)、gutmann(35遍擦写)

经典案例

bash
# 列出存储池中的所有卷
virsh vol-list --pool vm-images

# 创建 QCOW2 格式的存储卷
virsh vol-create-as vm-images vm01-system.qcow2 50G --format qcow2

# 创建 RAW 格式的存储卷
virsh vol-create-as vm-images vm01-data.raw 100G --format raw

# 创建使用预分配元数据的 QCOW2 卷(性能更好)
virsh vol-create-as vm-images vm01-fast.qcow2 50G \
  --format qcow2 --prealloc-metadata

# 查看卷信息
virsh vol-info --pool vm-images vm01-system.qcow2

# 从备份恢复卷
virsh vol-upload --pool vm-images vm01-system.qcow2 /backup/vm01-system.qcow2

# 下载卷到本地
virsh vol-download --pool vm-images vm01-system.qcow2 ./vm01-system-backup.qcow2

# 扩容卷(从 50G 扩展到 100G)
virsh vol-resize vm01-system.qcow2 100G --pool vm-images

# 扩容并立即分配全部空间
virsh vol-resize vm01-data.qcow2 200G --pool vm-images --allocate

# 克隆卷
virsh vol-clone --pool vm-images vm01-system.qcow2 vm02-system.qcow2

# 安全擦除卷数据(使用 scrub 算法)
virsh vol-wipe vm01-old.raw --algorithm scrub --pool vm-images

# 删除卷
virsh vol-delete vm01-old.raw --pool vm-images

# 导出卷的 XML 配置
virsh vol-dumpxml --pool vm-images vm01-system.qcow2

virsh net-* - 网络管理

管理 KVM 的虚拟网络,包括 NAT、桥接、Open vSwitch 等。

语法格式

bash
virsh net-list [选项]
virsh net-define <XML文>
virsh net-create <XML文>
virsh net-start <网络名>
virsh net-destroy <网络名>
virsh net-undefine <网络名>
virsh net-info <网络名>
virsh net-autostart <网络名>
virsh net-edit <网络名>
virsh net-dumpxml <网络名>
virsh net-name <UUID>
virsh net-uuid <>
virsh net-dhcp-leases <网络名> [选项]

选项

参数说明
net-list
--inactive列出未激活的网络
--all列出所有网络
----
net-define / net-create
通过 XML 定义支持 NAT、桥接、Open vSwitch、macvtap 等

经典案例

bash
# 列出所有网络
virsh net-list --all

# 查看默认 NAT 网络配置
virsh net-dumpxml default

# 创建 NAT 网络
cat > /tmp/nat-net.xml << EOF
<network>
  <name>private-net</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='192.168.200.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.200.10' end='192.168.200.200'/>
      <host mac='52:54:00:01:02:03' ip='192.168.200.10'/>
    </dhcp>
  </ip>
</network>
EOF
virsh net-define /tmp/nat-net.xml
virsh net-start private-net
virsh net-autostart private-net

# 创建桥接网络(需先配置宿主机网桥)
cat > /tmp/bridge-net.xml << EOF
<network>
  <name>br0-network</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
EOF
virsh net-define /tmp/bridge-net.xml
virsh net-start br0-network

# 查看 DHCP 租约
virsh net-dhcp-leases default

# 查看网络信息
virsh net-info default

# 停止网络
virsh net-destroy default

# 删除网络定义
virsh net-undefine default

# 编辑网络配置
virsh net-edit private-net

virsh node - 节点信息查看

查看宿主机(Hypervisor)的硬件和系统信息。

语法格式

bash
virsh nodeinfo
virsh nodememtune
virsh nodecpumap
virsh nodecpustats [选项]
virsh nodememstats [选项]
virsh nodesuspend <目标状> <持续时>
virsh sysinfo
virsh capabilities
virsh version

选项

参数说明
nodecpustats
--percent以百分比显示 CPU 使用率
--
nodememstats
--cell <编号>查看指定 NUMA 节点的内存统计

经典案例

bash
# 查看宿主机基本信息
virsh nodeinfo

# 输出示例:
# CPU model:           x86_64
# CPU(s):              32
# CPU frequency:       2100 MHz
# CPU socket(s):       2
# Core(s) per socket:  8
# Thread(s) per core:  2
# NUMA cell(s):        2
# Memory size:         262144 KiB

# 查看 NUMA 配置
virsh nodememtune

# 查看 CPU 拓扑
virsh nodecpumap

# 查看 CPU 使用率(百分比)
virsh nodecpustats --percent

# 查看内存使用统计
virsh nodememstats

# 查看指定 NUMA 节点的内存
virsh nodememstats --cell 0

# 查看系统硬件信息(BIOS、主板等)
virsh sysinfo

# 查看 Hypervisor 能力
virsh capabilities

# 查看 libvirt 版本
virsh version

virt-install - 虚拟机创建工具

virt-install 是创建 KVM 虚拟机最常用的命令行工具,支持从 ISO、网络安装、PXE 等方式创建虚拟机。

语法格式

bash
virt-install [选项]

选项

参数说明示例
基本选项
--name <名称>虚拟机名称--name vm01
--ram <MB>内存大小(MB)--ram 4096
--vcpus <数量>vCPU 数量--vcpus 4
--disk <磁盘配置>磁盘配置(路径、大小、格式)--disk path=/data/kvm/vm01.qcow2,size=50,format=qcow2
--cdrom <路径>CDROM ISO 镜像路径--cdrom /data/iso/centos-7.iso
--location <URL/路径>网络安装源--location http://mirror.centos.org/7/os/x86_64/
--network <网络配置>网络配置--network network=default
--graphics <类型>图形显示配置--graphics vnc,listen=0.0.0.0,port=5900
--virt-type <类型>Hypervisor 类型--virt-type kvm
--os-variant <系统>操作系统类型优化--os-variant centos7.0
--boot <引导配置>引导顺序和设备--boot cdrom,hd,menu=on
--cpu <CPU配置>CPU 模型和特性--cpu host-passthrough
------
高级选项
--extra-args <参数>内核启动参数(用于网络安装)--extra-args "ks=http://server/kickstart.cfg"
--pxePXE 网络引导
--import从已有磁盘镜像导入
--livecdLive CD 模式(不创建磁盘)
--nographics无图形界面
--hvm完全虚拟化
--paravirt半虚拟化
--print-xml仅打印 XML,不实际创建
--dry-run干运行,验证配置但不创建
--force强制创建(跳过确认)
--autostart设置自动启动
--wait <分钟>等待安装完成--wait 10
--check <检查项>启用/禁用检查--check disk_size=off
------
设备选项
--controller <控制器>添加控制器--controller type=scsi,model=virtio-scsi
--input <输入设备>输入设备--input type=tablet,bus=usb
--serial <串口>串口配置--serial pty
--console <控制台>控制台配置--console pty,target_type=serial
--sound <声卡>声卡类型--sound ich6
--watchdog <看门狗>watchdog 设备--watchdog action=reset,model=i6300esb
--rng <随机数>RNG 设备--rng type=random,backend=/dev/urandom
--tpm <TPM>TPM 设备--tpm type=passthrough,model=tpm-tis
--hostdev <设备>主机设备直通--hostdev 002.003
------
资源调优选项
--cputune <参数>CPU 调优--cputune vcpupin0=0-3,shares=2048
--memtune <参数>内存调优--memtune hard_limit=8589934592,soft_limit=4294967296
--blkiotune <参数>IO 调优--blkiotune weight=500
--numatune <参数>NUMA 调优--numatune memory=0,memnodes=0-1
--qemu-commandline <参数>透传 QEMU 参数--qemu-commandline="-machine pc,accel=kvm -cpu host"

经典案例

bash
# 基础安装(从 ISO 安装 CentOS 7)
virt-install --name vm01 --ram 2048 --vcpus 2 \
  --disk path=/data/kvm/vm01.qcow2,size=40,format=qcow2 \
  --cdrom /data/iso/CentOS-7-x86_64-Minimal.iso \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 \
  --virt-type kvm --os-variant centos7.0

# 无图形界面安装 Ubuntu
virt-install --name ubuntu-vm --ram 4096 --vcpus 4 \
  --disk path=/data/kvm/ubuntu.qcow2,size=60,format=qcow2 \
  --location http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/ \
  --extra-args "console=ttyS0,115200n8 serial" \
  --network bridge=br0 --nographics \
  --os-variant ubuntu22.04

# 从现有磁盘镜像导入(快速创建)
virt-install --name vm-clone --ram 4096 --vcpus 2 \
  --disk path=/data/kvm/vm-clone.qcow2,format=qcow2 \
  --network network=default \
  --import --os-variant centos7.0

# PXE 网络引导安装
virt-install --name pxe-vm --ram 2048 --vcpus 2 \
  --disk path=/data/kvm/pxe-vm.qcow2,size=40 \
  --network bridge=br0 --pxe \
  --graphics vnc --os-variant centos7.0

# 使用 CPU 直通模式(性能敏感型应用)
virt-install --name perf-vm --ram 65536 --vcpus 16 \
  --disk path=/data/kvm/perf-vm.qcow2,size=200,format=qcow2,bus=virtio,cache=none \
  --network network=default,model=virtio \
  --cpu host-passthrough \
  --virt-type kvm --os-variant centos7.0

# 创建带 UEFI 引导的虚拟机
virt-install --name uefi-vm --ram 4096 --vcpus 4 \
  --disk path=/data/kvm/uefi-vm.qcow2,size=50,format=qcow2 \
  --cdrom /data/iso/ubuntu-22.04-server.iso \
  --boot uefi --network network=default \
  --graphics vnc --os-variant ubuntu22.04

# 创建 GPU 直通虚拟机
virt-install --name gpu-vm --ram 32768 --vcpus 8 \
  --disk path=/data/kvm/gpu-vm.qcow2,size=100 \
  --hostdev 02:00.0 --hostdev 02:00.1 \
  --network bridge=br0 --os-variant centos7.0

# 虚拟机添加多块网卡
virt-install --name multi-nic-vm --ram 4096 --vcpus 4 \
  --disk path=/data/kvm/multi-nic.qcow2,size=40 \
  --network bridge=br0 --network network=default \
  --network bridge=br1 --graphics vnc \
  --os-variant centos7.0

# 先打印 XML 查看配置,确认无误后再创建
virt-install --name test-vm --ram 2048 --vcpus 2 \
  --disk path=/data/kvm/test.qcow2,size=20 \
  --cdrom /data/iso/CentOS-7.iso --network default \
  --print-xml

virt-clone - 虚拟机克隆

克隆已有的虚拟机,快速创建相同配置的实例。

语法格式

bash
virt-clone [选项]

选项

参数说明示例
--original <名称>源虚拟机名称--original vm01
--name <名称>新虚拟机名称--name vm02
--file <磁盘路径>新虚拟机磁盘路径--file /data/kvm/vm02.qcow2
--mac <MAC地址>新虚拟机 MAC 地址--mac 52:54:00:aa:bb:cc
--auto-clone自动生成新名称和路径
--print-xml仅打印 XML,不实际克隆
--replace替换已存在的同名虚拟机
--check <检查项>启用/禁用检查--check all=off

经典案例

bash
# 简单克隆(自动生成新名称和磁盘路径)
virt-clone --original vm01 --auto-clone

# 指定新名称和磁盘路径
virt-clone --original vm01 --name vm02 \
  --file /data/kvm/vm02-system.qcow2 \
  --file /data/kvm/vm02-data.qcow2

# 克隆并指定新 MAC 地址
virt-clone --original web-template --name web-01 \
  --file /data/kvm/web-01.qcow2 --mac 52:54:00:ab:cd:01

# 先打印 XML 查看配置
virt-clone --original vm01 --name vm02 \
  --file /data/kvm/vm02.qcow2 --print-xml

# 克隆前替换已存在的目标
virt-clone --original vm01 --name vm02 \
  --file /data/kvm/vm02.qcow2 --replace

virt-viewer - 虚拟机控制台

打开虚拟机的图形控制台进行交互操作。

语法格式

bash
virt-viewer [选项] <虚拟机名称/ID>
virt-viewer -c <连接URI> <虚拟机名称/ID>

选项

参数说明
-c / --connect URI连接到远程 hypervisor
-w / --wait等待虚拟机启动后再连接
-f / --full-screen全屏模式
-a / --attach附加到正在运行的虚拟机
-z / --zoom <百分比>缩放比例
-d / --debug调试模式
-k / --hotkeys <快捷键>自定义快捷键
--kiosk信息亭模式
--kiosk-quit <行为>信息亭退出行为

经典案例

bash
# 打开虚拟机图形控制台
virt-viewer vm01

# 等待虚拟机启动后自动连接
virt-viewer --wait vm01

# 全屏模式
virt-viewer --full-screen vm01

# 附加到已运行的虚拟机
virt-viewer --attach vm01

# 连接到远程宿主机上的虚拟机
virt-viewer -c qemu+ssh://root@192.168.1.100/system vm01

virt-top - 虚拟机资源监控

实时监控宿主机的虚拟机资源使用情况。

语法格式

bash
virt-top [选项]

选项

参数说明
-c / --connect URI连接到远程 hypervisor
-d / --delay <秒>刷新间隔(默认 3 秒)
--sort <排序方式>排序字段:cpu(默认)、mem、time、net
--block-in-bytes磁盘 I/O 以字节显示
--hist-cpu显示 CPU 历史
--csv <文件>输出到 CSV 文件
--help显示帮助

经典案例

bash
# 启动实时监控
virt-top

# 每 5 秒刷新一次
virt-top -d 5

# 按内存使用排序
virt-top --sort mem

# 按 CPU 使用排序
virt-top --sort cpu

# 输出到 CSV 文件
virt-top --csv /tmp/virt-top-report.csv -d 10 -n 6

# 监控远程宿主机
virt-top -c qemu+ssh://root@192.168.1.100/system

qemu-img - 磁盘镜像管理

管理 QEMU/KVM 的磁盘镜像文件,支持多种格式。

语法格式

bash
qemu-img <子命> [选项] <文件路径> [参数]

子命令

子命令功能说明
create创建磁盘镜像
check检查镜像一致性
info查看镜像信息
resize调整镜像大小
convert转换镜像格式
snapshot管理镜像内部快照
commit提交 backing file 变更
compare比较两个镜像差异
map映射镜像的数据分配
amend修改镜像选项
bench测试 I/O 性能
dd镜像转换和复制

选项

参数说明示例
create
-f <格式>磁盘格式-f qcow2
-o <选项>额外选项-o preallocation=metadata,cluster_size=64k
--object <对象>定义加密密钥等--object secret,id=key0,data=...
------
convert
-f <输入格式>输入格式-f raw
-O <输出格式>输出格式-O qcow2
-c压缩输出
-p显示进度
-S <大小>稀疏大小-S 4k
--target-image-opts使用目标镜像选项
------
resize
+<大小>增加容量+10G
-<大小>缩减容量-10G
--shrink允许缩减
--preallocation预分配模式off, falloc, full
------
snapshot
-l列出快照
-c <名称>创建快照
-a <名称>应用(恢复)快照
-d <名称>删除快照

经典案例

bash
# 创建 QCOW2 镜像
qemu-img create -f qcow2 /data/kvm/vm01.qcow2 50G

# 创建预分配元数据的 QCOW2 镜像(初始写入性能好)
qemu-img create -f qcow2 -o preallocation=metadata,cluster_size=64k \
  /data/kvm/vm02.qcow2 50G

# 创建 RAW 镜像
qemu-img create -f raw /data/kvm/vm01.raw 50G

# 查看镜像信息
qemu-img info /data/kvm/vm01.qcow2

# 查看镜像详细信息(含位图、子格式等)
qemu-img info --backing-chain /data/kvm/vm01.qcow2

# 转换镜像格式(RAW → QCOW2)
qemu-img convert -f raw -O qcow2 -c -p /data/kvm/vm01.raw /data/kvm/vm01.qcow2

# 转换镜像并调整大小
qemu-img convert -f qcow2 -O qcow2 -p \
  old-image.qcow2 new-image.qcow2

# 扩容镜像(从 50G 扩到 100G)
qemu-img resize /data/kvm/vm01.qcow2 +50G

# 扩容镜像并立即预分配
qemu-img resize /data/kvm/vm01.qcow2 100G --preallocation=full

# 管理镜像内部快照
qemu-img snapshot -c pre-upgrade /data/kvm/vm01.qcow2   # 创建快照
qemu-img snapshot -l /data/kvm/vm01.qcow2                # 列出快照
qemu-img snapshot -a pre-upgrade /data/kvm/vm01.qcow2    # 恢复快照
qemu-img snapshot -d old-snapshot /data/kvm/vm01.qcow2   # 删除快照

# 检查镜像一致性
qemu-img check /data/kvm/vm01.qcow2

# 检查并修复镜像
qemu-img check -r all /data/kvm/vm01.qcow2

# 创建带 backing file 的镜像(差分镜像)
qemu-img create -f qcow2 -b /data/kvm/base-image.qcow2 -F qcow2 \
  /data/kvm/diff-image.qcow2

# 提交差分镜像到基础镜像
qemu-img commit /data/kvm/diff-image.qcow2

# 比较两个镜像
qemu-img compare /data/kvm/vm01.qcow2 /data/kvm/vm02.qcow2

# 测试磁盘 I/O 性能(4K 随机读写,64 并发)
qemu-img bench -c 1000 -d 64 -s 4096 /data/kvm/vm01.qcow2

# 映射查看磁盘数据分配
qemu-img map /data/kvm/vm01.qcow2

# 使用 dd 子命令转换
qemu-img dd -f qcow2 -O raw if=/data/kvm/vm01.qcow2 of=/data/kvm/vm01.raw bs=4M

注意事项

  1. virsh destroy 是强制关机,相当于拔电源,可能导致数据丢失,应优先使用 virsh shutdown
  2. 热迁移要求源和目标宿主机之间的 CPU 兼容(建议使用 host-passthrough CPU 模式)
  3. 快照会占用磁盘空间,长时间保留大量快照会影响磁盘 IO 性能
  4. qemu-img resize 扩容 RAW 和 QCOW2 镜像后,需要在 guest 操作系统中扩展文件系统和分区
  5. 缩减镜像大小前务必做好数据备份