我有一台 N100 小主机用 PVE 虚拟化了 OpenWrt 做软路由,但是碍于只有 2 个 2.5Gb 网口,只能一个 WAN 进,一个 LAN 出接到我的 1Gb 路由器上,路由器设置为无线 AP 和交换机,电脑再接到路由器上。这样就导致明明我是 2.5Gb 的局域网,经过路由器后就只剩 1Gb 了,非常浪费。

其中一种解决方法是换个 2.5Gb 路由器,不过我觉得在宿舍用这个千兆路由都绰绰有余了。最近发现 RTL8156b 的 2.5Gb USB 网卡只要 50 块钱左右,于是打算用它给 N100 主机加个 LAN 口。

接入并测试网卡

我使用的 PVE 版本是 8.1.3,Linux 内核是 Linux 6.5.11-7-pve. 实际使用时发现这款芯片的网卡似乎是免驱的,直接插入 USB 网卡就能识别到了。下面是我插入 USB 后的内核日志:

[847658.661547] usb 4-2: new SuperSpeed USB device number 5 using xhci_hcd
[847658.687950] usb 4-2: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[847658.687955] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[847658.687957] usb 4-2: Product: USB 10/100/1G/2.5G LAN
[847658.687958] usb 4-2: Manufacturer: Realtek
[847658.687959] usb 4-2: SerialNumber: 0013000001
[847658.726573] cdc_ncm 4-2:2.0: MAC-Address: c8:4d:44:29:81:4e
[847658.726578] cdc_ncm 4-2:2.0: setting rx_max = 16384
[847658.727082] cdc_ncm 4-2:2.0: setting tx_max = 16384
[847658.727762] cdc_ncm 4-2:2.0 eth0: register ‘cdc_ncm’ at usb-0000:01:00.0-2, CDC NCM (NO ZLP), c8:4d:44:29:81:4e
[847658.728904] cdc_ncm 4-2:2.0 eth0: unregister ‘cdc_ncm’ usb-0000:01:00.0-2, CDC NCM (NO ZLP)
[847658.890810] r8152-cfgselector 4-2: reset SuperSpeed USB device number 5 using xhci_hcd
[847659.022551] r8152 4-2:1.0: load rtl8156b-2 v3 10/20/23 successfully
[847659.111535] r8152 4-2:1.0 eth0: v1.12.13
[847659.126096] r8152 4-2:1.0 enxc84d4429814e: renamed from eth0

也可以通过指令来检查,首先安装 usbutils 工具:apt install usbutil -y

然后查看当前系统的 USB 设备情况:lsusb

Bus 004 Device 005: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN

然后查询 USB 网卡对应网卡名,网卡名可以在 PVE 的网络菜单里找到:

https://assets.zouht.com/img/blog/3601-01.webp

我这个网卡名是 enxc84d4429814e,长得非常奇怪,和内置网卡格格不入。

然后安装 ethtool 工具:apt install ethtool -y

查询该网卡的信息:ethtool enxc84d4429814e

https://assets.zouht.com/img/blog/3601-02.webp

需要注意支持的连接模式和通告连接模式是否都包含 2.5G 全双工,如果有那就是正常的。另外可以看下下面的当前运行模式,如果没有设备接入会显示 10M 半双工,可以尝试插个 2.5G 的设备上去,正常情况下就会运行到 2.5G 全双工了。

将网卡分配给 OpenWrt

(这里是错误方法)因为是 USB 网卡,我最开始自然而然想到的就是把 USB 端口直通给 OpenWrt 虚拟机,就像下面这样:

https://assets.zouht.com/img/blog/3601-03.webp

直通后还得在 OpenWrt 安装驱动,直接在软件包里安装 kmod-usb-net-rtl8152 就可以了。驱动安装好后能正常检测到网卡,但是非常奇怪的是不管怎么样都显示的 2.5Gb 半双工,用 iperf3 测速甚至连 1Gb 都到不了,只有 800Mb 左右。

