Realtek 8168驱动在Linux内核6.5.0-15-generic下编译失败及DKMS安装异常求助
Realtek 8168驱动在Linux内核6.5.0-15-generic下编译失败及DKMS安装异常求助
大家好,我在Ubuntu 22.04 LTS上遇到了Realtek 8168网卡驱动的棘手问题——官方源里的r8168-dkms(版本8.049.02)在6.5.0-15-generic内核下编译失败,尝试手动安装Realtek官方的8.052.01版本驱动也碰到了DKMS相关的异常。下面是详细的问题信息,希望能得到大家的帮助!
网卡硬件信息
我的网卡型号如下:
lspci | grep Ethernet 04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)
官方源驱动编译失败日志
执行cat /var/lib/dkms/r8168/8.049.02/build/make.log查看编译日志,核心错误是函数未声明和类型转换警告被当作错误:
DKMS make.log for r8168-8.049.02 for kernel 6.5.0-15-generic (x86_64) Tue Feb 6 09:10:19 AM AST 2024 make: Entering directory '/usr/src/linux-headers-6.5.0-15-generic' CC [M] /var/lib/dkms/r8168/8.049.02/build/r8168_n.o CC [M] /var/lib/dkms/r8168/8.049.02/build/r8168_asf.o CC [M] /var/lib/dkms/r8168/8.049.02/build/rtl_eeprom.o CC [M] /var/lib/dkms/r8168/8.049.02/build/rtltool.o In file included from ./include/linux/string.h:254, from ./include/linux/bitmap.h:11, from ./include/linux/cpumask.h:12, from ./arch/x86/include/asm/paravirt.h:17, from ./arch/x86/include/asm/cpuid.h:62, from ./arch/x86/include/asm/processor.h:19, from ./arch/x86/include/asm/timex.h:5, from ./include/linux/timex.h:67, from ./include/linux/time32.h:13, from ./include/linux/time.h:60, from ./include/linux/stat.h:19, from ./include/linux/module.h:13, from /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:43: /var/lib/dkms/r8168/8.049.02/build/r8168_n.c: In function ‘rtl8168_set_mac_address’: /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24197:19: warning: passing argument 1 of ‘__builtin_memcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 24197 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ~~~^~~~~~~~~~ ./include/linux/fortify-string.h:648:27: note: in definition of macro ‘__fortify_memcpy_chk’ 648 | __underlying_##op(p, q, __fortify_size); \ | ^ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24197:9: note: in expansion of macro ‘memcpy’ 24197 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ^~~~~~ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24197:19: note: expected ‘void *’ but argument is of type ‘const unsigned char *’ 24197 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ~~~^~~~~~~~~~ ./include/linux/fortify-string.h:648:27: note: in definition of macro ‘__fortify_memcpy_chk’ 648 | __underlying_##op(p, q, __fortify_size); \ | ^ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24197:9: note: in expansion of macro ‘memcpy’ 24197 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ^~~~~~ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24199:32: warning: passing argument 2 of ‘rtl8168_rar_set’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 24199 | rtl8168_rar_set(tp, dev->dev_addr); | ~~~^~~~~~~~~~ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:575:59: note: expected ‘uint8_t *’ {aka ‘unsigned char *’} but argument is of type ‘const unsigned char *’ 575 | void rtl8168_rar_set(struct rtl8168_private *tp, uint8_t *addr); | ~~~~~~~~~^~~~ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c: In function ‘r8168_csum_workaround’: /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:27733:24: error: implicit declaration of function ‘skb_gso_segment’; did you mean ‘skb_gso_reset’? [-Werror=implicit-function-declaration] 27733 | segs = skb_gso_segment(skb, features); | ^~~~~~~~~~~~~~~ | skb_gso_reset /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:27733:22: warning: assignment to ‘struct sk_buff *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion] 27733 | segs = skb_gso_segment(skb, features); | ^ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c: In function ‘rtl8168_resume’: /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:28693:32: warning: passing argument 2 of ‘rtl8168_rar_set’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 28693 | rtl8168_rar_set(tp, dev->dev_addr); | ~~~^~~~~~~~~~ /var/lib/dkms/r8168/8.049.02/build/r8168_n.c:24214:26: note: expected ‘uint8_t *’ {aka ‘unsigned char *’} but argument is of type ‘const unsigned char *’ 24214 | uint8_t *addr) | ~~~~~~~~~^~~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:251: /var/lib/dkms/r8168/8.049.02/build/r8168_n.o] Error 1 make[1]: *** [/usr/src/linux-headers-6.5.0-15-generic/Makefile:2037: /var/lib/dkms/r8168/8.049.02/build] Error 2 make: *** [Makefile:234: __sub-make] Error 2 make: Leaving directory '/usr/src/linux-headers-6.5.0-15-generic'
手动安装官方驱动的DKMS异常
我尝试安装Realtek官方的8.052.01版本驱动,先删除了旧的DKMS记录:
sudo rm -rf /var/lib/dkms/r8168/8.052.01/ sudo rm -rf /var/lib/dkms/r8168/
但执行编译命令时出现错误:
sudo dkms build r8168/8.052.01 --force
输出如下:
Kernel preparation unnecessary for this kernel. Skipping... Building module: cleaning build area... make -j12 KERNELRELEASE=6.5.0-15-generic...(bad exit status: 2) Error! Bad return status for module build on kernel: 6.5.0-15-generic (x86_64) Consult /var/lib/dkms/r8168/8.052.01/build/make.log for more information.
查看该日志cat /var/lib/dkms/r8168/8.052.01/build/make.log,发现是Makefile缺失对应规则:
DKMS make.log for r8168-8.052.01 for kernel 6.5.0-15-generic (x86_64) Tue Feb 6 10:45:03 AM AST 2024 make -C src/ clean make -C src/ modules make -C src/ install make[1]: Entering directory '/var/lib/dkms/r8168/8.052.01/build/src' make[1]: Entering directory '/var/lib/dkms/r8168/8.052.01/build/src' make[1]: *** No rule to make target 'clean'. Stop. make[1]: *** No rule to make target 'modules'. Stop. make[1]: Leaving directory '/var/lib/dkms/r8168/8.052.01/build/src' make[1]: Leaving directory '/var/lib/dkms/r8168/8.052.01/build/src' make[1]: Entering directory '/var/lib/dkms/r8168/8.052.01/build/src' make[1]: *** No rule to make target 'install'. Stop. make[1]: Leaving directory '/var/lib/dkms/r8168/8.052.01/build/src' make: *** [Makefile:48: clean] Error 2 make: *** Waiting for unfinished jobs.... make: *** [Makefile:41: modules] Error 2 make: *** [Makefile:55: install] Error 2
尝试指定内核版本编译也失败,提示同样的Makefile规则缺失问题:
sudo dkms build r8168 -v 8.052.01 -k 6.5.0-15-generic --force
其他相关发现和已执行操作
- 之前发现从Windows 10直接重启到Ubuntu时,网卡会工作异常;后来在Windows上安装了Realtek 10.69版本驱动后,再重启到Ubuntu就没有这个问题了。
- 我本来想给
r8168-dkms提交bug,但发现它不是官方包。 - 我曾为6.5.0-14-generic内核成功手动安装过8.052.01驱动,步骤如下:
- 移除旧驱动:
sudo dkms remove r8168/8.049.02 --all - 解压驱动包:
tar xvf r8168-8.052.01.tar.bz2 - 进入源码目录:
cd r8168-8.052.01/src - 创建DKMS源码目录:
sudo mkdir /usr/src/r8168-8.052.01 - 复制源码文件:
sudo cp -v * /usr/src/r8168-8.052.01/ - 创建
dkms.conf文件:sudo nano /usr/src/r8168-8.052.01/dkms.conf,内容为:PACKAGE_NAME="r8168" PACKAGE_VERSION="8.052.01" BUILT_MODULE_NAME[0]="$PACKAGE_NAME" DEST_MODULE_LOCATION[0]="/updates/dkms" AUTOINSTALL="YES" REMAKE_INITRD="YES" - 执行DKMS命令:
sudo dkms add r8168/8.052.01 sudo dkms build r8168/8.052.01 -k 6.5.0-14-generic sudo dkms install r8168/8.052.01 -k 6.5.0-14-generic
- 移除旧驱动:
求助问题
现在我卡在两个核心问题上:
- 官方源的
r8168-dkms8.049.02版本无法在6.5.0-15-generic内核编译,核心错误是skb_gso_segment函数未声明,同时const类型转换的警告被当作错误处理。 - 手动安装的8.052.01版本驱动在DKMS编译时提示Makefile没有clean、modules等规则,无法完成编译。
请问有没有办法解决这两个问题?或者有没有其他方式让我的Realtek 8168网卡在6.5.0-15-generic内核下正常工作?
备注:内容来源于stack exchange,提问作者user1765738




