~城南花已开~头像
超聚变服务器 KVM 虚拟机与 SR-IOV VF (PCI直通) 全流程实战指南-KVM1封面图

超聚变服务器 KVM 虚拟机与 SR-IOV VF (PCI直通) 全流程实战指南-KVM1

 前言

在超聚变 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
virt-clone --original vm-ubuntu-1 --name vm-ubuntu-2 --file /var/lib/libvirt/images/vm-ubuntu-2.qcow2

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连接


附录:日常运维避坑速查

  1. VNC 复制粘贴不进去?

    • 在 Linux 终端里,粘贴的快捷键不是 Ctrl+V,而是 Shift + Insert 或 鼠标中键。

    • 强烈建议配通 SSH 后,用 SSH 终端操作,彻底告别 VNC 折磨。

  2. 开机自启:virsh autostart vm-ubuntu-1

  3. 优雅关机:virsh shutdown vm-ubuntu-1

  4. 彻底删除虚拟机(连同磁盘一起删除):

    virsh destroy vm-ubuntu-1
    virsh undefine vm-ubuntu-1 --remove-all-storage

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/m0_65516281/article/details/169168271

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--