(下面是正确方法)于是我就换了种方法,网卡分配给 PVE 宿主机,然后创建一个网桥分配给 OpenWrt。我们在 PVE 的网络管理界面,点击创建新网桥,桥接端口选择我们的 USB 网卡名:enxc84d4429814e. 然后点击应用配置。

https://assets.zouht.com/img/blog/3601-04.webp

新建网桥后,在 OpenWrt 的虚拟机硬件里,添加一个网络设备即可。设备选我们刚才新建的网桥,模型选半虚拟化就行了:

https://assets.zouht.com/img/blog/3601-05.webp

这个过程是热更新的,不需要重启 OpenWrt,直接进入后台,可以看到已经多了个新接口:

https://assets.zouht.com/img/blog/3601-06.webp

接下来不要忘记在 OpenWrt 里,要将新加入的网口并入 LAN 口网桥里,加入网桥后,这几个接口就是互通的了,相当于这几个网口拥有一个交换机。我们点击 br-lan 的配置,把自己的所有 LAN 口都勾上保存就行了。

https://assets.zouht.com/img/blog/3601-07.webp

测试速率

我们可以在除了本机的任意局域网设备开启 iperf3 服务端进行测试,首先得安装 iperf3:apt install iperf3 -y,这个在客户端和服务端都得安装。然后启动服务端:iperf3 -s -i 1

首先测试服务端 -> 客户端的流量,在客户端运行:iperf3 -c 192.168.6.2 -i 1 -t 10 -b 10G

可以看到能跑到 2.35Gb,有一点小损失,可能是虚拟化的损失,也有可能是 USB 网卡本来的损失:

Connecting to host 192.168.6.2, port 5201
[ 5] local 172.25.15.46 port 40638 connected to 192.168.6.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 281 MBytes 2.36 Gbits/sec 0 2.84 MBytes
[ 5] 1.00-2.00 sec 280 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 2.00-3.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 3.00-4.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 4.00-5.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 5.00-6.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 6.00-7.00 sec 280 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 7.00-8.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 8.00-9.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
[ 5] 9.00-10.00 sec 281 MBytes 2.35 Gbits/sec 0 2.84 MBytes
– – – – – – – – – – – – – – – – – – – – – – – – –
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec 0 sender
[ 5] 0.00-10.01 sec 2.74 GBytes 2.35 Gbits/sec receiver
iperf Done.

首先测试客户端 -> 服务端的流量,在客户端运行:iperf3 -c 192.168.6.2 -i 1 -t 10 -b 10G -R

可以看到能跑到 2.32Gb,仍然有一点小损失:

Connecting to host 192.168.6.2, port 5201
Reverse mode, remote host 192.168.6.2 is sending
[ 5] local 172.25.15.46 port 44888 connected to 192.168.6.2 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 260 MBytes 2.18 Gbits/sec
[ 5] 1.00-2.00 sec 268 MBytes 2.25 Gbits/sec
[ 5] 2.00-3.00 sec 276 MBytes 2.31 Gbits/sec
[ 5] 3.00-4.00 sec 277 MBytes 2.32 Gbits/sec
[ 5] 4.00-5.00 sec 276 MBytes 2.32 Gbits/sec
[ 5] 5.00-6.00 sec 276 MBytes 2.32 Gbits/sec
[ 5] 6.00-7.00 sec 276 MBytes 2.31 Gbits/sec
[ 5] 7.00-8.00 sec 276 MBytes 2.32 Gbits/sec
[ 5] 8.00-9.00 sec 276 MBytes 2.32 Gbits/sec
[ 5] 9.00-10.00 sec 277 MBytes 2.32 Gbits/sec
– – – – – – – – – – – – – – – – – – – – – – – – –
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 2.68 GBytes 2.30 Gbits/sec 0 sender
[ 5] 0.00-10.00 sec 2.67 GBytes 2.30 Gbits/sec receiver
iperf Done.

使用 SMB 进行文件传输测试,也可以达到 280MB/s 也就是 2.2Gb 左右的传输速度。说明网卡正常工作。

https://assets.zouht.com/img/blog/3601-08.webp
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。