前言
在超聚变 V7/V8 服务器上部署虚拟化环境时,为了追求极致的网络性能,通常会将 Intel E810 网卡通过 SR-IOV 技术虚拟出多个 VF(Virtual Function),并直接直通(Passthrough)给 KVM 虚拟机。
本文基于Ubuntu Server 22.04 LTS宿主机和Ubuntu 22.04 Desktop客户机,详细记录了从 BIOS 设置、系统安装、网卡驱动填坑到 VF 直通与虚拟机克隆的完整流程。
环境说明
硬件平台:超聚变 V7/V8 服务器
网卡型号:Intel E810-XXV (25G双口)
宿主机:Ubuntu Server 22.04 LTS (纯命令行,内核自带
ice驱动-使用windterm工具远程)客户机:Ubuntu 22.04.3 Desktop (使用
ubuntu-22.04.3-desktop-amd64.iso)虚拟化组件:KVM + libvirt + QEMU
第一阶段:宿主机环境与权限准备
1.1 BIOS 硬件底层设置(首次操作)
超聚变服务器开机按F2进入 BIOS,完成以下关键设置后保存重启:
Intel VT-d(或 AMD IOMMU):Enabled(开启 IOMMU,PCI 直通的前提)
SR-IOV Support:Enabled(开启网卡 SR-IOV 功能)
Secure Boot:Disabled(关闭安全启动,避免内核模块签名拦截)
注意:如果是 E810 网卡,建议将 BIOS 中的
Transmit Balancing设为Disabled,否则可能导致驱动进入安全模式,无法开启 SR-IOV。
1.2 宿主机依赖安装
登录 Ubuntu 宿主机(root)执行:
# 1. 验证 IOMMU 是否生效(输出大于 0 即成功) ls /sys/kernel/iommu_groups/ | wc -l # 2. 安装 KVM 及依赖 apt update apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils ufw # 3. 启动服务与默认 NAT 网络 systemctl enable --now libvirtd virsh net-start default 2>/dev/null || true virsh net-autostart default
1.3 镜像准备与权限修复(避坑重点)
QEMU 在 Ubuntu 下默认以libvirt-qemu用户运行,必须修复镜像目录的权限,否则读取 ISO 会报Permission denied。
# 准备目录并上传镜像 mkdir -p /var/lib/libvirt/images cp /你的路径/ubuntu-22.04.3-desktop-amd64.iso /var/lib/libvirt/images/ # 修复权限 chown -R libvirt-qemu:kvm /var/lib/libvirt/images/ chmod 644 /var/lib/libvirt/images/*.iso
第二阶段:第一台虚拟机 (vm-ubuntu-1) 创建与安装
2.1 创建系统虚拟磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/vm-ubuntu-1.qcow2 40G chown libvirt-qemu:kvm /var/lib/libvirt/images/vm-ubuntu-1.qcow2
2.2 编写 XML 配置文件
将以下完整配置保存为/tmp/vm-ubuntu-1.xml(光盘位于第一启动项以便安装):
<domain type='kvm'> <name>vm-ubuntu-1</name> <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>8388608</currentMemory> <vcpu placement='static'>4</vcpu> <os> <type arch='x86_64' machine='q35'>hvm</type> <boot dev='cdrom'/> <boot dev='hd'/> </os> <features><acpi/><apic/></features> <cpu mode='host-passthrough' check='none'/> <clock offset='utc'/> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='writeback'/> <source file='/var/lib/libvirt/images/vm-ubuntu-1.qcow2'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/ubuntu-22.04.3-desktop-amd64.iso'/> <target dev='sda' bus='sata'/> <readonly/> </disk> <interface type='network'> <source network='default'/> <model type='virtio'/> </interface> <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'> <listen type='address' address='0.0.0.0'/> </graphics> <video><model type='virtio' heads='1' primary='yes'/></video> <input type='tablet' bus='usb'/> <input type='mouse' bus='usb'/> <input type='keyboard' bus='usb'/> </devices> </domain>
2.3 启动并完成系统安装
virsh define /tmp/vm-ubuntu-1.xml virsh start vm-ubuntu-1 virsh vncdisplay vm-ubuntu-1
假设输出
:0,宿主机放行端口:ufw allow 5900:5910/tcp。使用 VNC 客户端连接
宿主机IP:5900,按向导完成 Ubuntu 安装(选择Erase disk抹除虚拟盘)。
安装完成提示重启时,系统会再次进入 Live 安装界面,这是正常的,进行下一步。
2.4 安装后收尾(安全弹出光驱)
⚠️ 避坑:不要手贱去 XML 里乱删<disk>代码,极易误删系统盘导致No bootable device。在宿主机终端执行:
# 1. 强制关闭虚拟机 virsh destroy vm-ubuntu-1 # 2. 弹出光驱(拔出 ISO 镜像) virsh change-media vm-ubuntu-1 sda --eject # 3. 重新启动 virsh start vm-ubuntu-1
此时再用 VNC 连接,即可正常进入 Ubuntu 登录界面。
2.5 安装 SSH 服务(方便后续终端操作)
在 VNC 界面中打开终端,执行:
sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh sudo ufw allow 22/tcp
回到宿主机终端,即可直接通过ssh 用户名@192.168.122.x免 VNC 丝滑操作。
第三阶段:SR-IOV VF 创建与持久化 (E810 驱动避坑)
3.1 识别网卡并解决驱动安全模式
使用ip a找到 E810 网卡的 PF 名称(例如eno80或enp59s0f0)。
🚨 核心踩坑预警:如果你执行echo 4 > /sys/class/net/eno80/device/sriov_numvfs报Operation not supported,多半是因为内核自带的ice驱动与网卡固件不兼容,导致进入了安全模式(Safe Mode)。请检查dmesg | grep -i "safe mode"。
解决办法:去 Intel 官网或发行版仓库下载最新版的ice驱动并编译安装(或者更换更高版本的内核),重启后安全模式解除,即可继续。
3.2 创建 VF
# 在 PF 上创建 4 个 VF echo 4 > /sys/class/net/eno80/device/sriov_numvfs # 验证 VF 生成 ip -o link show | grep eno80v
3.3 开机自动创建 VF (Systemd 持久化)
创建服务文件vi /etc/systemd/system/sriov-vf.service,写入:
[Unit] Description=Create SR-IOV VFs After=network-pre.target Before=libvirtd.service [Service] Type=oneshot ExecStart=/bin/bash -c 'echo 4 > /sys/class/net/eno80/device/sriov_numvfs' RemainAfterExit=yes [Install] WantedBy=multi-user.target
激活服务:
systemctl daemon-reload systemctl enable --now sriov-vf.service
第四阶段:VF 映射到虚拟机 (PCI Hostdev 直通)
我们采用 PCI 直通模式(hostdev),获取 VF 的 PCI 地址:
lspci | grep -i eth # 找到对应的 VF 地址,例如 0000:41:01.0
4.1 挂载 VF 网卡到虚拟机
# 1. 先关机 virsh shutdown vm-ubuntu-1 # 2. 将 PCI 设备直通给虚拟机(--config 为持久化生效) virsh attach-interface vm-ubuntu-1 hostdev --source 0000:41:01.0 --model virtio --managed --config # 3. 启动虚拟机 virsh start vm-ubuntu-1
注:千万不要对关机状态的虚拟机使用--live参数,会报domain is not running。
4.2 客户机 (Ubuntu) 内部网络配置
进入 VNC,在 Ubuntu 终端中配置 VF 网卡的 IP:
# 查看连接名 (通常新增的为 Wired connection 2) nmcli connection show # 配置静态 IP (必须加 sudo,否则会报 Not authorized 错误) sudo nmcli connection modify "Wired connection 2" ipv4.method manual ipv4.addresses 192.168.5.60/24 ipv4.gateway 192.168.5.1 ipv4.dns 8.8.8.8 # 启用连接 sudo nmcli connection up "Wired connection 2"
第五阶段:克隆第二台虚拟机 (vm-ubuntu-2)
5.1 克隆第一台虚拟机
virsh shutdown vm-ubuntu-1 |
5.2 修改第二台虚拟机配置(防冲突)
复制磁盘文件:
sudo cp /var/lib/libvirt/images/vm-ubuntu-1.qcow2 /var/lib/libvirt/images/vm-ubuntu-2.qcow2 sudo chown libvirt-qemu:kvm /var/lib/libvirt/images/vm-ubuntu-2.qcow2导出原虚拟机 XML 并修改:
sudo virsh dumpxml vm-ubuntu-1 > /tmp/vm-ubuntu-2.xml sudo vi /tmp/vm-ubuntu-2.xml在 XML 文件中修改以下关键项:
1.<name>:vm-ubuntu-1 → vm-ubuntu-2
2.删除 <uuid> 标签行(让 libvirt 自动生成新 UUID)
3.将所有 vm-ubuntu-1.qcow2 路径改为 vm-ubuntu-2.qcow2
4.修改所有 <mac address=.../>,确保 MAC 地址不重复
5.如果使用了 PCI 直通(hostdev),将 PCI 地址改为其他未使用的 VF 地址(如 0000:41:01.1)
定义并启动新虚拟机:
sudo virsh define /tmp/vm-ubuntu-2.xml sudo virsh start vm-ubuntu-2 sudo virsh vncdisplay vm-ubuntu-2 #放行端口 firewall-cmd --permanent --add-port=5901/tcp firewall-cmd --reload #VNC连接附录:日常运维避坑速查
VNC 复制粘贴不进去?
在 Linux 终端里,粘贴的快捷键不是
Ctrl+V,而是Shift + Insert或鼠标中键。强烈建议配通 SSH 后,用 SSH 终端操作,彻底告别 VNC 折磨。
开机自启:
virsh autostart vm-ubuntu-1优雅关机:
virsh shutdown vm-ubuntu-1彻底删除虚拟机(连同磁盘一起删除):
virsh destroy vm-ubuntu-1 virsh undefine vm-ubuntu-1 --remove-all-storage