简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

Oracle Linux KVM虚拟化技术实战指南从基础部署到高级优化的企业级虚拟化解决方案全解析

3万

主题

349

科技点

3万

积分

大区版主

木柜子打湿

积分
31898

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-9 17:30:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 引言

Oracle Linux KVM(Kernel-based Virtual Machine)是一种开源的虚拟化解决方案,它将Linux内核转变为一个类型1(裸机)的hypervisor。作为企业级虚拟化技术,KVM在Oracle Linux中得到了充分的支持和优化,为用户提供了一个高性能、稳定且安全的虚拟化平台。

KVM利用Linux内核的虚拟化扩展(如Intel VT-x或AMD-V技术),允许用户在同一物理硬件上运行多个隔离的虚拟机(VM)。每个虚拟机都有自己的一套虚拟硬件(CPU、内存、存储、网络设备等),并可以运行独立的操作系统和应用程序。

本指南将全面介绍如何在Oracle Linux上部署、配置和管理KVM虚拟化环境,从基础概念到高级优化技术,帮助企业IT专业人员构建高效、可靠的虚拟化基础设施。

2. KVM基础概念

2.1 KVM架构

KVM架构主要由以下几个组件组成:

• KVM内核模块:包含kvm.ko(核心KVM模块)和特定于处理器的模块(如kvm-intel.ko或kvm-amd.ko)
• QEMU:提供硬件虚拟化的用户空间组件,模拟虚拟设备的I/O
• libvirt:管理虚拟化的API和守护进程,提供统一的虚拟化管理接口
• virt-install和virt-manager:命令行和图形界面的虚拟机管理工具

2.2 虚拟化类型

KVM支持两种虚拟化类型:

• 全虚拟化:客户机操作系统无需修改即可运行,适用于大多数操作系统
• 半虚拟化(Para-virtualization):客户机操作系统经过修改,能够感知虚拟环境,性能更高

2.3 虚拟化模式

在Oracle Linux KVM中,虚拟机可以运行在以下模式之一:

• 硬件辅助虚拟化(HVM):利用处理器的虚拟化扩展指令集
• 全虚拟化模式:通过二进制转换技术实现
• 半虚拟化模式:使用virtio驱动程序提高I/O性能

3. 环境准备与基础部署

3.1 硬件要求

在部署Oracle Linux KVM之前,确保硬件满足以下要求:

• 支持虚拟化扩展的CPU(Intel VT-x或AMD-V)
• 足够的内存(建议至少8GB,根据虚拟机数量和用途增加)
• 充足的存储空间(用于虚拟机磁盘镜像)
• 网络接口卡(建议至少两块,用于管理和虚拟机网络)

3.2 系统安装

安装Oracle Linux 7/8/9时,选择”Server with GUI”或”Minimal Install”选项。安装完成后,更新系统到最新版本:
  1. sudo yum update -y
复制代码

3.3 验证虚拟化支持

在安装KVM之前,先验证系统是否支持硬件虚拟化:
  1. # 检查CPU是否支持虚拟化
  2. grep -E 'vmx|svm' /proc/cpuinfo
  3. # 如果输出包含vmx(Intel)或svm(AMD),表示CPU支持虚拟化
  4. # 检查KVM内核模块是否已加载
  5. lsmod | grep kvm
  6. # 如果没有加载,可以手动加载
  7. sudo modprobe kvm
  8. sudo modprobe kvm_intel  # 或 kvm_amd
复制代码

3.4 安装KVM组件

安装KVM和相关管理工具:
  1. # Oracle Linux 7
  2. sudo yum install -y qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager virt-viewer
  3. # Oracle Linux 8/9
  4. sudo dnf install -y qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager virt-viewer
复制代码

3.5 启动libvirtd服务

安装完成后,启动并启用libvirtd服务:
  1. sudo systemctl start libvirtd
  2. sudo systemctl enable libvirtd
  3. # 验证服务状态
  4. sudo systemctl status libvirtd
复制代码

3.6 配置用户权限

将用户添加到libvirt组,以便无需root权限即可管理虚拟机:
  1. sudo usermod -aG libvirt $(whoami)
  2. newgrp libvirt
复制代码

3.7 验证KVM安装

验证KVM是否正确安装和配置:
  1. # 检查KVM是否可用
  2. virsh list --all
  3. # 如果没有错误,表示KVM已正确安装
复制代码

4. 虚拟机创建与管理

4.1 使用virt-manager创建虚拟机

virt-manager是一个图形界面工具,可以直观地创建和管理虚拟机:

1. 启动virt-manager:virt-manager
2. 在virt-manager主界面,点击”File” > “New Virtual Machine”
3. 选择安装方式:本地安装介质(ISO镜像)网络安装(HTTP、FTP、NFS)导入现有磁盘镜像
4. 本地安装介质(ISO镜像)
5. 网络安装(HTTP、FTP、NFS)
6. 导入现有磁盘镜像
7. 配置虚拟机参数:内存大小CPU数量磁盘空间网络配置
8. 内存大小
9. CPU数量
10. 磁盘空间
11. 网络配置
12. 完成创建并开始安装操作系统

启动virt-manager:
  1. virt-manager
复制代码

在virt-manager主界面,点击”File” > “New Virtual Machine”

选择安装方式:

• 本地安装介质(ISO镜像)
• 网络安装(HTTP、FTP、NFS)
• 导入现有磁盘镜像

配置虚拟机参数:

• 内存大小
• CPU数量
• 磁盘空间
• 网络配置

完成创建并开始安装操作系统

4.2 使用virt-install创建虚拟机

virt-install是一个命令行工具,适合批量创建虚拟机或自动化部署:
  1. # 创建一个基本的虚拟机
  2. virt-install \
  3.   --name ol8-vm1 \
  4.   --memory 2048 \
  5.   --vcpus 2 \
  6.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20 \
  7.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  8.   --os-variant ol8.5 \
  9.   --network network=default \
  10.   --graphics spice
复制代码

参数说明:

• --name:虚拟机名称
• --memory:内存大小(MB)
• --vcpus:虚拟CPU数量
• --disk:磁盘配置(路径和大小)
• --cdrom:安装介质路径
• --os-variant:操作系统类型(优化虚拟机配置)
• --network:网络配置
• --graphics:图形配置

4.3 使用virsh管理虚拟机

virsh是一个强大的命令行工具,用于管理虚拟机和hypervisor:
  1. # 列出所有虚拟机
  2. virsh list --all
  3. # 启动虚拟机
  4. virsh start ol8-vm1
  5. # 关闭虚拟机
  6. virsh shutdown ol8-vm1
  7. # 强制关闭虚拟机
  8. virsh destroy ol8-vm1
  9. # 暂停虚拟机
  10. virsh suspend ol8-vm1
  11. # 恢复暂停的虚拟机
  12. virsh resume ol8-vm1
  13. # 重启虚拟机
  14. virsh reboot ol8-vm1
  15. # 删除虚拟机
  16. virsh undefine ol8-vm1
  17. # 获取虚拟机信息
  18. virsh dominfo ol8-vm1
  19. # 查看虚拟机XML配置
  20. virsh dumpxml ol8-vm1
  21. # 编辑虚拟机配置
  22. virsh edit ol8-vm1
复制代码

4.4 虚拟机克隆

