KVM 虚拟化

本文档系统讲解 KVM 虚拟化技术,涵盖虚拟化与云计算/容器的演进关系、半虚拟化与全虚拟化对比、KVM 安装部署(CPU 虚拟化检测、qemu-kvm/libvirt/virt-manager 等组件)、虚拟机创建(图形化与 virt-install 命令行)、虚拟机磁盘格式 qcow2 与 raw、virsh 常用命令、网络管理(NAT/私有网络与桥接网络)、快照、克隆、添加网卡与硬盘、磁盘文件迁移以及远程图形管理等内容。

一、虚拟化概述

1.1 技术演进

虚拟化 → 云计算 → 容器(DevOps)是现代基础设施的演进路线。

常见的虚拟化技术/产品包括:

  • Xen
  • KVM
  • VMware ESX / ESXi
  • OpenVZ
  • Oracle VM VirtualBox
  • vSphere

Red Hat 系发行版默认采用的虚拟化方案:

发行版本 默认虚拟化
RHEL 5 Xen
RHEL 6 KVM
RHEL 7 KVM

1.2 半虚拟化与全虚拟化

半(准)虚拟化:

  • 客户机操作系统内核必须经过修改,才能使用半虚拟化。
  • 典型代表:Xen。

全虚拟化:

  • 必须由 CPU 支持硬件虚拟化。
  • 客户机不需要修改内核,原则上可以安装任何操作系统。
  • Intel 平台:vmx;AMD 平台:svm。
  • 典型代表:KVM、VMware ESXi。

查看 CPU 是否支持硬件虚拟化:

# Intel
cat /proc/cpuinfo | grep vmx

# AMD
cat /proc/cpuinfo | grep svm

同时需要在 BIOS/EFI 中开启 Intel VT(或 AMD-V)技术。


二、KVM 安装

2.1 环境准备

确认系统版本:

cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

宿主机需准备好 yum 源。只使用本地镜像 yum 源即可,不要添加公网 CentOS 源和 EPEL 源,否则安装的软件版本可能过新,导致兼容性问题。

2.2 检测 CPU 虚拟化支持

cat /proc/cpuinfo | grep -E "vmx|svm"

若有输出说明 CPU 支持硬件虚拟化;同时要确认 BIOS/EFI 中已开启 Intel VT 技术。

2.3 安装 KVM 相关软件包

yum install qemu-kvm libvirt virt-install libvirt-python virt-manager libvirt-client virt-viewer -y

主要包说明:

软件包 作用
qemu-kvm KVM 用户空间组件,提供设备模拟
libvirt 虚拟化管理库与守护进程
virt-install 命令行创建虚拟机工具
libvirt-python libvirt 的 Python 绑定
virt-manager 图形化虚拟机管理器
libvirt-client libvirt 客户端工具(含 virsh)
virt-viewer 虚拟机图形控制台查看器

2.4 启动 libvirtd 服务

systemctl restart libvirtd
systemctl enable libvirtd
systemctl status libvirtd

2.5 确认 KVM 模块已加载

lsmod | grep kvm

输出示例:

kvm_intel             170181  0
kvm                   554609  1 kvm_intel
irqbypass              13503  1 kvm

若未加载,可手动装载:

modprobe kvm
modprobe kvm_intel        # Intel 平台;AMD 平台为 kvm_amd

模块加载成功后,内核会创建字符设备 /dev/kvm,这是判断 KVM 是否真正可用的最终依据:

ls -l /dev/kvm
# crw-rw----+ 1 root kvm 10, 232 ... /dev/kvm
现象 原因与处理
/dev/kvm 不存在 模块未加载,或 CPU 不支持虚拟化 / BIOS 中未开启 VT-x / AMD-V(见 2.1~2.3 节)
存在但普通用户 Permission denied 设备属组为 kvm,把用户加入该组:usermod -aG kvm <用户>,重新登录生效
嵌套虚拟化场景下不存在 宿主机的虚拟机未开启「虚拟化引擎 / 嵌套虚拟化」选项

一条命令做完整体检(libvirt-client 包提供):virt-host-validate,它会逐项检查 CPU 虚拟化支持、/dev/kvm 可用性、IOMMU、cgroup 等,比逐条手查更快。


