KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它将Linux内核转化为一个Type-1(裸金属)hypervisor,允许用户在单一物理服务器上运行多个虚拟机(VM),KVM的高效性和与Linux内核的深度集成使其成为企业级虚拟化的首选方案之一,要熟练使用KVM,掌握其常用命令是必不可少的,以下将从虚拟机管理、网络配置、存储管理、快照与克隆、性能监控等多个维度详细介绍KVM的常用命令,并通过表格形式归纳关键操作,最后附上相关FAQs解答。

虚拟机管理命令
虚拟机的生命周期管理是KVM操作的核心,包括创建、启动、停止、删除等基本操作,这些命令通常通过virsh工具实现,virsh是KVM的命令行管理接口,基于libvirt库构建功能强大且灵活。
创建虚拟机
创建虚拟机有两种主要方式:基于磁盘镜像安装或通过预定义的XML配置文件安装。
- 
基于磁盘镜像安装:首先创建虚拟磁盘,然后启动安装过程。
# 创建10GB的qcow2格式磁盘(动态分配空间) qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 10G # 通过virt-install启动安装(使用ISO镜像和网络安装) virt-install --name vm1 --ram 2048 --vcpus 2 --disk path=/var/lib/libvirt/images/vm1.qcow2,format=qcow2 \ --cdrom /path/to/install.iso --network network=default --graphics vnc,listen=0.0.0.0 --os-variant centos8
参数说明:
--name指定虚拟机名称;--ram分配内存(MB);--vcpus分配CPU核心数;--disk指定磁盘路径和格式;--cdrom指向安装镜像;--network配置网络;--graphics启用VNC远程图形界面。
(图片来源网络,侵删) - 
基于XML配置文件:手动编写XML配置文件,通过
virsh define创建虚拟机。
示例XML文件(vm1.xml):<domain type='kvm'> <name>vm1</name> <memory unit='MiB'>2048</memory> <vcpu placement='static'>2</vcpu> <os> <type arch='x86_64'>hvm</type> <boot dev='cdrom'/> </os> <devices> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/vm1.qcow2'/> <target dev='vda'/> </disk> <interface type='network'> <source network='default'/> <model type='virtio'/> </interface> <graphics type='vnc' listen='0.0.0.0' port='5901'/> </devices> </domain>通过
virsh define vm1.xml定义虚拟机,此时虚拟机处于“关闭”状态,需手动启动。 
启动与停止虚拟机
# 启动虚拟机(若已定义) virsh start vm1 # 强制关闭虚拟机(相当于物理机电源键) virsh destroy vm1 # 正常关闭虚拟机(需虚拟机安装了acpid服务) virsh shutdown vm1 # 挂起虚拟机(保存当前状态到内存) virsh suspend vm1 # 恢复挂起的虚拟机 virsh resume vm1
删除虚拟机
删除虚拟机前需确保虚拟机已停止,删除操作会移除虚拟机配置,但不会自动删除磁盘文件(需手动清理)。
# 停止并删除虚拟机(保留磁盘) virsh undefine vm1 # 强制删除正在运行的虚拟机(不推荐,可能导致数据丢失) virsh destroy vm1 && virsh undefine vm1
虚拟机网络配置命令
KVM支持多种网络模式,如NAT(默认)、桥接(Bridge)、仅主机网络等,网络配置主要通过virsh管理虚拟网络接口。