克隆现有虚拟机可以快速创建具有相似配置的新虚拟机:
  1. # 使用virt-clone命令克隆虚拟机
  2. virt-clone \
  3.   --original ol8-vm1 \
  4.   --name ol8-vm2 \
  5.   --file /var/lib/libvirt/images/ol8-vm2.qcow2
  6. # 或者使用virsh命令
  7. virsh vol-clone --pool default ol8-vm1.qcow2 ol8-vm2.qcow2
  8. virsh dumpxml ol8-vm1 > /tmp/ol8-vm2.xml
  9. # 编辑XML文件,修改名称、磁盘路径、MAC地址等
  10. virsh define /tmp/ol8-vm2.xml
复制代码

5. 网络配置

5.1 默认网络

KVM安装后会创建一个默认的NAT网络,允许虚拟机通过主机访问外部网络:
  1. # 查看默认网络配置
  2. virsh net-list --all
  3. virsh net-dumpxml default
  4. # 启动/停止默认网络
  5. virsh net-start default
  6. virsh net-stop default
  7. # 自动启动默认网络
  8. virsh net-autostart default
复制代码

5.2 创建桥接网络

桥接网络允许虚拟机直接连接到物理网络,获得与主机相同的网络访问权限:
  1. # 安装桥接工具
  2. sudo yum install -y bridge-utils
  3. # 创建网络桥接配置文件
  4. sudo vi /etc/sysconfig/network-scripts/ifcfg-br0
  5. # 添加以下内容(根据实际网络配置调整)
  6. DEVICE=br0
  7. TYPE=Bridge
  8. BOOTPROTO=dhcp
  9. ONBOOT=yes
  10. DELAY=0
  11. STP=no
  12. # 修改物理网卡配置
  13. sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
  14. # 添加以下内容(根据实际网卡名称调整)
  15. DEVICE=eth0
  16. TYPE=Ethernet
  17. BOOTPROTO=none
  18. ONBOOT=yes
  19. BRIDGE=br0
  20. # 重启网络服务
  21. sudo systemctl restart network
  22. # 验证桥接配置
  23. brctl show
  24. ip a show br0
  25. # 创建使用桥接网络的虚拟机
  26. virt-install \
  27.   --name ol8-vm1 \
  28.   --memory 2048 \
  29.   --vcpus 2 \
  30.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20 \
  31.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  32.   --os-variant ol8.5 \
  33.   --network bridge=br0 \
  34.   --graphics spice
复制代码

5.3 创建隔离网络

隔离网络允许虚拟机之间相互通信,但不与外部网络连接:
  1. # 创建隔离网络XML配置文件
  2. cat > isolated-network.xml << EOF
  3. <network>
  4.   <name>isolated</name>
  5.   <bridge name='virbr1'/>
  6.   <ip address='192.168.100.1' netmask='255.255.255.0'>
  7.     <dhcp>
  8.       <range start='192.168.100.128' end='192.168.100.254'/>
  9.     </dhcp>
  10.   </ip>
  11. </network>
  12. EOF
  13. # 定义并启动网络
  14. virsh net-define isolated-network.xml
  15. virsh net-start isolated
  16. virsh net-autostart isolated
  17. # 在虚拟机中使用隔离网络
  18. virt-install \
  19.   --name ol8-vm1 \
  20.   --memory 2048 \
  21.   --vcpus 2 \
  22.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20 \
  23.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  24.   --os-variant ol8.5 \
  25.   --network network=isolated \
  26.   --graphics spice
复制代码

5.4 高级网络配置
  1. # 创建VLAN接口
  2. sudo vconfig add eth0 100
  3. sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0.100
  4. # 添加以下内容
  5. DEVICE=eth0.100
  6. BOOTPROTO=none
  7. ONBOOT=yes
  8. IPADDR=192.168.1.10
  9. NETMASK=255.255.255.0
  10. VLAN=yes
  11. # 创建桥接接口到VLAN
  12. sudo vi /etc/sysconfig/network-scripts/ifcfg-br0.100
  13. # 添加以下内容
  14. DEVICE=br0.100
  15. TYPE=Bridge
  16. BOOTPROTO=none
  17. ONBOOT=yes
  18. IPADDR=192.168.1.11
  19. NETMASK=255.255.255.0
  20. # 将VLAN接口添加到桥接
  21. sudo brctl addif br0.100 eth0.100
  22. # 重启网络服务
  23. sudo systemctl restart network
复制代码
  1. # 安装绑定工具
  2. sudo yum install -y teamd
  3. # 创建绑定接口配置
  4. sudo vi /etc/sysconfig/network-scripts/ifcfg-bond0
  5. # 添加以下内容
  6. DEVICE=bond0
  7. TYPE=Bond
  8. BONDING_MASTER=yes
  9. IPADDR=192.168.1.10
  10. NETMASK=255.255.255.0
  11. ONBOOT=yes
  12. BONDING_OPTS="mode=4 miimon=100"
  13. # 将物理网卡添加到绑定
  14. sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
  15. # 添加以下内容
  16. DEVICE=eth0
  17. TYPE=Ethernet
  18. BOOTPROTO=none
  19. ONBOOT=yes
  20. MASTER=bond0
  21. SLAVE=yes
  22. sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
  23. # 添加以下内容
  24. DEVICE=eth1
  25. TYPE=Ethernet
  26. BOOTPROTO=none
  27. ONBOOT=yes
  28. MASTER=bond0
  29. SLAVE=yes
  30. # 重启网络服务
  31. sudo systemctl restart network
  32. # 验证绑定状态
  33. cat /proc/net/bonding/bond0
复制代码

6. 存储管理

6.1 存储池

存储池是KVM中用于管理存储资源的抽象层,可以是目录、磁盘分区、LVM卷组等:
  1. # 列出所有存储池
  2. virsh pool-list --all
  3. # 查看默认存储池信息
  4. virsh pool-info default
  5. # 创建基于目录的存储池
  6. mkdir -p /var/lib/libvirt/images/custom
  7. virsh pool-define-as custom dir --target /var/lib/libvirt/images/custom
  8. virsh pool-build custom
  9. virsh pool-start custom
  10. virsh pool-autostart custom
  11. # 创建基于文件系统的存储池
  12. virsh pool-define-as fs-pool fs --source-path /dev/sdb1 --target /mnt/fs-pool
  13. virsh pool-build fs-pool
  14. virsh pool-start fs-pool
  15. virsh pool-autostart fs-pool
  16. # 创建基于LVM的存储池
  17. # 首先创建LVM卷组
  18. sudo pvcreate /dev/sdc1
  19. sudo vgcreate vg-kvm /dev/sdc1
  20. # 然后创建存储池
  21. virsh pool-define-as lvm-pool logical --source-name vg-kvm --target /dev/vg-kvm
  22. virsh pool-build lvm-pool
  23. virsh pool-start lvm-pool
  24. virsh pool-autostart lvm-pool
  25. # 删除存储池
  26. virsh pool-destroy custom
  27. virsh pool-undefine custom
复制代码

6.2 存储卷

存储卷是存储池中的实际存储单元,通常用作虚拟机的磁盘:
  1. # 列出存储池中的所有卷
  2. virsh vol-list default
  3. # 创建存储卷
  4. virsh vol-create-as default new-volume.qcow2 20G --format qcow2
  5. # 上传文件到存储卷
  6. virsh vol-upload --pool default new-volume.qcow2 /path/to/local/file
  7. # 下载存储卷到本地
  8. virsh vol-download --pool default new-volume.qcow2 /path/to/local/file
  9. # 删除存储卷
  10. virsh vol-delete --pool default new-volume.qcow2
  11. # 克隆存储卷
  12. virsh vol-clone --pool default new-volume.qcow2 cloned-volume.qcow2
  13. # 调整存储卷大小
  14. virsh vol-resize --pool default new-volume.qcow2 30G
