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 的命令相同,打开虚拟机管理器后按向导操作:
- 安装方式:选择第一项,使用 ISO 镜像直接安装。
- 安装路径:填写 ISO 在宿主机上的路径,例如
/data/CentOS-7-x86_64-DVD-1611.iso。 - 内存与 CPU:
- 内存大小:800M。若内存过小,安装时无法使用图形安装方式,只能使用文本安装方式。
- CPU 个数:2,不能大于宿主机的 CPU 核数。
- 硬盘大小:20G。默认磁盘路径为
/var/lib/libvirt/images/kvm1.qcow2。 - 虚拟机名称:
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
授权做法:
- 在 kvm1 虚拟机内部(不是宿主机)操作:
grubby --update-kernel=ALL --args="console=ttyS0"
reboot
-
在宿主机上使用
virsh console kvm1连接。 -
退出方式:
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 图形化克隆
- 先关闭
kvm1,或执行virsh suspend kvm1暂停(使用virsh resume kvm1恢复)。 - 在
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/)。
- 关闭虚拟机:
virsh destroy kvm1
- 移动磁盘文件:
mv /var/lib/libvirt/images/kvm1.qcow2 /data/kvm/
- 修改配置中的磁盘路径:
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 后的新路径。
- 重新启动虚拟机:
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 的虚拟机。
十二、常见排错与注意事项
- CPU 不支持虚拟化:检查
/proc/cpuinfo中是否有vmx或svm,并在 BIOS/EFI 中开启 Intel VT-x / AMD-V。 - yum 源问题:仅使用本地镜像源,避免公网源导致软件版本过新引发兼容性问题。
- 内存不足:创建虚拟机时内存过小会导致无法使用图形安装,只能进入文本安装模式。
- 克隆失败:克隆时源虚拟机必须处于关闭或暂停状态。
- console 无法连接:需在客户机内通过
grubby --update-kernel=ALL --args="console=ttyS0"配置串口授权并重启;退出 console 使用Ctrl + ]。 - 快照不生效:快照要求磁盘格式为 qcow2,raw 格式不支持快照。
- 删除虚拟机后磁盘仍在:
virsh undefine只删除定义,磁盘文件需手动rm。 - 桥接网络配置:需先停用 NetworkManager;
TYPE=Bridge大小写敏感;配置完成后物理网卡无 IP、br0有 IP 属正常现象。 - 在线添加硬盘:选择 virtio 类型可热添加无需重启,设备名为
vda、vdb……;选择 IDE/SATA/SCSI 则需重启,设备名为sda、sdb…… - PCI 地址冲突:使用
virsh edit添加设备时,<address>的slot不能与已有设备重复,否则保存失败。
此处评论已关闭