参考声明
本文基于社区两个 RTL8188GU 适配方案优化而来:方案 2(链接)因 6.12.18-trim 内核 API 变更编译失败,最终基于方案 1(链接)修改,解决了内核升级后出现的各类新报错,亲测在飞牛 fnOS 上可用。
一、适配信息
- 网卡:Realtek RTL8xxxU 系列(以 RTL8188GU 为例,设备 ID 0bda:b711)
- 系统:飞牛 fnOS,内核 6.12.18-trim(x86_64)
- 核心:解决内核升级后驱动编译报错、加载失败问题
二、操作步骤
1. 开启 SSH 并提权
飞牛后台→系统设置→高级设置,找到 SSH 服务并开启;
用 SSH 工具登录后,先提权到 root:
运行
sudo su - root
2. 检查状态
先确认网卡和内核版本是否符合要求,运行以下命令:
运行
lsusb | grep 0bda:b711 # 能查到这个ID说明网卡识别正常
uname -r # 确认内核是6.12.18-trim
3. 安装依赖 + 修复软链接
这一步解决编译时依赖缺失和内核头文件找不到的问题,直接运行:
运行
apt update && apt install -y bc gcc build-essential git dkms linux-headers-$(uname -r) linux-kbuild-$(uname -r | cut -d. -f1-2) firmware-realtek
rm -f /lib/modules/$(uname -r)/build
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build
4. 下载源码 + 修复报错
内核升级后会有几个核心编译报错,用下面的命令一键修复:
运行
git clone https://github.com/lwfinger/rtl8xxxu.git /tmp/rtl8xxxu && cd /tmp/rtl8xxxu
# 修复3个核心报错
sed -i 's/ieee80211_beacon_cntdwn_is_complete(vif)/ieee80211_beacon_cntdwn_is_complete(vif, 0)/g' rtl8xxxu_core.c
sed -i 's/ieee80211_csa_finish(vif)/ieee80211_csa_finish(vif, 0)/g' rtl8xxxu_core.c
sed -i 's/void rtl8xxxu_stop(struct ieee80211_hw *hw)/void rtl8xxxu_stop(struct ieee80211_hw *hw, bool force)/g' rtl8xxxu_core.c
sed -i '/void rtl8xxxu_stop(struct ieee80211_hw *hw, bool force)/a \ (void)force;' rtl8xxxu_core.c
sed -i '1i EXTRA_CFLAGS += -Wno-error -Wno-incompatible-pointer-types' Makefile
5. 编译安装 + 验证
编译安装驱动,然后验证是否生效:
运行
make clean && make -j2 modules && make install && make install_fw
depmod -a && modprobe rtl8xxxu
echo "rtl8xxxu" >> /etc/modules-load.d/rtl8xxxu.conf
systemctl restart NetworkManager
# 验证驱动是否加载成功
lsmod | grep rtl8xxxu
ip link show | grep wlan
三、内核升级后报错速查
表格
| 报错信息 |
解决方案 |
| build 目录不存在 |
ln -s /usr/src/linux-headers-6.12.18-trim /lib/modules/6.12.18-trim/build |
| 函数参数不足 |
执行步骤 4 的 sed 修复命令 |
| 指针类型不匹配 |
执行步骤 4 的 sed 修复命令 |
| 警告转错误 |
执行步骤 4 最后一条 sed 命令 |
| 模块找不到 |
用 modprobe rtl8xxxu(不是 rtl8xxxu_git) |
实操过程中踩了不少内核升级后的坑,核心就是解决 API 不兼容和编译依赖的问题,按上面的步骤来基本能一次成功。如果有遇到其他问题,评论区一起交流~