DocsByRcDocsByRc
PVE 网络配置指南
PVE · Virtualization

PVE 网络配置指南

为 PVE 软路由环境量身打造的网络底层配置:VirtIO 虚拟化与 PCIe 硬件直通双路线,防失联、网口重命名全覆盖。

适用PVE 8 / iStoreOS
难度中等
阅读—

在 PVE 宿主机上部署软路由(如 iStoreOS / OpenWrt)时,网络接口的接入方式决定了系统的吞吐量、CPU 负载以及功能扩展性。主要分为 VirtIO 半虚拟化 与 PCIe 硬件直通 两种流派。

核心原则:没有绝对的完美,只有最适合的场景。企业级集群优先选择虚拟化(为了热迁移和高可用),而家用极客与高性能软路由优先选择硬件直通。

在此模式下,宿主机接管所有物理网卡,并创建虚拟交换机(Linux Bridge)。虚拟机通过 VirtIO 驱动连接到虚拟交换机,实现内存级别的数据零拷贝共享。

优势与场景:支持内存按需分配(Memory Ballooning),支持无缝实时快照和热迁移,且多个虚拟机可同时挂载在同一个 vmbr0 上,方便内部数据互通。

步骤一:在 PVE 中创建虚拟交换机 (Linux Bridge)

  1. 登录 PVE Web 管理后台。
  2. 在左侧菜单树中,点击你的节点名称(例如:pve)。
  3. 在节点菜单中选择 网络 (Network),你将看到系统默认已经存在一个 vmbr0。
  4. 点击顶部菜单栏的 创建 (Create),选择 Linux Bridge。
  5. 在弹出的窗口中进行以下配置:
    • 名称 (Name): 保持默认的 vmbr1(如果作为第二个网口)。
    • IPv4/CIDR: 留空(虚拟机内部软路由会自己管理 IP)。
    • 网关 (Gateway): 留空。
    • 桥接端口 (Bridge ports): 填入你需要绑定的物理网卡名称,例如 enp3s0 或 eth1(可对照网络列表里物理网卡的名称填入)。
  6. 点击 创建 (Create)。
  7. 点击顶部菜单的 应用配置 (Apply Configuration) 按钮,让新网桥生效。

步骤二:将虚拟网卡分配给虚拟机

  1. 在 PVE 左侧菜单中,选中你需要配置的软路由虚拟机(如 100 (istoreos))。
  2. 点击 硬件 (Hardware) 标签卡。
  3. 点击顶部的 添加 (Add),选择 网络设备 (Network Device)。
  4. 在弹出的窗口中配置:
    • 桥接 (Bridge): 在下拉菜单中选择你刚才创建的 vmbr1。
    • 模型 (Model): 务必选择 VirtIO (半虚拟化),以获得最佳性能。
    • 防火墙 (Firewall): 建议取消勾选,由软路由自带防火墙接管。
  5. 点击 添加,重新启动虚拟机,软路由系统中即可识别到新网卡。

通过 IOMMU 技术,将主板上的物理网卡芯片直接暴露并移交给虚拟机控制。数据包利用 DMA(直接内存访问)技术绕过 PVE 宿主机系统的 CPU,榨干物理网卡的全部性能。

视觉欺骗预警:直通物理网卡会强制触发 PVE 的 RAM Locking 机制,导致面板显示的内存占用率飙升至 100%。这属于正常现象。

步骤一:主板 BIOS 开启虚拟化支持

  1. 重启物理主机,狂按 Del 或 F2 进入主板 BIOS。
  2. 找到 CPU 配置或高级设置,开启 VT-d (Intel) 或 IOMMU / AMD-V (AMD)。
  3. 保存并退出 BIOS。

步骤二:修改 PVE 内核启动参数,开启 IOMMU

  1. 在 PVE 宿主机面板点击左侧节点 pve,进入 Shell(终端)。
  2. 先看一眼现有启动参数(记下原样,改错了好恢复):grep GRUB_CMDLINE_LINUX_DEFAULT /etc/default/grub。
  3. 用 sed 在原有引号内容后面空格追加开启参数(不要整行替换,会丢掉原来的参数):
BASH
# Intel:在原有参数后追加 intel_iommu=on iommu=pt
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"/GRUB_CMDLINE_LINUX_DEFAULT="\1 intel_iommu=on iommu=pt"/' /etc/default/grub

# AMD:在原有参数后追加 amd_iommu=on iommu=pt
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"/GRUB_CMDLINE_LINUX_DEFAULT="\1 amd_iommu=on iommu=pt"/' /etc/default/grub