查看网络状态
# 列出所有虚拟网络 virsh net-list --all # 查看指定网络详情(如default网络) virsh net-info default # 查看网络XML配置 virsh net-dumpxml default
管理虚拟网络
# 启动/停止网络 virsh net-start default virsh net-stop default # 定义新的虚拟网络(需先创建XML文件) virsh net-define network.xml # 删除网络(需先停止) virsh net-undefine default
修改虚拟机网络配置
# 编辑虚拟机XML配置文件(会暂停虚拟机) virsh edit vm1 # 动态添加网络接口(运行时生效) virsh attach-device vm1 /path/to/nic.xml --config --live # 动态移除网络接口 virsh detach-device vm1 /path/to/nic.xml --live
虚拟机存储管理命令
KVM支持多种磁盘格式(如qcow2、raw、vmdk等),存储管理包括磁盘创建、扩容、挂载等操作。
创建与管理磁盘镜像
# 创建qcow2格式磁盘(动态分配) qemu-img create -f qcow2 /var/lib/libvirt/images/vm2_disk.qcow2 20G # 创建raw格式磁盘(固定大小,性能更高) qemu-img create -f raw /var/lib/libvirt/images/vm2_disk.raw 20G # 查看磁盘信息 qemu-img info /var/lib/libvirt/images/vm1.qcow2 # 调整磁盘大小(仅支持扩容,需在虚拟机内部分区格式化) qemu-img resize /var/lib/libvirt/images/vm1.qcow2 +5G # 扩容5GB
挂载与卸载磁盘
# 动态添加磁盘到虚拟机(需准备XML配置文件) virsh attach-device vm1 disk.xml --config --live # 动态卸载磁盘 virsh detach-device vm1 disk.xml --live
虚拟机快照与克隆命令
快照和克隆是虚拟机高效运维的重要功能,快照用于保存某个时间点的状态,克隆用于快速复制虚拟机。
快照管理
# 创建快照(当前状态) virsh snapshot-create vm1 # 创建带名称的快照 virsh snapshot-create-as vm1 snap1 "backup before update" # 列出所有快照 virsh snapshot-list vm1 # 回滚到指定快照(需停止虚拟机) virsh snapshot-revert vm1 snap1 # 删除快照 virsh snapshot-delete vm1 snap1
虚拟机克隆
# 完全克隆(创建新的磁盘文件,耗时较长) virt-clone --original vm1 --name vm2 --file /var/lib/libvirt/images/vm2.qcow2 # 快速克隆(使用qcow2的copy-on-write特性,节省空间) virt-clone --original vm1 --name vm3 --file /var/lib/libvirt/images/vm3.qcow2 --link
虚拟机性能监控命令
监控虚拟机的资源使用情况是保障稳定运行的关键,KVM可通过virsh、top、vmstat等工具实现监控。
使用virsh监控
# 查看虚拟机CPU使用率(实时) virsh cpu-stats vm1 # 查看虚拟机内存使用情况 virsh dommemstat vm1 # 查看虚拟机IO统计 virsh domblkstat vm1
使用系统工具监控
# 查看所有虚拟机进程(qemu-system-*) ps aux | grep qemu # 使用top监控虚拟机CPU/内存(通过虚拟机PID) top -p $(pgrep -f "vm1") # 使用vmstat监控虚拟机整体性能 vmstat 1
关键命令速查表
| 操作类别 | 命令示例 | 功能说明 | 
|---|---|---|
| 虚拟机创建 | virt-install --name vm1 --ram 2048 --vcpus 2 --disk path=/path/to/disk | 
创建并启动虚拟机 | 
| 虚拟机启动 | virsh start vm1 | 
启动已定义的虚拟机 | 
| 虚拟机关闭 | virsh shutdown vm1 | 
正常关闭虚拟机(需安装acpid) | 
| 虚拟机删除 | virsh undefine vm1 | 
删除虚拟机配置(保留磁盘) | 
| 磁盘创建 | qemu-img create -f qcow2 vm_disk.qcow2 10G | 
创建10GB的qcow2格式磁盘 | 
| 快照创建 | virsh snapshot-create-as vm1 snap1 "backup" | 
为虚拟机创建名为snap1的快照 | 
| 克隆虚拟机 | virt-clone --original vm1 --name vm2 --file /path/to/vm2.qcow2 | 
完全克隆虚拟机vm1为vm2 | 
| 网络列表 | virsh net-list --all | 
列出所有虚拟网络状态 | 
| 查看虚拟机状态 | virsh domstate vm1 | 
查看虚拟机当前状态(running/shut off/paused等) | 
相关问答FAQs
Q1: KVM虚拟机无法启动,提示“domain vm1 already exists”,如何解决?
A: 该错误通常表示虚拟机配置已被定义但未正确清理,解决步骤如下:  
- 检查虚拟机状态:
virsh domstate vm1,若为“shut off”但无法启动,可能是配置冲突。 - 尝试强制删除虚拟机配置:
virsh undefine vm1 --remove-all-storage(会删除磁盘文件,谨慎操作)。 - 若磁盘文件需保留,可先备份磁盘,再执行
virsh undefine vm1,然后重新定义虚拟机。 
Q2: 如何为KVM虚拟机添加USB设备?
A: 动态添加USB设备需通过XML配置实现,步骤如下:  
- 创建USB设备XML文件(usb.xml):  
<devices> <hostdev mode='subsystem' type='usb'> <source> <vendor id='0x1234'/> # 替换为目标设备vendor ID <product id='0x5678'/> # 替换为目标设备product ID </source> </hostdev> </devices> - 使用
virsh attach-device命令添加:virsh attach-device vm1 usb.xml --live(运行时生效)。 - 验证设备是否已识别:在虚拟机内执行
lsusb查看设备列表。 
