ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Ubuntu 18.04无线网卡驱动缺失的排查与三重解决方案

Ubuntu 18.04无线网卡驱动缺失的排查与三重解决方案 1. 问题定位为什么Ubuntu 18.04会“没有WiFi”刚装好Ubuntu 18.04满心欢喜准备联网更新结果打开网络设置一看Wi-Fi选项直接消失了或者只有一个“有线连接”孤零零地挂在那里。这几乎是每个Linux新手都会遇到的“当头一棒”。别慌这绝对不是你的硬件坏了99%的原因是你的无线网卡驱动没有正确加载。Ubuntu 18.04作为一款发布于2018年的长期支持版本其内核自带的硬件驱动库虽然广泛但面对市面上层出不穷、尤其是较新的无线网卡芯片时难免会“力不从心”。这个问题的本质是操作系统内核与硬件固件之间的“语言不通”。首先我们需要理解Linux系统识别硬件的流程。当你开机时Linux内核会探测所有硬件设备并为它们加载对应的内核模块驱动。对于网络设备我们可以通过终端命令来窥探究竟。打开终端CtrlAltT输入第一条诊断命令lspci -knn | grep -iA3 network或者针对USB接口的无线网卡比如很多USB随身Wi-Fi棒子lsusblspci命令会列出所有PCI总线上的设备-k参数会显示每个设备正在使用的内核驱动模块-nn则会显示设备的厂商和型号ID这是最关键的信息。而lsusb则对应USB设备。执行后你可能会看到类似这样的输出03:00.0 Network controller [0280]: Intel Corporation Wireless 8265 / 8275 [8086:24fd] (rev 78) Subsystem: Intel Corporation Wireless 8265 / 8275 [8086:0050] Kernel driver in use: iwlwifi Kernel modules: iwlwifi这是一个理想情况它告诉我们1有一个网络控制器2它的厂商ID是8086英特尔设备ID是24fd3内核正在使用的驱动模块是iwlwifi并且有对应的内核模块可用。Wi-Fi功能正常的前提就是这一行“Kernel driver in use”存在且正确。但更可能的情况是你看到的是03:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. Device [10ec:c821] Subsystem: Realtek Semiconductor Co., Ltd. Device [10ec:c821] Kernel modules: rtw88_8822ce注意这里只有“Kernel modules”列出了可用的模块名但没有“Kernel driver in use”。这就像系统知道这个设备“可能”用什么语言交流模块名但并没有请翻译官驱动上场。或者更糟糕的情况是“Kernel modules”这一栏完全是空的这意味着内核根本不认识这个设备没有任何内置模块对应。另一种快速检查网卡状态的方法是使用rfkill命令。这个工具用于查看和解除对无线设备的软硬件阻塞比如飞行模式开关或硬件射频开关。rfkill list如果输出中你的无线网卡通常是phy0后面显示“Soft blocked: yes”或“Hard blocked: yes”那么Wi-Fi被禁用就是因为它被锁定了。“Soft blocked”可以通过软件命令解除而“Hard blocked”通常需要你按一下笔记本上的物理Wi-Fi开关或Fn组合键。注意在开始任何驱动安装操作前请务必先执行rfkill list检查。我就曾花了半小时编译驱动最后发现是笔记本侧面的无线开关被关掉了闹了个大笑话。如果rfkill显示一切未阻塞但lspci显示驱动未加载那么我们的核心任务就是为这个特定的网卡找到并安装正确的驱动。这个过程就像为一把特殊的锁配钥匙我们需要的就是锁的型号——即上面命令中显示的[10ec:c821]这部分厂商ID和设备ID。2. 核心解决路径驱动安装的“三重门”确定了问题根源在于驱动接下来就是具体的解决之路。根据网卡型号和内核支持程度主要有三条路径我们可以形象地称之为“三重门”。选择哪一扇门取决于你的网卡型号和lspci的输出结果。2.1 第一重门利用Ubuntu的“官方仓库”与“附加驱动”这是最安全、最推荐的首选方案。Ubuntu维护了一个庞大的软件仓库其中包含大量经过测试的硬件驱动特别是对于许多Broadcom、Realtek等厂商的无线网卡。首先确保你的系统能够访问网络。既然Wi-Fi不能用你需要先通过网线连接有线网络。这是后续所有操作的基础。连接网线后系统通常会自动识别并连接。第一步更新软件包列表刷新仓库信息sudo apt update第二步安装一个强大的硬件识别与管理工具——ubuntu-drivers。这个工具能自动检测你的硬件并推荐可用的专有驱动。sudo apt install ubuntu-drivers-common安装完成后让它自动检测并列出所有可用的驱动选项ubuntu-drivers devices这个命令会扫描你的硬件并输出类似下面的结果 /sys/devices/pci0000:00/0000:00:1c.0/0000:03:00.0 vendor : Realtek Semiconductor Co., Ltd. model : RTL8822CE 802.11ac PCIe Wireless Network Adapter driver : rtw88-8822ce - third-party free driver : rtl8822ce-dkms - distro non-free这里列出了两个可用的驱动rtw88-8822ce第三方免费和rtl8822ce-dkms发行版提供的非免费。通常选择那个标记为“distro non-free”的驱动会更稳定因为它经过了Ubuntu团队的适配。第三步安装推荐的驱动。你可以手动选择安装其中一个或者让系统自动安装所有推荐的驱动sudo ubuntu-drivers autoinstall或者手动安装特定驱动包sudo apt install rtl8822ce-dkms安装完成后必须重启计算机让新驱动的内核模块被加载。实操心得dkmsDynamic Kernel Module Support是Linux驱动管理的一个神器。它会在你安装驱动时自动为当前内核版本编译模块并且在内核更新后自动重新编译适配新内核。因此优先选择带-dkms后缀的驱动包可以避免未来系统升级后Wi-Fi再次挂掉的问题。如果ubuntu-drivers没有给出任何推荐或者你安装后问题依旧那么我们需要进入下一扇门。2.2 第二重门手动安装“官方仓库”中的通用驱动包有些网卡的驱动虽然不在ubuntu-drivers的自动推荐列表里但依然存在于Ubuntu的官方仓库中。常见于一些Realtek、Intel和Broadcom的较新芯片。我们需要根据之前lspci查到的设备ID去网络上搜索对应的驱动包名。例如对于常见的Realtek RTL88xx系列USB网卡很多随身Wi-Fi用的就是这类芯片可以尝试安装sudo apt install rtl88xxau-dkms对于其他系列常见的驱动包有rtl8812au-dkms,rtl8821au-dkms: 适用于Realtek 8812AU, 8821AU芯片。rtl88x2bu-dkms: 适用于Realtek 88x2BU芯片如RTL8822BU。broadcom-sta-dkms: 适用于许多Broadcom博通无线网卡。firmware-b43-installer: 适用于另一部分Broadcom芯片需要同时安装b43-fwcutter。安装命令依然是sudo apt install 包名。安装后重启。如何知道该装哪个这就需要你把lspci得到的设备ID如10ec:c821或者芯片型号如RTL8822CE作为关键词去搜索引擎或Ubuntu论坛搜索“Ubuntu 18.04 [芯片型号] driver”。社区里通常已经有前人踩过坑并留下了解决方案。2.3 第三重门从源码编译安装最后的武器当前两扇门都走不通时尤其是对于非常新的硬件在Ubuntu 18.04的老旧内核看来或者是一些厂商根本不提供Linux驱动的情况我们就需要祭出最终武器从源代码编译安装驱动。这需要一定的动手能力但成功率很高。通常这些驱动的源代码托管在GitHub上。我们以GitHub上一个非常活跃的Realtek驱动项目rtl88x2bu为例。第一步安装编译所需的工具链和内核头文件。内核头文件必须与你当前运行的内核版本严格一致。sudo apt update sudo apt install git build-essential dkms linux-headers-$(uname -r)$(uname -r)会自动获取你当前的内核版本号确保安装正确的头文件。第二步从GitHub克隆驱动源码仓库git clone https://github.com/cilynx/rtl88x2bu.git cd rtl88x2bu第三步使用DKMS来管理编译和安装过程。这是比手动make更优雅的方式。# 将驱动源码添加到DKMS树中 sudo dkms add . # 编译并安装驱动模块版本号可以查看源码目录下的dkms.conf文件这里假设是5.8.7.1 sudo dkms install rtl88x2bu/5.8.7.1第四步加载新编译的内核模块sudo modprobe 88x2bu最后重启系统。重启后检查驱动是否加载lsmod | grep 88x2bu如果看到输出则表示驱动加载成功。踩坑记录编译驱动最常见的问题是“内核头文件不匹配”。错误信息可能包含“/lib/modules/xxx/build: No such file or directory”。这几乎总是因为linux-headers-$(uname -r)没有正确安装。请再次确认uname -r的输出并运行apt-cache search linux-headers-来查找完全匹配的包名。另一个常见错误是编译过程中报错“implicit declaration of function‘xxx’”这可能是你的GCC编译器版本太高而驱动代码较旧。可以尝试安装低版本的gcc-7并指定使用它来编译但这属于进阶操作了。3. 驱动之外的排查固件、网络管理与服务有时候驱动正确加载了但Wi-Fi依然无法工作或者能扫描到信号却无法连接。这可能是其他环节出了问题。3.1 缺失的固件Firmware无线网卡除了需要驱动软件还需要固件Firmware——一段运行在网卡微控制器上的低级代码。驱动负责与操作系统通信而固件负责控制硬件本身的射频、编码等底层操作。很多驱动包只包含驱动模块固件需要单独安装。当你使用dmesg查看内核日志命令并过滤无线相关错误时可能会看到这样的线索sudo dmesg | grep -i firmware如果输出中有“failed to load firmware rtw88/rtw8822c_fw.bin”之类的错误就说明固件缺失。解决方法就是安装对应的固件包。Ubuntu将许多固件打包在linux-firmware这个庞大的包里但有时也不全。我们可以尝试安装或更新它sudo apt update sudo apt install --reinstall linux-firmware对于一些特定型号可能需要更针对性的固件包比如firmware-realtek、firmware-iwlwifiIntel等。同样可以根据网卡型号搜索“[芯片型号] firmware ubuntu”来找到对应的包。3.2 网络管理器的“罢工”Ubuntu 18.04默认使用NetworkManager来管理网络连接。如果它出现异常也会导致Wi-Fi列表不显示或无法连接。首先检查NetworkManager服务是否在运行systemctl status NetworkManager如果状态不是“active (running)”可以尝试重启它sudo systemctl restart NetworkManager有时候NetworkManager的配置可能出了问题。一个粗暴但有效的调试方法是先停止NetworkManager改用更底层的wpa_supplicant和dhclient工具手动连接一次Wi-Fi这可以排除NetworkManager本身的问题。不过对于大多数桌面用户重启服务或重启电脑就能解决。3.3 电源管理与节能选项这是一个容易被忽略的坑。为了节省电量Linux内核和某些驱动可能会对无线网卡进行激进的电源管理有时这会导致网卡性能不稳定甚至断开连接。我们可以临时关闭PCIe设备的ASPMActive State Power Management和无线网卡的电源管理来测试# 临时关闭PCIe ASPM重启后失效 sudo bash -c echo performance /sys/module/pcie_aspm/parameters/policy # 临时关闭iwlwifi驱动的电源管理如果是Intel网卡 sudo iwconfig wlan0 power off如果这样做之后Wi-Fi变得稳定了那么你可以考虑永久修改这些设置。永久修改需要编辑内核引导参数或创建udev规则、modprobe配置文件这涉及更多系统知识建议在确认有效后再搜索具体方法。4. 终极方案与预防内核升级与硬件兼容性考量如果以上所有方法都失败了尤其是你的电脑是近一两年新买的那么问题的根源很可能在于Ubuntu 18.04的内核太老了。Ubuntu 18.04.6 LTS的默认内核版本是5.4这对于2018年之后的许多新硬件支持有限。4.1 升级到更新的HWE内核Ubuntu为LTS版本提供了“硬件启用堆栈”HWE, Hardware Enablement Stack它可以将较新版本的内核和图形驱动向后移植到老的LTS系统上。对于Ubuntu 18.04你可以升级到更新的HWE内核来获得更好的硬件支持。# 安装最新的HWE内核 sudo apt install --install-recommends linux-generic-hwe-18.04安装完成后重启电脑在GRUB引导菜单中选择新内核启动。新内核包含了更多更新的驱动很可能就能直接识别你的无线网卡了。4.2 考虑升级Ubuntu版本如果升级HWE内核后问题依旧或者你不想在旧系统上折腾那么最一劳永逸的解决方案是升级你的Ubuntu系统。例如直接安装Ubuntu 20.04 LTS或22.04 LTS。新版本的系统搭载了更新的内核20.04是5.1522.04是5.19或更新对新型硬件的支持是代际的提升。很多在18.04上需要手动编译驱动的网卡在22.04上可能就是开箱即用。在决定重装系统前可以制作一个Ubuntu 22.04的Live USB启动盘在不安装的情况下“试用”系统看看Wi-Fi是否能被直接识别。这是一个非常有效的验证方法。4.3 硬件兼容性清单与选购建议对于计划在Linux下使用特别是用于开发或学习的朋友在购买电脑或无线网卡时提前考虑兼容性能省去无数麻烦。笔记本优先选择英特尔Intel的无线网卡如AX200、AX210等。它们在Linux下的驱动支持iwlwifi是最好、最稳定的通常无需任何额外操作。许多戴尔Dell、联想ThinkPad的工作站系列对Linux兼容性也很好。USB无线网卡随身Wi-Fi棒子这是重灾区。购买时一定要搜索“芯片型号 Linux”。优先选择采用Realtek RTL8812AU、RTL88x2BU或Mediatek联发科MT76xx系列芯片的产品。这些芯片通常有活跃的社区驱动项目如上面提到的rtl88x2bu。务必避开那些只提供Windows驱动、且网上完全找不到Linux相关讨论的“三无”产品。内置PCIe网卡如果笔记本的无线网卡无法驱动且是可更换的很多轻薄本已经焊死那么更换一块Intel AX200网卡是最佳选择价格不贵兼容性无敌。我自己就曾为了一个杂牌USB网卡折腾了两天最后花了60块钱换了一块Intel AX200插上后重启即用那种舒畅感无以言表。时间也是成本对于生产力工具在硬件上做一点投资来换取极致的兼容性和稳定性往往是值得的。最后再分享一个我常用的诊断命令组合当Wi-Fi出问题时按顺序执行并观察输出基本能定位到问题层rfkill list- 检查是否被阻塞。lspci -knn | grep -iA3 network或lsusb- 检查硬件ID和驱动加载状态。lsmod | grep 驱动名- 检查驱动模块是否被加载。sudo dmesg | tail -30- 查看最近的内核日志寻找错误信息。iwconfig和nmcli device status- 检查网络接口和NetworkManager管理的设备状态。把这一套流程走下来从软阻塞到硬阻塞从驱动缺失到固件错误从服务异常到内核过旧层层递进绝大部分“没有Wi-Fi”的问题都能找到突破口。Linux桌面环境的完善正是靠无数用户这样一步步排查、分享解决方案推动的。当你最终看到Wi-Fi图标亮起并成功连接时那种解决问题的成就感或许也是使用Linux的乐趣之一吧。
返回列表