# 核对追加结果(引号里应保留原有内容 + 新参数)
grep GRUB_CMDLINE_LINUX_DEFAULT /etc/default/grub
systemd-boot 用户看这里:PVE 8 在 UEFI 下默认用 systemd-boot 而非 GRUB(/etc/default/grub 可能根本不存在)。上面三步跳过,走下面这套:
BASH
# 先看一眼现有参数(记下原样)
cat /etc/kernel/cmdline

# Intel:在行尾空格追加(AMD 把 intel_iommu=on 换成 amd_iommu=on)
sed -i 's/$/ intel_iommu=on iommu=pt/' /etc/kernel/cmdline

# 核对结果 + 刷新引导(相当于 GRUB 的 update-grub)
cat /etc/kernel/cmdline
proxmox-boot-tool refresh
  1. (GRUB 用户)上面 sed 已执行,无需手动保存。systemd-boot 用户上一步已完成,跳过。
  2. 更新引导并加载 VFIO 模块(systemd-boot 用户跳过第 1 条 update-grub,上一步已 refresh):
BASH
# 1. 更新引导文件(GRUB 用户;systemd-boot 上一步已 refresh,跳过这行)
update-grub

# 2. 修改模块文件,让系统允许直通
nano /etc/modules

# 在文件末尾换行,粘贴以下三行(vfio_virqfd 在新内核已移除,不要加)
vfio
vfio_iommu_type1
vfio_pci

# 3. 按 Ctrl+O 保存,Ctrl+X 退出。更新内核配置:
update-initramfs -u -k all

# 4. 重启整个 PVE 物理机
reboot
重启后先验证 IOMMU 已生效,再做步骤三:执行 dmesg | grep -e DMAR -e IOMMU,应能看到 DMAR/IOMMU 相关输出(Intel 平台找 DMAR: IOMMU enabled)。没有任何输出说明 IOMMU 没开起来,先回头检查 BIOS 和启动参数,别急着直通。

步骤三:在虚拟机分配 PCIe 物理硬件

先解绑再直通:要直通的网卡如果还挂在某个 vmbr 的 Bridge ports 里,直接直通会冲突。去 节点 → 网络,双击该网桥,把这块网卡从 Bridge ports 里删掉,点 应用配置,再回来做下面步骤。
  1. 确保虚拟机 (如 100 istoreos) 处于关机状态。
  2. 在左侧菜单点击该虚拟机的 硬件 (Hardware),检查 机型 (Machine),双击将其改为 q35。
  3. 点击顶部的 添加 (Add),选择 PCI 设备 (PCI Device)。
  4. 在弹出的窗口中进行以下极简配置:
    • 设备 (Device): 在下拉列表中寻找你的网卡名称(例如 Intel Ethernet Controller I225-V 或 RTL8125)。
    • 所有功能 (All Functions): 务必打勾。
    • PCI-Express: 务必打勾(告诉系统以纯净 PCIe 模式透传)。
  5. 点击 添加。重复此步骤,将你需要直通的物理网口全部添加进去。
  6. 启动虚拟机,软路由底层将直接握手物理网卡芯片。
绝对禁忌:如果你的机器有 6 个物理网口,千万不要将 6 个口全部做 PCIe 直通!必须至少保留 1 个口(通常为 eth0 或 enp8s0)作为 PVE 宿主机的虚拟管理桥接,否则一旦软路由崩溃,你将彻底失去对 PVE 的控制权。

破解“内存跑满”的视觉 BUG (QEMU Guest Agent)

为了让 PVE 宿主机能够读取直通模式下虚拟机的真实内存数据,必须建立底层通讯通道。

  1. 在 PVE 左侧选中虚拟机,点击 选项 (Options) 面板。
  2. 双击 QEMU Guest Agent,勾选 已启用,点击确定。
  3. 进入 iStoreOS (OpenWrt) 系统的后台,在软件包管理或终端内,安装对应的通讯程序:
BASH
# 在 iStoreOS 终端内执行
opkg update
opkg install qemu-ga
  1. 安装完成后,务必回到 PVE 面板,对该虚拟机执行完整的 关机 (Shutdown),等待完全停止后,再点击 启动 (Start)。
彻底断电重启后,PVE 面板不仅会显示真实的(如 13%)极低内存占用,还能直接获取到虚拟机的局域网 IP 地址,并支持完美的安全软关机机制。

在虚拟化模式下,物理网口(enp*s0)、虚拟交换机(vmbr*)和软路由网卡(eth*)的命名逻辑不同,容易造成对应关系混乱。通过底层 MAC 地址绑定和网卡重置,可以实现 物理口 = 自定义名 = vmbr = 软路由网卡 的强迫症完美映射。

