Ubuntu Linux 下安装 R8156B 2.5G 网卡

4,685 阅读6分钟

前言

购买了,R8156B芯片的2.5G网卡,并放在NAS上使用,但修改配置文件后并没有按照理想的状态运行。经过一番查验后发现是驱动问题,最终解决,附上记录和解决方案。

问题

插上网卡,检测到为网卡为enx00e04c681128,简单将/etc/network/interfaces当中的的网卡名称修改,重启后发现连主机也无法联网。

使用ip link 命令检测后发现网卡状态为down,使用ip link set dev enx00e04c681128 up 启动网卡后,发现此时主机可以连接网络,但是VM客户端依然无法联网。进入客户端中,使用命令检测:

➜  ~ ip link ls
......
4: enx00e04c680000: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP mode DEFAULT group default qlen 1000
    link/ether 00:e0:4c:00:00:00 brd ff:ff:ff:ff:ff:ff
......
➜  ~ ethtool enx00e04c680000
Settings for enx00e04c680000:
        Current message level: 0x00000007 ()
                               drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol
        Link detected: yes

可以看到并没有获取到IP。在主机当中查询,发现网桥是正常的:

➜  ~ brctl show vmbr0
bridge name     bridge id               STP enabled     interfaces
vmbr0           8000.00e04c681128       no              enx00e04c681128
                                                        fwpr101p0
                                                        fwpr105p0

折腾了很久,参阅了很多帖子但是都没有解决问题:

No IP Addresses on VM/Containers with Bonding

Proxmox on local network - No IP for the containers

VM bridge not getting DHCP address for new install.

...

一开始的主要在解决配置文件的问题,因为主机可以联网,但是VM无法联网,因此没去考虑驱动的问题。当然问题始终无法解决。

搜索后再次怀疑是网卡问题,一方面,观察到网卡驱动很奇怪为cdc_ncm ,为了搞懂cdc_ncm 到底是什么,又进行了一番搜索,最后发现原来Linux内核当中没有整合R8156 的驱动,大概确定了这是由于网卡驱动没装好导致的问题。

Can't get RTL8125B working on 20.04

使用ethtool -i的时候发现获取不到网卡的速率,在使用dmesg --human查看内核日志的时候,发现网卡不断在发送奇怪的消息,

[  556.959398] usb 3-3.2: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=30.00
[  556.959400] usb 3-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[  556.959401] usb 3-3.2: Product: USB 10/100/1G/2.5G LAN
[  556.959402] usb 3-3.2: Manufacturer: Realtek
[  556.959403] usb 3-3.2: SerialNumber: 000000001
[  556.984103] cdc_ncm 3-3.2:2.0: MAC-Address: a0:ce:c8:cb:7c:ca
[  556.984105] cdc_ncm 3-3.2:2.0: setting rx_max = 16384
[  556.984172] cdc_ncm 3-3.2:2.0: setting tx_max = 16384
[  556.984445] cdc_ncm 3-3.2:2.0 usb0: register 'cdc_ncm' at usb-0000:00:14.0-3.2, CDC NCM, a0:ce:c8:cb:7c:ca
[  557.009821] usbcore: registered new interface driver r8152
[  557.012312] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: renamed from usb0
[  557.062459] usb 2-3.1.1: new high-speed USB device number 8 using xhci_hcd
[  557.062510] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: network connection: disconnected
[  557.094515] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: network connection: disconnected
[  557.126508] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: network connection: disconnected
[  557.158506] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: network connection: disconnected
[  557.190514] cdc_ncm 3-3.2:2.0 enxa0cec8cb7cca: network connection: disconnected

Why is ethtool not showing me all the properties for a NIC?

搜索后发现已经有类似的问题了,让我没想到的是在20.04当中也没有集成驱动。

RTL8152 on Ubuntu 18.04

Bug #1832472 "cdc_ncm floods syslog unneccessarily" : Bugs : linux package : Ubuntu

也是R8156网卡导致的,参考34楼。

This is because the upstream driver doesn't support Realtek 8156 (yet). Please ask Realtek to upstream their driver, and use [1] for the interim. [1] www.realtek.com/en/componen…

由此可以确定,并不是配置问题,而是网卡驱动没有正确安装。

分析

一开始并没有往驱动方面去思考,毕竟出来一两年的芯片了,目前realtek非常常用的2.5G芯片,内核早就有支持。另一方面也缺乏驱动方面目的经验,一开始看到cdc_ncm 驱动并没有意识到驱动有问题。

确定问题之后,接下来的步骤就很简单了,编译安装驱动。

解决方案

编译驱动

首先,安装驱动,

Realtek USB FE / GBE / 2.5G / Gaming Ethernet Family Controller Software

里面有安装说明,这里附上另一个安装说明:

Install Realtek 8152 or 8153 drivers on Ubuntu 16.10

`Here's what I did to get the driver working on Debian Stretch:

  1. Download official driver from realtek: www.realtek.com/en/componen…

  2. untar it: # tar xvf ./r8152.53.56-2.12.0.tar

  3. make sure you have current kernel headers installed sudo apt install linux-headers-$(uname -r)

  4. compile the driver cd r8152_2.12.0 && make

  5. install the compiled driver sudo make install`

需要注意的是,由于主机为proxmox,定制Debian系统,需要手动安装一遍Linux headerbuild-enessial ,然后在执行安装。

安装驱动

编译完成后,在当前文件夹下生成了驱动文件r8152.ko ,接下来使用命令安装,并更具命令加载到系统当中,并更新启动镜像:

sudo insmod r8152.ko
depmod -a
update-initramfs -u

然而安装完成后,无论重启还是怎么,VM依然无法上网。检查后发现驱动还是cdc_ncm ,这是怎么回事呢?反复安装了几次,使用r8154网卡正常识别,确定驱动没问题,驱动文件当中也有提及8156这个型号,lsusb也有网卡。

添加规则文件

想要强制使用驱动文件,直接屏蔽cdc_ncm 驱动粗鲁,更改PID和DID太麻烦

linux ethernet drivers product id, device id and address

另一种是然是卸载模块,让安装的驱动优先级更高?

sudo modprobe -r cdc-ncm

然后由于显卡目前使用的驱动就是cdc-ncm ,因此也行不通。

经过搜索发现,只要将附带的rule文件复制到udev配置文件当中即可。

RTL8152 on Ubuntu 18.04

cp 50-usb-realtek-net.rules /usr/lib/udev/rules.d/
modprobe r8152
sudo systemctl status systemd-modules-load.service

重启网络服务,重新加载模块或重启电脑后,再用ethtool 查看一切正常了,检测结果如下所示:

➜  ~ ethtool enx00e04c680000
Settings for enx00e04c680000:
        Supported ports: [ MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
                                2500baseT/Full 
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
                                2500baseT/Full 
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                             100baseT/Half 100baseT/Full 
                                             1000baseT/Full 
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00007fff (32767)
                               drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol
        Link detected: yes

其它

  • 稍微了解了一下Linux驱动的一些规范,感觉也没那么麻烦。
  • Linux驱动的rule文件详解
  • 访问的一些网站

session_buddy_export_2021_06_20_22_33_43.txt

  • 基于typec的驱动

ulli-kroll/r8152