三、创建虚拟机

3.1 图形化安装

virt-manager

与 Xen 的命令相同,打开虚拟机管理器后按向导操作:

  1. 安装方式:选择第一项,使用 ISO 镜像直接安装。
  2. 安装路径:填写 ISO 在宿主机上的路径,例如 /data/CentOS-7-x86_64-DVD-1611.iso。
  3. 内存与 CPU:
    • 内存大小:800M。若内存过小,安装时无法使用图形安装方式,只能使用文本安装方式。
    • CPU 个数:2,不能大于宿主机的 CPU 核数。
  4. 硬盘大小:20G。默认磁盘路径为 /var/lib/libvirt/images/kvm1.qcow2。
  5. 虚拟机名称:kvm1(自定义)。网络默认只能选择 default,这是一个 NAT(私有)网络;桥接网络需要后续单独配置后才能选择。

3.2 命令行安装(virt-install)

virt-install --name "kvm1" --memory 800 --vcpus 2 \
  --disk=/var/lib/libvirt/images/kvm1.qcow2,size=20 \
  -l /data/CentOS-7-x86_64-DVD-1611.iso \
  --network bridge=virbr0

常用参数说明:

参数 说明
--name 虚拟机名称
--memory 内存大小(MB)
--vcpus 虚拟 CPU 个数
--disk 磁盘路径及大小(GB)
-l 安装介质(ISO 或树)路径
--network 网络连接方式

四、virsh 常用命令

4.1 查看帮助

virsh help
virsh help domain
virsh help network
virsh help monitor

由于参数很多,可以使用 domain、network、monitor 等关键字只查看相关参数的帮助。

4.2 列出虚拟机

# 列出正在运行的虚拟机
virsh list
 Id    Name                           State
----------------------------------------------------
 1     kvm1                           running
# 列出所有虚拟机(包括任何状态)
virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     kvm1                           running
 -     kvm2                           shut off

4.3 启动、关闭与重启

virsh start kvm1       # 启动一个虚拟机
virsh shutdown kvm1    # 正常关闭(先停服务再关电源)
virsh reboot kvm1      # 正常重启(先 shutdown 再 start)
virsh destroy kvm1     # 强制关闭,类似断电,可瞬间关闭
virsh reset kvm1       # 相当于先 destroy 再 start

4.4 保存、暂停与恢复

# 关闭 kvm1 并将当前状态保存为文件(路径和名字自定义)
virsh save kvm1 /etc/libvirt/qemu/kvm1.save

# 通过保存的文件恢复当时的状态
virsh restore /etc/libvirt/qemu/kvm1.save

# 暂停 kvm1
virsh suspend kvm1

# 由暂停恢复为继续运行
virsh resume kvm1

4.5 连接虚拟机

方法一:图形管理器

virt-manager

打开管理器后双击要连接的虚拟机。

方法二:virt-viewer

virt-viewer kvm1

连接一个已启动的虚拟机并以图形方式查看。

方法三:SSH

ssh x.x.x.x

非图形方式连接,需要虚拟机已配置好 IP。

方法四:virsh console

非图形方式也可以使用 console 连接,此方法不需要虚拟机配置 IP,但需要配置串口授权。

virsh console kvm1

授权做法:

  1. 在 kvm1 虚拟机内部(不是宿主机)操作:
grubby --update-kernel=ALL --args="console=ttyS0"
reboot
  1. 在宿主机上使用 virsh console kvm1 连接。

  2. 退出方式:

    • exit 仅退出当前登录的用户;
    • 要完全退出 console 连接,使用 Ctrl + ](右中括号键)。

4.6 virsh 常用命令速查表

类别 命令 说明
查看 virsh list 列出运行中的虚拟机
查看 virsh list --all 列出所有虚拟机
电源 virsh start <域> 启动虚拟机
电源 virsh shutdown <域> 正常关闭
电源 virsh reboot <域> 正常重启
电源 virsh destroy <域> 强制断电
电源 virsh reset <域> 强制重启
状态 virsh save <域> <文件> 保存状态到文件
状态 virsh restore <文件> 从文件恢复状态
状态 virsh suspend <域> 暂停
状态 virsh resume <域> 恢复
连接 virsh console <域> 串口字符连接
配置 virsh edit <域> 编辑虚拟机 XML 配置
定义 virsh define <xml> 定义(注册)虚拟机
删除 virsh undefine <域> 取消定义虚拟机
克隆 virt-clone 克隆虚拟机(shell 命令)

