KVM 命令行参考
KVM(Kernel-based Virtual Machine)通过 virsh、virt-install、qemu-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 | 仅输出虚拟机 UUID | virsh list --uuid |
--state-running | 仅显示运行中的虚拟机 | |
--state-shutoff | 仅显示已关闭的虚拟机 | |
--state-paused | 仅显示已暂停的虚拟机 | |
--managed-save | 列出有托管保存状态的虚拟机 | |
--transient | 列出临时虚拟机 | |
--persistent | 列出持久化虚拟机 | |
--table | 以表格形式输出(默认) | |
--stats | 显示额外的统计信息 | |
-c / --connect URI | 连接到指定的 hypervisor | virsh -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 --allvirsh 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 vm01virsh 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 vm01virsh 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 --metadatavirsh 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 vm01virsh 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-imagesvirsh 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 <格式> | 磁盘格式:raw、qcow2、vmdk、vhd |
--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.qcow2virsh 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-netvirsh 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 versionvirt-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" |
--pxe | PXE 网络引导 | |
--import | 从已有磁盘镜像导入 | |
--livecd | Live 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-xmlvirt-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 --replacevirt-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 vm01virt-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/systemqemu-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注意事项
virsh destroy是强制关机,相当于拔电源,可能导致数据丢失,应优先使用virsh shutdown- 热迁移要求源和目标宿主机之间的 CPU 兼容(建议使用
host-passthroughCPU 模式) - 快照会占用磁盘空间,长时间保留大量快照会影响磁盘 IO 性能
- qemu-img resize 扩容 RAW 和 QCOW2 镜像后,需要在 guest 操作系统中扩展文件系统和分区
- 缩减镜像大小前务必做好数据备份