隐性影响预警:此规则死死绑定网卡的 MAC 地址。如果未来更换主板或增加外置网卡,新网卡因 MAC 地址不同,会恢复默认命名,需要重新修改本配置。

步骤一:记录物理网卡 MAC 地址

  1. 在 PVE 左侧菜单点击物理节点(如 pve),进入 >_ Shell (终端)。
  2. 输入命令查看所有物理网卡的 MAC 地址与实时状态:ip -br link。

步骤二:创建自定义命名规则文件

  1. 在终端中,为你想定义名称的网卡创建规则文件:
BASH
nano /etc/systemd/network/10-mgmt.link
  1. 在编辑器中粘贴以下内容(务必替换为你真实的 MAC 地址与自定义小写名称):
INI
[Match]
MACAddress=00:e2:69:73:cf:24

[Link]
Name=mgmt
  1. 按 Ctrl+O 保存,回车确认,按 Ctrl+X 退出。
  2. 重复操作:对照映射表,为你其余的网卡依次创建对应的 .link 文件并填入正确的 MAC 与名称(如 portwan、port3 等)。

步骤三:更新内核引导

  1. 将规则刻入开机镜像,确保底层内核第一时间识别新名字:
BASH
update-initramfs -u -k all

步骤四:提前修改网络配置(防断网核心步)

为了避免重启后系统因寻找旧网卡而卡死(寻卡超时长达 90 秒)甚至导致 PVE 后台失联,我们必须在重启前,提前修改宿主机的网络总配置文件。

  1. 在终端输入命令编辑配置文件:nano /etc/network/interfaces。
  2. 在文件中找到所有包含旧名字的行,将其替换为你刚刚自定义的新名称(如 mgmt、portwan 等)。
  3. 修改完成后,按 Ctrl+O 保存,回车确认,按 Ctrl+X 退出。
  4. 此时底层规则与上层调用已完全统一,可以安心执行重启:reboot。

步骤五:在虚拟机中重置网卡顺序 (eth 映射)

在虚拟机的世界里,谁先被添加,系统就将其认定为前置的 eth 编号。我们需要打乱重排:

  1. 重启完成后,登录 PVE 网页后台,选中你的 100 (istoreos) 虚拟机,确保其处于 关机 状态。
  2. 进入 硬件 (Hardware),将列表中之前添加的所有 网络设备 (net0, net1...) 全部移除 (Remove),一个不留。
  3. 严格按照 vmbr1 到 vmbr5 的顺序,重新依次添加网卡:
    • 点击 添加 -> 网络设备,桥接选择 vmbr1 (模型 VirtIO) —— 它将被分配为系统的 eth0 (WAN)。
    • 再次点击添加,桥接选择 vmbr2 —— 它将被分配为系统的 eth1 (LAN)。
    • 再次点击添加,桥接选择 vmbr3 等,以此类推。

本章汇总了当前多网口主机的真实底层物理对应关系,以及在日常 PVE 运维和网口排查时最高频使用的极客命令。

一、常用网络排查与状态查询命令

在 PVE 终端(Shell)中,随时可以使用以下极客命令来排查物理网口状态、线缆连接以及 MAC 对应关系:

BASH
# 1. 快速精准过滤:只看当前插了网线且处于联通状态(LOWER_UP)的物理网口
ip link | grep -i -C 1 "up"

# 2. 查看所有网卡的名称、简要状态及 MAC 地址清单
ip -br link

二、本机物理网卡与 MAC 状态总览

通过命令行工具检测到的本机真实物理网口硬件与 MAC 地址对应关系如下:

TEXT
lo       00:00:00:00:00:00
enp3s0   88:c9:b3:bb:5a:13
enp4s0   88:c9:b3:bb:5a:12
enp5s0   88:c9:b3:bb:5a:11
enp6s0   88:c9:b3:bb:5a:14
enp7s0   00:e2:69:73:cf:25
enp8s0   00:e2:69:73:cf:24

三、最终闭环映射对照关系

物理接口、系统网桥与自定义重命名之家的精准落地对应关系:

TEXT
enp8s0 = vmbr0 = mgmt    (宿主机管理口)
enp7s0 = vmbr1 = portwan (WAN 光猫接入)
enp6s0 = vmbr2 = port3   (LAN / 内部扩展)
enp3s0 = vmbr3 = port4   (LAN / 内部扩展)
enp4s0 = vmbr4 = port5   (LAN / 内部扩展)
enp5s0 = vmbr5 = port6   (LAN / 内部扩展)
终极闭环达成:至此,整个 PVE 软路由的网口重命名、防失联、虚拟网桥绑定以及日常排查命令全部构建完毕。