ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux下RTL8723DU无线蓝牙二合一网卡驱动编译安装全攻略

Linux下RTL8723DU无线蓝牙二合一网卡驱动编译安装全攻略 1. 项目概述一张网卡两套系统如果你手头有一台迷你主机、工控机或者某些品牌的笔记本电脑特别是那些追求极致轻薄或高性价比的设备你很可能会遇到一块名为RTL8723DU的无线网卡。这块小小的芯片很有意思它把Wi-Fi和蓝牙功能集成在了一个模块里主打的就是一个“All in One”。对于设备制造商来说这能节省空间和成本但对于我们这些终端用户特别是喜欢自己折腾系统比如安装各种Linux发行版的朋友来说它可能意味着一个不大不小的麻烦系统自带的驱动可能无法完美识别它或者只能驱动Wi-Fi蓝牙却成了摆设。我最近就遇到了这么一档子事。一台用作家庭影音中心的小主机原装系统是Windows跑得挺稳。但我想把它刷成某个基于Linux的媒体中心系统结果装完发现Wi-Fi列表空空如也蓝牙设备也搜不到。一查硬件果然是RTL8723DU。这问题其实挺典型的根源在于Linux内核的驱动更新往往滞后于硬件上市速度尤其是对于这种二合一的组合芯片驱动兼容性更是个挑战。RTL8723DU的Wi-Fi部分和蓝牙部分在Linux系统里实际上是两个独立的驱动模块需要分别编译、安装和配置任何一个环节出问题都会导致功能缺失。所以今天我们就来彻底搞定它。这篇文章的目标很明确为你提供一份从零开始为RTL8723DU芯片编译和安装Wi-Fi及蓝牙驱动的完整指南。无论你是Linux新手还是有一定经验的用户跟着步骤走都能让你的网卡在Linux下“满血复活”。整个过程会涉及内核头文件准备、驱动源码下载、编译参数调整、模块加载以及稳定性配置我会把每一步的原理和可能踩的坑都讲清楚。2. 驱动原理与方案选型在动手之前我们得先搞清楚我们要对付的是什么以及为什么通用的驱动往往不行。RTL8723DU是一款由Realtek瑞昱生产的无线芯片它集成了802.11n Wi-Fi和蓝牙4.0有的版本是4.2功能。在Linux的世界里硬件驱动通常以内核模块.ko文件的形式存在。2.1 为什么需要手动编译驱动主流Linux发行版如Ubuntu、Fedora的内核已经包含了非常丰富的硬件驱动但它们是“通用”和“稳定”导向的。内核维护者只会将那些经过充分测试、代码稳定的驱动合并到主线内核中。像RTL8723DU这类较新或相对小众的芯片其官方驱动可能还处于更新迭代较快的阶段或者代码风格与内核主线要求有差异因此没有被直接收录。此时我们有几种选择等待发行版更新被动等待下一个内核版本或系统更新包含它。这可能需要几周甚至几个月对于急需使用的我们来说不现实。安装DKMS驱动包有些热心开发者或硬件厂商会提供DKMS动态内核模块支持格式的安装包。DKMS的好处是能在系统内核升级后自动重新编译驱动。但缺点是这类包的维护质量参差不齐可能不适用于你的特定内核版本或发行版。手动编译源码这是最直接、最可控的方法。直接从相对可靠的源码仓库获取代码在自己的系统环境下编译。这样做的好处是兼容性最好可以针对当前内核进行优化也能更深入地理解驱动加载过程。我们选择的就是这条路虽然步骤稍多但一劳永逸且能积累宝贵的排错经验。2.2 Wi-Fi驱动与蓝牙驱动的区别这是理解整个安装过程的关键。RTL8723DU的Wi-Fi和蓝牙虽然是同一颗芯片但在操作系统层面它们被视作两个独立的设备由两套不同的驱动栈来管理。Wi-Fi驱动 (rtl8723du)这个驱动负责管理芯片的无线网络功能。它需要处理802.11协议、扫描网络、建立连接、管理数据包等。编译后会产生一个名为8723du.ko的内核模块。蓝牙驱动 (rtl8723du_bt)这个驱动负责管理蓝牙功能。它遵循Linux的蓝牙子系统BlueZ规范处理蓝牙设备发现、配对、协议栈等。编译后通常会产生rtk_btusb.ko之类的模块。一个重要概念固件Firmware。除了内核模块这类无线和蓝牙设备通常还需要额外的“固件”文件。你可以把驱动理解为“软件控制器”告诉系统如何操作硬件而固件则是加载到硬件芯片内部运行的“微程序”是硬件正常工作的基础。系统需要在特定目录下准备好对应的固件文件驱动加载时会自动读取它们。缺少固件是导致驱动加载后设备仍无法工作的常见原因。2.3 源码获取渠道分析网上能找到的RTL8723DU驱动源码有很多版本质量不一。主要来源有Realtek官方理论上最权威但Realtek官网的Linux驱动更新慢且下载界面不友好经常找不到对应型号。GitHub开源仓库这是最活跃的来源。通常是由社区开发者维护的他们从官方代码或其他渠道获取后进行适配和更新使其能在新内核上编译通过。我们需要寻找那些Star数较多、近期有更新的仓库这代表其活跃度和可靠性较高。注意在下载和编译任何第三方驱动时请务必从可信的仓库获取。随意编译来路不明的代码可能存在安全风险或系统不稳定。基于以上分析我们的技术路线确定为从可靠的GitHub仓库获取最新的驱动源码在本地准备编译环境分别编译Wi-Fi和蓝牙驱动模块安装并加载模块最后配置固件和网络管理工具。3. 环境准备与依赖安装工欲善其事必先利其器。编译内核模块不是运行一个简单的脚本它需要你的Linux系统具备完整的编译工具链和当前运行内核的“开发头文件”。3.1 确认系统与内核信息首先打开终端我们需要确认几个关键信息# 查看当前Linux发行版和版本号 lsb_release -a # 或者查看 /etc/os-release 文件 cat /etc/os-release # 查看当前正在运行的内核版本这个信息至关重要 uname -r记下uname -r输出的内核版本号例如5.15.0-91-generic。我们后续安装的“内核头文件”必须和这个版本完全一致。3.2 安装编译工具与内核头文件不同的Linux发行版使用不同的包管理器。以下以最常见的Ubuntu/Debian系和Fedora/RHEL系为例。对于 Ubuntu, Debian, Linux Mint 等使用 apt# 首先更新软件包列表 sudo apt update # 安装编译必需的工具gcc, make, 构建工具等 sudo apt install build-essential # 安装与当前运行内核完全匹配的头文件 sudo apt install linux-headers-$(uname -r) # 安装可能需要的其他依赖如git用于下载源码、wireless-tools等 sudo apt install git libelf-dev对于 Fedora, RHEL, CentOS 等使用 dnf 或 yum# 安装开发工具组和内核头文件 sudo dnf groupinstall Development Tools sudo dnf install kernel-devel-$(uname -r) # 安装其他依赖 sudo dnf install git elfutils-libelf-devel关键检查安装完成后务必验证内核头文件路径是否存在。这个路径通常是/lib/modules/$(uname -r)/build或/usr/src/kernels/$(uname -r)。你可以用ls命令查看一下。这个路径会在编译时被Makefile引用告诉编译器如何为你的特定内核构建模块。实操心得有时apt install linux-headers-$(uname -r)可能会失败提示找不到该版本的包。这通常是因为你的内核刚升级但软件源中的头文件包还未同步。可以尝试先sudo apt update sudo apt upgrade升级所有包或者稍等几小时再试。也可以去发行版官网手动搜索下载对应版本的headers包但比较麻烦。3.3 获取驱动源码这里我们选择一个在社区中较为活跃的GitHub仓库作为示例。请注意仓库地址和代码可能随时间变化请以实际情况为准。# 创建一个专门的工作目录避免文件散落各处 mkdir -p ~/rtl8723du_driver cd ~/rtl8723du_driver # 使用git克隆驱动源码仓库 git clone https://github.com/lwfinger/rtl8723du.git cd rtl8723dulwfinger是一位在Realtek无线驱动社区化方面做了大量工作的维护者他的仓库通常比较可靠。进入目录后你可以查看README.md文件里面通常会有基本的编译说明。4. Wi-Fi驱动编译与安装详解现在进入核心环节。我们首先处理Wi-Fi部分。4.1 源码结构与编译进入克隆下来的rtl8723du目录你会看到一系列文件其中最关键的是Makefile。ls -la典型的文件包括Makefile: 编译的指挥棒定义了编译规则、内核路径等。hal/,os_dep/: 驱动核心代码目录包含了硬件抽象层和操作系统相关代码。Kconfig: 内核配置相关文件如果我们以内核树外方式编译这个不太用得到。开始编译# 确保你在源码根目录下 cd ~/rtl8723du_driver/rtl8723du # 执行清理如果是首次编译可跳过但无害 make clean # 开始编译。-j 参数后面跟数字表示用几个CPU核心并行编译可以加快速度。 # 例如如果你的CPU是4核可以用 make -j4 make -j$(nproc)$(nproc)命令会自动获取你CPU的核心数。编译过程会输出大量信息如果没有以error结尾的报错最后几行看到类似LD [M] /path/to/8723du.ko和Building modules, stage 2的成功提示就说明编译成功了。编译过程解析make命令会读取Makefile。这个文件里最关键的一行通常是KSRC ? /lib/modules/$(shell uname -r)/build它指定了内核头文件的位置。编译器会根据你的当前内核版本将C源码编译成与之匹配的内核模块对象文件.ko。4.2 安装驱动模块编译生成的.ko文件还在当前目录。我们需要将它安装到系统的标准模块目录/lib/modules/$(uname -r)/kernel/drivers/net/wireless/下并更新模块依赖关系。# 安装模块这需要root权限 sudo make install # 更新initramfs初始内存文件系统。这一步非常重要 # 它确保系统在启动早期比如从硬盘加载根文件系统之前就能加载这个驱动。 # 对于Ubuntu/Debian sudo update-initramfs -u # 对于Fedora/RHEL sudo dracut --forcemake install命令通常做了三件事将8723du.ko文件复制到系统模块目录。运行depmod命令更新模块的依赖关系数据库modules.dep文件。可能还会尝试用modprobe加载模块但有时不会我们下一步手动做。4.3 加载模块与验证安装后驱动模块不会自动激活。我们需要手动加载它或者重启电脑让系统自动加载。# 方法一手动加载模块 sudo modprobe 8723du # 方法二重启系统 sudo reboot重启后或者手动加载后如何验证Wi-Fi驱动是否工作# 查看网络接口应该能看到一个新的无线接口通常是 wlan0, wlp2s0 等 ip link show # 或者使用更传统的命令 ifconfig -a # 查看内核加载的模块列表确认 8723du 模块在其中 lsmod | grep 8723du # 使用 iwconfig 查看无线接口详情如果已安装 iwconfig如果能看到类似wlan0: IEEE 802.11 ESSID:off/any这样的无线接口并且lsmod能查到8723du那么恭喜你Wi-Fi驱动部分基本成功了。接下来你可以尝试使用系统自带的网络管理器如NetworkManager去扫描和连接Wi-Fi网络了。常见问题1编译错误 “Makefile:xxx: *** Linux kernel source not found...”这明确提示找不到内核头文件。请回到第3.2步确保linux-headers-$(uname -r)或kernel-devel-$(uname -r)已正确安装并且路径/lib/modules/$(uname -r)/build存在且是一个有效的链接。常见问题2模块加载失败 “modprobe: FATAL: Module 8723du not found...”这说明模块没有正确安装到系统目录。请检查sudo make install是否成功执行有无报错。是否运行了depmod和update-initramfs。可以手动查找模块find /lib/modules -name \8723du.ko\看它在哪里。5. 蓝牙驱动编译与安装详解Wi-Fi搞定后我们再来处理蓝牙。蓝牙驱动的编译流程类似但细节和后续配置有所不同。很多源码仓库会把Wi-Fi和蓝牙驱动放在一起但编译是分开的。5.1 定位与编译蓝牙驱动通常蓝牙驱动的源码会在一个独立的子目录里比如rtk_btusb或bluetooth。# 假设蓝牙驱动源码在仓库的 rtk_btusb 目录下 cd ~/rtl8723du_driver/rtl8723du/rtk_btusb # 同样先清理再编译 make clean make -j$(nproc)编译过程与Wi-Fi驱动类似。成功后你应该会得到rtk_btusb.ko或其他类似命名的.ko文件。5.2 安装与加载蓝牙模块# 安装蓝牙模块 sudo make install # 同样更新initramfs非常重要 # Ubuntu/Debian: sudo update-initramfs -u # Fedora/RHEL: sudo dracut --force # 加载蓝牙模块 sudo modprobe rtk_btusb5.3 蓝牙固件处理这是蓝牙驱动能否正常工作的关键一步也是最容易出问题的地方。RTL8723DU的蓝牙部分需要特定的固件文件。这些文件通常以.bin或.hcd为后缀。固件从哪里来驱动源码包内有些维护良好的驱动仓库会在源码目录下附带一个firmware/文件夹里面就有需要的固件。仔细查看rtk_btusb目录或仓库根目录。Linux固件项目这是一个集中了各种硬件固件的官方项目。你可以尝试安装linux-firmware包它包含了大量固件。sudo apt install linux-firmware # Debian/Ubuntu sudo dnf install linux-firmware # Fedora手动寻找如果以上都没有你可能需要根据芯片的USB ID通过lsusb命令查看找到Realtek的设备去网上搜索对应的固件文件。这需要一些耐心和搜索技巧。如何安装固件Linux系统通常在/lib/firmware/或/usr/lib/firmware/目录下存放固件。你需要将正确的固件文件例如rtl8723du_config.bin和rtl8723du_fw.bin具体名字请参考驱动源码的README或代码复制到该目录。# 假设你在驱动源码目录找到了固件文件 sudo cp rtl8723du_fw.bin /lib/firmware/ sudo cp rtl8723du_config.bin /lib/firmware/ # 修改文件权限可选但通常是个好习惯 sudo chmod 644 /lib/firmware/rtl8723du_*.bin5.4 验证蓝牙功能加载模块并放置好固件后重启系统或重新加载模块然后进行验证。# 查看蓝牙模块是否加载 lsmod | grep rtk_btusb # 查看蓝牙控制器是否被识别 hciconfig -a # 或者使用更新的命令 bluetoothctl show # 启动蓝牙服务如果未运行 sudo systemctl start bluetooth sudo systemctl enable bluetooth # 设置开机自启 # 进入bluetoothctl交互界面尝试扫描设备 bluetoothctl # 在bluetoothctl 提示符下输入 power on scan on如果hciconfig显示你的蓝牙设备如hci0并且状态为UP RUNNING或者在bluetoothctl里能开启扫描那么蓝牙驱动就基本正常了。踩坑实录蓝牙能识别但无法连接或极不稳定这个问题我遇到过好几次。现象是hciconfig能看到设备但bluetoothctl里扫描不到任何设备或者配对频繁断开。除了固件问题一个常见原因是电源管理冲突。Linux内核的USB自动挂起autosuspend功能有时会干扰蓝牙设备。解决方案为蓝牙设备USB接口禁用电源管理。首先用lsusb找到你的RTL8723DU蓝牙部分的USB总线号和设备号例如Bus 001 Device 004: ID 0bda:b720 Realtek...。创建一个udev规则文件sudo nano /etc/udev/rules.d/81-bluetooth-rtl8723du.rules在文件中添加一行根据你的USB ID修改SUBSYSTEMusb, ATTRS{idVendor}0bda, ATTRS{idProduct}b720, ATTR{power/autosuspend}-1保存退出然后重新加载udev规则并重启蓝牙服务sudo udevadm control --reload-rules sudo systemctl restart bluetooth这个技巧对解决许多USB蓝牙设备的随机断开问题非常有效。6. 系统集成与稳定性优化驱动装好并能用只是第一步。要让它在日常使用中稳定可靠还需要一些系统级的配置和优化。6.1 防止驱动被系统自带驱动覆盖某些发行版如Ubuntu可能会在系统更新时自动安装或启用一个名为rtl8xxxu的内核模块这是一个通用的Realtek USB无线驱动它可能会“抢占”我们的8723du驱动导致设备又无法使用。解决方案黑名单blacklist将可能冲突的通用驱动模块加入黑名单阻止系统自动加载它。# 创建或编辑黑名单配置文件 sudo nano /etc/modprobe.d/blacklist-rtl8xxxu.conf在文件中添加以下内容# 阻止 rtl8xxxu 模块自动加载避免与手动安装的 8723du 驱动冲突 blacklist rtl8xxxu保存并退出。更新initramfs后下次启动就不会加载这个模块了。sudo update-initramfs -u # Debian/Ubuntu6.2 配置网络管理器NetworkManager对于Wi-Fi大多数桌面环境都使用NetworkManager来管理连接。驱动正常后NetworkManager通常能自动识别并管理新的无线接口。如果遇到问题可以尝试重启NetworkManager服务sudo systemctl restart NetworkManager对于某些特殊的网络配置如静态IP、特定的DNS使用图形界面或nmtui文本界面工具进行配置会更方便。6.3 性能与功耗调优可选驱动本身可能提供一些可调节的参数。你可以通过查看模块参数来了解# 查看 8723du 模块有哪些可调节参数 modinfo 8723du | grep parm常见的参数可能包括swenc软件加密影响CPU占用、ips省电模式等。不建议新手随意修改这些参数除非你明确知道其含义且遇到了特定问题如连接速度慢、功耗过高。修改方法通常是在加载模块时传递参数例如sudo modprobe 8723du ips0或者将其写入/etc/modprobe.d/下的配置文件使其永久生效。6.4 内核升级后的处理当你升级系统内核后例如从5.15.0-91升级到5.15.0-92之前编译的驱动模块将不再适用于新内核。因为内核模块是与特定内核版本紧密绑定的。如何处理DKMS推荐如果你在最初安装驱动时使用的是支持DKMS的安装包例如dkms install那么系统在安装新内核后会自动为你重新编译驱动。这是我们选择手动编译的一个缺点但我们可以事后补救或者寻找该驱动的DKMS版本。手动重新编译最直接的方法。每次内核升级后回到你的驱动源码目录重新执行一遍make clean,make,sudo make install,sudo update-initramfs -u的流程。虽然有点麻烦但能保证绝对兼容。脚本自动化你可以写一个简单的脚本放在家目录内容就是编译安装的那几条命令。内核升级后运行一下脚本即可。7. 故障排查与问题实录即使按照步骤操作也可能会遇到各种问题。这里汇总一些我遇到过的典型问题及其解决方法。7.1 Wi-Fi相关故障问题编译成功模块加载成功但ip link看不到无线接口。排查运行dmesg | grep 8723du或journalctl -k | grep 8723du查看内核日志中关于该模块的详细输出。重点看有没有Firmware not ready或类似的错误。解决这很可能是Wi-Fi固件缺失。RTL8723DU的Wi-Fi部分也需要固件。通常安装linux-firmware包就能解决。如果还不行需要去Realtek官网或驱动源码仓库寻找名为rtl8723du_nic.bin或类似的固件文件将其放入/lib/firmware/rtlwifi/目录。问题能看到接口wlan0但无法扫描到任何网络。排查首先确认无线硬件开关是否打开笔记本上可能有物理开关或Fn功能键。然后检查地区代码regdomain有些驱动默认地区设置可能限制了信道。# 查看当前无线地区设置 iw reg get # 临时设置为中国CN注意这可能需要root权限且不一定所有驱动都支持 sudo iw reg set CN解决也可能是驱动参数问题。尝试关闭省电模式sudo iw dev wlan0 set power_save off。7.2 蓝牙相关故障问题hciconfig能看到hci0但状态是DOWN而不是UP RUNNING。排查运行sudo dmesg | grep -i bluetooth和sudo dmesg | grep -i firmware检查固件加载日志。解决几乎可以肯定是固件问题。请严格按照第5.3节检查固件文件是否正确放置文件名是否完全匹配驱动期望的名称。有时需要同时放置fw和config两个文件。问题蓝牙设备频繁断开连接特别是进入睡眠或闲置后。排查这通常是USB电源管理问题也可能是蓝牙协议栈的兼容性问题。解决禁用USB自动挂起如第5.4节末尾所述创建udev规则。调整蓝牙协议在bluetoothctl中尝试为已配对的设备设置较低的连接间隔Connection Parameters但这需要设备支持。更通用的方法是编辑/etc/bluetooth/main.conf尝试修改[Policy]或[General]下的参数例如AutoEnabletrue但改动前建议备份原文件。7.3 通用排查命令速查表当遇到问题时按顺序执行以下命令能帮你快速定位问题根源命令作用关键信息uname -r确认当前内核版本确保与安装的头文件一致lsmod | grep -E \(8723du|rtk_btusb)\检查驱动模块是否已加载看到模块名表示加载成功dmesg | tail -50查看最近的内核消息关注usb,firmware,bluetooth,wlan相关错误journalctl -k -b --no-pager查看本次启动的所有内核日志更全面的错误信息lsusb列出所有USB设备确认设备是否被系统识别找Realtek IDrfkill list查看无线软硬块锁定状态Soft blocked: yes表示被软件锁定sudo lshw -C network详细列出网络硬件信息查看网卡详情和驱动信息7.4 终极手段回退与重试如果所有方法都试过了问题依旧可以考虑尝试不同的驱动源码版本GitHub上可能有多个维护者的分支有些分支对特定内核版本兼容性更好。可以git checkout到不同的提交点或分支试试。降级内核如果你刚升级了内核就出问题可以考虑暂时降级回之前稳定的内核版本。寻求社区帮助在驱动源码仓库的Issues页面搜索你遇到的问题很可能已经有人遇到并解决了。如果找不到可以按照模板提交一个新 issue附上你的系统信息、内核版本和详细的错误日志。整个手动编译安装驱动的过程就像是为你的硬件和系统进行一次“定制化手术”。它需要耐心和细致的排查但成功后的成就感和对系统更深的理解是直接使用现成安装包无法比拟的。最重要的是通过这次实践你掌握了一套解决Linux下硬件兼容性问题的通用方法论确认硬件 - 准备环境 - 获取源码 - 编译安装 - 配置固件 - 排查日志。这套方法不仅适用于RTL8723DU对于其他需要手动安装驱动的硬件也同样有效。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进