欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > KVM 虚拟化

KVM 虚拟化

2025/6/17 11:24:06 来源:https://blog.csdn.net/2501_91112123/article/details/148687102  浏览:    关键词:KVM 虚拟化

一、案例背景与目标

1.1 案例背景

在企业 IT 环境中,常常面临 Linux 服务器硬件资源利用率不高的问题。为了充分利用这些闲置资源,部署 KVM 虚拟化平台成为一种高效的解决方案。通过 KVM,可以在单一物理服务器上运行多个业务系统,实现资源的最大化利用。例如,在运行 Nginx 服务的服务器上部署 KVM,然后在 KVM 虚拟机上运行 Tomcat 等其他服务,从而提高硬件资源的利用率,降低企业 IT 成本。

1.2 技能目标5

本案例旨在帮助读者掌握以下技能:

  • 深入理解 KVM 虚拟化原理
  • 熟练掌握 KVM 虚拟化架构的部署方法
  • 能够独立创建和管理 KVM 虚拟机实例

二、KVM 虚拟化原理详解

2.1 KVM 的组成结构

广义的 KVM 虚拟化技术主要由两部分组成:

  • KVM 内核模块:基于 Linux 内核开发,主要负责模拟处理器和内存资源,为虚拟机的运行提供底层支持
  • Qemu:经过简化和修改的 Qemu 组件,主要处理 I/O 操作,并为用户提供虚拟机管理的用户空间工具

这两部分相互协作,共同构成了一个完整的虚拟化平台。需要注意的是,Qemu 本身是一套独立的虚拟化解决方案,纯软件实现所有虚拟化功能,但性能较低。而 KVM 通过与 Linux 内核的深度整合,在性能、安全性、兼容性和稳定性方面都有出色表现。

2.2 KVM 运6789行时的三种模式

KVM 的引入为 Linux 系统增加了一种新的运行模式 —— 客户模式,从而形成了三种运行模式:

2.2.1 客户模式

客户模式是客户机操作系统运行的模式,它又分为两个子模式:

  • 用户模式:为用户提供虚拟机管理的用户空间工具,并代表用户执行 I/O 操作,Qemu 就运行在这个模式下
  • 内核模式:负责模拟 CPU 和内存,实现客户模式的切换,并处理从客户模式的退出,KVM 内核模块运行在此模式
2.2.2 原有Linux 模式
  • 内核模式:Linux 主机操作系统的内核运行模式
  • 用户模式:Linux 主机操作系统的用户空间运行模式

三种模式的层次关系如图 1.2 所示,用户空间的 Qemu 通过 IOCTL 系统调用与内核模式的 KVM 驱动进行交互,实现对虚拟机的管理和控制。

2.3 KVM 工作原理

KVM 的工作流程如下:

  1. 用户模式的 Qemu 利用 libkvm 接口,通过 ioctl 系统调用进入内核模式
  2. KVM 驱动为虚拟机创建虚拟 CPU 和虚拟内存
  3. 执行 VMLAUNCH 指令进入客户模式,装载并运行 Guest OS
  4. 在 Guest OS 运行过程中,如果发生中断或影子缺页等异常情况,将暂停 Guest OS 的运行,保存当前上下文并退出到内核模式处理异常
  5. 在内核模式处理异常时,如果不需要 I/O 操作,处理完成后重新进入客户模式;如果需要 I/O 操作,则进入用户模式,由 Qemu 处理 I/O
  6. I/O 处理完成后,依次进入内核模式和客户模式,继续运行 Guest OS

三、案例环境准备

3.1 实验环境配置

本案例使用的实验环境如下表所示:

主机名操作系统IP 地址主要软件
bdqnCentOS 7.9 x86_64192.168.10.108KVM 虚拟机
test01CentOS 7.9 x86_64192.168.10.109-

3.2 案例需求
本案例需要完成以下任务:

  1. 在 bdqn 主机上安装 KVM 虚拟化平台
  2. 完成 KVM 的基本操作管理,包括虚拟机的创建、启动、停止等
  3. 掌握 KVM 命令行操作虚拟机的方法

3.3 实现思路
本案例的实现思路分为以下几个步骤:

  1. 准备 KVM 安装环境
  2. 安装 KVM 虚拟化软件
  3. 配置 KVM 桥接网络
  4. 创建 KVM 存储池并安装虚拟机
  5. 使用命令行操作虚拟机

四、KVM 虚拟化平台搭建