五、虚拟机文件与删除

5.1 相关文件路径

以 kvm1 为例:

文件类型 路径
配置文件 /etc/libvirt/qemu/kvm1.xml
磁盘文件(默认) /var/lib/libvirt/images/kvm1.qcow2

5.2 打开配置文件

方法一:直接使用编辑器:

vim /etc/libvirt/qemu/kvm1.xml

方法二:使用 virsh:

virsh edit kvm1

5.3 删除虚拟机

以删除 kvm3 为例:

virsh destroy kvm3
virsh undefine kvm3
# 磁盘文件需要手动删除
rm -rf /var/lib/libvirt/images/kvm3.qcow2

undefine 只删除虚拟机定义,磁盘文件需手动删除。


六、KVM 克隆

注意:克隆时源虚拟机必须处于关闭或暂停状态。

6.1 图形化克隆

  1. 先关闭 kvm1,或执行 virsh suspend kvm1 暂停(使用 virsh resume kvm1 恢复)。
  2. 在 virt-manager 中右键点击 kvm1 → 选择 Clone → 修改克隆后的名字或其他参数 → 点击 Clone。

6.2 命令行克隆(virt-clone)

virt-clone -o kvm1 -n kvm11 -f /var/lib/libvirt/images/kvm11.qcow2

输出示例:

Allocating kvm4.qcow2  7% [-          ]  34 MB/s | 957 MB     05:29 ETA

将 kvm1 克隆为 kvm11,指定磁盘路径为 /var/lib/libvirt/images/kvm11.qcow2。若 kvm1 有多个硬盘,克隆时也要对应指定多个目标路径。

参数说明:

参数 说明
-o 源虚拟机(original)
-n 新虚拟机名称(new)
-f 新磁盘文件路径(file)

6.3 手动克隆

1. 拷贝配置文件和磁盘文件

cp /etc/libvirt/qemu/kvm1.xml /etc/libvirt/qemu/kvm3.xml
cp /var/lib/libvirt/images/kvm1.qcow2 /var/lib/libvirt/images/kvm3.qcow2

2. 修改拷贝后的配置文件

vim /etc/libvirt/qemu/kvm3.xml

需要修改 <name>、<uuid>、磁盘路径、MAC 地址等:

<domain type='kvm'>
  <name>kvm3</name>
  <uuid>811d69e8-b1d8-cfbf-684a-69f2e0af6b88</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/var/lib/libvirt/images/kvm3.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:5c:3a:2d'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

修改要点:

  • <name> 改为新虚拟机名称(如 kvm3)。
  • <uuid> 随意修改几位,保证唯一。
  • <source file> 改为新磁盘文件路径。
  • <mac address> 修改后几位,保证不冲突。

3. 定义虚拟机

保存后,直接使用 virsh list --all 是查看不到的,需要先 define 一下:

virsh define /etc/libvirt/qemu/kvm3.xml

再次查看即可看到 kvm3:

virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     kvm1                           shut off
 -     kvm1-clone                     shut off
 -     kvm2                           shut off
 -     kvm3                           shut off

4. 启动克隆虚拟机

virsh start kvm3

七、KVM 网络管理

KVM 网络简单划分为两类:桥接网络 和 私有网络(NAT)。

7.1 查看网络帮助与列表

virsh help network
virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes

default 是一个 NAT 网络(私有网络)。

查看 default 网络详情:

virsh net-info default
Name            default
UUID            704eb1b7-3feb-4a38-8642-9c3fe2f023bb
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

即:名为 default、类型为 NAT(私有网络)、连接在宿主机 virbr0 网桥上的网络。

default 网段的配置文件路径为:

/etc/libvirt/qemu/networks/default.xml

启动与停止 default 网络:

virsh net-destroy default   # 停掉,状态变为 inactive
virsh net-start default     # 启动,状态变为 active

7.2 网络模型说明