复制代码

6.3 磁盘镜像格式

KVM支持多种磁盘镜像格式,各有优缺点:

RAW格式是最简单的磁盘镜像格式,没有额外的元数据或压缩:
  1. # 创建RAW格式磁盘
  2. qemu-img create -f raw /var/lib/libvirt/images/ol8-vm1.raw 20G
  3. # 使用RAW格式创建虚拟机
  4. virt-install \
  5.   --name ol8-vm1 \
  6.   --memory 2048 \
  7.   --vcpus 2 \
  8.   --disk path=/var/lib/libvirt/images/ol8-vm1.raw,size=20,format=raw \
  9.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  10.   --os-variant ol8.5 \
  11.   --network network=default \
  12.   --graphics spice
复制代码

QCOW2(QEMU Copy On Write 2)是KVM推荐的格式,支持快照、压缩和加密:
  1. # 创建QCOW2格式磁盘
  2. qemu-img create -f qcow2 /var/lib/libvirt/images/ol8-vm1.qcow2 20G
  3. # 使用QCOW2格式创建虚拟机
  4. virt-install \
  5.   --name ol8-vm1 \
  6.   --memory 2048 \
  7.   --vcpus 2 \
  8.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20,format=qcow2 \
  9.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  10.   --os-variant ol8.5 \
  11.   --network network=default \
  12.   --graphics spice
复制代码
  1. # 查看磁盘镜像信息
  2. qemu-img info /var/lib/libvirt/images/ol8-vm1.qcow2
  3. # 调整磁盘镜像大小
  4. qemu-img resize /var/lib/libvirt/images/ol8-vm1.qcow2 +10G
  5. # 创建磁盘快照
  6. virsh snapshot-create-as ol8-vm1 snapshot1 "Description of snapshot"
  7. # 列出虚拟机快照
  8. virsh snapshot-list ol8-vm1
  9. # 恢复到快照
  10. virsh snapshot-revert ol8-vm1 snapshot1
  11. # 删除快照
  12. virsh snapshot-delete ol8-vm1 snapshot1
  13. # 转换磁盘镜像格式
  14. qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/ol8-vm1.raw /var/lib/libvirt/images/ol8-vm1.qcow2
复制代码

6.4 直通存储(Passthrough)

直通存储允许虚拟机直接访问物理存储设备,提供更高的性能:
  1. # 使用物理分区作为虚拟机磁盘
  2. virt-install \
  3.   --name ol8-vm1 \
  4.   --memory 2048 \
  5.   --vcpus 2 \
  6.   --disk path=/dev/sdb1 \
  7.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  8.   --os-variant ol8.5 \
  9.   --network network=default \
  10.   --graphics spice
  11. # 使用LVM逻辑卷作为虚拟机磁盘
  12. # 首先创建逻辑卷
  13. sudo lvcreate -L 20G -n ol8-vm1-disk vg-kvm
  14. # 然后创建虚拟机
  15. virt-install \
  16.   --name ol8-vm1 \
  17.   --memory 2048 \
  18.   --vcpus 2 \
  19.   --disk path=/dev/vg-kvm/ol8-vm1-disk \
  20.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  21.   --os-variant ol8.5 \
  22.   --network network=default \
  23.   --graphics spice
复制代码

7. 高级特性

7.1 实时迁移

实时迁移允许在不中断服务的情况下将虚拟机从一台主机迁移到另一台主机:
  1. # 在源主机和目标主机上配置共享存储
  2. # 可以使用NFS、iSCSI、光纤通道或GlusterFS等
  3. # 配置libvirt以允许迁移
  4. sudo vi /etc/libvirt/libvirtd.conf
  5. # 取消注释并修改以下行
  6. listen_tls = 0
  7. listen_tcp = 1
  8. auth_tcp = "none"
  9. # 重启libvirtd服务
  10. sudo systemctl restart libvirtd
  11. # 在源主机上执行迁移
  12. virsh migrate --live ol8-vm1 qemu+tcp://destination-host/system
  13. # 或者使用带压缩的迁移(适用于慢速网络)
  14. virsh migrate --live --compressed ol8-vm1 qemu+tcp://destination-host/system
  15. # 迁移完成后,在目标主机上验证虚拟机状态
  16. virsh list
复制代码

7.2 高可用性(HA)

使用Pacemaker和Corosync构建KVM高可用性集群:
  1. # 在所有节点上安装集群软件
  2. sudo yum install -y pcs fence-agents-all
  3. # 设置集群用户密码
  4. sudo passwd hacluster
  5. # 启动并启用pcsd服务
  6. sudo systemctl start pcsd
  7. sudo systemctl enable pcsd
  8. # 在一个节点上认证集群节点
  9. sudo pcs host auth node1 node2 node3
  10. # 创建集群
  11. sudo pcs cluster setup --name kvm-cluster node1 node2 node3
  12. # 启动集群
  13. sudo pcs cluster start --all
  14. sudo pcs cluster enable --all
  15. # 配置STONITH设备(根据实际硬件配置)
  16. sudo pcs stonith create fence-node1 fence_xvm pcmk_host_map=node1:node1-domain
  17. sudo pcs stonith create fence-node2 fence_xvm pcmk_host_map=node2:node2-domain
  18. sudo pcs stonith create fence-node3 fence_xvm pcmk_host_map=node3:node3-domain
  19. # 配置虚拟机资源
  20. sudo pcs resource create vm-vm1 VirtualMachine \
  21.   hypervisor="qemu:///system" \
  22.   config="/etc/libvirt/qemu/ol8-vm1.xml" \
  23.   meta allow-migrate=true \
  24.   op start timeout=120s \
  25.   op stop timeout=120s \
  26.   op monitor timeout=30s interval=10s \
  27.   --group vm-group
  28. # 配置约束,确保虚拟机在特定节点上运行
  29. sudo pcs constraint location vm-vm1 prefers node1=500
  30. # 配置资源粘性,确保虚拟机尽量不迁移
  31. sudo pcs resource meta vm-vm1 resource-stickiness=100
复制代码

7.3 资源池

资源池允许将多个主机的资源(CPU、内存、存储)集中管理,按需分配给虚拟机:
  1. # 创建资源池配置文件
  2. cat > resource-pool.xml << EOF
  3. <pool>
  4.   <name>compute-pool</name>
  5.   <capacity>
  6.     <cpu unit='count'>16</cpu>
  7.     <memory unit='KiB'>16777216</memory>
  8.   </capacity>
  9.   <allocation>
  10.     <cpu unit='count'>8</cpu>
  11.     <memory unit='KiB'>8388608</memory>
  12.   </allocation>
  13.   <available>
  14.     <cpu unit='count'>8</cpu>
  15.     <memory unit='KiB'>8388608</memory>
  16.   </available>
  17. </pool>
  18. EOF
  19. # 定义资源池
  20. virsh pool-define resource-pool.xml
  21. # 启动资源池
  22. virsh pool-start compute-pool
  23. # 自动启动资源池
  24. virsh pool-autostart compute-pool
  25. # 在创建虚拟机时使用资源池
  26. virt-install \
  27.   --name ol8-vm1 \
  28.   --memory 2048 \
  29.   --vcpus 2 \
  30.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20 \
  31.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  32.   --os-variant ol8.5 \
  33.   --network network=default \
  34.   --graphics spice \
  35.   --resource-pool compute-pool
