You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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驱动,步骤如下:
    1. 移除旧驱动:sudo dkms remove r8168/8.049.02 --all
    2. 解压驱动包:tar xvf r8168-8.052.01.tar.bz2
    3. 进入源码目录:cd r8168-8.052.01/src
    4. 创建DKMS源码目录:sudo mkdir /usr/src/r8168-8.052.01
    5. 复制源码文件:sudo cp -v * /usr/src/r8168-8.052.01/
    6. 创建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"
      
    7. 执行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
      
    但这套步骤在6.5.0-15-generic内核上完全失效,而且现在即使重新操作,也因为DKMS残留问题无法重试。

求助问题

现在我卡在两个核心问题上:

  1. 官方源的r8168-dkms 8.049.02版本无法在6.5.0-15-generic内核编译,核心错误是skb_gso_segment函数未声明,同时const类型转换的警告被当作错误处理。
  2. 手动安装的8.052.01版本驱动在DKMS编译时提示Makefile没有clean、modules等规则,无法完成编译。

请问有没有办法解决这两个问题?或者有没有其他方式让我的Realtek 8168网卡在6.5.0-15-generic内核下正常工作?

备注:内容来源于stack exchange,提问作者user1765738

火山引擎 最新活动