4.1 准备 KVM 虚拟化环境

4.1.1 YUM 安装 KVM 相关软件

在 CentOS 系统中,可以通过 YUM 方便地安装 KVM 所需的软件包。首先需要部署基于光盘镜像的本地 YUM 源,然后执行以下命令安装相关软件:

# 安装GNOME桌面环境
yum groupinstall -y "GNOME Desktop"
# 安装KVM模块
yum -y install qemu-kvm
# 安装KVM调试工具(可选)
yum -y install qemu-kvm-tools
# 安装构建虚拟机的命令行工具
yum -y install virt-install
# 安装qemu组件,用于创建磁盘和启动虚拟机
yum -y install qemu-img
# 安装网络支持工具
yum -y install bridge-utils
# 安装虚拟机管理工具
yum -y install libvirt
# 安装图形界面管理虚拟机工具
yum -y install virt-manager

安装完成后,需要将系统的默认运行目标更改为图形化界面,否则重启时可能会报错:

ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
4.1.2 验证36373839CPU 虚拟化支持

重启系统后,需要验证 CPU 是否支持虚拟化技术:

使用以下命令检查 KVM 模块是否正确安装:

lsmod | grep kvm

如果输出结果中包含kvm_intelkvm_amd,则说明 KVM 模块已成功加载

4.1.4 开42启 libvirtd 服务

安装完成后,需要启动 libvirtd 服务以提供相关支持:

# 启动libvirtd服务
systemctl start libvirtd
# 设置libvirtd服务开机自启
systemctl enable libvirtd

4.2 设置 KVM43网络(桥接模式)

4.2.1 网络模式介绍

在 libvirt 中运行 KVM 网络有两种模式:

  • NAT 模式:默认网络模式,数据包通过 NAT 方式经主机网卡接口传送,虚拟机可以访问外网,但外部主机无法访问虚拟机内部网络
  • 桥接模式:允许虚拟机像独立主机一样拥有网络,外部机器可以直接访问虚拟机内部,但需要网卡支持(一般有线网卡都支持)

本案例以桥接模式为例进行配置,宿主机 IP 地址为 192.168.10.1。首先编辑物理网卡配置文件:

vim /etc/sysconfig/network-scripts/ifcfg-ens33

添加以下内容

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=58b0765c-572c-4f63-89a7-1bf720b1fab0
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

然后编辑桥接网卡配置文件:

vim /etc/sysconfig/network-scripts/ifcfg-br0

添加以下内容:

TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
4.2.3 重启网络服务

配置完成后,重启网络服务使配置生效:

/etc/init.d/network restart
4.2.4 验证桥接配置

使用 ifconfig 命令查看网络配置,确认桥接网卡 br0 已正确配置 IP 地址:

ifconfig

如果看到 br0 的相关信息,说明网卡桥接成功。

4.3 使用 virt-manager 管理 KVM

4.3.1 启动 virt-manager

在命令行中输入以下命令启动图形化虚拟机管理工具 virt-manager

virt-manager
4.3.2 创建存储池
  1. 在 virt-manager 界面中,双击 QEMU/KVM,选择 "存储" 选项卡
  2. 单击 "+" 按钮新建存储池
  3. 在弹出的对话框中,输入存储池名称(如 bdqn),选择类型为 "dir. 文件系统目录"
  4. 浏览或输入存储目录(如 /data_kvm/store)
  5. 单击 "完成" 按钮创建存储池
4.3.3 创建镜像存储池

以同样的方式创建镜像存储池:

  1. 单击 "+" 按钮
  2. 输入名称(如 bdqn_iso)
  3. 设置目录为 /data_kvm/iso
  4. 单击 "完成" 按钮

在安装操作系统时,需要将 ISO 镜像上传到该目录。

4.3.4 创建存储卷
  1. 单击刚创建的存储池(如 bdqn)
  2. 单击对话框中 "卷" 右边的 "+" 按钮
  3. 输入存储卷名称(如 bdqn_kvm.qcow2)
  4. 选择格式为 qcow2
  5. 设置最大容量(如 10.0GB)
  6. 单击 "完成" 按钮创建存储卷
