跳转至

KVM常用命令

虚拟机管理

显示运行的虚拟机

Bash
virsh list

显示所有的虚拟机

Bash
virsh list --all

创建虚拟机

Bash
1
2
3
4
virt-install --name test --ram 4096 \
  --disk path=/home/images/test/test_centos-7-cloud.qcow2,size=20,format=qcow2 \
  --graphics vnc,listen=0.0.0.0 --noautoconsole --network network=default --force \
  --autostart --os-type=linux --os-variant=rhel7 --import

使用现有硬盘启动虚拟机

Bash
virt-install \
--name webvirtcloud \   # 虚拟机名字
--ram 4096 \            # 内存
--vcpus=4 \             # CPU
--os-variant detect=on,name=rocky10 \   # 指定OS类型,优化虚拟机性能
--import \              # 关键参数,告诉系统跳过安装过程,直接使用已有磁盘启动
--disk path=/opt/kvm_data/img/webvirtcloud.img,format=qcow2 \  # 指定硬盘地址
--network bridge=br0 \  #  定义网络类型,default 是使用 NAT 的默认虚拟网络
--graphics vnc,port=5901,listen=0.0.0.0 \   # 启用 VNC 以便远程访问
--noautoconsole \       # 命令执行后不自动连接控制台,让虚拟机在后台创建
--autostart             # 物理机开机自启动

连接虚拟机

Bash
virsh console <domain>  # 虚拟机的名字

退出:Ctrl + ]

虚拟机状态控制

挂起虚拟机

Bash
virsh suspend <domain>  # 虚拟机的名字

恢复被挂起的虚机

Bash
virsh resume <domain>  # 虚拟机的名字

虚机随宿主机启动而自启

Bash
virsh autostart <domain>  # 虚拟机的名字

关闭自动启动

Bash
virsh autostart --disable <domain>  # 虚拟机的名字

虚拟机启停操作

Bash
1
2
3
4
virsh start <domain>       # 启动
virsh shutdown <domain>    # 关闭,shutdown状态,未必能成功
virsh destroy <domain>     # 强制关闭虚机
virsh reboot <domain>      # 重启

虚拟机克隆

克隆虚机(需要暂停或关闭)

Bash
virt-clone -o test -n test1 --file /home/images/test/test1_centos-7-cloud.qcow2

参数说明:

  • -o test:被克隆的主机名
  • -n test1:新克隆的主机名
  • --file:新克隆主机的镜像存放地址

虚拟机删除

删除虚拟机

Bash
virsh undefine <domain>  # 虚拟机的名字

VNC管理

显示虚拟机VNC端口

Bash
virsh vncdisplay <domain>  # 虚拟机的名字

说明:

  • 显示结果为 :1 表示端口为 5901
  • 显示结果为 :2 表示端口为 5902
  • 以此类推,端口 = 5900 + 显示编号

磁盘管理

给虚拟机添加磁盘

1. 创建新的虚拟磁盘

Bash
# qemu-img create -f qcow2 -o size=10G /share/img/37.img

2. 添加虚拟磁盘到指定的虚拟机

Bash
1
2
3
virsh attach-disk --domain smokeping-slave --source /share/img/37.img \
  --target sdb --targetbus virtio --driver qemu \
  --subdriver qcow2 --sourcetype file --cache none --persistent

注意事项:

  • 这里的 --source 后面必须跟绝对路径

参数说明:

参数 说明
--persistent 会让此操作同时对运行的虚拟机以及虚拟机的 XML 文件都会生效
--target 设定在虚拟机中此设备的设备文件名称,最好在添加硬盘之前到虚拟机中先查看确认一下磁盘设备名称;然后此处设置名称顺延,比如我的虚拟机中原来只有一块盘,其设备文件名为 vda,所以我这里设定为 vdb
--targetbus 用来设定客户机磁盘的总线类型
--driver 根据模拟器决定,如果模拟器是 qemu 则此处的值只能是 qemu
--subdriver 磁盘源的类型
--sourcefile 磁盘源的大类,这里用的是 file,也可以使用 block

查看配置 XML

Bash
virsh dumpxml smokeping-slave

移除磁盘

Bash
virsh detach-disk --domain smokeping-slave --target sdb --persistent --config --live