星形网络拓扑示意:

        PC1          PC2
          \          /
           交换机(vmnet0、vmnet1、vmnet8、default、default1...)
          /          \
        PC3          PC4
网络类型 说明
桥接(Bridge) 与宿主机物理网卡在同一个物理交换机上
私有网络(NAT/Isolated/Routed) 私自虚拟的网络,不与宿主机在同一个物理交换机上

7.3 图形化增加私有网络

在 virt-manager 中:Edit → Connection Details → Virtual Networks → 点击左下角的 + 号增加私有网络(选择名字、网络分配地址范围、DHCP 分配范围)。

最后一步有三种私有网络类型可选:

类型 说明
isolated 相当于 VMware 的 host-only,没有 NAT,也没有网关
NAT 有网关、有 NAT,可以通过宿主机访问外网
routed 相当于在 isolated 基础上加了一个网关

完成后,在宿主机上使用 ifconfig 或 virsh net-list --all 即可看到新加的网络。

7.4 手动添加私有网络

1. 拷贝并修改配置文件

cp /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/default2.xml
vim /etc/libvirt/qemu/networks/default2.xml
<network>
  <name>default2</name>
  <uuid>243166ddb-e2fd-9983-1997-5e8efdc06c42</uuid>
  <bridge name='virbr2' stp='on' delay='0' />
  <mac address='52:54:00:AF:51:25'/>
  <ip address='192.168.101.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.101.128' end='192.168.101.254' />
    </dhcp>
  </ip>
</network>

修改要点:名称、UUID、bridge 名称(virbr2)、MAC 地址(改后三位)、IP 网段与 DHCP 范围。

2. 定义并启动网络

virsh net-define /etc/libvirt/qemu/networks/default2.xml   # 定义后状态为 inactive、autostart 为 no
virsh net-start default2                                   # 启动

验证:

ifconfig virbr2 | head -2
virbr2    Link encap:Ethernet  HWaddr 52:54:00:AF:51:25
          inet addr:192.168.101.1  Bcast:192.168.101.255  Mask:255.255.255.0

3. 设置开机自启动

virsh net-autostart default2

查看自启动目录(实际是配置文件的软链接):

ls /etc/libvirt/qemu/networks/autostart/
default1.xml  default2.xml  default.xml

所有网络配置文件都位于:

ls /etc/libvirt/qemu/networks/
autostart  default1.xml  default2.xml  default.xml

7.5 修改网络配置

1. 编辑配置文件

vim /etc/libvirt/qemu/networks/default2.xml

例如将网段从 192.168.101.0 改为 192.168.102.0,并添加 routed 转发:

<network>
  <name>default2</name>
  <uuid>243166ddb-e2fd-9982-1996-5e8efdc06c42</uuid>
  <forward dev='eth0' mode='route'>
    <interface dev='eth0'/>
  </forward>
  <bridge name='virbr2' stp='on' delay='0' />
  <mac address='52:54:00:AF:166:45'/>
  <ip address='192.168.102.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.102.128' end='192.168.102.254' />
    </dhcp>
  </ip>
</network>

保存后直接 ifconfig virbr2 查看不会立即改变,需要执行以下步骤。

2. 重新定义并重启网络

virsh net-define /etc/libvirt/qemu/networks/default2.xml
Network default2 defined from /etc/libvirt/qemu/networks/default3.xml
virsh net-destroy default2
Network default2 destroyed
virsh net-start default2
Network default2 started

此时 ifconfig virbr2 即可看到已变为 192.168.102.1。

也可以直接使用 virsh net-edit default2 编辑并保存,之后只需 net-destroy + net-start,无需再 net-define。

7.6 删除网络

图形化方式: 在 virt-manager → Edit → Connection Details → Virtual Networks 中选择要删除的网络,先停止再删除。

命令行方式:

virsh net-destroy default2    # 停掉,状态变为 inactive
virsh net-undefine default2   # 删除网络定义,物理配置文件也一并删除

7.7 配置桥接网络(Bridge)

将物理网卡(如 enp2s0)桥接到 br0(名称自定义)。

1. 停止并禁用 NetworkManager

systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl status NetworkManager

