前言
购买了,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当中也没有集成驱动。
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:
-
Download official driver from realtek: www.realtek.com/en/componen…
-
untar it: # tar xvf ./r8152.53.56-2.12.0.tar
-
make sure you have current kernel headers installed sudo apt install linux-headers-$(uname -r)
-
compile the driver cd r8152_2.12.0 && make
-
install the compiled driver sudo make install`
需要注意的是,由于主机为proxmox,定制Debian系统,需要手动安装一遍Linux header和build-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配置文件当中即可。
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的驱动