KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它将Linux内核转化为一个虚拟机监控程序(Hypervisor),允许用户在同一台物理服务器上运行多个独立的虚拟机,KVM的管理命令行工具是系统管理员进行虚拟机创建、配置、监控和维护的核心手段,熟练掌握这些命令可以显著提高虚拟化环境的管理效率和可靠性,以下将详细介绍KVM管理命令行的常用操作和技巧。

在开始之前,需要确保系统中已安装KVM及相关工具包,如qemu-kvm、libvirt、virt-manager等。libvirt是一套用于管理虚拟化平台的开源API和守护进程,提供了统一的命令行工具virsh,这是KVM管理中最常用的命令行工具之一。virt-install用于创建新虚拟机,virt-viewer用于连接虚拟机控制台,virt-top用于实时监控虚拟机性能,这些工具共同构成了完整的KVM命令行管理生态。
虚拟机生命周期管理
虚拟机的生命周期管理包括创建、启动、停止、暂停、恢复和删除等操作,使用virsh命令可以轻松实现这些功能,创建虚拟机时,可以通过virt-install命令指定虚拟机的名称、内存大小、虚拟CPU数量、磁盘镜像、安装镜像源等参数,以下是一个创建虚拟机的示例命令:
virt-install --name vm1 --ram 2048 --vcpus 2 --disk path=/var/lib/libvirt/images/vm1.img,size=20 --cdrom /path/to/install.iso --network network=default
该命令创建了一个名为“vm1”的虚拟机,分配2GB内存和2个vCPU,磁盘大小为20GB,并通过ISO镜像安装操作系统。
启动虚拟机使用virsh start vm1,停止虚拟机(强制关机)使用virsh destroy vm1,正常关机使用virsh shutdown vm1,暂停虚拟机(保存当前状态)使用virsh suspend vm1,恢复暂停的虚拟机使用virsh resume vm1,删除虚拟机(包括磁盘镜像)使用virsh undefine vm1 --remove-all-storage,需要注意的是,destroy命令会直接切断虚拟机电源,可能导致数据丢失,建议优先使用shutdown。
虚拟机配置管理
虚拟机的配置信息(如CPU、内存、磁盘、网络等)通常存储在XML文件中,通过virsh命令可以查看和修改这些配置,查看虚拟机XML配置使用virsh dumpxml vm1 > vm1.xml,编辑配置文件后,可以通过virsh define vm1.xml使配置生效,动态调整虚拟机的内存大小,可以使用virsh setmem vm1 --size 4G --live,其中--live参数表示在虚拟机运行时生效,无需重启。

CPU的配置同样支持热插拔,使用virsh setvcpus vm1 --count 4 --live可以动态增加vCPU数量,对于磁盘管理,可以通过virsh attach-disk vm1 /path/to/newdisk.img vdb --persistent添加新磁盘,virsh detach-disk vm1 vdb --persistent移除磁盘,网络方面,虚拟机默认通过NAT方式连接,若需配置桥接网络,需在宿主机上创建网桥设备,并将虚拟机网络接口绑定到网桥。
虚拟机监控与维护
实时监控虚拟机性能是确保系统稳定运行的关键。virsh命令提供了丰富的监控选项,如virsh dominfo vm1查看虚拟机基本信息,virsh domstate vm1查看虚拟机当前状态(运行、暂停、关机等),virsh dommemstat vm1查看内存使用情况。virt-top工具类似于Linux的top命令,可以实时显示所有虚拟机的CPU、内存、磁盘I/O等性能数据,非常适合动态监控。
虚拟机快照(Snapshot)是数据备份和恢复的重要手段,使用virsh snapshot-create-as vm1 snap1 --description "before update"可以创建快照,virsh snapshot-list vm1查看所有快照,virsh snapshot-revert vm1 snap1恢复到指定快照,virsh snapshot-delete vm1 snap1删除快照,快照功能在虚拟机升级或测试前尤为重要,可快速回滚到稳定状态。
常用命令速查表
为了方便查阅,以下将部分常用virsh命令整理成表格:

| 功能分类 | 命令示例 | 说明 |
|---|---|---|
| 虚拟机创建 | virt-install --name vm1 --ram 2048 ... |
创建新虚拟机并安装系统 |
| 启动虚拟机 | virsh start vm1 |
启动已定义的虚拟机 |
| 停止虚拟机 | virsh shutdown vm1 |
正常关机 |
| 强制停止 | virsh destroy vm1 |
强制切断电源(数据丢失风险) |
| 暂停虚拟机 | virsh suspend vm1 |
暂停虚拟机(内存状态保留) |
| 恢复虚拟机 | virsh resume vm1 |
恢复暂停的虚拟机 |
| 删除虚拟机 | virsh undefine vm1 --remove-all-storage |
删除虚拟机配置及磁盘 |
| 查看XML配置 | virsh dumpxml vm1 |
输出虚拟机当前配置信息 |
| 修改配置 | virsh define vm1.xml |
通过XML文件更新虚拟机配置 |
| 动态调整内存 | virsh setmem vm1 --size 4G --live |
在线调整内存大小 |
| 动态调整CPU | virsh setvcpus vm1 --count 4 --live |
在线调整vCPU数量 |
| 添加磁盘 | virsh attach-disk vm1 /dev/sdb vdb |
为虚拟机添加新磁盘 |
| 移除磁盘 | virsh detach-disk vm1 vdb |
移除虚拟机指定磁盘 |
| 创建快照 | virsh snapshot-create-as vm1 snap1 |
创建虚拟机快照 |
| 列出快照 | virsh snapshot-list vm1 |
显示虚拟机所有快照 |
| 恢复快照 | virsh snapshot-revert vm1 snap1 |
恢复虚拟机到指定快照 |
| 删除快照 | virsh snapshot-delete vm1 snap1 |
删除指定快照 |
相关问答FAQs
Q1: 如何解决KVM虚拟机无法连接网络的问题?
A1: 首先检查虚拟机网络配置是否正确,使用virsh domiflist vm1查看网络接口状态,若为NAT模式,确保libvirt的默认网络已启动(virsh net-list --all),并检查宿主机防火墙是否拦截了流量,若需桥接模式,需在宿主机创建网桥(如br0),并将物理网卡(如eth0)绑定到网桥,配置虚拟机网络接口为type=bridge, source=br0,检查虚拟机内部系统是否正确识别了网络设备(如eth0)并配置了IP地址。
Q2: KVM虚拟机磁盘空间不足时,如何动态扩容?
A2: 动态扩容分为两步:第一步扩容宿主机磁盘镜像文件,第二步在虚拟机内部识别扩容空间,首先使用qemu-img resize /var/lib/libvirt/images/vm1.img +20G将镜像文件扩大20G,然后关闭虚拟机,使用virsh attach-disk vm1 --source /dev/sdb --target vdb --type disk --mode readonly --subdev node-source --driver qemu --config添加扩容后的磁盘(或直接编辑XML配置添加磁盘),启动虚拟机后,进入系统使用lsblk查看新磁盘,使用fdisk或parted分区,最后格式化并挂载到指定目录,对于LVM分区,可直接使用lvextend和resize2fs调整文件系统大小。
