起因
最近想把家里的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文件即可,编辑完成后重启后生效,实测效果很稳定。
需要注意的是,在重启前请将与网卡名相关的服务均调整为重命名后的名字,否则可能会造成服务异常
参考资料
- Module build for the currently running kernel was skipped · Issue #288 · draios/sysdig (github.com)
- Wrong driver loaded (r8169 instead of r8125) · Issue #7 · awesometic/realtek-r8125-dkms (github.com)
- 使用多个USB网卡,重启后网口名称都会变化-CSDN博客
- 虚拟机装的 Debian,如何指定多个网卡与 eth 的对应关系 – V2EX
- Debian 12安装NVIDIA显卡驱动后更新内核无法进入系统 – 新手园地 – Debian中文论坛 (debiancn.org)
- systemd.link 中文手册 [金步国] (jinbuguo.com)
- 最新
- 最热
只看作者