4.3.5 新建虚拟机
  1. 右击 "QEMU/KVM",选择 "新建" 选项
  2. 在弹出的对话框中选择 "本地安装介质",单击 "前进"
  3. 单击 "浏览" 按钮选择 ISO 镜像文件
  4. 选择操作系统类型及版本,单击 "前进"
  5. 分配内存和 CPU 资源(如 1 核 CPU、1GB 内存),单击 "前进"
  6. 点选 "选择或创建自定义存储",单击 "管理" 按钮选择存储卷文件,单击 "前进"
  7. 命名虚拟机(如 CentOS 7.3),勾选 "在安装前自定义配置",单击 "完成"
  8. 在 "引导选项" 视图中勾选 "主机引导时启动虚拟机",单击 "应用"
  9. 最后单击 "开始安装" 按钮,按照提示完成操作系统安装

五、KVM 命令行管理77787980虚拟机

5.1 虚拟机基本操作

5.1.1 查看命令帮助
virsh -h
5.1.2 查看配置文件目录
ls /etc/libvirt/qemu/
5.1.3 查看虚拟机状态
virsh list --all
5.1.4 控制虚拟机启动与关闭
# 启动虚拟机
virsh start test01
# 正常关闭虚拟机
virsh shutdown test01
# 强制关闭虚拟机
virsh destroy test01
5.1.5 挂起与恢复虚拟机
# 挂起虚拟机
virsh suspend test01
# 恢复虚拟机
virsh resume test01

5.1虚拟机自启动与配置管理

5.2.1 设置虚拟机自启动
virsh autostart test01

此命令将在 /etc/libvirt/qemu/autostart/ 目录下创建开机自动启动的配置文件。

5.2.2 导出与导入虚拟机配置
# 导出虚拟机配置到文件
virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml
# 通过配置文件临时启动虚拟机
virsh create /etc/libvirt/qemu/test01.xml
# 永久定义虚拟机配置
virsh define /etc/libvirt/qemu/test01.xml
5.2.3 虚拟机删除与恢复
# 关闭并删除虚拟机定义
virsh shutdown test01
virsh undefine test01
# 恢复虚拟机(需提前备份配置文件)
mv test02.xml test01.xml
virsh define test01.xml
5.2.4 修改虚拟机配置
# 直接编辑XML配置文件
vim /etc/libvirt/qemu/test01.xml
# 使用virsh交互编辑
virsh edit test01

5.3 磁盘与文件管理

5.3.1 磁盘格式操作
# 查看磁盘详细信息
qemu-img info /data_kvm/store/test01.qcow2
# 转换磁盘格式(raw转qcow2)
virsh shutdown test01
qemu-img convert -f raw -o qcow2 source.img target.qcow2
# 修改XML配置文件中的磁盘路径
virsh edit test01
5.3.2 虚拟机文件操作
# 安装文件操作工具
yum -y install libguestfs-tools-c
# 查看虚拟机文件内容
virt-cat -a /data_kvm/store/test01.qcow2 /etc/hosts
# 编辑虚拟机文件
virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
# 查看虚拟机磁盘使用情况
virt-df -h test01

5.4 虚拟机克隆与快照

5.4.1 虚拟机克隆
# 查看源虚拟机状态(需关闭)
virsh list --all
# 克隆虚拟机
virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
# 启动克隆的虚拟机
virsh start test02
5.4.2 虚拟机快照管理
# 创建快照(需磁盘为qcow2格式)
virsh snapshot-create test01
# 查看所有快照
virsh snapshot-list test01
# 查看当前快照
virsh snapshot-current test01
# 恢复到指定快照
virsh snapshot-revert test01 1503494464
# 删除快照
virsh snapshot-delete test01 1503494464

六、KVM 高级管理技巧

6.1 虚拟机资源调整

6.1.1 动态调整内存
# 查看当前内存配置
virsh dommemstat test01
# 动态增加内存(不重启虚拟机)
virsh setmaxmem test01 2048M --config
virsh setmem test01 2048M
# 永久修改内存配置
virsh edit test01
6.1.2 调整 CPU 资源
# 查看当前CPU配置
virsh vcpucount test01
# 动态增加CPU核心数(需虚拟机支持)
virsh setvcpus test01 2 --config --live
# 永久修改CPU配置
virsh edit test01

6.2 网络高级配置

