很多人在 Linux 或树莓派上配置 Wi-Fi 时,都曾被这些名字搞糊涂:
rfkill
wpa_supplicant
NetworkManager
dhcpcd
尤其在 Raspberry Pi OS Bookworm 之后,不少旧教程突然失效:
为什么改 wpa_supplicant.conf 不生效了?
为什么 dhcpcd.conf 没用了?
NetworkManager 到底和 wpa_supplicant 是什么关系?
rfkill 又是什么?
本文从架构、职责划分、历史演进三个角度,把 Linux 的 Wi-Fi 网络栈讲清楚。
一、Linux Wi-Fi 网络栈:谁负责什么?
先看全景图。
┌────────────────────────────────────┐│ Linux Kernel Driver ││ brcmfmac / iwlwifi / mt76 … │└──────────────┬─────────────────────┘ │ ▼┌────────────────────────────────────┐│ rfkill ││ 无线硬件/软件开关控制 │└──────────────┬─────────────────────┘ │ ▼┌────────────────────────────────────┐│ wpa_supplicant ││ Wi-Fi扫描 / WPA认证 / AP关联 │└──────────────┬─────────────────────┘ │ ▼┌────────────────────────────────────┐│ NetworkManager ││ 网络统一管理 / DHCP / DNS / VPN │└────────────────────────────────────┘
理解这一层次关系之后,很多 Linux 网络问题会突然变得清晰。
二、Driver:真正驱动 Wi-Fi 硬件的东西
最底层永远是Linux Kernel Driver。Linux 本身不会直接“认识”无线芯片,真正让系统能发现 Wi-Fi 硬件的,是对应驱动。
不同芯片对应不同 driver,例如:
以 Raspberry Pi 为例,系统中常见:
当这些模块正常工作时,系统才会出现:
此时意味着:
如果这一层出问题,后面所有工具都会失效,因为根本没有 Wi-Fi 设备可供管理。
三、rfkill:Linux 的无线“总闸门”
很多 Linux 教程会跳过rfkill,实际上它是 Linux 无线系统里非常关键的一层。
rfkill 是什么?
Linux Kernel 官方定义:
RF-kill is a generic interface for disabling any radio transmitter in the system.
翻译成人话:Linux 的无线总开关框架,
它负责统一控制:
本质上,它位于 driver 与用户空间之间。
Soft Block 与 Hard Block
rfkill 有两个概念。
1)Soft Block
软件层禁用,即系统主动禁止无线发射,通常来自:
系统配置
NetworkManager
飞行模式
用户操作
2)Hard Block
硬件层禁用,通常来自:
物理无线开关
BIOS 设置
EC 固件
Laptop Fn 快捷键
这一状态不能通过软件强制解除。
为什么 rfkill 很容易被忽略
因为它处于一个很“尴尬”的位置。很多时候,driver 正常,wlan0 存在,但无线被 rfkill 阻断,于是会出现各种奇怪现象:
No devices found
Network unavailable
无法扫描SSID
无法连接AP
问题并不在 NetworkManager,真正的问题是无线发射器根本没被允许工作。
NetworkManager 与 rfkill 的关系
现代 Linux 中:
本质上就是请求 NetworkManager 打开 Wi-Fi Radio,其底层通常对应 rfkill software state。
因此:
NetworkManager ↓ rfkill ↓ driver
是一条真实存在的调用链。
四、wpa_supplicant:真正负责“连接 Wi-Fi”的组件
很多人以为NetworkManager 负责连接 Wi-Fi,实际上这并不准确。在绝大多数 Linux 系统里,真正完成 Wi-Fi 认证工作的,是wpa_supplicant。
什么是 Supplicant
在 IEEE 802.1X / WPA 标准中:
Authenticator → 路由器/AP
Supplicant → 客户端
因此 wpa_supplicant 字面意思就是WPA 客户端认证程序。官方描述:
WPA/WPA2/WPA3 supplicant for Linux.
它负责什么
核心职责:
扫描 Wi-Fi 网络
选择 SSID
执行 WPA/WPA2/WPA3 握手
802.1X/EAP 认证
关联到 Access Point
漫游
换句话说,它真正负责:“把 wlan0 连到某个路由器上”。
一个容易混淆的事实
很多人认为连接Wi-Fi等于可以上网,其实不是。Wi-Fi 认证成功之后,通常只是关联到了 AP,并不等于:
这些属于更高层网络管理职责。
NetworkManager 与 wpa_supplicant 的关系
这里有一个非常重要但容易误解的事实,在现代 Linux 中:
NetworkManager ≠wpa_supplicant
更准确的关系是:
NetworkManager ↓ 调用wpa_supplicant ↓ 控制 wlan0
也就是说:NetworkManager 很多时候是通过 wpa_supplicant 完成 Wi-Fi 管理。它们不是替代关系,而是管理层和执行层的关系。
五、历史上的 dhcpcd
dhcpcd来自 Linux 网络栈的历史演进。
早期 Linux 网络管理模式
在早期 Linux 世界里,并不存在统一网络管理框架。网络通常采用多个专用组件组合模式,典型架构是:
driver ↓wpa_supplicant ↓DHCP client
其中 DHCP Client 负责:
dhcpcd扮演的是DHCP Client角色。这也符合Unix的一贯设计哲学,简单就是美。
传统 Raspberry Pi 模式
长期以来,Raspberry Pi OS 使用 wpa_supplicant + dhcpcd 组合,其特点是轻量、简单、适合嵌入式、适合无桌面环境。
在那个年代,这是一套非常合理的设计。
为什么后来被弱化
随着 Linux 系统复杂度增加,用户开始需要:
多网卡
VPN
热点
自动漫游
动态路由
连接Profile
桌面GUI管理
传统组合模式逐渐暴露问题,因为网络职责被拆散在多个组件里,维护复杂度越来越高。于是统一管理框架开始成为趋势,这就是 NetworkManager 崛起的背景。
Bookworm 的变化
从Raspberry Pi OS Bookworm 开始,默认网络方案转向NetworkManager。
这是为什么大量旧教程突然“不灵了”的原因。
很多历史配置方法建立在wpa_supplicant + dhcpcd时代,现代 Raspberry Pi 网络栈已经进入NetworkManager 主导阶段。
六、NetworkManager:现代 Linux 的网络总管
可以把 NetworkManager 理解为Linux 网络控制中心,它统一管理:
Wi-Fi
Ethernet
DHCP
DNS
VPN
Routing
热点
静态IP
Connection Profile
它的目标是:自动发现、自动配置、统一管理网络连接。
它为什么流行
因为它解决了传统 Linux 网络管理碎片化问题,过去可能需要:
wpa_supplicant
dhcpcd
resolv.conf
route
VPN工具
多个配置文件
现在统一收敛到NetworkManager之下。
Connection Profile的思想
NetworkManager 引入了一个现代网络系统非常重要的概念:Connection Profile,即网络连接配置对象。
它不仅记录:
还可以包含:
这也是现代 Linux 网络管理更像“配置管理系统”的原因。
七、命令快速参考
# 查看系统版本,本文是 Debian 13(trixie)cat /etc/os-release# 查看网络接口ip link# 查看无线设备iw dev# 查看已加载驱动模块lsmod# 查看无线驱动相关日志dmesg | grep -i brcm# 查看无线网卡的节能状态 iw dev wlan0 get power_save# 如果因为节能无法连接可把它关闭sudo iw dev wlan0 set power_save off ######################################################### rfkill:无线总开关######################################################### 查看 rfkill 状态rfkill list# 软解锁 Wi-Fisudo rfkill unblock wifi# 软锁定 Wi-Fisudo rfkill block wifi######################################################### wpa_supplicant:Wi-Fi 配置与认证# 用 NetworkManager 可以忽视本部分 ######################################################### 查看配置文件cat /etc/wpa_supplicant/wpa_supplicant.conf# 查看连接状态wpa_cli status# 扫描 Wi-Fisudo iw dev wlan0 scan# 手动启动 wpa_supplicantsudo wpa_supplicant \ -i wlan0 \ -c /etc/wpa_supplicant/wpa_supplicant.conf######################################################### NetworkManager:现代 Linux 网络管理######################################################### 查看设备状态nmcli device status# 查看 Wi-Fi Radio 状态nmcli radio# 开启 Wi-Fi Radiosudo nmcli radio wifi on# 关闭 Wi-Fi Radiosudo nmcli radio wifi off# 显示 Wi-Finmcli device wifi list# 连接 Wi-Fisudo nmcli device wifi connect \ "SSID" password "PASSWORD"# 查看已保存连接nmcli connection show# 查看 NAME 为 HomeWifi 的profilenmcli connection show "HomeWifi"# 关闭节能模式,0:缺省 1:忽略 2:关闭 3:开启 sudo nmcli connection modify "HomeWifi" 802-11-wireless.powersave 2# 重启连接 sudo nmcli connection down "HomeWifi"sudo nmcli connection up "HomeWifi"# 删除连接 profilesudo nmcli connection delete "HomeWifi"######################################################### NetworkManager 配置文件######################################################### 查看保存的 connection profilesls /etc/NetworkManager/system-connections/# 查看 profile 内容sudo cat \/etc/NetworkManager/system-connections/*.nmconnection######################################################### systemd 服务层######################################################### 查看 NetworkManager 服务systemctl status NetworkManager# 查看 wpa_supplicant 服务systemctl status wpa_supplicant# 启用 NetworkManagersudo systemctl enable NetworkManager# 重启 NetworkManagersudo systemctl restart NetworkManager######################################################### IP / Route / DNS######################################################### 查看 IP 地址ip addr# 查看路由表ip route# 查看 DNSnmcli dev show | grep DNS# 老系统可查看cat /etc/resolv.conf
参考资料
Linux Kernel rfkill Documentation
https://docs.kernel.org/driver-api/rfkill.html
HostAP / wpa_supplicant Official
https://w1.fi/wpa_supplicant/
Linux Wireless Documentation — wpa_supplicant
https://wireless.docs.kernel.org/en/latest/en/users/documentation/wpa_supplicant.html
NetworkManager Official Documentation
https://networkmanager.dev/docs/
Raspberry Pi Forum — NetworkManager on Bookworm
https://forums.raspberrypi.com/viewtopic.php?t=357739
Raspberry Pi StackExchange — Networking on Raspberry Pi OS Bookworm
https://raspberrypi.stackexchange.com/questions/145593/how-do-i-set-up-networking-on-raspberry-pi-os-bookworm-or-later
Jeff Geerling — Static IP on Raspberry Pi OS Bookworm
https://www.jeffgeerling.com/blog/2024/set-static-ip-address-nmtui-on-raspberry-pi-os-12-bookworm/