KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它将Linux内核转化为一个Type-1(裸金属) hypervisor,允许用户在同一物理服务器上运行多个隔离的虚拟机(VM),KVM依赖于CPU的硬件虚拟化扩展(如Intel VT-x或AMD-V),并通过QEMU(Quick Emulator)提供设备模拟和I/O虚拟化,以下是KVM虚拟化中常用的命令及其详细说明,涵盖虚拟机管理、网络配置、存储管理等多个方面,并通过表格形式汇总关键命令,最后附上相关FAQs。

KVM虚拟机管理命令
KVM虚拟机的管理通常通过virsh命令行工具实现,它是libvirt库的命令行接口,支持虚拟机的创建、启动、停止、迁移等操作。
虚拟机生命周期管理
-
列出所有虚拟机:
virsh list --all
显示所有虚拟机的名称、ID和状态(running/shut off/paused等)。 -
启动虚拟机:
virsh start <vm_name>
启动指定的虚拟机,例如virsh start ubuntu-vm。 -
关闭虚拟机(正常关机):
virsh shutdown <vm_name>
向虚拟机发送关机信号,需在虚拟机内部安装acpid服务才能正常关机。
(图片来源网络,侵删) -
强制关闭虚拟机(相当于物理机断电):
virsh destroy <vm_name>
立即停止虚拟机,可能导致数据未保存,需谨慎使用。 -
挂起虚拟机:
virsh suspend <vm_name>
暂停虚拟机运行,状态为paused,可通过virsh resume恢复。 -
恢复挂起的虚拟机:
virsh resume <vm_name> -
删除虚拟机(仅删除配置,不删除磁盘文件):
virsh undefine <vm_name>
若需同时删除磁盘文件,需手动删除或使用--storage参数(需配置存储池)。
(图片来源网络,侵删)
虚拟机配置与查看
-
查看虚拟机配置信息:
virsh dumpxml <vm_name>
以XML格式输出虚拟机的详细配置,包括CPU、内存、磁盘、网络等参数。 -
编辑虚拟机配置:
virsh edit <vm_name>
打开默认文本编辑器(如vi)修改虚拟机XML配置,修改后需重启虚拟机生效。 -
查看虚拟机资源使用情况:
virsh dominfo <vm_name>
显示虚拟机的CPU、内存、磁盘等资源占用信息。 -
虚拟机控制台访问:
virsh console <vm_name>
直接连接虚拟机的串口控制台,需在虚拟机配置中启用串口并设置终端类型为pty。
虚拟机快照管理
快照用于保存虚拟机的某个时间点状态,便于后续恢复或回滚。
-
创建快照:
virsh snapshot-create-as <vm_name> <snapshot_name> --description "snapshot description"
virsh snapshot-create-as ubuntu-vm snap1 --description "pre-update snapshot"。 -
列出虚拟机所有快照:
virsh snapshot-list <vm_name> -
查看快照详情:
virsh snapshot-info <vm_name> <snapshot_name> -
恢复快照:
virsh snapshot-revert <vm_name> <snapshot_name>
恢复虚拟机到指定快照状态,恢复前需关闭虚拟机。 -
删除快照:
virsh snapshot-delete <vm_name> <snapshot_name>
KVM存储管理命令
KVM支持多种存储后端,如文件(qcow2、raw)、块设备、网络存储(NFS、iSCSI)等,通过virsh和qemu-img工具管理。
磁盘镜像管理
-
创建磁盘镜像(qcow2格式,支持快照和压缩):
qemu-img create -f qcow2 /var/lib/libvirt/images/ubuntu-vm.qcow2 20G
创建一个20GB的qcow2格式磁盘镜像。 -
转换磁盘格式(如raw转qcow2):
qemu-img convert -f raw -O qcow2 source.img target.qcow2 -
调整磁盘大小(需在虚拟机内部扩展文件系统):
qemu-img resize /var/lib/libvirt/images/ubuntu-vm.qcow2 +10G
磁盘容量增加10GB,虚拟机内需使用resize2fs(ext4)或xfs_growfs(XFS)扩容文件系统。 -
查看磁盘镜像信息:
qemu-img info /var/lib/libvirt/images/ubuntu-vm.qcow2
存储池管理
存储池是存储资源的逻辑集合,如目录、LVM卷、iSCSI目标等。
-
列出所有存储池:
virsh pool-list --all -
创建存储池(以目录为例):
virsh pool-define-as --name dir-pool --type dir --target /data/kvm-pool
定义名为dir-pool的目录存储池,目标路径为/data/kvm-pool。 -
启动存储池:
virsh pool-start dir-pool -
设置存储池自动启动:
virsh pool-autostart dir-pool -
删除存储池(需先停止并卸载):
virsh pool-destroy dir-pool && virsh pool-undefine dir-pool
KVM网络管理命令
KVM支持多种网络模式,如NAT(默认)、桥接(bridge)、仅主机网络(host-only)等,通过virsh和brctl工具管理。
虚拟网络管理
-
列出所有虚拟网络:
virsh net-list --all -
查看虚拟网络配置:
virsh net-dumpxml default
default是KVM默认的NAT网络名称。 -
启动虚拟网络:
virsh net-start default -
停止虚拟网络:
virsh net-stop default -
删除虚拟网络:
virsh net-undefine default
删除前需确保没有虚拟机使用该网络。
网桥配置
-
查看网桥状态:
brctl show
需安装bridge-utils工具包。 -
创建网桥(例如br0):
ip link add br0 type bridge && ip addr add 192.168.1.100/24 dev br0 && ip link set br0 up
将物理网卡(如eth0)加入网桥:ip link set eth0 master br0。 -
删除网桥:
ip link set eth0 nomaster && ip link del br0
KVM常用命令汇总表
| 功能分类 | 命令示例 | 说明 |
|---|---|---|
| 虚拟机生命周期 | virsh list --all |
列出所有虚拟机状态 |
virsh start <vm_name> |
启动虚拟机 | |
virsh destroy <vm_name> |
强制关闭虚拟机 | |
| 虚拟机配置 | virsh dumpxml <vm_name> |
查看虚拟机XML配置 |
virsh edit <vm_name> |
编辑虚拟机配置 | |
| 快照管理 | virsh snapshot-create-as <vm_name> <snap_name> |
创建快照 |
virsh snapshot-revert <vm_name> <snap_name> |
恢复快照 | |
| 存储管理 | qemu-img create -f qcow2 <disk_path> <size> |
创建磁盘镜像 |
qemu-img resize <disk_path> +<size> |
扩展磁盘大小 | |
virsh pool-list --all |
列出存储池 | |
| 网络管理 | virsh net-list --all |
列出虚拟网络 |
brctl show |
查看网桥状态 | |
| 性能监控 | virsh domblkstat <vm_name> |
查看虚拟机磁盘统计信息 |
virsh dommemstat <vm_name> |
查看虚拟机内存统计信息 |
相关问答FAQs
问题1:如何查看KVM虚拟机的实时资源占用情况(如CPU、内存使用率)?
解答:可通过以下方式查看:
- 使用
virsh命令:virsh cpu-stats <vm_name>:查看CPU实时使用统计。virsh memstat <vm_name>:查看内存使用统计。
- 使用
top或htop:在宿主机上执行top -p $(virsh qemu-command-info <vm_name> | grep PID | awk '{print $2}'),直接查看虚拟机进程的资源占用。 - 安装
virt-top工具:yum install virt-top(CentOS/RHEL)或apt install virt-top(Ubuntu),运行virt-top可实时显示所有虚拟机的资源使用情况,类似top命令。
问题2:KVM虚拟机无法启动,提示“domain is not running”或“failed to allocate memory”,如何排查?
解答:此类问题通常与资源分配或配置错误相关,可按以下步骤排查:
- 检查虚拟机状态:执行
virsh list --all确认虚拟机是否处于shut off或paused状态。 - 查看错误日志:通过
virsh logcat <vm_name>或查看/var/log/libvirt/qemu/<vm_name>.log定位具体错误,如内存不足(failed to allocate memory)需检查宿主机内存是否充足;磁盘文件损坏需检查磁盘镜像文件是否存在或使用qemu-img check验证。 - 检查资源配置:使用
virsh dumpxml <vm_name>查看CPU、内存配置是否超出宿主机限制,例如宿主机总内存为16GB,若虚拟机配置为32GB则无法启动。 - 检查存储池/网络:确认虚拟机关联的存储池是否已启动,网络配置是否正确(如NAT网络是否运行)。
- 尝试强制重启:若配置无问题,可尝试
virsh undefine <vm_name>后重新定义虚拟机,或使用virsh reset <vm_name>强制重启虚拟机(可能导致数据丢失)。