2. 创建桥接网卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=3.3.3.251
NETMASK=255.255.255.0
GATEWAY=3.3.3.2
DNS1=114.114.114.114
ONBOOT=yes

注意:TYPE=Bridge 中 B 必须大写,其余小写。

3. 修改物理网卡配置

将物理网卡(示例为 enp0s25)加入桥接,只保留以下三行:

vim /etc/sysconfig/network-scripts/ifcfg-enp0s25
DEVICE="enp0s25"
ONBOOT="yes"
BRIDGE=br0

4. 重启网络

systemctl restart network

重启后在宿主机上 ifconfig 查看:br0 有 IP,而原物理网卡 enp2s0 没有 IP,这是正常现象。

7.8 修改虚拟机网卡连接

图形化方式: 在 virt-manager 中双击虚拟机 → 点击左上角灯泡图标(Show virtual hardware details) → 找到网卡,修改为目标网络。建议网卡模块选择 virtio(这样网卡名称默认为 eth0、eth1……)。

命令行方式: 编辑虚拟机配置:

virsh edit kvm3

将 interface 从 network 改为 bridge:

    <interface type='network'>
      <mac address='52:54:00:07:8d:e5'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

修改为:

    <interface type='bridge'>
      <mac address='52:54:00:07:8d:e5'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

重启虚拟机使其生效:

virsh shutdown kvm1
virsh start kvm1

重启后虚拟机即使用桥接网络。


八、磁盘格式与管理

8.1 qcow2 与 raw 格式

特性 raw qcow2
说明 老版本默认格式,裸盘格式 新版本默认格式,支持快照、压缩、加密等
快照 不支持 支持
占用空间 立即分配全部空间 按需增长(thin provisioning)

默认磁盘路径:/var/lib/libvirt/images/<虚拟机名>.qcow2。

8.2 使用 dd 创建磁盘文件并转换格式

使用 dd 创建一个稀疏磁盘文件:

dd if=/dev/zero of=/var/lib/libvirt/images/kvm4-2.img bs=1M count=1 seek=400

seek 表示跳过多少个 BS 块,这里创建的是一个名义上 400M 的文件(实际只占用 1M)。

查看磁盘信息:

qemu-img info /var/lib/libvirt/images/kvm4-2.img
image: /var/lib/libvirt/images/kvm4-2.img
file format: raw
virtual size: 3.8T (4194305048576 bytes)
disk size: 1.0M

将 raw 转换为 qcow2:

cd /var/lib/libvirt/images/
qemu-img convert -f raw -O qcow2 kvm4-2.img kvm4-2.qcow2
rm -f kvm4-2.img

再次查看:

qemu-img info /var/lib/libvirt/images/kvm4-2.qcow2
image: /var/lib/libvirt/images/kvm4-2.qcow2
file format: qcow2
virtual size: 3.8T (4194305048576 bytes)
disk size: 256K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

九、快照

在 RHEL 7 / CentOS 7 下使用快照非常方便、速度快,前提条件是磁盘格式为 qcow2。

查看快照帮助:

virsh help snapshot

常用快照命令:

# 列出 kvm1 的快照
virsh snapshot-list kvm1

# 为 kvm1 当前状态创建快照,名称为 snap1,描述信息自定义
virsh snapshot-create-as --domain kvm1 snap1 --description "my first test snapshot"

# 恢复 kvm1 的快照 snap1
virsh snapshot-revert kvm1 snap1

# 删除 kvm1 的快照 snap1
virsh snapshot-delete kvm1 snap1

十、添加网卡与硬盘

10.1 图形化添加

在 virt-manager 中双击打开 kvm1 → 点击左上角灯泡图标(Show virtual hardware details) → 点击左下角 Add Hardware,直接添加并填写相关参数。

注意事项:

  • Device type 选择 virtio:无需重启虚拟机即可直接生效,磁盘名为 vda、vdb、vdc……
  • 若选择 IDE disk、SATA disk、SCSI disk:需要重启,磁盘名为 sda、sdb、sdc……
  • 添加网卡同样建议选择 virtio,网卡名称默认为 eth0、eth1……

图形方式在线删除磁盘后,仍需手动 rm 删除物理磁盘文件(xxx.qcow2)。

10.2 命令行添加硬盘