参数说明:

  • --domain:指定虚拟机名称
  • --target:指定要移除的磁盘设备名称
  • --persistent:持久化操作,同时修改运行配置和 XML 配置文件
  • --config:修改配置文件
  • --live:对正在运行的虚拟机生效

常用技巧

查看虚拟机详细信息

Bash
virsh dominfo <domain>

查看虚拟机网络信息

Bash
virsh domiflist <domain>

查看虚拟机CPU使用情况

Bash
virsh vcpuinfo <domain>

查看虚拟机内存使用情况

Bash
virsh dommemstat <domain>

查看虚拟机磁盘信息

Bash
virsh domblklist <domain>

编辑虚拟机配置

Bash
virsh edit <domain>

修改虚拟机配置后重载

Bash
virsh define <xml-file>

设置虚拟机开机自启动

Bash
virsh autostart <domain>

取消虚拟机开机自启动

Bash
virsh autostart --disable <domain>

快照管理

创建快照

Bash
virsh snapshot-create <domain>

创建带名称的快照

Bash
virsh snapshot-create-as <domain> --name <snapshot-name>

列出快照

Bash
virsh snapshot-list <domain>

查看快照信息

Bash
virsh snapshot-info <domain> --snapshotname <snapshot-name>

恢复快照

Bash
virsh snapshot-revert <domain> --snapshotname <snapshot-name>

删除快照

Bash
virsh snapshot-delete <domain> --snapshotname <snapshot-name>

网络管理

列出网络

Bash
virsh net-list --all

查看网络详情

Bash
virsh net-dumpxml <network-name>

启动网络

Bash
virsh net-start <network-name>

停止网络

Bash
virsh net-destroy <network-name>

设置网络开机自启动

Bash
virsh net-autostart <network-name>

存储池管理

列出存储池

Bash
virsh pool-list --all

查看存储池详情

Bash
virsh pool-info <pool-name>

启动存储池

Bash
virsh pool-start <pool-name>

停止存储池

Bash
virsh pool-destroy <pool-name>

设置存储池开机自启动

Bash
virsh pool-autostart <pool-name>

故障排查

查看虚拟机日志

Bash
virsh domlog <domain>

查看虚拟机运行状态

Bash
virsh domstate <domain>

调试模式启动虚拟机

Bash
virsh start <domain> --console

查看虚拟机事件

Bash
virsh event --loop

性能优化

设置虚拟机CPU亲和性

Bash
virsh vcpupin <domain> <vcpu> <cpulist>

设置虚拟机内存大小

Bash
virsh setmem <domain> <size>

设置虚拟机CPU数量

Bash
virsh setvcpus <domain> <count> --maximum

调整虚拟机内存(动态调整)

Bash
virsh setmem <domain> <size> --live

迁移管理

迁移虚拟机(实时迁移)

Bash
virsh migrate --live <domain> qemu+ssh://<dest-host>/system

迁移虚拟机(离线迁移)

Bash
virsh migrate <domain> qemu+ssh://<dest-host>/system

备份与恢复

导出虚拟机配置

Bash
virsh dumpxml <domain> > <domain>.xml

导入虚拟机配置

Bash
virsh define <domain>.xml

备份虚拟机磁盘

Bash
cp <disk-image> <backup-image>

恢复虚拟机

Bash
1
2
3
4
5
# 1. 恢复配置文件
virsh define <domain>.xml

# 2. 启动虚拟机
virsh start <domain>

注意事项

  1. 磁盘操作前务必备份
  • 在添加或删除磁盘前,建议先对虚拟机进行快照或备份
  1. 使用绝对路径
  • 在添加磁盘时,--source 参数必须使用绝对路径
  1. 设备名称规划
  • 添加磁盘前先查看现有磁盘设备名称,按顺序分配(vda, vdb, vdc...)
  1. 持久化操作
  • 使用 --persistent 参数确保配置永久生效
  • 同时修改运行配置和 XML 文件
  1. 克隆虚拟机
  • 克隆前需要暂停或关闭虚拟机
  • 确保有足够的磁盘空间存放新镜像
  1. VNC端口
  • VNC显示编号从1开始
  • 实际端口号 = 5900 + 显示编号
  • 确保防火墙允许相应的端口访问
  1. 权限管理
  • 执行 virsh 命令通常需要 root 权限
  • 使用 sudo 或切换到 root 用户