复制代码

7.4 SR-IOV(Single Root I/O Virtualization)

SR-IOV允许物理设备(如网卡)直接分配给虚拟机,提供接近物理机的I/O性能:
  1. # 检查系统是否支持SR-IOV
  2. lspci | grep -i "Ethernet Controller"
  3. # 查看设备是否支持SR-IOV
  4. lspci -vvv -s <device_id> | grep -i "Single Root I/O Virtualization"
  5. # 在BIOS/UEFI中启用VT-d和SR-IOV
  6. # 加载内核模块
  7. sudo modprobe vfio
  8. sudo modprobe vfio_pci
  9. sudo modprobe vfio_iommu_type1
  10. # 启用SR-IOV并创建虚拟功能(VF)
  11. echo 7 > /sys/class/net/<interface_name>/device/sriov_numvfs
  12. # 验证VF创建
  13. lspci | grep -i "Ethernet Controller"
  14. # 将VF分配给虚拟机
  15. # 首先获取VF的PCI地址
  16. lspci | grep -i "Ethernet Controller" | grep "Virtual Function"
  17. # 创建虚拟机并分配VF
  18. virt-install \
  19.   --name ol8-vm1 \
  20.   --memory 2048 \
  21.   --vcpus 2 \
  22.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=20 \
  23.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  24.   --os-variant ol8.5 \
  25.   --network type=hostdev,managed=yes,source_mode=capable,source=<vf_pci_address> \
  26.   --graphics spice
  27. # 在虚拟机内安装VF驱动程序
复制代码

7.5 GPU直通(GPU Passthrough)

GPU直通允许虚拟机直接访问物理GPU,适用于图形密集型应用:
  1. # 检查系统是否支持VT-d
  2. dmesg | grep -i "DMAR\|IOMMU"
  3. # 在BIOS/UEFI中启用VT-d
  4. # 配置GRUB以启用IOMMU
  5. sudo vi /etc/default/grub
  6. # 在GRUB_CMDLINE_LINUX中添加intel_iommu=on或amd_iommu=on
  7. GRUB_CMDLINE_LINUX="... intel_iommu=on"
  8. # 更新GRUB配置
  9. sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  10. # 重启系统
  11. sudo reboot
  12. # 验证IOMMU是否启用
  13. dmesg | grep -i "DMAR\|IOMMU"
  14. # 加载VFIO模块
  15. sudo modprobe vfio
  16. sudo modprobe vfio_pci
  17. sudo modprobe vfio_iommu_type1
  18. # 获取GPU的PCI地址
  19. lspci | grep -i "VGA\|3D controller"
  20. # 将GPU绑定到VFIO驱动
  21. echo "<gpu_id>" > /sys/bus/pci/drivers/vfio-pci/new_id
  22. # 创建虚拟机并分配GPU
  23. virt-install \
  24.   --name ol8-vm1 \
  25.   --memory 8192 \
  26.   --vcpus 4 \
  27.   --disk path=/var/lib/libvirt/images/ol8-vm1.qcow2,size=50 \
  28.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  29.   --os-variant ol8.5 \
  30.   --network network=default \
  31.   --hostdev <gpu_pci_address>,driver_name=vfio \
  32.   --graphics spice
  33. # 在虚拟机内安装GPU驱动程序
复制代码

8. 性能优化

8.1 CPU优化

KVM提供多种CPU模式,根据需求选择合适的模式:
  1. # 查看可用的CPU模型
  2. virsh capabilities | grep cpu | grep model
  3. # 修改虚拟机CPU模式
  4. virsh edit ol8-vm1
  5. # 在XML配置中修改CPU部分
  6. <cpu mode='host-model' check='partial'>
  7.   <topology sockets='1' cores='2' threads='2'/>
  8. </cpu>
  9. # 或者使用host-passthrough模式,提供最佳性能但可能影响迁移
  10. <cpu mode='host-passthrough' check='none'>
  11.   <topology sockets='1' cores='2' threads='2'/>
  12. </cpu>
复制代码

CPU亲和性可以将虚拟机的vCPU绑定到特定的物理CPU核心,提高缓存利用率:
  1. # 查看CPU拓扑
  2. lscpu
  3. # 修改虚拟机配置以设置CPU亲和性
  4. virsh edit ol8-vm1
  5. # 在XML配置中添加cputune部分
  6. <cputune>
  7.   <vcpupin vcpu='0' cpuset='0'/>
  8.   <vcpupin vcpu='1' cpuset='1'/>
  9. </cputune>
  10. # 或者使用numatune设置NUMA节点亲和性
  11. <numatune>
  12.   <memory mode='strict' nodeset='0'/>
  13.   <memnode cellid='0' mode='strict' nodeset='0'/>
  14. </numatune>
复制代码
  1. # 在虚拟机运行时添加vCPU
  2. virsh setvcpus ol8-vm1 4 --live
  3. # 永久修改vCPU数量
  4. virsh setvcpus ol8-vm1 4 --config
  5. # 在虚拟机内识别新CPU
  6. # 对于Linux虚拟机
  7. echo 1 > /sys/devices/system/cpu/cpu2/online
  8. echo 1 > /sys/devices/system/cpu/cpu3/online
复制代码

8.2 内存优化

内存 ballooning允许动态调整虚拟机内存大小:
  1. # 安装内存ballooning驱动
  2. # 对于Linux虚拟机,确保加载virtio_balloon模块
  3. sudo modprobe virtio_balloon
  4. # 调整虚拟机内存大小
  5. virsh setmem ol8-vm1 4G --live
  6. # 永久修改内存大小
  7. virsh setmem ol8-vm1 4G --config
  8. # 设置最大内存限制
  9. virsh setmaxmem ol8-vm1 8G --config
复制代码

巨页可以减少TLB(Translation Lookaside Buffer)缺失,提高内存访问效率:
  1. # 检查系统是否支持巨页
  2. grep Huge /proc/meminfo
  3. # 配置巨页
  4. # 临时设置
  5. echo 2048 > /proc/sys/vm/nr_hugepages
  6. # 永久设置
  7. sudo vi /etc/sysctl.conf
  8. vm.nr_hugepages = 2048
  9. # 应用设置
  10. sudo sysctl -p
  11. # 创建巨页挂载点
  12. sudo mkdir /dev/hugepages
  13. sudo mount -t hugetlbfs hugetlbfs /dev/hugepages
  14. # 永久挂载
  15. echo "hugetlbfs /dev/hugepages hugetlbfs defaults 0 0" | sudo tee -a /etc/fstab
  16. # 配置libvirt使用巨页
  17. sudo vi /etc/libvirt/qemu.conf
  18. # 取消注释并修改以下行
  19. hugetlbfs_mount = "/dev/hugepages"
  20. # 重启libvirtd服务
  21. sudo systemctl restart libvirtd
  22. # 修改虚拟机配置使用巨页
  23. virsh edit ol8-vm1
  24. # 在XML配置中添加memoryBacking部分
  25. <memoryBacking>
  26.   <hugepages>
  27.     <page size='2048' unit='KiB'/>
  28.   </hugepages>
  29. </memoryBacking>
