Debian12安装RTL8156B USB网卡及DKMS驱动的探究

Debian12安装RTL8156B USB网卡及DKMS驱动的探究

起因

最近想把家里的3855U小主机改成软路由,作为拨号路由进行多宽带拨号使用,但无奈MiniPCIe不够用了,闲鱼买了两块RTL8156B的USB3.0网卡作为扩展

到手后发现估计又是出口转内销产品,50块东西做的很精致,外壳应该还真就是铝合金

插上主机后发现可以识别,我的系统是Debian12,内核当然升级到了6.1.0,但随之而来的问题也出现了,它识别到了是块网卡,但似乎驱动状态并不正常。

使用lsusb命令查看,发现网卡处于cdc_ncm状态,猜测是即便6.1.0的内核也并未合并RTL8156B的驱动,于是尝试自行安装驱动

安装驱动

瑞昱官网是有驱动的下载的,但我发现Github上有个名为awesometic/realtek-r8152-dkms: A DKMS package for easy use of Realtek r8152 driver, which supports Realtek USB NICs including RTL8156 2.5 GbE. (github.com)的项目,描述为DKMS模式下的快速驱动安装,至于什么是DKMS,可以参考动态内核模块支持 – 维基百科,自由的百科全书 (wikipedia.org)这篇wiki。

于是乎后面的步骤就非常轻松写意了,首先安装DKMS

以下步骤如非注明,则均以root权限执行命令

apt install dkms -y 

下载最新的Releases deb包并使用dpkg安装

wget -c https://github.com/awesometic/realtek-r8152-dkms/releases/download/2.17.1-3/realtek-r8152-dkms_2.17.1-3_amd64.deb
dpkg -i realtek-r8152-dkms_2.17.1-3_amd64.deb

至此,驱动就安装完毕了

关于DKMS驱动安装后,使用lspci -v或ethtool -i 命令查看到的驱动版本对不上的问题探究

DKMS驱动由于可以使用deb包的形式进行安装,安装的便捷度可以说是大幅提升

但在我安装的过程中却碰到了执行apt/dpkg且安装完成后,DKMS驱动并未启用的问题,由于我有三种网卡(RTL8111/RTL8125/RTL8156B),它们三个对应的驱动则为(RTL8168/RTL8125/RTL8152),在我均使用DKMS的deb方式安装后,使用ethtool -i命令查看内核驱动时发现驱动版本均为1.13.x,而使用lspci -v命令时,查看到的drive in use均为rtl8169(linux下的通用驱动),且RTL8152驱动回报的版本也不正常,最终发现是由于我升级Debain12过程中升级了6.1.0内核,却忘记同步安装6.1.0的linux-headers,而DKMS在未找到内核对应的linux-headers时不会进行驱动的编译,会直接SKIP无headers的内核。提示信息大概像下面这样

Module build for the currently running kernel was skipped since the
kernel source for this kernel does not seem to be installed.

这个问题困扰了我足足三天,因为DKMS对这个跳过的信息完全不会进行高亮甚至做一个warring/notice标识的提示,直到我在一篇关于英伟达DKMS驱动安装不正常的帖子里看到这个描述才知道,下面是正常的驱动状态与不正常的驱动状态对比

如何禁用RT8169驱动

由于RT8169驱动是Linux内核自带的Realtek网卡通用驱动,它可以让大部分Realtek网卡在Linux下直接开箱即用,无需手动安装驱动。但众所周知免驱的代价就是能用但不太稳定,当然这锅纯粹就是Realtek的问题,目前已知的问题就是RTL8125/8156B会存在兼容性问题,例如异常掉线/丢包/卡死/性能低下等等,所以在可以安装对应驱动的情况下不建议使用RT8169通用驱动。另外由于Linux特有的旧驱动优先级比新安装驱动优先级高的问题,如果要使用新驱动建议将RT8169驱动禁用,但不建议卸载,因为这东西跟着内核走,你下次升级内核的时候这玩意还是会回来。

执行下面的命令创建blacklist-r8169.conf作为驱动黑名单文件

sudo tee -a /etc/modprobe.d/blacklist-r8169.conf > /dev/null <<EOT
# To use r8125/r8168 driver explicitly
blacklist r8169
EOT

更新initramfs

update-initramfs -u

之后重启系统即可

如何重命名网卡名

另外我发现USB网卡插入后,网卡名实在是不太美观……于是尝试重命名网卡,将网卡统一修改为eth1/2/3……格式

sed -i '/GRUB_CMDLINE_LINUX=/s/"$/net.ifnames=0 biosdevname=0"/' /etc/default/grub

或者,编辑/etc/default/grub,将GRUB_CMDLINE_LINUX字段修改为如下所示

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

然后

update-grub

最后

sed -i 's/网卡名/指定的名称,如eth1/' /etc/network/interfaces

此改动重启系统后生效

如何使用mac地址自动重命名网卡

[老方案(可能会弃用)]使用.rules文件(udev)进行网卡重命名

由于一些莫名其妙的问题,网卡会时不时的在重启后变换名称(比如原本是eth1的网卡变成了eth0),而由于ntftables和dnsmaq等服务的配置均依靠网卡名来实现,这就会造成实际配置的错误,所以我需要固定网卡名称

经过一些搜索后得知,对于网卡的重命名仅需创建一个内核规则即可

/etc/udev/rules.d下创建70-persistent-net.rules文件,没有此目录的话创建一个即可

mkdir /etc/udev/rules.d
vi /etc/udev/rules.d/70-persistent-net.rules

添加以下内容到文件中

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="网卡MAC地址1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="网卡MAC地址2", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="lan1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="网卡MAC地址3", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="wan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="网卡MAC地址4", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="wan1"

需要注意的是,网卡MAC地址只能填写小写的英文字符,大写英文字符不会生效不要漏掉了双引号,漏掉也不会生效

[新标准]使用.link文件(systemd network)进行重命名

/etc/systemd/network/下创建10-lan1.link文件,写入如下格式

[Match]
MACAddress=00:30:18:51:fd:03

[Link]
Name=lan0

有几张网卡写几个10-xx.link文件即可,编辑完成后重启后生效,实测效果很稳定。

需要注意的是,在重启前请将与网卡名相关的服务均调整为重命名后的名字,否则可能会造成服务异常

参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 共1条
头像
说点什么?
提交
头像

昵称

取消
昵称表情代码图片
    • Rain的头像-Rain's BlogRain作者0