1. 创建并转换磁盘文件

见第 8.2 节,使用 dd 创建后用 qemu-img convert 转为 qcow2。

2. 编辑虚拟机配置

virsh edit kvm4

在 <devices> 与 </devices> 之间添加以下内容(也可以拷贝其他磁盘配置段落进行修改):

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' />
      <source file='/var/lib/libvirt/images/kvm4-2.qcow2'/>
      <target dev='vdb' bus='virtio'/>
      <boot order='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>

修改要点:

  • driver type 确认为 qcow2。
  • source file 改为新磁盘文件路径。
  • target dev 新硬盘命名为 vdb。
  • boot order 若与其他设备冲突,改为未使用的数字。
  • address slot 修改为未被占用的编号(如从 0x07 改为 0x08)。

若 PCI 编号冲突,保存会失败。

3. 重启虚拟机

重启后(有时 reboot 不生效,需要先 force off 再启动),登录后使用 fdisk 即可看到新硬盘。

10.3 迁移磁盘文件路径

当 /var 目录空间不足时,可将磁盘文件迁移到其他目录(如 /data/kvm/)。

  1. 关闭虚拟机:
virsh destroy kvm1
  1. 移动磁盘文件:
mv /var/lib/libvirt/images/kvm1.qcow2 /data/kvm/
  1. 修改配置中的磁盘路径:
virsh edit kvm1
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' />
      <source file='/data/kvm/kvm1.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>

将 <source file> 路径改为 mv 后的新路径。

  1. 重新启动虚拟机:
virsh start kvm1

十一、KVM 远程图形管理

11.1 场景说明

示例:在 192.168.1.9(管理端宿主机)上远程图形管理 192.168.1.251(被管理宿主机)。

11.2 配置步骤

1. 绑定主机名

在管理端的 /etc/hosts 中绑定被管理宿主机的主机名。

2. 配置 SSH 等效性

# 生成密钥(三次回车)
ssh-keygen

# 加入自己的私钥
ssh-add /root/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
# 将公钥拷贝到被管理宿主机
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.251

3. 启动被管理端服务

所有被管理的宿主机都需要启动 libvirtd 服务:

systemctl start libvirtd
systemctl enable libvirtd

4. 添加远程连接

在 virt-manager 中:File → Add Connection,填写要远程连接的主机 IP(或主机名,需 /etc/hosts 绑定)。

5. 远程管理

连接成功后即可看到远程的虚拟客户机,双击即可远程调取其图形控制台。

11.3 命令行方式连接

virt-viewer -c qemu+ssh://root@192.168.122.82/system kvm3

表示使用 root 用户(前提是前面配置的 SSH 等效性也是 root 用户)访问 192.168.1.251 上名为 kvm1 的虚拟机。


十二、常见排错与注意事项

  1. CPU 不支持虚拟化:检查 /proc/cpuinfo 中是否有 vmx 或 svm,并在 BIOS/EFI 中开启 Intel VT-x / AMD-V。
  2. yum 源问题:仅使用本地镜像源,避免公网源导致软件版本过新引发兼容性问题。
  3. 内存不足:创建虚拟机时内存过小会导致无法使用图形安装,只能进入文本安装模式。
  4. 克隆失败:克隆时源虚拟机必须处于关闭或暂停状态。
  5. console 无法连接:需在客户机内通过 grubby --update-kernel=ALL --args="console=ttyS0" 配置串口授权并重启;退出 console 使用 Ctrl + ]。
  6. 快照不生效:快照要求磁盘格式为 qcow2,raw 格式不支持快照。
  7. 删除虚拟机后磁盘仍在:virsh undefine 只删除定义,磁盘文件需手动 rm。
  8. 桥接网络配置:需先停用 NetworkManager;TYPE=Bridge 大小写敏感;配置完成后物理网卡无 IP、br0 有 IP 属正常现象。
  9. 在线添加硬盘:选择 virtio 类型可热添加无需重启,设备名为 vda、vdb……;选择 IDE/SATA/SCSI 则需重启,设备名为 sda、sdb……
  10. PCI 地址冲突:使用 virsh edit 添加设备时,<address> 的 slot 不能与已有设备重复,否则保存失败。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