6.2.1 创建虚拟网络
# 创建NAT模式虚拟网络
virsh net-create /usr/share/libvirt/networks/default.xml
# 查看虚拟网络列表
virsh net-list
# 启动/停止虚拟网络
virsh net-start default
virsh net-stop default
6.2.2 配置端口转发
# 编辑虚拟网络配置
virsh net-edit default
# 添加端口转发规则(示例:转发主机8080到虚拟机80)
<forward mode='nat'><port start='8080' end='8080' protocol='tcp'><guest port='80'/></port>
</forward>
# 重启网络使配置生效
virsh net-destroy default
virsh net-create /etc/libvirt/qemu/networks/default.xml

6.3 存储池高级管理

6.3.1 扩展存储池
# 查看存储池信息
virsh pool-info bdqn
# 扩展存储池空间(需先增加物理磁盘空间)
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir -p /data_kvm/store_ext
mount /dev/sdb1 /data_kvm/store_ext
# 扩展逻辑卷(如果使用LVM)
vgextend vg_kvm /dev/sdb1
lvextend -L +10G /dev/vg_kvm/lv_store
# 重新扫描存储池
virsh pool-scan bdqn
6.3.2 迁移存储池
# 停止存储池
virsh pool-stop bdqn
# 复制存储池到新位置
rsync -avz /data_kvm/store/ /new_storage/store/
# 修改存储池路径
virsh pool-edit bdqn
# 重新定义存储池
virsh pool-define /etc/libvirt/pools/bdqn.xml
# 启动存储池
virsh pool-start bdqn

七、常见问题与解决方案

7.1 安装与配置问题

7.1.1 CPU 虚拟化支持未开启
  • 现象:执行cat /proc/cpuinfo | grep vmx无输出
  • 解决方案
    1. 重启服务器进入 BIOS
    2. 在 CPU 配置中启用 Intel VT-x 或 AMD-V 虚拟化技术
    3. 保存设置并重启系统
7.1.2 桥接网络配置失败
  • 现象:重启网络后 br0 接口未生成 IP 地址
  • 解决方案
    1. 检查物理网卡配置文件是否正确设置BRIDGE=br0
    2. 确认桥接网卡配置文件中 IP 地址、网关设置正确
    3. 尝试手动创建桥接接口:brctl addbr br0; brctl addif br0 ens33; ifconfig br0 up

7.2 虚拟机运行问题

7.2.1 虚拟机无法启动
  • 现象:执行virsh start test01后虚拟机状态仍为关闭
  • 解决方案
    1. 检查虚拟机日志:tail -f /var/log/libvirt/qemu/test01.log
    2. 确认存储卷路径正确:virsh edit test01查看<source file>字段
    3. 检查磁盘空间是否充足:df -h /data_kvm/store
7.2.2 虚拟机网络不通
  • 现象:虚拟机无法访问外部网络或被外部访问
  • 解决方案
    1. 检查虚拟机网络配置是否正确(IP、子网掩码、网关)
    2. 确认桥接网络配置正确,物理网卡已加入桥接
    3. 检查宿主机防火墙设置:iptables -L -n确保允许相关流量

7.3 性能优化问题

7.3.1 虚拟机性能低下
  • 解决方案
    1. 启用 CPU 全虚拟化:在虚拟机配置中添加<cpu mode='host-passthrough'>
    2. 使用 virtio 驱动:安装qemu-guest-agentvirtio驱动
    3. 调整内存分配:确保虚拟机有足够内存,避免频繁 swap
    4. 优化存储:使用 SSD 存储或配置 RAID 提高磁盘性能
7.3.2 I/O 性能瓶颈
  • 解决方案
    1. 使用本地存储而非网络存储
    2. 配置磁盘缓存:在虚拟机配置中设置<driver cache='writeback'>
    3. 启用多队列网卡:在支持的硬件上配置num_queues=4

八、KVM 最佳实践

8.1 资源规划与分配

  • CPU 分配:单物理 CPU 核心建议最多分配给 2-3 个虚拟机
  • 内存分配:预留 20% 物理内存给宿主机系统
  • 存储规划
    • 系统盘使用 qcow2 格式并启用精简配置
    • 数据盘使用 raw 格式获得最佳性能
    • 重要数据建议配置存储池备份策略

8.2 安全与备份策略

  • 安全措施

    1. 启用 SELinux 增强安全性:setenforce 1
    2. 限制 libvirtd 服务访问:tcpwrappers配置/etc/hosts.allow
    3. 虚拟机内部部署防火墙和杀毒软件
  • 备份策略

    1. 定期对虚拟机配置文件和磁盘文件进行备份
    2. 使用快照功能保存重要状态点
    3. 重要数据建议实时同步到异地存储

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词