复制代码

内存过载允许分配给所有虚拟机的总内存超过物理内存:
  1. # 配置KSM(Kernel Samepage Merging)
  2. # 启用KSM
  3. sudo systemctl start ksmtuned
  4. sudo systemctl enable ksmtuned
  5. # 调整KSM参数
  6. echo 100 > /sys/kernel/mm/ksm/pages_to_scan
  7. echo 20 > /sys/kernel/mm/ksm/sleep_millisecs
  8. echo 1 > /sys/kernel/mm/ksm/run
  9. # 查看KSM效果
  10. cat /sys/kernel/mm/ksm/pages_shared
  11. # 配置内存交换(Swap)
  12. # 创建交换文件
  13. sudo fallocate -l 4G /swapfile
  14. sudo chmod 600 /swapfile
  15. sudo mkswap /swapfile
  16. sudo swapon /swapfile
  17. # 永久启用交换
  18. echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab
  19. # 调整交换参数
  20. sudo vi /etc/sysctl.conf
  21. vm.swappiness = 10
  22. vm.vfs_cache_pressure = 50
  23. # 应用设置
  24. sudo sysctl -p
复制代码

8.3 I/O优化

virtio驱动提供半虚拟化I/O,性能优于全虚拟化:
  1. # 确保虚拟机使用virtio驱动
  2. virsh edit ol8-vm1
  3. # 在XML配置中修改磁盘部分
  4. <disk type='file' device='disk'>
  5.   <driver name='qemu' type='qcow2' cache='none' io='native'/>
  6.   <source file='/var/lib/libvirt/images/ol8-vm1.qcow2'/>
  7.   <target dev='vda' bus='virtio'/>
  8. </disk>
  9. # 修改网络部分
  10. <interface type='network'>
  11.   <mac address='52:54:00:71:b1:b6'/>
  12.   <source network='default'/>
  13.   <model type='virtio'/>
  14. </interface>
复制代码
  1. # 查看当前I/O调度器
  2. cat /sys/block/sda/queue/scheduler
  3. # 临时更改I/O调度器
  4. echo noop > /sys/block/sda/queue/scheduler
  5. # 永久更改I/O调度器
  6. sudo vi /etc/udev/rules.d/60-io-scheduler.rules
  7. # 添加以下内容
  8. ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
  9. ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
  10. # 应用规则
  11. sudo udevadm control --reload-rules
  12. sudo udevadm trigger
复制代码

多队列Virtio可以提高网络和磁盘I/O的并行性:
  1. # 配置多队列Virtio网络
  2. virsh edit ol8-vm1
  3. # 在XML配置中修改网络部分
  4. <interface type='network'>
  5.   <mac address='52:54:00:71:b1:b6'/>
  6.   <source network='default'/>
  7.   <model type='virtio'/>
  8.   <driver name='vhost' queues='4'/>
  9. </interface>
  10. # 配置多队列Virtio磁盘
  11. virsh edit ol8-vm1
  12. # 在XML配置中修改磁盘部分
  13. <disk type='file' device='disk'>
  14.   <driver name='qemu' type='qcow2' cache='none' io='native' iothread='1'/>
  15.   <source file='/var/lib/libvirt/images/ol8-vm1.qcow2'/>
  16.   <target dev='vda' bus='virtio'/>
  17. </disk>
  18. # 在虚拟机内启用多队列
  19. # 对于网络
  20. ethtool -L eth0 combined 4
  21. # 对于磁盘,确保使用多队列调度器
  22. echo mq-deadline > /sys/block/vda/queue/scheduler
复制代码

8.4 网络优化
  1. # 查看网络中断
  2. cat /proc/interrupts | grep eth
  3. # 设置网络中断亲和性
  4. echo 1 > /proc/irq/123/smp_affinity
  5. echo 2 > /proc/irq/124/smp_affinity
  6. echo 4 > /proc/irq/125/smp_affinity
  7. echo 8 > /proc/irq/126/smp_affinity
  8. # 或者使用irqbalance服务
  9. sudo systemctl start irqbalance
  10. sudo systemctl enable irqbalance
复制代码
  1. # 调整网络参数
  2. sudo vi /etc/sysctl.conf
  3. # 添加以下内容
  4. # 网络缓冲区大小
  5. net.core.rmem_max = 16777216
  6. net.core.wmem_max = 16777216
  7. net.ipv4.tcp_rmem = 4096 87380 16777216
  8. net.ipv4.tcp_wmem = 4096 65536 16777216
  9. # TCP连接优化
  10. net.ipv4.tcp_fin_timeout = 30
  11. net.ipv4.tcp_keepalive_time = 1200
  12. net.ipv4.tcp_max_syn_backlog = 8192
  13. net.ipv4.tcp_max_tw_buckets = 5000
  14. net.ipv4.tcp_tw_reuse = 1
  15. net.ipv4.tcp_tw_recycle = 1
  16. net.ipv4.tcp_syncookies = 1
  17. # 应用设置
  18. sudo sysctl -p
复制代码

DPDK可以绕过内核,直接在用户空间处理网络数据包,提高网络性能:
  1. # 安装DPDK
  2. sudo yum install -y dpdk dpdk-tools
  3. # 配置巨页
  4. echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  5. mkdir -p /mnt/huge
  6. mount -t hugetlbfs nodev /mnt/huge
  7. # 绑定网卡到DPDK
  8. modprobe vfio-pci
  9. usertools/dpdk-devbind.py --bind=vfio-pci <interface_pci_address>
  10. # 创建使用DPDK的虚拟机
  11. virsh edit ol8-vm1
  12. # 在XML配置中修改网络部分
  13. <interface type='vhostuser'>
  14.   <mac address='52:54:00:71:b1:b6'/>
  15.   <source type='unix' path='/var/run/vhost-user/ol8-vm1.sock' mode='server'/>
  16.   <model type='virtio'/>
  17.   <driver name='vhost' rx_queue_size='1024' tx_queue_size='1024'/>
  18. </interface>
复制代码

9. 企业级应用场景

9.1 企业私有云构建

使用Oracle Linux KVM构建企业私有云:
  1. # 安装OpenStack(以Rocky版本为例)
  2. sudo yum install -y centos-release-openstack-rocky
  3. sudo yum update -y
  4. sudo yum install -y python3-openstackclient
  5. sudo yum install -y openstack-selinux
  6. # 安装Packstack
  7. sudo yum install -y openstack-packstack
  8. # 生成应答文件
  9. packstack --gen-answer-file=answers.txt
  10. # 编辑应答文件,根据需要修改配置
  11. # 例如,配置KVM作为hypervisor
  12. vi answers.txt
  13. CONFIG_NOVA_COMPUTE_HOSTS=10.0.0.11
  14. CONFIG_NOVA_LIBVIRT_VIRT_TYPE=kvm
  15. # 部署OpenStack
  16. packstack --answer-file=answers.txt
  17. # 验证部署
  18. source /root/keystonerc_admin
  19. openstack compute service list
  20. openstack network agent list
复制代码

9.2 虚拟桌面基础设施(VDI)

