新电脑装好Ubuntu系统,桌面正常、声音正常,点开右上角网络菜单,Wi-Fi列表却是空的。这个场景我在帮人装系统的过程中见过不止一次,自己第一次遇到的时候也愣了半天。问题通常不是无线网卡硬件坏了,而是Ubuntu系统并没有加载这块无线网卡对应的驱动。新发布的笔记本往往带着最新批次的无线网卡芯片,Ubuntu内置内核的驱动库还没跟上硬件更新速度,系统"看不见"网卡,自然搜不到任何Wi-Fi信号。
这篇文章就是一次完整的无线网卡驱动安装记录,覆盖确认硬件型号、判断驱动缺失原因、临时联网、编译驱动、验证收尾的全过程。内容里既有终端命令,也会解释每一步背后的原因。如果你正好遇到Ubuntu装完连不上Wi-Fi,或者打算给新买的笔记本装Linux,这篇文章应该能帮你少走一些弯路。
1. 先用三条命令确认无线网卡和驱动状态
1.1 看症状:无线图标消失是"没驱动"的典型信号
不要急着到处找驱动,第一步先确认问题方向。无线网卡驱动缺失时,最常见的外在表现有这几个:
- 系统设置里的"Wi-Fi"开关是灰色的,或者干脆没有这个选项
- 右上角网络菜单只有有线和飞行模式,没有"选择无线网络"
- 在终端里执行
iwconfig,只有lo或eth0,看不到类似wlan0的无线接口 - 无线指示灯不亮,按快捷键开关键也没反应
如果符合其中一两条,基本可以排除"附近刚好没Wi-Fi信号"这种可能性,问题大概率出在驱动加载层面。还有一件小事值得先做:确认笔记本的物理无线开关没有被关闭。不少轻薄本用Fn组合键控制无线开关,如果硬件层面处于关闭状态,软件层面怎么折腾都不可能出现Wi-Fi。这一步看起来蠢,但确实能省下后面好几个小时的排查时间。
无线网卡的驱动问题,本质上是操作系统和硬件之间的"翻译官"没上岗。内核要控制一块网卡,需要对应的内核模块告诉它这块卡的寄存器怎么操作、中断怎么处理、数据怎么收发。没有这个模块,硬件插在电脑里,系统却对它视而不见。
1.2 识别硬件:lspci和lsusb里怎么找到网卡
确认方向之后,下一步是搞清楚机器里装的到底是哪块无线网卡。终端执行:
sudo lspci -nn | grep -i net加上sudo是为了确保输出完整,加上-nn是让输出带上设备的厂商ID和设备ID。以一台新出的轻薄本为例,输出可能长这样:
00:1f.6 Ethernet controller [0200]: Device [1a2b:0001] 02:00.0 Network controller [0280]: Device [1a2b:0002] (rev 01)第一行是有线网卡(Ethernet controller),第二行是无线网卡(Network controller)。方括号里的[0280]表示设备类型,[1a2b:0002]分别是厂商ID和设备ID。不同网卡的ID完全不同,拿到这两串数字,后续找驱动就有据可依。有的无线网卡走的是USB接口,lspci里看不到网络控制器,这时候改用lsusb:
lsusb在输出里找包含 WLAN、Wireless、802.11、Wi-Fi 这类字样的设备,同样记下厂商ID和设备ID。这里有个容易踩的细节:有些USB无线网卡在lsusb里显示的厂商ID是主控芯片的ID而不是成品网卡的ID,如果看到的信息和实际网卡型号对不上,把设备ID拆开单独搜,反而更容易找到正确答案。
1.3 看驱动和内核:lspci -k与uname -r才是关键
记下网卡设备ID后,再确认系统到底有没有为它加载驱动:
lspci -k -s 02:00.0把02:00.0换成你自己设备的总线位置。输出里重点看两行:Kernel driver in use表示当前正在使用哪个驱动模块,Kernel modules表示内核里有哪些候选模块。正常的驱动状态是两行都有。如果只有Kernel modules没有Kernel driver in use,或者两行完全缺失,说明系统里根本没有可用的驱动匹配这块卡。USB网卡可以用lsusb -t查看设备挂到了哪个驱动节点,也能判断驱动是否接管成功。
顺手还要执行一下:
uname -r把内核版本记在旁边。原因很简单:后续编译驱动需要安装完全对应的内核头文件,版本号必须精确一致。而且有些新网卡在较新的内核里其实已经有了原生支持,直接升级内核就能解决,完全不用自己编译。先看清自己在哪个版本,再决定走哪条路,比盲目照搬教程靠谱得多。
2. 为什么新电脑装好Ubuntu就搜不到Wi-Fi
2.1 内核驱动跟不上新硬件发布,这是根本原因
Ubuntu每个版本在发布时,会把内核版本固定下来,之后主要是安全更新和小版本升级。这意味着它的驱动集在发布那一刻就定了型。而笔记本厂商为了给新品做卖点,用的无线网卡芯片往往是最新批次,发布时间可能只比你的笔记本早几个月。Linux内核社区的驱动维护者,不可能在芯片量产前就拿到样品,把驱动写进内核里。所以"新电脑+旧内核"这个组合,遇到驱动缺失几乎是必然的。
用生活里的事来类比:系统自带的驱动库相当于一个工具箱,里面的螺丝刀是几个月前配好的。新买的螺丝是新型号,工具不在手边,自然拧不上去。解决办法要么是给工具箱补充对应工具,也就是编译驱动;要么是把整个工具箱换新,也就是升级内核。理解了这层关系,就不会在装驱动失败时觉得是自己操作有问题。
2.2 你的网卡驱动属于哪一类:开箱即用、手动编译、还是无解
在动手之前,先把手里网卡的驱动来源分个类,这决定了你后面走哪条路:
| 类型 | 特征 | 对策 |
|---|---|---|
| 内核原生支持 | 开机就能用,或升级内核后就能用 | 无需操作,或直接升级内核 |
| 厂商提供Linux驱动 | 有官方驱动包或开源驱动仓库 | 下载源码编译安装,优先用DKMS管理 |
| 只有Windows驱动 | Linux下没有任何官方支持 | 换一张主流芯片网卡,或等社区驱动 |
判断归属的方法很简单:拿之前记下的设备ID去搜索引擎搜,格式就是"设备ID ubuntu 驱动"。如果搜出来的是安装教程、开源仓库地址,属于第二类,按第4章操作就行。如果搜出来的全是Windows驱动下载页面,就比较麻烦。这种卡在Linux社区往往以逆向驱动为主,稳定性堪忧。我的建议是别在这上面耗太久,直接换一张主流芯片的USB无线网卡,几十块钱的事情,能省掉以天计的折腾时间。
2.3 驱动装不上还有一种隐藏情况:Secure Boot拦截
还有一类情况特别迷惑:驱动源码编译一遍成功,安装也没报错,但modprobe加载时就是失败,或者重启后又回到原样。这时候要优先怀疑UEFI的 Secure Boot 设置。
Secure Boot 是UEFI固件的一个安全机制,只允许运行经过签名的启动加载程序和内核模块。你手动编译出来的驱动模块没有可信签名,Secure Boot 开启时会被内核拒绝加载。这种情况在近几年的笔记本上很常见,尤其预装Windows的机器,出厂默认开启Secure Boot。第5章会详细讲MOK注册的处理方法,这里先让你有个概念:驱动安装失败,不一定是编译有问题,也可能是安全启动策略不放行。
3. 下载驱动之前,先让电脑临时能上网
3.1 有线网络:有网口就插,省心第一
编译驱动需要下载源码、安装编译工具,前提是系统能联网。能插网线就插网线,这是最没有技术含量但也最有效的一步。Ubuntu对绝大多数有线网卡的支持非常成熟,插上网线通常几秒内就能获取IP上网。唯一的问题是现在很多轻薄本为了做厚度,把RJ45网口直接砍掉了。如果你正好碰上本本没有网口,接着看下面两种替代方案。
3.2 手机USB共享网络:没有网口时的最快线路
没有有线网口,又没装好无线驱动,最快的出路不是去借USB无线网卡,而是用手机USB共享网络。拿数据线把手机连到电脑上,在手机设置里打开"USB网络共享"或"个人热点",不同手机的菜单位置不太一样。连接成功后,Ubuntu会识别出一个有线网络设备,系统网络菜单里会多出一条有线连接,马上就能上网。
这个方法稳定可靠的原因在于:手机USB共享是走有线的,完全不依赖电脑端的无线硬件,正好绕开了我们要解决的驱动问题。整个过程会消耗手机流量,下载源码包和编译依赖一般几十MB到几百MB,注意别在系统镜像下载这种大任务上把流量用光。如果手机恰好没有流量,就往下看第三种方案。
3.3 离线deb包:完全没网的第二套备案
如果暂时没有可联网的设备,还能提前准备离线包。思路是:在另一台能上网的电脑上下载好需要的deb包,U盘拷过去安装。需要在目标机器上安装的核心前置条件包括build-essential、dkms,以及和当前内核匹配的linux-headers包。可以用:
apt-get download build-essential dkms在有联网的电脑上执行,把下载的deb文件拷贝到目标机器,再用:
sudo dpkg -i *.deb一次装完。依赖复杂的场景下,可以先执行apt-get install -d把包提前下载到/var/cache/apt/archives,再统一拷贝。需要注意两件事:下载机器的Ubuntu版本要和目标机器一致,内核头文件版本要和目标机器当前内核一致,否则装进去的包版本不对,反而引入新问题。离线方案准备起来要花点功夫,但在纯无网环境下,它是唯一能让编译工作跑起来的路。
4. 三种方式把无线网卡驱动装进系统
4.1 图形化先试一把:附加驱动面板
动手编译之前,先花两分钟看一眼Ubuntu自带的"附加驱动"界面。打开"软件与更新",切到"附加驱动"标签,系统会自动扫描硬件和已安装的第三方驱动。如果你的网卡芯片厂商在Ubuntu软件源里提供了闭源驱动,这里会直接列出来,选中最下面的一项,点击"应用修改",等它跑完安装和重启即可。整个过程图形化,不需要碰终端,是三条路线里最省心的。
不过这个面板能解决的问题有限。它依赖发行版提前把驱动包收录进软件源,而新发布几个月的网卡芯片往往还没被收入,面板里自然一片空白。所以我的建议是:这个面板值得先打开看一眼,但别抱着一定能解决的期待。扫不出来就果断走下面两条路线,别在这里反复点刷新。
4.2 源码编译:最通用也最考验耐心的路线
这是最通用、也是这次记录里最核心的一条路线。无论芯片是哪个厂商,安装思路都差不多。
第一步,安装编译工具和内核头文件:
sudo apt update sudo apt install build-essential dkms git sudo apt install linux-headers-$(uname -r)$(uname -r)会自动替换成当前内核版本。这里最容易出的问题就是内核头文件没装或者版本不匹配。编译内核模块,必须让头文件目录和当前运行内核完全对应,如果系统里同时有多个内核版本,一定要确认头文件装到了正在用的版本上。
第二步,拿到驱动源码。来源一般是芯片厂商的开源仓库或官网下载页面。下载后解压:
tar -xzf 驱动源码包.tar.gz cd 驱动源码目录进入目录后别急着make,先看 README 或者 INSTALL 文件。这些文件里通常写清楚了编译方式、依赖要求、支持的内核范围,甚至特殊注意事项。有的项目提供install.sh,有的要求直接make,还有的提供了dkms集成脚本。提前看一眼,能避免后半程各种报错。
第三步,编译安装。最常见的形式是:
make sudo make install如果项目有dkms集成,会提供类似这样的方式:
sudo dkms add . sudo dkms build -m <模块名> -v <版本号> sudo dkms install -m <模块名> -v <版本号>这里的模块名和版本号不是随手写的,源码目录里通常有一个dkms.conf文件,里面的PACKAGE_NAME和PACKAGE_VERSION两项分别定义了这两个参数。先cat一下,再填进去,成功率会高很多。强烈建议优先用DKMS方式,原因在下一节。
第四步,加载模块验证:
sudo modprobe <模块名>此时如果没有报错信息,说明驱动已经接管了网卡。可以在系统设置里看一眼Wi-Fi图标有没有出现,也可以跳到第5章用命令行验证。
编译驱动这件事,看起来命令不多,实际上每一行都和系统环境强相关。同一个源码包,在多台机器上可能编译行为都不一样。遇到报错不要慌,先看错误信息里提到哪个文件缺失,再去补对应依赖,通常比反复重跑全程更有效。
4.3 用DKMS接管驱动,防止下次升级内核后失效
直接make install装好的驱动,本质上只是在当前内核目录里放了一个模块文件。下次系统升级内核,新内核目录里不会有这个文件,驱动直接失效,电脑又回到没有Wi-Fi的状态。这是很多人折腾完驱动后发现"过段时间又坏了"的根本原因。DKMS 就是为了解决这个问题而存在的。
DKMS做的事可以这样理解:它把驱动源码登记在一个系统级的"花名册"里,以后每次内核升级,DKMS都会自动为新内核重新编译一次驱动并安装。用户只需要在第一次安装时把驱动"登记"进去,之后的事情自动完成。
常用命令就四条:
dkms add:把当前目录的驱动源码加入DKMS管理dkms build:编译生成模块dkms install:安装到当前内核dkms status:查看所有DKMS管理的驱动和状态
装好之后,dkms status会显示类似下面的记录:
驱动名/版本号, 当前内核版本号, x86_64: installed这样以后无论升级多少次内核,驱动都不会突然消失。如果在实际使用中切换了其他内核,DKMS也会在相应时机自动补装。这是我个人在编译驱动时优先推荐DKMS而不推荐直接make install的最主要原因。
5. 驱动装完不等于结束:加载、验证、开机生效
5.1 用lsmod和dmesg确认模块真正加载了
安装驱动之后,先别急着点Wi-Fi图标。用命令行确认驱动到底有没有加载成功,效率要高得多:
lsmod | grep <模块名>有输出说明模块已加载。如果没输出,再查看内核日志:
sudo dmesg | tail看最后二三十行里有没有驱动初始化的记录,或者有没有 Error、failed、not permitted 这类关键字。正常情况应该能看到类似固件加载完成的信息。如果看到错误,把关键行复制下来去搜,通常能快速定位是固件缺失还是 Secure Boot 拦截。
确认模块加载后,重新跑一遍:
lspci -k -s 02:00.0如果Kernel driver in use后面出现了你装的驱动名,说明驱动已经正式接管网卡,剩下的事情就是联网验证。
有些手动编译安装的驱动,重启后模块不会自动加载,还需要手动让它开机生效。编辑/etc/modules文件,把模块名写进去,一行一个:
echo "你的模块名" | sudo tee -a /etc/modulesDKMS方式安装的驱动一般已经处理了自动加载,不太需要手动加。但如果你不确定,看一下/etc/modules-load.d/目录下有没有相关配置文件,或者直接加一行保险起见也没有坏处。
5.2 用nmcli命令行完成无线连接验证
图形界面有时候不刷新,命令行验证更直接。Ubuntu的网络管理默认交给 NetworkManager,可以用它的命令行工具nmcli:
nmcli radio wifi on nmcli device status nmcli device wifi list nmcli device wifi connect "你的WiFi名字" password "你的密码"第三步能列出Wi-Fi列表,就说明驱动和射频部分都正常。第四步执行连接后,可以用nmcli device status看到设备状态变成 connected。
这里有一个桌面端常见的坑:如果连接密码被放进了系统的密钥环,而电脑设置了自动登录,下次开机时网络工具可能在登录界面之前就拿不到密钥,表现是"已保存的Wi-Fi需要再次输入密码"。解决方法是到"设置-网络"里找到这个Wi-Fi连接,把权限设置改成"所有用户都可以连接",或者把密钥存入系统密钥环而不是登录密钥环。命令行下也可以参考nmcli connection modify。这个细节不影响初次连接验证,但影响之后的日常使用体验,不少人都在这上面困惑过。
5.3 处理Secure Boot弹出的MOK注册提示
如果电脑开着 Secure Boot,DKMS首次安装驱动后,重启时很大概率会进入一个蓝底的MOK管理界面。很多第一次遇到的人会在这里卡住,甚至直接选了 Continue 导致驱动无法加载。正确的处理流程是这样的:
重启看到MOK管理界面后,选择Enroll key from disk,然后找到路径/var/lib/dkms/mok.key这个文件,选择它并确认注册密钥,最后重启系统。注册完成后,内核会信任由这把密钥签名的模块,DKMS安装的驱动就能正常加载。
注意一个细节:MOK界面等待操作的时间通常很短,重启时最好守在电脑前。如果错过了也没关系,重新执行一次sudo dkms install来触发生成新的密钥和注册提示,或者干脆在BIOS里暂时关闭 Secure Boot,安装验证通过后再打开。不过直接关闭 Secure Boot 会影响系统整体安全策略,能注册密钥还是优先注册。
6. 高频问题排查速查表与实战心得
6.1 编译阶段报错怎么破
编译驱动时最常见的报错集中在依赖缺失和版本不匹配两类。整理成表格方便对照:
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 找不到 linux/version.h | 内核头文件没装或版本不符 | sudo apt install linux-headers-$(uname -r) |
| 找不到 gcc、make | 缺编译工具链 | sudo apt install build-essential |
| modprobe 提示模块不存在 | 模块没有安装到当前内核目录 | 检查 /lib/modules/$(uname -r) 下是否有生成文件 |
| dkms build 阶段报配置错误 | 源码和当前内核版本不兼容 | 查看项目README支持的内核范围,升级内核或换驱动版本 |
编译报错有一个通用排查思路:不要整个屏幕看,先看第一处报错提到哪个文件路径,再判断它是"缺工具""缺头文件"还是"源码本身不兼容"。前两类通常补装依赖即可,最后一类就得考虑换驱动版本或者升级内核。盲目删缓存、反复重跑是效率最低的解决方式。
6.2 驱动加载了却搜不到Wi-Fi
模块加载成功,但系统依然搜不到Wi-Fi,优先级最高的排查项是rfkill状态。在终端执行:
rfkill list如果看到无线网卡那一行显示blocked: yes,说明射频被软开关或硬开关锁住了。执行:
sudo rfkill unblock all解锁后一般就能搜到网络。rfkill被锁住的原因很多,比如之前驱动缺失时按了物理无线开关,或者系统把飞行模式状态固化了。每个笔记本的无线开关位置都不一样,这个环节多试几次组合键也无妨。
如果rfkill正常,还是没有Wi-Fi,试试重启 NetworkManager:
sudo systemctl restart NetworkManager有时候 NetworkManager 没有正确接管新出现的无线设备,重启服务就能解决。还不行的话,检查BIOS里无线网卡有没有被禁用,个别商务机型BIOS里会有WLAN开关选项。
6.3 网速慢、频繁掉线的隐形因素
驱动正常工作、能连上Wi-Fi之后,还可能遇到连接不稳定、速度跑不满的情况。比较常见的隐形因素是无线网卡的电源管理策略过于激进。不少新网卡在Linux下的默认省电策略会定期休眠射频模块,表现就是一段时间不用后掉线、唤醒后需要重新连接。
可以通过 NetworkManager 配置关闭Wi-Fi省电模式。新建一个配置文件:
sudo nano /etc/NetworkManager/conf.d/default-wifi-powersave-off.conf内容写上:
[connection] wifi.powersave = 2保存后重启 NetworkManager。这里的2表示关闭省电。这个调整对不少掉线问题有立竿见影的效果,但不同芯片表现不同,如果没改善可以再观察信道设置。
5GHz频段连接不稳定时,优先检查路由器里的信道设置。部分无线网卡驱动对DFS动态信道支持得不好,路由器如果设成自动并跳到了DFS信道,连接可能频繁中断。把5GHz信道固定到常用信道,往往能解决问题。2.4GHz频段的干扰源多,周围Wi-Fi密集的话尝试把信道带宽从40MHz改成20MHz,牺牲一点速度换稳定性,在办公室和公寓场景下非常值得。
6.4 实在装不上的最后两条路
如果编译安装这条路确实走不通,还有两个方向可以尝试。一是升级内核,新内核往往已经带上了你网卡的驱动。新版桌面版每半年发布一次,LTS版本也有HWE内核可以启用。升级后,厂商提交的驱动代码会逐渐进入主线,说不定你的网卡已经被原生支持。升级前记得备份重要数据,内核这东西虽然一般不会拍坏系统,但谨慎一点总没错。
如果内核都救不了,就只能在硬件上面做文章。换一张Linux支持度好的USB无线网卡,插上就能用,日常办公性能完全够。花几十块钱省下好几个通宵的排障时间,这笔账怎么算都划算。我在帮别人处理老电脑时的经验是,与其在"厂商不给驱动"的死胡同里耗着,不如直接降低硬件适配成本,把时间留给真正有价值的事情。
最后说一点个人习惯。我每次拿到一台装Linux的新机器,第一步不是急着找驱动,而是先把lspci -nnk和uname -r的输出存成一个文本文件。这两个东西在之后的每一次排障里都会用上,而且能准确告诉你是硬件不认、驱动没装、还是模块没加载,90%的问题在最初这一步就能定位方向。装驱动这件事,最怕的就是瞎折腾——按着网上的教程照搬,结果连网卡型号都对不上。先确认自己在哪一站,再选路线,整个过程会顺畅很多。