在用 Intel N100 小主机折腾 PVE(Proxmox Virtual Environment)做 AIO(All in One)时,双网卡直通给 OpenWrt/iStoreOS 等软路由系统是提升网络性能、降低 CPU 占用的常见操作。
但很多人在操作时经常遇到两个痛点:
- 一顿操作后,PVE 宿主机失联了,管理后台再也打不开。
- N100 的 4 个网卡在同一个 IOMMU 分组里,无法单独直通。
本文将以多网卡(以常见的 4 口 i226-V N100 小主机为例)为背景,手把手带你完成双网卡直通,同时保留剩余网口供 PVE 宿主机正常通信与管理的完整配置流程。
一、 核心逻辑与网口分配规划
在开始敲命令之前,必须先理清网口分配逻辑。假设你的 N100 小主机有 4 个物理网口,在系统里识别为 enp2s0、enp3s0、enp4s0、enp5s0:
| 物理网卡名称 | 拟分配用途 | 处理方式 |
|---|---|---|
| enp2s0 (网口 1) | PVE 宿主机管理口 / LAN 桥接 | 绝对不要直通。绑定到 vmbr0,用于宿主机上网及管理。 |
| enp3s0 (网口 2) | 软路由 WAN 口 | 直通 给软路由 VM,接光猫。 |
| enp4s0 (网口 3) | 软路由 LAN 口 | 直通 给软路由 VM,接交换机或 AP。 |
| enp5s0 (网口 4) | 备用口 / 物理双 WAN / 其它 VM | 保持默认(不直通,或通过虚拟网桥使用)。 |
关键原则:直通是“物理剥夺”。一旦一个网卡被直通给某个虚拟机,PVE 宿主机就完全失去了对该网卡的控制权。因此,必须留出至少一个网口(如 enp2s0)绑定在
vmbr0上,绝对不能将其直通。
二、 开启 PVE 宿主机的 IOMMU 支持
要想实现硬件直通,必须在宿主机内核中启用 Intel VT-d。
1. 确认 BIOS 设置
开机按 DEL 或 F2 进入 BIOS,确保以下选项已开启(Enabled):
Intel Virtualization Technology(VT-x)Intel VT for Directed I/O(VT-d)
2. 修改内核启动参数
根据你的 PVE 安装方式(UEFI 还是 Legacy),修改配置文件。
情况 A:如果是 GRUB 引导(最常见)
编辑 /etc/default/grub 文件:
nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet" 这一行,修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
保存退出(Ctrl+O,回车,Ctrl+X),然后更新 grub:
update-grub
情况 B:如果是 systemd-boot 引导(通常是 UEFI + ZFS 安装)
编辑 /etc/kernel/cmdline 文件:
nano /etc/kernel/cmdline
在已有内容末尾加上(空格分隔):
intel_iommu=on iommu=pt
保存退出,然后更新引导:
proxmox-boot-tool refresh
3. 添加内核模块
编辑 /etc/modules 文件,确保系统启动时加载 VFIO 相关模块:
nano /etc/modules
在文件末尾添加以下四行内容:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
保存并重启 PVE 宿主机:
reboot
三、 解决 N100 的 IOMMU 分组恶梦 (ACS 冲突)
重启后,在 PVE 网页端的“系统 -> 硬件 -> 添加 PCI 设备”中,你可能会发现所有的网卡都被分在同一个 IOMMU 组(例如 Group 1)。如果直接直通其中一两个,PVE 会报错或直接将整个组(包括管理口)一起直通,导致宿主机瞬间失联。
解决办法:开启 ACS 强拆分组
- 重新编辑内核配置文件(以 GRUB 引导为例):
nano /etc/default/grub - 在
GRUB_CMDLINE_LINUX_DEFAULT中追加pcie_acs_override=downstream,multifunction:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction" - 保存并更新引导:
update-grub # systemd-boot 用户请运行 proxmox-boot-tool refresh - 再次重启 PVE:
reboot
重启后,进入 PVE 后台,在“节点 -> 系统 -> 硬件”中查看 PCI 设备,此时你会发现网卡的 IOMMU 组已经被成功拆分,每个网卡都拥有了独立的 Group ID。
四、 确认并保护宿主机管理网口
在直通前,必须确认哪个网口是当前的“保命口”。
- 在 PVE 后台,点击“节点 -> 网络”。
- 查看
vmbr0(虚拟网桥)绑定在哪个Active(活动)的物理网卡上(比如enp2s0)。 - 在后续的直通操作中,绝对不要勾选这个网卡对应的 PCI 设备!
五、 将双网卡直通给虚拟机(以 OpenWrt 为例)
- 进入 PVE 后台,选择你的软路由虚拟机(如 ID 100)。
- 点击 “硬件” -> “添加” -> “PCI 设备”。
- 在“设备”下拉菜单中,找到你要直通的第一个网卡(例如
0000:03:00.0,对应enp3s0)。 - 务必勾选“所有功能”(All Functions)和“ROM 栏”(ROM-Bar),不要勾选“PCI-Express”。(部分 N100 小主机勾选 PCIe 可能会导致虚拟机无法启动或死机,建议保持默认不勾选 PCIe )。
- 点击“添加”。
- 重复上述步骤,将第二个网卡(例如
0000:04:00.0,对应enp4s0)也添加进来。
此时,你的虚拟机硬件列表中应该有两行额外的 PCI 设备。
六、 避坑指南与极限救援
1. 为什么直通后虚拟机打不开,提示 No IOMMU detected?
请检查 BIOS 中的 VT-d 是否真正开启,以及你在 PVE 中修改的 Grub/cmdline 配置文件是否拼写正确,且是否成功运行了更新命令(update-grub 或 proxmox-boot-tool refresh)。
2. 直通后宿主机失联了怎么办?(终极救砖法)
如果你不小心把管理网口也直通了,或者 ACS 拆分失效导致全组网卡被强行带走,导致无法访问 PVE 后台,请不要惊慌,按以下步骤救援:
- 接上显示器和键盘到 N100 小主机上。
- 登录 PVE 命令行(用户名
root,密码为你设定的密码)。 - 编辑虚拟机配置文件,强行删掉直通设备。例如虚拟机 ID 是
100:nano /etc/pve/qemu-server/100.conf - 在文件里找到类似
hostpci0: 00:1f.6这样的行,直接整行删掉,保存退出。 - 如果是因为内核参数改错导致系统崩溃,直接编辑
/etc/default/grub,恢复原状并运行update-grub,然后重启。
3. PVE 宿主机如何通过软路由上网?
直通后,你的软路由拥有了物理 WAN(接光猫拨号)和物理 LAN(接交换机)。
此时,将 N100 的 物理管理口(enp2s0) 用网线连接到交换机(也就是软路由 LAN 口延伸出来的网络)上。
在 PVE 的“网络”配置中,将 vmbr0 的网关(Gateway)指向软路由的 LAN 口 IP(例如 192.168.1.1)。这样,PVE 宿主机既能被局域网设备管理,也能通过软路由正常下载更新和上网了。