先讲一个我自己的遭遇。第一次给树莓派4B做无屏幕WiFi配置的时候,系统烧好了、SD卡插上了,通上电满怀期待地等了两分钟,结果ifconfig一敲,只有eth0孤零零地躺在那里,wlan0连影子都没有。我再挂到路由器后台想找它的IP,刷新了好几遍也没有新设备。那一刻的感觉,就像你明明把钥匙插进了锁孔,却又怀疑自己是不是拿错了钥匙——设备是好的,系统是好的,但就是找不到突破口。
后来折腾了整整一个晚上,把驱动、配置、网络服务全部翻了一遍,才搞明白这类问题的完整链路。这篇文章把这套经验整理出来:从无屏幕状态下如何提前写好WiFi配置,到ifconfig看不到wlan0的逐层排查,再到开机自动联网和断线自愈,全部是纯实操路线。适合刚拿到树莓派想省掉显示器键盘的玩家,也适合准备把树莓派扔在某个角落做无人值守项目的折腾党。
1. 为什么要无屏幕配置WiFi:先理解启动流程
1.1 无头模式是树莓派的经典玩法
所谓无屏幕配置,英文叫 headless setup,就是不给树莓派接显示器、键盘、鼠标,只给它一张烧录好的SD卡和一根电源线,让它从零开始自己联网、自己启动。这个玩法在树莓派生态里非常成熟,几乎所有官方文档都给了支持,核心原因在于树莓派的启动流程是固定且可预测的。
我习惯把树莓派的启动分成两个阶段。第一个阶段由GPU内的固化引导程序完成,它负责读取SD卡上的boot分区(在Windows下显示为一个几十MB的可移动盘),加载config.txt里指定的内核和固件文件;第二个阶段才是系统内核正式接管,挂载根文件系统,启动所有服务。关键点在于,网络配置相关的文件同样存放在这个boot分区里,所以理论上我们不需要看到任何界面,只要提前把配置文件躺在SD卡上,系统起来后就会自动去读。
很多新手卡在无屏幕配置这一步,是因为把树莓派理解成了普通台式机——总想着装完系统后需要一台显示器去敲命令。实际上树莓派完全支持“设施完整性”式的运行方式:写好配置、通电、等它自己上线,然后通过SSH从远程接管一切。想明白这个逻辑,后面所有操作都会有方向感。
1.2 配置文件读取时机与关键路径
要理解为什么这么做能生效,需要知道不同系统在启动阶段会用哪个配置文件。
如果用的是树莓派官方系统(Raspberry Pi OS、Raspberry Pi OS Lite),网络管理器主要有两套:早期版本默认使用dhcpcd配合wpa_supplicant来管理WiFi;较新的桌面包则使用NetworkManager。但不论哪套,底层的WiFi连接信息最初都来自/etc/wpa_supplicant/wpa_supplicant.conf,或者是首次启动时从boot分区拷贝过去的一个同名文件。
如果用的是 Ubuntu Server(20.04、22.04、24.04),情况不太一样。Ubuntu Server 从 18.04 起默认使用netplan管理网络,配置文件是/etc/netplan/下的.yaml文件。它在首次启动时会读取 SD 卡boot分区里名为network-config的文件,如果里面有WiFi配置,cloud-init会把它转换成netplan配置然后netplan apply。所以给Ubuntu Server预置WiFi的玩法,和树莓派官方系统是两条线,不能混用。
把这个对应关系记清楚,很多“为什么我改了wpa_supplicant.conf却没用”的问题就迎刃而解了。你在Ubuntu Server上使劲写wpa_supplicant.conf,当然不会生效,因为它根本没走那条链路。
1.3 硬件准备与系统选型
无屏幕配置虽然门槛低,但硬件准备直接决定后续是否顺利。我的建议清单如下:
- 树莓派4B主控板一块,最好带散热片或者小风扇,WiFi运行稳定性和温度直接相关;
- 原装或靠谱的5V/3A Type-C电源。电流不够是WiFi掉线、吞吐下降的隐形元凶;
- microSD卡一张,容量至少16GB,速度等级建议A1或U1以上。树莓派4B支持SD卡启动,卡太慢会让系统启动时间变长,更容易让人误以为配置失败;
- 读卡器一个,用于在电脑上写入镜像和修改配置;
- 网线一根。虽然名义上是无屏幕配置,但第一次调试时如果手边有网线,会极大降低排查难度。网线连接不需要任何配置,插上就能SSH进去看日志,是定位问题最好的辅助手段;
- 另一台安装有Windows、macOS或Linux的电脑,用于写卡和SSH连接。
系统方面,如果你只是做个WiFi接入点、跑跑Docker或自动化脚本,我优先推荐Raspberry Pi OS Lite。它没有桌面环境,占内存小,对WiFi配置兼容性最好,固件在烧录时就已经带好,基本不会出现“看不到wlan0”这种驱动问题。
如果你有特定的服务器环境需求,比如需要跑Ubuntu的某个版本、依赖某个内核功能,才考虑Ubuntu Server。Ubuntu Server的优势是内核更通用、更贴近云服务器习惯,但代价是树莓派内置WiFi的brcmfmac固件不一定随镜像完整打包,经常需要手动安装linux-firmware,这就是很多人装了Ubuntu之后找不到WiFi的直接原因。
2. 首次配置的完整步骤:两种可直接照抄的方式
2.1 方案一:用官方烧录工具一把梭
树莓派官方出的 Raspberry Pi Imager 是目前烧录和预配置体验最好的工具,支持Windows、macOS、Linux三个平台。它的核心优势不在烧录本身,而是旁边那个齿轮形状的“设置”面板。
具体操作流程是这样的:
- 下载并安装 Raspberry Pi Imager,插上读卡器,把SD卡接入电脑;
- 打开Imager,点击“选择设备”,选树莓派4;
- 点击“选择操作系统”。如果你想用官方系统,选 Raspberry Pi OS Lite(推荐无桌面场景);如果你想用Ubuntu,记得先用官方工具写好,或者用Ubuntu自己提供的镜像工具;
- 点击“选择存储”,务必看清楚盘符,别把电脑本身的硬盘给覆盖了;
- 关键一步:点击右下角的齿轮图标打开“设置”,或者烧录前按
Ctrl+Shift+X,在弹出的界面里做如下配置:- 勾选“启用SSH”,这里可以设置用户名和密码(新版Raspberry Pi OS不允许默认pi用户空密码登录,必须创建用户);
- 勾选“设置无线局域网”,填入WiFi的SSID和密码,WiFi国家选中国(或其他所在国);
- 设置主机名,默认是
raspberrypi,如果担心局域网内有多个树莓派冲突,建议改成有辨识度的名字,比如pi4-home; - 如果你想跳过首次启动向导,可以勾选“配置无线网络时一并设置区域和键盘布局”,按需填写即可;
- 确认所有设置无误后,点击“写入”,工具会自动完成烧录并把SSH和WiFi配置写入SD卡的
boot分区; - 烧录完成后,Windows下会提示需要格式化,直接点取消;macOS/Linux下直接卸载SD卡卷即可,不用再做其他操作;
- 把卡插入树莓派,插电源,等2分钟左右尝试SSH连接:
ssh 用户名@树莓派IP。
这套流程最省心的地方在于,Imager写入的WiFi配置是“标准”的,它会在boot分区生成firstrun.sh或直接写network-config,不同系统自动切换对应方案,不用自己操心系统类别。
2.2 方案二:手动写入配置文件,适合想完全掌控细节的人
虽然Imager很好用,但很多人手里已经有现成的镜像文件,或者烧录工具是balenaEtcher、Win32DiskImager,没法用官方工具的高级选项。这时就需要纯手动方式,原理很简单:在SD卡上留下“暗号”,让系统启动后自己接上WiFi。
第一步,正常烧录镜像。任意工具都能完成这一步,关键在烧录完成之后的操作。
第二步,如果在树莓派官方系统上用,需要让SSH在无屏幕状态下默认开启。从2016年11月之后的系统版本开始,树莓派默认关闭SSH,但在boot分区放一个空文件命名为ssh(注意没有后缀名)就能打开SSH服务。Windows下创建这种文件有点绕,用记事本新建文本后,右键重命名,把文件名改为ssh、去掉.txt后缀,确认弹窗时选择“是”即可。
第三步,在boot分区创建wpa_supplicant.conf文件,写入如下内容:
country=CN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="你的无线SSID" psk="你的WiFi密码" key_mgmt=WPA-PSK scan_ssid=1 }这里有几个字段要解释清楚。country=CN必须填写,国家码不仅决定WiFi模块运行在哪个射频法规环境,还直接控制了5GHz频段能不能搜到、能不能连上。很多人在无屏幕配置时因为没写这行,导致2.4GHz正常、5GHz完全消失。ctrl_interface这一行非必需,但写上之后可以让标准用户组netdev里的用户通过wpa_cli工具查看和控制WiFi状态,对后续排查非常方便。scan_ssid=1是可选的,只有在你的路由器开启了“隐藏SSID”时才需要,正常环境可留可删。
第四步,安全弹出SD卡,插到树莓派上通电。如果你用的还是Windows且文件被写成了CRLF换行符,树莓派上的解析器有时会不认,导致整份配置被跳过。最稳妥的做法是不要用记事本编辑,而是用Notepad++、VS Code等支持选择换行符的工具,保存时把行尾设为LF;或者干脆先把wpa_supplicant.conf保存为无BOM的UTF-8格式。这个坑非常隐蔽,没有报错提示,症状就是“明明写了配置文件但死活连不上WiFi”。
2.3 Ubuntu Server 的 netplan 配置写法
如果你的目标系统是Ubuntu Server(常见于博客教程里出现树莓派4b安装ubuntu20.04、树莓派4b安装ubuntu22.04的情况),上面那一招就不灵了。Ubuntu Server的首次WiFi预配置走boot分区里的network-config文件。
格式化SD卡后,boot分区下会有一个名为network-config的文件,用带LF换行符的编辑器打开,修改为类似下面的内容:
version: 2 ethernets: eth0: dhcp4: true optional: true wifis: wlan0: dhcp4: true optional: true access-points: "你的无线SSID": password: "你的WiFi密码"然后把文件保存回SD卡的boot分区。同时,如果要在Ubuntu Server上启用SSH,也需要在boot分区放一个ssh空文件,否则系统默认openssh-server不一定启动。
Ubuntu Server启动时,cloud-init会读取network-config并转化为Netplan配置。但这里有个额外前提,镜像里必须带着树莓派WiFi的固件。如果启动后wlan0依然不存在,第一件事就是安装linux-firmware:
sudo apt update sudo apt install linux-firmware sudo reboot这也是Ubuntu Server和树莓派官方系统最大的差别——官方系统把brcmfmac固件直接打包了,Ubuntu则有可能缺省部分固件,尤其是某些最小化安装或精简镜像。遇到ifconfig看不到wlan0,先别怀疑硬件,把固件补上再谈其它。
3. 从 ifconfig 看不到 wlan0 到正常联网的排查实录
3.1 先确认是“没驱动”还是“没配置”
排查WiFi问题的第一步不是翻配置文件,而是确认wlan0接口在内核层面是否存在。现代Linux系统里,ifconfig已经不是默认安装的包了,很多新系统上你敲ifconfig会直接提示command not found,或者它显示的接口不包含无线网卡。这就是很多人误以为“WiFi没驱动”的第一层骗局。
更可靠的命令是用ip系列:
ip link show如果输出里有wlan0,说明网卡已被内核正确识别,问题在配置层;如果完全没有wlan0,但输出里有eth0和lo,那就要往驱动和固件方向排查。
在此基础上,还可以用iwconfig看无线扩展接口,用nmcli device status看NetworkManager是否发现了这个设备。多命令交叉验证能快速缩小问题范围。我踩过最大的一次坑就是ifconfig显示不出来,但ip link下wlan0明明白白在那里,只是没有配置IP地址——如果当时直接认定驱动坏了去重装系统,就要白白浪费几个小时。
3.2 驱动与固件层:命令与常见坑
树莓派4B板载WiFi芯片是博通BCM43455,走的是SDIO接口,内核驱动为brcmfmac。确认驱动有没有加载,用以下命令:
lsmod | grep brcmfmac如果有输出,说明驱动模块已经加载。如果没有,看看dmesg日志有没有报错:
dmesg | grep -i brcmfmac dmesg | grep -i firmware常见错误有三种:
第一种,“Unknown error”或者固件加载失败。通常是/lib/firmware/brcm/下的brcmfmac43455-sdio.bin缺失或版本过老。树莓派官方系统基本不会遇到,Ubuntu Server上比较频繁。解决方式就是前面说过的安装linux-firmware。
第二种,brcmfmac: brcmf_sdio_htoll ...之类的协议错误,往往是SD卡供电不稳或树莓派供电异常,优先换电源测试。
第三种,无线开关被软禁用。用下面命令检查:
rfkill list看到wlan0: Wireless LAN Soft blocked: yes的提示,说明无线网卡被软件层面禁用了,执行rfkill unblock wifi即可解除。这个状态经常出现在部分Ubuntu安装包预置的网络策略里,不解除的话WiFi永远进不了工作状态。
3.3 系统服务层:wpa_supplicant、NetworkManager与dhcpcd
驱动正常、接口存在但连不上WiFi,问题基本在服务层。不同系统的排查命令不一样,我一个个说。
树莓派官方系统Lite版,传统上走dhcpcd加wpa_supplicant。检查服务状态:
systemctl status wpa_supplicant systemctl status dhcpcd然后用wpa_cli看实际连接状态:
wpa_cli -i wlan0 status输出里的State字段是关键。如果显示COMPLETED,说明已经和路由器完成握手,接下来的问题出在dhcpcd分配IP上;如果显示SCANNING或一直DISCONNECTED,说明wpa_supplicant没读到配置,或者信号问题、加密不兼容。
树莓派官方桌面版和部分新版本,改用NetworkManager之后,排查命令换成:
nmcli device status nmcli radio wifi nmcli dev wifi list如果设备存在但连不上网络,可以考虑手动连接:
nmcli dev wifi connect "SSID" password "密码"Ubuntu Server这条线,用networkctl和journalctl:
networkctl status wlan0 journalctl -u systemd-networkd -u wpa_supplicant -n 50如果出现反复认证失败的日志,优先检查密码是否包含特殊字符、路由器加密协议是不是只开了WPA3等。
3.4 常见问题速查表
整理一份我在实际调试中最常遇到的组合问题,方便你很快对号入座:
| 症状 | 可能原因 | 排查命令 | 解决方向 |
|---|---|---|---|
ifconfig无wlan0,但ip link有 | 系统中ifconfig未安装或未显示无线接口 | ip link、which ifconfig | 改用ip命令,或安装 net-tools |
ip link也没有wlan0 | 驱动未加载/固件缺失 | lsmod|grep brcmfmac、dmesg|grep -i firmware | 安装linux-firmware,重载驱动 |
rfkill list显示 soft blocked | WiFi被软件禁用 | rfkill list | rfkill unblock wifi |
| wpa_cli状态一直是SCANNING | 配置文件未读取/国家码问题 | wpa_cli -i wlan0 status | 检查wpa_supplicant.conf格式、换行符 |
| 2.4GHz能连,5GHz搜不到 | 国家码未设置或路由器信道不兼容 | 查看wpa_supplicant.conf里的country= | 补全国家码,重启WiFi |
| 连接成功但拿不到IP | DHCP异常或路由器AP隔离 | dhclient -v wlan0、看路由器后台 | 检查DHCP服务,关闭AP隔离 |
| 密码确定正确,但认证失败 | 加密协议不兼容 | journalctl -u wpa_supplicant | 路由器调整成WPA2/WPA3混合模式 |
这张表收藏好,排查的时候比任何教程都有用。
4. 实现自动联网、断线重连与稳定运行
4.1 开机自动联网的常见入口
无屏幕场景下,开机自动联网不是“可选项”,而是“必需品”。总不能每次断电重启都抱着显示器键盘到设备旁边去操作。树莓派官方系统开机后会自动从/etc/wpa_supplicant/wpa_supplicant.conf读取WiFi配置并连接,只要你配置路径正确,基本不存在需要额外设置“开机启动”的问题。Ubuntu Server则依靠netplan apply和systemd-networkd完成同样的工作。
但自动联网只是一半,另一半是自动重连。树莓派自带的wpa_supplicant在WiFi暂时断掉后会尝试重新扫描,但如果路由器重启、信道切换、DHCP租约过期,有时会卡在“连接过程”中不出来,表现为State=ASSOCIATING或DISCONNECTED反复横跳。这种时候就需要一个看门狗级别的重连机制。
4.2 断线重连脚本
我给你一个实测可用的方案:写一个简单的systemd定时服务,每分钟检查一次网络状态,如果发现网关不通且持续了一定次数,就强制重启WiFi连接。
脚本路径/usr/local/bin/wifi-watchdog.sh,内容如下:
#!/bin/bash # 无线网络看门狗:ping网关 && 尝试重启wpa_supplicant连接 GATEWAY="192.168.1.1" FAIL_COUNT=0 for i in 1 2 3; do if ping -c 1 -W 2 $GATEWAY > /dev/null 2>&1; then FAIL_COUNT=0 break else FAIL_COUNT=$((FAIL_COUNT+1)) sleep 1 fi done if [ $FAIL_COUNT -ge 3 ]; then # 连续三次ping不通,重启无线 wpa_cli -i wlan0 disconnect sleep 1 wpa_cli -i wlan0 reconnect # 如果reconnect后还没有IP,主动重新申请一次 sleep 5 if ! ip addr show wlan0 | grep -q 'inet '; then dhclient -v wlan0 > /dev/null 2>&1 fi fi exit 0然后创建一个systemd service,文件/etc/systemd/system/wifi-watchdog.service:
[Unit] Description=WiFi Watchdog After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/bin/wifi-watchdog.sh [Install] WantedBy=multi-user.target再创建一个定时触发用的timer,/etc/systemd/system/wifi-watchdog.timer:
[Unit] Description=Run WiFi Watchdog Every Minute [Timer] OnBootSec=1min OnUnitActiveSec=1min [Install] WantedBy=timers.target启用它们:
sudo chmod +x /usr/local/bin/wifi-watchdog.sh sudo systemctl daemon-reload sudo systemctl enable --now wifi-watchdog.timer这个方案的好处是不需要额外安装任何命令,树莓派系统自带ping、wpa_cli、dhclient就够用。坏处是它只判断网关连通性,如果你的网关本身就经常单点故障,需要把检测目标改成公网DNS,比如1.1.1.1或223.5.5.5,但公网DNS会偶尔丢包,所以阈值要多试几次再定。
4.3 静态IP还是DHCP:部署场景不同选择不同
自动联网解决的是“有没有IP”的问题,但IP怎么分配,也值得提前想清楚。
如果树莓派只是客户端,家里没有特殊服务,DHCP完全够用。每次启动路由器都会分配一个地址,虽然可能变化,但配合主机名或者mDNS来SSH访问就无所谓。如果树莓派承载了服务端角色,比如跑了一个Web服务、摄像头推流、NAS,那你必须保证它的IP常年不变。这里有两种做法。
第一种,在路由器上做DHCP绑定。登录路由管理页,根据树莓派的MAC地址分配固定IP。这种方案的优势是不用改树莓派任何文件,路由器层面的规则,就算系统重刷了也一样生效。
第二种,直接在树莓派系统里配置静态IP。树莓派官方Lite系统,编辑/etc/dhcpcd.conf,在末尾追加:
interface wlan0 static ip_address=192.168.1.100/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 223.5.5.5然后重启dhcpcd:
sudo systemctl restart dhcpcdUbuntu Server则在netplan文件里改,在wifis.wlan0部分增加:
addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 192.168.1.1 - 223.5.5.5然后sudo netplan apply。
配置静态IP时有个易错点,IP段必须和路由器网段一致,不能随意选。比如路由器网段是192.168.31.x,你却写了个192.168.1.100,结果就是“看起来配了IP,却上不了网”,排查起来相当迷惑。先用ip route show或读路由页面确认网段再填。
5. 更多实操技巧与踩坑记录
5.1 无屏幕时如何快速找到树莓派IP
这是无屏幕玩法里最基础也最关键的问题。WiFi配置好之后设备已经上线,但如果你不知道它被分到的IP,SSH还是连不进去。我的查找顺序是这样的:
优先用mDNS主机名。树莓派官方系统默认启用avahi,局域网内通常可以直接ping raspberrypi.local或ssh pi@raspberrypi.local来连接,Ubuntu Server则是ubuntu.local。前提是电脑和树莓派在同一个网段,且电脑的防火墙没有拦mDNS。
其次用路由器后台。手机或电脑登录路由器管理页面,翻“已连接设备”列表,找以raspberrypi或ubuntu命名的设备最快。
如果路由器列表里找不到,用ARP扫描。Windows命令:
arp -amacOS/Linux命令:
ip neigh树莓派的网卡MAC地址以dc:a6:32或e4:5f:01开头(新批次可能不同),在列表里找到这些前缀就能锁定。
更大范围扫描用nmap:
nmap -sn 192.168.1.0/24扫描结果里看厂家信息,出现Raspberry Pi厂牌的那个大概率就是树莓派。要注意扫描网段得替换成你实际网段。
5.2 2.4G/5G频段、SSID与加密细节
树莓派4B支持2.4GHz和5GHz双频WiFi,但双频也带来一些麻烦。5GHz频段受国家码管理,如果系统里country没设对,5GHz网络直接搜不到。如果你确定路由器5GHz信道没问题,把wpa_supplicant.conf里的country=CN写上(或改成你所在国家/地区的ISO Code),然后重启WiFi:
sudo wpa_cli -i wlan0 reconfigureSSID如果包含中文,某些固件版本会出现编码问题,表现为能扫描到这个网络但认证失败。解决办法是临时把SSID改成纯英文测试,如果立刻能连,就说明是编码问题,再去路由器和系统端适配。
加密协议方面,树莓派官方驱动对WPA2支持最好。如果你把路由器设成了“仅WPA3”模式,部分固件会认证失败或反复掉线。建议路由器WiFi安全模式设置为WPA2/WPA3混合,这是兼容性和安全性之间的折中方案。
5.3 电源、散热对WiFi的隐性影响
最后聊一个很多人忽略的点:树莓派4B的WiFi稳定性对电源波动非常敏感。树莓派4B运行时的瞬时电流可以到2.5A甚至更高,如果你用的充电头名义上是5V/2A,实际电压在负载上来后会掉到4.5V左右,这时候WiFi模块会先出问题,表现就是吞吐骤降、连接断断续续,甚至wlan0接口直接消失。
排查方法很简单,看电源指示灯有没有闪烁,或者执行:
vcgencmd get_throttled输出0x0表示供电正常,出现了类似0x50000之类的十六进制值,说明曾经发生过欠压,那就该换电源或换线。数据线也别忽略,很多“满足5V/3A”的充电头配了一根内阻很大的线,实际到树莓派入口的电已经被“吃”掉了不少。
散热对WiFi的影响则更隐蔽。树莓派4B的BCM43455无线芯片是板上集成,没有独立散热。当你给树莓派塞进一个密闭的金属壳,或者ARM核心长时间高负载,板子温度升高后无线模块的稳定性就会下降。表现为吞吐量断崖式下跌、延迟抖动剧烈,但这时候用vcgencmd measure_temp一看,温度可能也就六十多度,并不会引起系统主动降频。经验做法是,只要树莓派要做持续运行的网络任务,就加一个被动散热片,甚至小风扇,成本几块钱,但能换来一整年的稳定。
我现在的习惯是,每块树莓派上电之前,先把这三件事做完:确认电源适配器余量、检查SD卡读写是否正常、在配置阶段就把wpa_supplicant.conf的换行符和country检查清楚。这三步能避开无屏幕配置里80%以上的坑。
最后再分享一个实战小技巧:如果你有一根网线,在无屏幕配置WiFi时顺手把它插上,树莓派会自动从DHCP获取一个有线IP。这样即使无线配置完全失败,你依然能SSH进去查看日志、修改配置,而不是面对一个完全失联的黑盒子。无线弄好之后拔掉网线就行,这个习惯帮我省掉了无数次盲查日志的等待时间。