ChrisKim
Do not go gentle into that good night.
颢天

PVE 8+OpenWrt 使用 RTL8156b USB 网卡

我有一台 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
本文链接:https://www.zouht.com/3601.html
本文使用:CC BY-NC-SA 4.0 许可
# # # # #
首页      随笔      PVE 8+OpenWrt 使用 RTL8156b USB 网卡

发表回复

textsms
account_circle
email

  • 太阳雨

    虽然我没看明白,但是我知道经过你的折腾,问题能解决了 [胜利]

    4 月前 回复
  • Yjq

    帮了我大忙,一直找不到问题出在哪

    2 周前 回复

颢天

PVE 8+OpenWrt 使用 RTL8156b USB 网卡
我有一台 N100 小主机用 PVE 虚拟化了 OpenWrt 做软路由,但是碍于只有 2 个 2.5Gb 网口,只能一个 WAN 进,一个 LAN 出接到我的 1Gb 路由器上,路由器设置为无线 AP 和交换机,电脑再接…
扫描二维码继续阅读
2023-12-28