KVM 基本使用

1. 启用虚拟化

检查 CPU 是否支持虚拟化

egrep -c '(vmx|svm)' /proc/cpuinfo  # 返回 ≥1 表示支持
Bash

安装 KVM 相关软件包

dnf install -y qemu-kvm libvirt virt-install virt-viewer
Bash

启动虚拟化服务:

systemctl enable --now libvirtd
Bash

检查当前主机是否满足 KVM 虚拟化运行条件:

virt-host-validate
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device '/dev/kvm' exists                                 : PASS
  QEMU: Checking if device '/dev/kvm' is accessible                          : PASS
  QEMU: Checking if device '/dev/vhost-net' exists                           : PASS
  QEMU: Checking if device '/dev/net/tun' exists                             : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)
Bash

2. 创建虚拟机

准备镜像:

# 下载一个镜像到宿主机
mkdir -p /kvm/iso/
cd /kvm/iso/
ll
-rw-r--r-- 1 root root 2252013568 Jul 10 14:14 Rocky-9.6-x86_64-minimal.iso
Bash

创建磁盘镜像路径:

mkdir -p /kvm/images/
Bash

创建网桥:(可选项,也可以默认的 NAT 模式)

# 查看网络设备
nmcli device 

# 创建网桥
nmcli connection add type bridge con-name br0 ifname br0

# 将上面查看到达物理网卡关联到网桥上,这里是 eno1
nmcli connection add type bridge-slave ifname eno1 master br0

# 先停止物理网卡原来的连接,然后启用桥接
nmcli connection down "eno1" && nmcli connection up br0

# 等待 DHCP 获取IP,然后查看 IP 配置到了 br0 上
ip addr

# 设置开机使用 br0 网桥连接
nmcli con mod "eno1" connection.autoconnect no
nmcli con mod br0 connection.autoconnect on
Bash

创建虚拟机:

virt-install \
    --name rocky-linux \
    --vcpus 2 \
    --memory 4096 \
    --disk path=/kvm/images/rocky-linux.qcow2,size=10 \
    --location /kvm/iso/Rocky-9.6-x86_64-minimal.iso \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 \
    --os-variant rocky9 \
    --console pty,target_type=serial \
    --extra-args 'console=ttyS0'
    
# 添加 --extra-args 'console=ttyS0' 参数时 --cdrom 需修改为 --location,否则会报错
Bash

参数说明:

  • --name: 虚拟机名称(如 ubuntu-vm)。
  • --vcpus: 虚拟 CPU 核心数(如 2)。
  • --memory: 内存大小(MB,如 2048 = 2GB)。
  • --disk path=...: 指定虚拟磁盘路径和大小(单位 GB)。
  • --cdrom: 指定安装 ISO 镜像。
  • --network: 网络配置(network=default 使用默认 NAT 网络)。
  • --graphics: 启用 VNC 图形界面。-graphics none 禁用图形界面
  • --os-variant: 优化虚拟机配置(通过 osinfo-query os 查看支持的系统)。
  • --console pty,target_type=serial: 配置串行控制台。
  • --extra-args 'console=ttyS0': 传递额外的参数给内核,设置控制台为 ttyS0

连接到虚拟机的串行控制台文本安装:

virsh console rocky-linux
Bash

VNC 连接图形界面安装:

virt-viewer rocky-linux  # 本地图形界面


# 在宿主机上查看虚拟机 VNC 端口
virsh vncdisplay rocky-linux  # 输出类似 :0(表示 5900 端口)、1(表示 5901 端口)
# 远程安装,使用 VNC 客户端连接宿主机 IP + 端口。
vncviewer <宿主机IP>:5900
Bash

3. 虚拟机基本管理命令

连接命令:

# 连接虚拟机控制台
virsh console rocky-linux
# 退出虚拟机控制台
ctrl ]
Bash

查看虚拟机信息命令:

# 查看所有虚拟机(包括关闭的)
virsh list --all

# 查看虚拟机概要信息
virsh dominfo rocky-linux

# 查看 CPU 配置
virsh vcpuinfo rocky-linux

# 查看内存配置
virsh dommemstat rocky-linux

# 查看虚拟机磁盘信息
virsh domblklist rocky-linux
Bash

基本管理命令:

# 启动虚拟机
virsh start rocky-linux
# 关闭虚拟机
virsh shutdown rocky-linux
# 强制停止
virsh destroy rocky-linux
# 删除虚拟机
virsh undefine rocky-linux
# 启用虚拟机的自动启动
virsh autostart rocky-linux
# 禁用虚拟机的自动启动
virsh autostart rocky-linux --disable


# 创建磁盘快照
virsh snapshot-create-as \
    --domain rocky-linux \
    --name snap1 \
    --description "第一次快照" \
    --disk-only \
    --diskspec vda,snapshot=external,file=/var/lib/libvirt/images/rocky-linux-snap1.qcow2
# --diskspec:
    # vda 指定虚拟机的磁盘
    # 快照类型:external 创建外部快照(生成增量文件,原磁盘变为只读),internal 内部快照(存储在单个磁盘文件中,仅限 qcow2 格式)
    # file=:指定外部快照文件的存储路径
# --disk-only:仅对磁盘做快照(不保存内存状态)。

# 创建完整快照
virsh snapshot-create-as \
    --domain rocky-linux \
    --name snap2 \
    --description "完整快照(内存+磁盘)" \
    --atomic
# --atomic:确保快照操作的原子性(要么完全成功,要么失败不影响原状态)。
# 不指定外部快照,则使用内部快照

# 查看快照
virsh snapshot-list rocky-linux
 Name    Creation Time               State
----------------------------------------------------
 snap1   2025-07-12 12:02:44 +0800   disk-snapshot
 snap2   2025-07-12 12:03:08 +0800   running
# 恢复快照
# 关闭虚拟机(如果正在运行)
virsh shutdown rocky-linux
# 恢复到指定快照
virsh snapshot-revert rocky-linux --snapshotname snap1
# 删除快照
virsh snapshot-delete rocky-linux --snapshotname snap1
Bash

修改配置命令:

# 编辑虚拟机配置,文件路径 /etc/libvirt/qemu/rocky-linux.xml
virsh edit rocky-linux

# 通过命名修改硬件配置
# 将虚拟机 CPU 核心数改为 4
virt-xml rocky-linux --edit --vcpu 4 

# 修改内存大小
virt-xml rocky-linux --edit --memory 8192  # 注意:单位是 MiB

# 添加新磁盘
# 添加一个 20GB 的磁盘
virt-xml rocky-linux --add-device --disk /var/lib/libvirt/images/rocky-linux-disk2.qcow2,size=20 --update

# 删除磁盘
# 删除指定磁盘(需先确认磁盘设备名,如 vdb)
virt-xml rocky-linux --remove-device --disk target=vdb --update

# 增大虚拟机磁盘文件
## 关闭虚拟机
virsh shutdown rocky-linux
## 调整磁盘文件大小
qemu-img resize /kvm/images/rocky-linux.qcow2 +10G  # + 增加 10GB,直接使用 30G 则直接设置为 30GB(绝对值)。
chown qemu:qemu /kvm/images/rocky-linux.qcow2
## 启动虚拟机
virsh start rocky-linux
virsh console rocky-linux  # 连接控制台
## 在虚拟机中查看磁盘,可以将空闲空间新建一个分区。推荐使用 lvm
lsblk
Bash

复制虚拟机:

# 先关闭虚拟机
virsh shutdown rocky-linux
virt-clone \
    --original rocky-linux \
    --name rocky-linux-copy \
    --auto-clone
Bash
上一篇