1. 环境准备与硬件检查在Ubuntu 20.04上搭建KVM虚拟化环境前首先要确认硬件是否支持虚拟化技术。我遇到过不少新手直接开始安装结果发现CPU根本不支持虚拟化的情况。这里教大家几个简单但关键的检查命令打开终端输入grep -Eoc (vmx|svm) /proc/cpuinfo这个命令会返回CPU支持的虚拟化指令集数量。如果是Intel处理器会显示vmxAMD则是svm。我的i5-6300HQ返回结果是8说明完全支持。如果结果是0就需要进BIOS开启虚拟化选项不同主板位置不同一般在Advanced或Security选项卡里。接着安装检查工具sudo apt update sudo apt install cpu-checker -y kvm-ok正常会看到KVM acceleration can be used的提示。如果报错说/dev/kvm不存在可能是内核模块没加载试试sudo modprobe kvm_intel # Intel用这个 sudo modprobe kvm_amd # AMD用这个2. KVM套件安装与配置安装KVM全家桶其实很简单但每个包的作用很多人不清楚。我习惯用这条命令sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager -y这里解释下关键组件qemu-kvm提供底层虚拟化支持相当于虚拟机的发动机libvirt管理虚拟机的方向盘我们通过它控制虚拟机生命周期virt-manager图形化管理界面服务器环境可不装装完后有个重要步骤经常被忽略——把当前用户加入kvm和libvirt组sudo usermod -aG libvirt $USER sudo usermod -aG kvm $USER不加的话后面操作会各种权限报错。记得注销重新登录使组权限生效。检查服务状态sudo systemctl is-active libvirtd看到active才算成功。如果失败试试sudo systemctl enable --now libvirtd3. 网络配置实战清理默认网桥KVM安装后会默认创建名为virbr0的NAT网络我们要用桥接模式就得先清理它。这是我踩过坑的地方sudo virsh net-destroy default sudo virsh net-undefine default执行后用ip link命令检查应该看不到virbr0了。如果还有残留手动删除sudo ip link delete virbr0 sudo ip link delete virbr0-nic接下来配置桥接网络前需要调整内核参数sudo vim /etc/sysctl.d/bridge.conf加入net.bridge.bridge-nf-call-ip6tables0 net.bridge.bridge-nf-call-iptables0 net.bridge.bridge-nf-call-arptables0然后创建udev规则sudo vim /etc/udev/rules.d/99-bridge.rules内容ACTIONadd, SUBSYSTEMmodule, KERNELbr_netfilter, RUN/sbin/sysctl -p /etc/sysctl.d/bridge.conf4. Bridge网桥配置详解现在进入重头戏——配置br0网桥。首先确认你的物理网卡名称我的是eno1ip link show编辑Netplan配置Ubuntu 20.04开始用这个sudo vim /etc/netplan/00-installer-config.yaml这是我的配置模板network: ethernets: eno1: dhcp4: false dhcp6: false bridges: br0: interfaces: [eno1] addresses: [192.168.0.100/24] gateway4: 192.168.0.1 mtu: 1500 nameservers: addresses: [8.8.8.8,8.8.4.4] parameters: stp: true forward-delay: 4 dhcp4: no dhcp6: no version: 2关键点一定要禁用物理网卡的DHCPIP地址要和你局域网同网段网关填你路由器的地址MTU值一般1500特殊网络可能需要调整应用配置sudo netplan apply如果报错试试sudo netplan --debug apply5. KVM网桥网络创建现在要为KVM创建基于br0的网络。先准备XML定义文件vim host-bridge.xml内容network namehost-bridge/name forward modebridge/ bridge namebr0/ /network导入并启用sudo virsh net-define host-bridge.xml sudo virsh net-start host-bridge sudo virsh net-autostart host-bridge检查状态virsh net-list --all应该能看到host-bridge状态为active。6. 虚拟机创建与网络测试终于到创建虚拟机的时刻了我用这个命令创建CentOS 7sudo virt-install \ --namecentos7 \ --ram4096 \ --vcpus2 \ --virt-typekvm \ --os-typelinux \ --os-variantcentos7.0 \ --network networkhost-bridge,modelvirtio \ --graphics vnc,listen0.0.0.0 \ --noautoconsole \ --cdrom/path/to/CentOS-7-x86_64-Minimal-2003.iso \ --disk path/var/lib/libvirt/images/centos7.qcow2,size40注意几个关键参数--network指定使用我们创建的host-bridge磁盘格式用qcow2支持快照内存和CPU根据主机配置调整安装完成后进入虚拟机配置静态IP和br0同网段vi /etc/sysconfig/network-scripts/ifcfg-eth0修改BOOTPROTOstatic ONBOOTyes IPADDR192.168.0.101 NETMASK255.255.255.0 GATEWAY192.168.0.1 DNS18.8.8.8重启网络服务测试连通性ping 8.8.8.8 ping www.baidu.com如果宿主机能上网但虚拟机不行检查防火墙是否拦截网桥STP是否造成延迟可以关掉试试物理网卡是否支持混杂模式7. 常见问题排查指南问题1虚拟机获取不到IP检查virsh net-list确认host-bridge是active查看虚拟机网卡是否绑定到br0brctl show测试从宿主机ping虚拟机IP问题2网桥创建失败确认物理网卡已从NetworkManager解除管理nmcli dev set eno1 managed no检查内核模块是否加载lsmod | grep bridge问题3网络延迟高调整网桥参数parameters: stp: false forward-delay: 0在虚拟机XML配置中加入model typevirtio/ driver namevhost queues4/问题4宿主机重启后网络失效检查/etc/netplan/配置是否正确确认libvirtd服务设为开机自启sudo systemctl enable libvirtd8. 性能优化技巧经过多次测试我总结出这些优化方案CPU调优virsh edit centos7在部分添加cpu modehost-passthrough checknone/磁盘IO加速 创建磁盘时加上--disk ...,cachewriteback,iothreads,discardunmap内存大页 先分配大页内存sudo echo 1024 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages然后在虚拟机XML中添加memoryBacking hugepages/ /memoryBacking网络多队列interface typebridge driver namevhost queues4/ /interface实测这些优化能让虚拟机性能提升30%以上特别是IO密集型应用效果明显。