1. 项目概述与背景
在当前的虚拟化技术领域,KVM(Kernel-based Virtual Machine)作为Linux内核原生支持的虚拟化解决方案,因其高性能和低开销的特性,已成为企业级虚拟化部署的首选。而CentOS Stream 8作为RHEL的上游开发分支,提供了更前沿的软件包和功能更新,特别适合需要紧跟技术发展的开发测试环境。本文将详细记录在CentOS Stream 8系统上完整部署KVM虚拟化环境的实践过程,包括系统准备、组件安装、网络配置和日常管理命令等全流程操作。
与传统的CentOS不同,CentOS Stream 8采用滚动更新模式,这意味着我们需要特别注意软件包版本的兼容性问题。同时,作为生产环境常用的虚拟化平台,KVM的性能调优和网络配置直接影响最终使用体验。本指南不仅包含标准安装步骤,还会分享我在实际部署中积累的性能优化参数和网络调试技巧。
2. 系统准备与环境检查
2.1 CentOS Stream 8最小化安装
首先从官方镜像站点获取CentOS Stream 8的ISO镜像。推荐使用最小化安装模式,这可以减少不必要的服务占用系统资源:
bash复制# 验证镜像完整性
sha256sum CentOS-Stream-8-x86_64-latest-dvd1.iso
安装时需特别注意以下分区方案:
/boot分区:至少1GB,建议ext4格式swap分区:物理内存小于8G时设为内存的1.5倍,大于8G时与内存等大/分区:剩余所有空间,建议XFS格式
安装完成后,立即更新系统:
bash复制dnf update -y && dnf upgrade -y
注意:CentOS Stream 8默认使用dnf作为包管理器,与yum命令兼容但性能更优。
2.2 硬件虚拟化支持验证
在安装KVM前,必须确认CPU支持硬件虚拟化扩展:
bash复制grep -E '(vmx|svm)' /proc/cpuinfo
若没有输出,需进入BIOS启用Intel VT-x或AMD-V技术。对于云主机环境,部分供应商需要额外开启嵌套虚拟化支持:
bash复制# 检查嵌套虚拟化状态
cat /sys/module/kvm_intel/parameters/nested
3. KVM组件安装与配置
3.1 基础软件包安装
安装KVM核心组件和配套管理工具:
bash复制dnf install -y qemu-kvm libvirt virt-install virt-viewer bridge-utils
关键组件说明:
qemu-kvm:提供硬件模拟和加速功能libvirt:虚拟化管理API和守护进程virt-install:命令行虚拟机创建工具virt-viewer:图形化控制台访问工具bridge-utils:网络桥接管理工具
启动并启用相关服务:
bash复制systemctl enable --now libvirtd
3.2 用户权限配置
将管理用户加入kvm和libvirt组:
bash复制usermod -aG kvm,libvirt $(whoami)
newgrp kvm
验证安装结果:
bash复制virsh list --all
若显示空虚拟机列表且无错误,则基础环境配置成功。
4. 网络配置方案
4.1 默认网络配置
Libvirt安装后会创建一个名为default的NAT网络:
bash复制virsh net-list --all
查看网络详情:
bash复制virsh net-info default
4.2 创建桥接网络
对于需要直接暴露在物理网络的虚拟机,需配置桥接网络:
- 创建桥接接口配置文件
/etc/sysconfig/network-scripts/ifcfg-br0:
code复制DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
ONBOOT=yes
DELAY=0
- 修改物理网卡配置(如
/etc/sysconfig/network-scripts/ifcfg-enp3s0):
code复制DEVICE=enp3s0
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
- 重启网络服务:
bash复制systemctl restart NetworkManager
注意:桥接网络会使虚拟机直接暴露在物理网络中,请确保有适当的防火墙保护。
5. 虚拟机创建与管理
5.1 使用virt-install创建虚拟机
典型命令行示例:
bash复制virt-install \
--name centos8-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/centos8-vm.qcow2,size=20 \
--os-variant centos-stream8 \
--network bridge=br0 \
--graphics spice \
--location /path/to/CentOS-Stream-8-x86_64-latest-dvd1.iso \
--extra-args "console=tty0 console=ttyS0,115200n8"
关键参数说明:
--ram:分配内存大小(MB)--vcpus:虚拟CPU核心数--disk:指定磁盘映像路径和大小(GB)--os-variant:优化虚拟机配置,使用osinfo-query os查看支持列表--location:指定安装源位置
5.2 常用管理命令
虚拟机生命周期管理:
bash复制# 启动虚拟机
virsh start vm-name
# 关闭虚拟机(正常关机)
virsh shutdown vm-name
# 强制停止
virsh destroy vm-name
# 删除虚拟机
virsh undefine vm-name
虚拟机配置管理:
bash复制# 编辑虚拟机配置(临时修改)
virsh edit vm-name
# 持久化修改CPU数量
virsh setvcpus vm-name 4 --config
6. 高级配置与优化
6.1 性能调优参数
在虚拟机XML配置中添加以下CPU优化参数:
xml复制<cpu mode='host-passthrough' check='none'/>
<features>
<acpi/>
<apic/>
<pae/>
</features>
内存大页配置:
- 计算需要的大页数量(每页2MB):
bash复制echo $(( $(grep MemTotal /proc/meminfo | awk '{print $2}') / 2048 )) > /proc/sys/vm/nr_hugepages - 在虚拟机配置中添加:
xml复制<memoryBacking> <hugepages/> </memoryBacking>
6.2 存储优化
使用qcow2格式的磁盘映像时,可以预先分配空间提升性能:
bash复制qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/vm-disk.qcow2 50G
启用virtio-scsi控制器获得更好的磁盘性能:
xml复制<controller type='scsi' index='0' model='virtio-scsi'/>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<source file='/var/lib/libvirt/images/vm-disk.qcow2'/>
<target dev='sda' bus='scsi'/>
</disk>
7. 常见问题排查
7.1 虚拟机无法启动
检查日志定位问题:
bash复制# 查看libvirt日志
journalctl -u libvirtd -f
# 查看虚拟机控制台输出
virsh console vm-name
常见原因及解决:
- 权限问题:确保
/var/lib/libvirt/images/目录权限正确 - 存储空间不足:使用
df -h检查磁盘空间 - 网络配置错误:验证桥接接口状态
brctl show
7.2 网络连接问题
诊断步骤:
bash复制# 检查虚拟机网络接口
virsh domiflist vm-name
# 测试网络连通性
virsh qemu-monitor-command vm-name --hmp "info network"
解决方案:
- 重启libvirt默认网络:
bash复制
virsh net-destroy default virsh net-start default - 重新加载防火墙规则:
bash复制
firewall-cmd --reload
7.3 性能问题优化
CPU性能诊断:
bash复制# 查看CPU使用情况
virsh vcpuinfo vm-name
# 查看CPU亲和性
virsh vcpupin vm-name
内存性能诊断:
bash复制# 查看内存统计
virsh dommemstat vm-name
优化建议:
- 调整CPU调度策略:
bash复制virsh schedulerinfo vm-name --set cpu_shares=2048 - 启用KSM内存共享:
bash复制echo 1 > /sys/kernel/mm/ksm/run
8. 日常维护与管理脚本
8.1 自动化备份脚本
创建虚拟机快照备份:
bash复制#!/bin/bash
VM_LIST=$(virsh list --name --all)
BACKUP_DIR="/backup/vm/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
for VM in $VM_LIST; do
virsh dumpxml $VM > $BACKUP_DIR/$VM.xml
IMG_PATH=$(virsh domblklist $VM | grep vda | awk '{print $2}')
cp $IMG_PATH $BACKUP_DIR/
done
8.2 资源监控脚本
监控虚拟机资源使用:
bash复制#!/bin/bash
echo "===== CPU Top ====="
virsh list --all | grep running | awk '{print $2}' | xargs -I {} sh -c 'echo -n "{}: "; virsh vcpuinfo {} | grep Time | awk "{print \$5}"' | sort -k2 -nr
echo "===== Memory Top ====="
virsh list --all | grep running | awk '{print $2}' | xargs -I {} sh -c 'echo -n "{}: "; virsh dommemstat {} | grep actual | awk "{print \$2}"' | sort -k2 -nr
8.3 批量操作脚本
批量启动/关闭虚拟机:
bash复制#!/bin/bash
ACTION=$1
VM_LIST="vm1 vm2 vm3"
for VM in $VM_LIST; do
virsh $ACTION $VM
done
在实际生产环境中运行这些脚本时,我发现通过添加简单的日志记录功能可以大大方便后续问题排查。例如在备份脚本中加入:
bash复制echo "$(date) - 开始备份虚拟机 $VM" >> /var/log/vm-backup.log