使用Oracle Linux KVM构建VDI解决方案:
  1. # 安装SPICE协议支持
  2. sudo yum install -y spice-server spice-protocol spice-html5
  3. # 安装VDI管理组件(以oVirt为例)
  4. sudo yum install -y https://resources.ovirt.org/pub/yum-repo/ovirt-release44.rpm
  5. sudo yum install -y ovirt-engine
  6. # 配置oVirt引擎
  7. engine-setup
  8. # 安装oVirt节点
  9. sudo yum install -y ovirt-node-ng-image-update
  10. sudo yum install -y ovirt-node-ng-image-installer
  11. # 配置KVM主机
  12. sudo yum install -y vdsm
  13. sudo systemctl start vdsmd
  14. sudo systemctl enable vdsmd
  15. # 在oVirt管理界面中添加主机和存储
  16. # 创建虚拟机池和模板
  17. # 部署虚拟桌面
复制代码

9.3 开发测试环境

使用Oracle Linux KVM构建开发测试环境:
  1. # 创建开发环境模板
  2. virt-install \
  3.   --name dev-template \
  4.   --memory 4096 \
  5.   --vcpus 2 \
  6.   --disk path=/var/lib/libvirt/images/dev-template.qcow2,size=40 \
  7.   --cdrom /path/to/OracleLinux-R8-U5-x86_64-dvd.iso \
  8.   --os-variant ol8.5 \
  9.   --network network=default \
  10.   --graphics spice
  11. # 安装开发工具
  12. # 在模板虚拟机内
  13. sudo yum groupinstall -y "Development Tools"
  14. sudo yum install -y git docker python3 nodejs
  15. # 配置开发环境
  16. # 例如,配置Docker
  17. sudo systemctl start docker
  18. sudo systemctl enable docker
  19. sudo usermod -aG docker $(whoami)
  20. # 清理模板
  21. # 在模板虚拟机内
  22. sudo yum clean all
  23. sudo rm -rf /tmp/*
  24. sudo rm -rf /var/tmp/*
  25. sudo rm -f ~/.bash_history
  26. history -c
  27. # 关闭模板虚拟机
  28. sudo shutdown -h now
  29. # 创建开发环境的克隆脚本
  30. cat > create-dev-env.sh << 'EOF'
  31. #!/bin/bash
  32. VM_NAME=$1
  33. if [ -z "$VM_NAME" ]; then
  34.   echo "Usage: $0 <vm-name>"
  35.   exit 1
  36. fi
  37. # 从模板创建新虚拟机
  38. virt-clone \
  39.   --original dev-template \
  40.   --name $VM_NAME \
  41.   --file /var/lib/libvirt/images/$VM_NAME.qcow2
  42. # 启动虚拟机
  43. virsh start $VM_NAME
  44. # 获取虚拟机IP地址
  45. VM_MAC=$(virsh domiflist $VM_NAME | grep -o -E "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}")
  46. VM_IP=$(arp -n | grep $VM_MAC | awk '{print $1}')
  47. echo "Virtual machine $VM_NAME created with IP: $VM_IP"
  48. EOF
  49. chmod +x create-dev-env.sh
  50. # 使用脚本创建开发环境
  51. ./create-dev-env.sh dev-project1
复制代码

9.4 容器与虚拟机混合环境

在Oracle Linux KVM上运行容器与虚拟机混合环境:
  1. # 安装Docker
  2. sudo yum install -y docker
  3. sudo systemctl start docker
  4. sudo systemctl enable docker
  5. # 安装Kubernetes
  6. sudo yum install -y kubelet kubeadm kubectl
  7. sudo systemctl start kubelet
  8. sudo systemctl enable kubelet
  9. # 创建运行容器的虚拟机
  10. cat > container-vm.xml << 'EOF'
  11. <domain type='kvm'>
  12.   <name>container-vm</name>
  13.   <memory unit='GiB'>4</memory>
  14.   <vcpu placement='static'>4</vcpu>
  15.   <os>
  16.     <type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
  17.     <boot dev='hd'/>
  18.   </os>
  19.   <features>
  20.     <acpi/>
  21.     <apic/>
  22.     <vmport state='off'/>
  23.   </features>
  24.   <cpu mode='host-passthrough' check='none'/>
  25.   <clock offset='utc'>
  26.     <timer name='rtc' tickpolicy='catchup'/>
  27.     <timer name='pit' tickpolicy='delay'/>
  28.     <timer name='hpet' present='no'/>
  29.   </clock>
  30.   <pm>
  31.     <suspend-to-mem enabled='no'/>
  32.     <suspend-to-disk enabled='no'/>
  33.   </pm>
  34.   <devices>
  35.     <emulator>/usr/libexec/qemu-kvm</emulator>
  36.     <disk type='file' device='disk'>
  37.       <driver name='qemu' type='qcow2'/>
  38.       <source file='/var/lib/libvirt/images/container-vm.qcow2'/>
  39.       <target dev='vda' bus='virtio'/>
  40.     </disk>
  41.     <interface type='network'>
  42.       <mac address='52:54:00:71:b1:b6'/>
  43.       <source network='default'/>
  44.       <model type='virtio'/>
  45.     </interface>
  46.     <serial type='pty'>
  47.       <target port='0'/>
  48.     </serial>
  49.     <console type='pty'>
  50.       <target type='serial' port='0'/>
  51.     </console>
  52.   </devices>
  53. </domain>
  54. EOF
  55. virsh define container-vm.xml
  56. virsh start container-vm
  57. # 在Kubernetes集群中运行虚拟机
  58. # 安装KubeVirt
  59. kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v0.44.0/kubevirt-operator.yaml
  60. kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v0.44.0/kubevirt-cr.yaml
  61. # 创建虚拟机实例
  62. cat > vm.yaml << 'EOF'
  63. apiVersion: kubevirt.io/v1alpha3
  64. kind: VirtualMachine
  65. metadata:
  66.   name: testvm
  67. spec:
  68.   running: true
  69.   template:
  70.     metadata:
  71.       labels:
  72.         kubevirt.io/vm: testvm
  73.     spec:
  74.       domain:
  75.         devices:
  76.           disks:
  77.           - name: containerdisk
  78.             disk:
  79.               bus: virtio
  80.         resources:
  81.           requests:
  82.             memory: 512M
  83.       volumes:
  84.       - name: containerdisk
  85.         containerDisk:
  86.           image: kubevirt/cirros-registry-disk-demo:latest
  87. EOF
  88. kubectl apply -f vm.yaml
复制代码

10. 故障排除与维护

10.1 常见问题及解决方案
  1. # 检查虚拟机状态
  2. virsh list --all
  3. # 查看虚拟机日志
  4. tail -f /var/log/libvirt/qemu/ol8-vm1.log
  5. # 检查libvirt日志
  6. journalctl -u libvirtd -f
  7. # 检查KVM模块是否加载
  8. lsmod | grep kvm
  9. # 如果虚拟机无法启动,尝试以下步骤
  10. # 1. 检查XML配置
  11. virsh edit ol8-vm1
  12. # 2. 检查磁盘镜像是否损坏
  13. qemu-img check /var/lib/libvirt/images/ol8-vm1.qcow2
  14. # 3. 尝试以debug模式启动虚拟机
  15. virsh start ol8-vm1 --console
复制代码
  1. # 检查虚拟网络状态
  2. virsh net-list --all
  3. virsh net-dumpxml default
  4. # 检查网络过滤规则
  5. sudo iptables -L -v -n
  6. sudo iptables -t nat -L -v -n
  7. # 检查桥接接口
  8. brctl show
  9. ip a show virbr0
  10. # 如果使用桥接网络,检查物理网卡和桥接接口
  11. brctl show
  12. ip a show br0
  13. # 重启网络服务
  14. sudo systemctl restart network
  15. sudo systemctl restart libvirtd
  16. # 检查虚拟机内网络配置
  17. # 在虚拟机内
  18. ip a
  19. ping 8.8.8.8
复制代码
  1. # 检查CPU使用情况
  2. top
  3. htop
  4. # 检查I/O使用情况
  5. iostat -xz 1
  6. iotop
  7. # 检查内存使用情况
  8. free -h
  9. cat /proc/meminfo
  10. # 检查KVM特定统计信息
  11. virsh domstats ol8-vm1
  12. # 检查虚拟机内性能
  13. # 在虚拟机内
  14. top
  15. iostat -xz 1
  16. # 如果性能不佳,考虑以下优化措施
  17. # 1. 确保使用virtio驱动
  18. virsh edit ol8-vm1
  19. # 检查磁盘和网络部分是否使用virtio
  20. # 2. 启用KSM
  21. sudo systemctl start ksmtuned
  22. sudo systemctl enable ksmtuned
  23. # 3. 调整虚拟机资源分配
  24. virsh setmem ol8-vm1 4G
  25. virsh setvcpus ol8-vm1 4
复制代码

10.2 日志分析
  1. # libvirt日志
  2. tail -f /var/log/libvirt/libvirtd.log
  3. # QEMU日志
  4. tail -f /var/log/libvirt/qemu/ol8-vm1.log
  5. # 审计日志
  6. tail -f /var/log/audit/audit.log
  7. # 系统日志
  8. journalctl -f
  9. # 使用virt-host-validate检查主机配置
  10. virt-host-validate
  11. # 使用virt-top监控虚拟机性能
  12. sudo yum install -y virt-top
  13. virt-top
复制代码

10.3 备份与恢复
  1. # 方法1:使用virsh命令备份虚拟机配置
  2. virsh dumpxml ol8-vm1 > /backup/ol8-vm1.xml
  3. # 备份磁盘镜像
  4. cp /var/lib/libvirt/images/ol8-vm1.qcow2 /backup/
  5. # 方法2:使用virt-backup工具
  6. sudo yum install -y virt-backup
  7. virt-backup -c /etc/virt-backup.conf -n ol8-vm1
  8. # 方法3:使用rsync进行增量备份
  9. rsync -avz --delete /var/lib/libvirt/images/ol8-vm1.qcow2 /backup/
复制代码
  1. # 恢复虚拟机配置
  2. virsh define /backup/ol8-vm1.xml
  3. # 恢复磁盘镜像
  4. cp /backup/ol8-vm1.qcow2 /var/lib/libvirt/images/
  5. # 启动虚拟机
  6. virsh start ol8-vm1
复制代码
  1. # 创建快照
  2. virsh snapshot-create-as ol8-vm1 backup-$(date +%Y%m%d-%H%M%S)
  3. # 列出快照
  4. virsh snapshot-list ol8-vm1
  5. # 恢复到快照
  6. virsh snapshot-revert ol8-vm1 backup-20230101-120000
  7. # 删除快照
  8. virsh snapshot-delete ol8-vm1 backup-20230101-120000
复制代码

10.4 定期维护任务
  1. # 创建维护脚本
  2. cat > kvm-maintenance.sh << 'EOF'
  3. #!/bin/bash
  4. # 清理旧的日志文件
  5. find /var/log/libvirt -name "*.log" -mtime +30 -exec rm -f {} \;
  6. # 清理未使用的磁盘镜像
  7. for img in /var/lib/libvirt/images/*.qcow2; do
  8.   in_use=0
  9.   for vm in $(virsh list --name); do
  10.     if virsh domblklist $vm | grep -q $(basename $img); then
  11.       in_use=1
  12.       break
  13.     fi
  14.   done
  15.   if [ $in_use -eq 0 ]; then
  16.     echo "Removing unused image: $img"
  17.     rm -f $img
  18.   fi
  19. done
  20. # 优化磁盘镜像
  21. for img in /var/lib/libvirt/images/*.qcow2; do
  22.   echo "Optimizing image: $img"
  23.   virt-sparsify --in-place $img
  24. done
  25. # 检查并修复磁盘镜像
  26. for img in /var/lib/libvirt/images/*.qcow2; do
  27.   echo "Checking image: $img"
  28.   qemu-img check $img
  29. done
  30. # 更新虚拟机操作系统
  31. for vm in $(virsh list --name); do
  32.   echo "Updating VM: $vm"
  33.   virsh shutdown $vm
  34.   # 等待虚拟机关闭
  35.   while virsh list --name | grep -q $vm; do
  36.     sleep 5
  37.   done
  38.   # 使用guestfish更新虚拟机
  39.   guestfish --rw -a /var/lib/libvirt/images/$vm.qcow2 -i sh "yum update -y"
  40.   virsh start $vm
  41. done
  42. # 重启libvirt服务
  43. systemctl restart libvirtd
  44. echo "Maintenance completed."
  45. EOF
  46. chmod +x kvm-maintenance.sh
  47. # 设置定期执行
  48. echo "0 2 * * 0 /root/kvm-maintenance.sh" | crontab -
复制代码

11. 安全性考虑

11.1 虚拟化安全最佳实践
  1. # 1. 使用SELinux
  2. # 确保SELinux处于 enforcing 模式
  3. sudo vi /etc/selinux/config
  4. SELINUX=enforcing
  5. sudo setenforce 1
  6. # 验证SELinux上下文
  7. ls -Z /var/lib/libvirt/images/
  8. # 2. 使用sVirt(SELinux for虚拟化)
  9. # 检查sVirt是否启用
  10. ps -eZ | grep qemu
  11. # 3. 限制libvirt访问
  12. sudo vi /etc/libvirt/libvirtd.conf
  13. # 修改以下行
  14. unix_sock_group = "libvirt"
  15. unix_sock_ro_perms = "0777"
  16. unix_sock_rw_perms = "0770"
  17. auth_unix_ro = "none"
  18. auth_unix_rw = "none"
  19. # 重启libvirtd服务
  20. sudo systemctl restart libvirtd
  21. # 4. 使用防火墙限制访问
  22. sudo firewall-cmd --permanent --add-service=libvirt
  23. sudo firewall-cmd --permanent --add-port=16509/tcp
  24. sudo firewall-cmd --reload
  25. # 5. 禁用不必要的服务
  26. sudo systemctl stop libvirtd-tcp.socket
  27. sudo systemctl disable libvirtd-tcp.socket
复制代码

11.2 虚拟机隔离
  1. # 1. 使用网络隔离
  2. # 创建隔离网络
  3. cat > isolated-network.xml << EOF
  4. <network>
  5.   <name>isolated</name>
  6.   <bridge name='virbr1'/>
  7.   <ip address='192.168.100.1' netmask='255.255.255.0'>
  8.     <dhcp>
  9.       <range start='192.168.100.128' end='192.168.100.254'/>
  10.     </dhcp>
  11.   </ip>
  12. </network>
  13. EOF
  14. virsh net-define isolated-network.xml
  15. virsh net-start isolated
  16. virsh net-autostart isolated
  17. # 2. 使用资源限制
  18. # 设置虚拟机CPU和内存限制
  19. virsh edit ol8-vm1
  20. # 在XML配置中添加以下内容
  21. <cputune>
  22.   <shares>1024</shares>
  23.   <vcpupin vcpu='0' cpuset='0'/>
  24.   <vcpupin vcpu='1' cpuset='1'/>
  25. </cputune>
  26. <memtune>
  27.   <hard_limit unit='KiB'>4194304</hard_limit>
  28.   <soft_limit unit='KiB'>2097152</soft_limit>
  29.   <swap_hard_limit unit='KiB'>8388608</swap_hard_limit>
  30. </memtune>
  31. # 3. 使用I/O限制
  32. # 设置磁盘I/O限制
  33. virsh edit ol8-vm1
  34. # 在XML配置中修改磁盘部分
  35. <disk type='file' device='disk'>
  36.   <driver name='qemu' type='qcow2' cache='none' io='native' iothread='1'/>
  37.   <source file='/var/lib/libvirt/images/ol8-vm1.qcow2'/>
  38.   <target dev='vda' bus='virtio'/>
  39.   <iotune>
  40.     <total_bytes_sec>10000000</total_bytes_sec>
  41.     <read_iops_sec>4000</read_iops_sec>
  42.     <write_iops_sec>4000</write_iops_sec>
  43.   </iotune>
  44. </disk>
  45. # 4. 使用网络带宽限制
  46. # 设置网络带宽限制
  47. virsh edit ol8-vm1
  48. # 在XML配置中修改网络部分
  49. <interface type='network'>
  50.   <mac address='52:54:00:71:b1:b6'/>
  51.   <source network='default'/>
  52.   <model type='virtio'/>
  53.   <bandwidth>
  54.     <inbound average='1000' peak='5000' burst='1024'/>
  55.     <outbound average='1000' peak='5000' burst='1024'/>
  56.   </bandwidth>
  57. </interface>
复制代码

11.3 安全审计与监控
  1. # 1. 启用审计日志
  2. sudo vi /etc/audit/rules.d/audit.rules
  3. # 添加以下内容
  4. -w /usr/libexec/qemu-kvm -p x -k virtualization
  5. -w /etc/libvirt -p x -k virt_config
  6. -w /var/lib/libvirt -p x -k virt_data
  7. # 重启审计服务
  8. sudo systemctl restart auditd
  9. # 2. 使用AIDE(高级入侵检测环境)
  10. sudo yum install -y aide
  11. sudo aide --init
  12. sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
  13. # 配置定期检查
  14. echo "0 5 * * * /usr/sbin/aide --check" | crontab -
  15. # 3. 使用fail2ban保护libvirt
  16. sudo yum install -y fail2ban
  17. sudo vi /etc/fail2ban/jail.local
  18. # 添加以下内容
  19. [libvirt]
  20. enabled = true
  21. port = 16509
  22. filter = libvirt
  23. logpath = /var/log/libvirt/libvirtd.log
  24. maxretry = 3
  25. bantime = 3600
  26. # 创建过滤器
  27. sudo vi /etc/fail2ban/filter.d/libvirt.conf
  28. # 添加以下内容
  29. [Definition]
  30. failregex = .* authentication failed.*
  31. ignoreregex =
  32. # 重启fail2ban服务
  33. sudo systemctl restart fail2ban
复制代码

11.4 虚拟机加密
  1. # 1. 使用LUKS加密磁盘镜像
  2. # 创建加密磁盘镜像
  3. qemu-img create -f qcow2 /var/lib/libvirt/images/encrypted.qcow2 20G
  4. sudo cryptsetup luksFormat /var/lib/libvirt/images/encrypted.qcow2
  5. sudo cryptsetup luksOpen /var/lib/libvirt/images/encrypted.qcow2 encrypted
  6. sudo mkfs.ext4 /dev/mapper/encrypted
  7. sudo cryptsetup luksClose encrypted
  8. # 在虚拟机配置中使用加密磁盘
  9. virsh edit ol8-vm1
  10. # 在XML配置中添加以下内容
  11. <disk type='file' device='disk'>
  12.   <driver name='qemu' type='qcow2'/>
  13.   <source file='/var/lib/libvirt/images/encrypted.qcow2'/>
  14.   <target dev='vda' bus='virtio'/>
  15.   <encryption format='luks'>
  16.     <secret type='passphrase' uuid='uuid-of-secret'/>
  17.   </encryption>
  18. </disk>
  19. # 创建密钥
  20. virsh secret-define --file secret.xml
  21. virsh secret-set-value uuid-of-secret base64-encoded-password
  22. # 2. 使用qcow2内置加密
  23. # 创建加密的qcow2镜像
  24. qemu-img create -f qcow2 -o encryption=on /var/lib/libvirt/images/encrypted.qcow2 20G
  25. # 设置加密密码
  26. qemu-img amend -o encrypt.key-secret=secret0 /var/lib/libvirt/images/encrypted.qcow2
复制代码

12. 总结与展望

Oracle Linux KVM虚拟化技术提供了一个强大、高效且安全的企业级虚拟化解决方案。通过本指南,我们全面介绍了从基础部署到高级优化的各个方面,包括:

• KVM基础概念和架构
• 环境准备与基础部署
• 虚拟机创建与管理
• 网络配置
• 存储管理
• 高级特性(实时迁移、高可用性、资源池等)
• 性能优化(CPU、内存、I/O、网络)
• 企业级应用场景(私有云、VDI、开发测试环境、容器混合环境)
• 故障排除与维护
• 安全性考虑

随着技术的不断发展,Oracle Linux KVM虚拟化技术也在持续演进。未来,我们可以期待以下发展趋势:

1. 更紧密的云集成:与Oracle Cloud Infrastructure(OCI)和其他云平台的更深层次集成,实现混合云和多云环境的无缝管理。
2. 容器与虚拟机的融合:KubeVirt等项目将使容器和虚拟机在同一平台上协同工作,提供更灵活的应用部署选项。
3. 增强的安全性:引入更多安全功能,如机密计算、可信执行环境(TEE)等,保护虚拟机中的敏感数据。
4. AI驱动的优化:利用人工智能和机器学习技术,自动优化虚拟机资源分配和性能配置。
5. 边缘计算支持:改进KVM在边缘计算场景中的适用性,支持低延迟、高带宽的边缘应用部署。

更紧密的云集成:与Oracle Cloud Infrastructure(OCI)和其他云平台的更深层次集成,实现混合云和多云环境的无缝管理。

容器与虚拟机的融合:KubeVirt等项目将使容器和虚拟机在同一平台上协同工作,提供更灵活的应用部署选项。

增强的安全性:引入更多安全功能,如机密计算、可信执行环境(TEE)等,保护虚拟机中的敏感数据。

AI驱动的优化:利用人工智能和机器学习技术,自动优化虚拟机资源分配和性能配置。

边缘计算支持:改进KVM在边缘计算场景中的适用性,支持低延迟、高带宽的边缘应用部署。

作为企业IT专业人员,掌握Oracle Linux KVM虚拟化技术将帮助您构建高效、可靠且安全的虚拟化基础设施,为企业的数字化转型提供强有力的支持。通过不断学习和实践,您将能够充分利用KVM的强大功能,为您的组织创造更大的价值。

无论您是刚开始接触KVM虚拟化,还是已经有一定经验,希望本指南能够为您提供有价值的参考和指导。随着技术的不断发展,我们建议您持续关注Oracle Linux KVM的最新动态,不断更新您的知识和技能,以应对不断变化的IT环境和业务需求。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.