标题里的“01”,我理解是这套树莓派5实践记录的第一篇。既然是从零开始,我会把原理层的东西也讲细一点,这样后面涉及系统调优、内核配置、远程桌面、容器化部署的篇幅里,就不用再回头补基础。今天这篇的核心就一个:不插显示器、不插键盘鼠标,在一台全新的树莓派5上,把Ubuntu装起来并且顺利远程进去。
我第一次走这个流程是在一台已经上架的设备上,机柜里根本没有位置放外设。当时手头只有一台笔记本、一根网线、一张TF卡和树莓派5原装电源。从下载镜像到修改预置配置,再到通电后通过SSH进入系统,前前后后折腾了大半天。踩过不少坑之后再回头梳理,发现这条链路其实非常清晰:选对镜像、写好配置、刷完卡、插电、扫IP、SSH。整套流程理顺之后,以后再装任何一台树莓派5,全程不需要人坐在屏幕前面,几分钟就能完成部署。
这篇文章我就按自己实际摸索出的完整链路来拆解,从场景和材料准备说起,一路走到最后的故障排查。无论你是想给树莓派5搭家庭服务器、跑边缘计算节点,还是批量部署多台设备,这套无外设安装方法都可以直接照搬。
1. 无外设安装的场景、材料与树莓派5启动逻辑
1.1 哪些场景必须走无外设路线
无外设安装,英文圈子里叫 headless install,翻译成大白话就是“没有屏幕也能把系统跑起来”。树莓派5会催生出这种需求,并不是因为它难伺候,而是大量真实使用场景倒逼出来的。
第一个场景是服务器化部署。树莓派5的接口性能和计算能力比树莓派4B强了一大截,很多人把它当小型服务器用——跑个NAS、挂Home Assistant、做个打印服务器、搭自用的AI推理节点。服务器这种东西,装完系统之后基本全靠SSH远程管理,日常根本不需要插显示器。既然最终使用方式就是无外设的,安装阶段自然也没必要专门找外设,直接一步到位反而更省事。
第二个场景是批量部署。如果一次要装三五台甚至更多的同类设备,每一台都插显示器手动走一遍图形安装向导,时间成本高到离谱。无外设安装配合配置文件预置,本质上就是流水线式的复制流程:同一张配好参数的镜像,一闪一插一通电,一批设备就齐活了,而且配置结果高度一致,不容易出现“每台机器手设时点错一个选项”的差异。
第三个场景是远程现场。设备已经装进机柜、挂在墙上或者放在工位底下,人不在设备旁边,周围也没有空间再放键盘鼠标。这时候如果安装必须依赖外设,整个项目就会卡在最笨的一步上。我自己那次就是这个情况,设备上架之后才发现周围连个显示器都没有,只能硬着头皮走无外设路线。
1.2 无外设安装的材料清单:电源、启动介质、网络缺一不可
树莓派5官方电源规格是5V/5A。这个要求不是吓唬人,树莓派5在满载状态下功耗比前代高不少,尤其是接USB 3.0外设或者NVMe硬盘的时候。无外设安装对电源的要求反而更严格,因为你看不到屏幕,无法直观判断供电不足时系统到底发生了什么。以前我在树莓派4B上用5V/2.4A电源,顶多性能下降一点,至少还能开机;到了树莓派5上,供电不足的表现就隐蔽多了——系统可能在启动中途反复重启,或者USB外设直接不识别。所以第一件必须准备的,就是一个达标的电源。
接下来是启动介质。树莓派5提供了两种主流选择:TF卡和NVMe固态硬盘。TF卡便宜、刷写方便,适合首次安装和应急备份;NVMe快、稳定、寿命长,适合长期运行的服务器型设备。无外设安装的首次流程,我建议优先用TF卡,因为刷写和改配置的步骤最简单,不存在分区工具和驱动兼容性问题。等系统稳定运行之后,再考虑要不要平滑迁移到NVMe。
然后是网络环境。既然没有显示器,系统装好之后要进去,只能靠SSH,而SSH的前置条件是网络通。这里有一个我非常想强调的优先级判断:首次安装千万不要一上来就折腾Wi-Fi。如果你的树莓派5旁边有网口,能用网线就务必用网线完成第一次启动配置。Wi-Fi的无外设配置本身不难,但它的故障变量太多——密码错、频段不匹配、信号弱、路由器开了隐藏SSID、企业级认证等等,任何一个问题都会让你在“查不到IP”的黑洞里越陷越深。网线插上就只需要关心DHCP,变量少了一个数量级。
最后是你手头用来做安装和维护的终端设备:一台装了SSH客户端的笔记本、一个TF卡读卡器或者USB-C的NVMe硬盘盒。如果你在Windows环境下,还需要注意一点:后面配置阶段要编辑FAT格式的system-boot分区,这个Windows可以正常读写,问题不大;但如果涉及修复ext4分区的场景,就需要额外的磁盘工具,这一块放到后面故障排查部分细说。
提示:无外设安装的成功率由“电源”和“网络”两个变量决定了八成。树莓派主板本身极少出问题,但电源虚标和Wi-Fi配置失误能把人折磨到崩溃。这两样别省,也别图省事。
1.3 树莓派5的启动流程决定了很多配置必须“事前完成”
树莓派5的无外设安装和早期型号有一个很不一样的地方:它的SoC是BCM2712,引导流程比前代复杂,首次启动时间也要长一些。插上电后的几十秒内,哪怕系统已经在正常加载,你也看不到任何能通过网络感知到的迹象。很多新手在这里犯的典型错误是:“插电两分钟没反应,是不是失败了?赶紧重新刷卡。”结果把正在首次初始化cloud-init的系统直接断电,搞出半损坏的配置。
还有一个需要记住的特性:树莓派5的引导顺序默认是SD卡优先,然后才轮到NVMe/USB等设备。如果你同时插了TF卡和NVMe,它会优先读TF卡。这个特性在无外设安装里反而是一个优势:你可以常备一张装着最小系统的“救援SD卡”,即使主启动介质出了任何问题,也能恢复到可SSH的状态,并不需要打开机箱去找显示器。
理解了“启动慢”和“引导顺序”这两件事,后面的很多操作你就能明白为什么要这么设计:无外设安装的绝大多数关键配置,必须在刷完镜像、第一次通电之前就写好。因为机器一旦启动,你没有屏幕和键盘,几乎无法在执行过程中插手。换句话说,这是一场“事前规划”的部署,而不是“事中交互”的安装。
2. 镜像选择与下载:树莓派5上Ubuntu版本怎么挑
2.1 选Server还是Desktop,先想清楚最终用途
Ubuntu官网下载页里,针对树莓派的版本明确分了“Ubuntu Server”和“Ubuntu Desktop”两类。这两个版本在无外设安装中的体验差别很大,选错了一个方向,后面会多出一堆不必要的麻烦。
Ubuntu Server是纯命令行环境,镜像体积大概1GB左右,安装后内存占用很低。因为不装图形桌面,首次初始化的任务量就少,cloud-init处理配置的速度也快。如果你的用途是跑服务、做开发环境、挂应用,Server版是最稳的选择。我个人的看法是:无外设安装本身就带有“服务器化管理”的基因,Server版和这种模式天然匹配。
Ubuntu Desktop自带GNOME桌面,镜像体积4GB左右,安装完成后的初始化流程重不少。虽然也能通过预置用户名和密码的方式实现无外设安装,但你需要额外考虑一个问题:第一次SSH进去之后,桌面环境并不会自动开启远程桌面,你还得再配置VNC或RDP,这等于在无外设链路上又加了一环。除非你对图形界面有硬性需求,否则我的建议是:第一次玩无外设安装,直接选Server版,把桌面部分放到系统跑通之后再加都来得及。
另外,国内有不少初次接触Linux的读者会被“搜狗输入法、微信怎么装”这类问题吸引过来。如果你也是抱着“先装上Ubuntu看看”的心态,那还是先老老实实把系统装好、能SSH进去再说。桌面美化、中文输入法这类事情,等系统稳定之后,在终端里敲几条命令就能搞定,不用在安装阶段给自己加戏。
2.2 下载路径、文件名辨识与SHA256校验
Ubuntu的树莓派镜像统一在官方站点发布,下载时认准文件名里的“raspi”字样,架构选arm64。例如:
ubuntu-24.04.x-preinstalled-server-arm64+raspi.img.xzarm64就是树莓派5的CPU架构,别下成riscv版本,更别下成普通的amd64桌面镜像,那些在树莓派上跑不起来。
下载完成后,强烈建议核对一下SHA256校验值。这一步能防止下载中断导致镜像损坏。命令很简单:
sha256sum ubuntu-24.04.1-preinstalled-server-arm64+raspi.img.xz把输出的哈希值和官网页面给出的值做对比,一致再继续刷写。这个动作看似多花几秒,实际意义很大:下载过程中只要丢了一个字节,镜像就可能无法引导,而完全引导不了在无外设场景下是最难排查的问题——你都不知道是卡在底层引导,还是卡在系统初始化,还是卡在网络配置。先验证哈希,等于排除了一个最基础也最致命的变量。
2.3 版本号背后的支持周期
树莓派5刚发布时,Ubuntu官方只提供了开发版本23.10的支持。那段时间想在树莓派5上跑Ubuntu,只能用每日构建版,引导流程里的小毛病不少。我也算是比较早吃螃蟹的人,折腾过那段时期的系统,体验确实谈不上稳定。等到Ubuntu 24.04 LTS正式发布之后,树莓派5的支持才真正进入成熟期。
24.04 LTS是目前树莓派5上最稳妥的选择。“LTS”意味着长周期支持,可以获得五年的安全更新和内核补丁。对于服务器用途来说,这是非常关键的:你不会希望系统装好半年之后就进入不维护状态。除非你有特殊需求,否则不建议一上来就用非LTS版本或者每日构建版。稳定压倒一切,尤其是在一个没有屏幕的设备上。
3. 开机前把配置写好:cloud-init的预置实战
3.1 cloud-init在树莓派5上的角色
Ubuntu官方的树莓派预置镜像,和树莓派官方系统Raspberry Pi OS的配置逻辑不太一样。它依赖cloud-init来完成首次引导的配置工作。cloud-init本来是给云服务器用的初始化工具,你在云平台新建实例时填用户名、贴SSH公钥、指定主机名,背后就是它在干活。Ubuntu把这套机制移植到了树莓派上:镜像刷好之后,system-boot分区里会有三个文件——user-data、meta-data、network-config。设备开机后,cloud-init读取这些文件,创建用户、设置网络、执行脚本,然后把控制权交回正常的系统启动流程。
换句话说,无外设安装的核心操作,就是在刷完卡之后、插电之前,修改这三个文件。你可以把它理解成“给安装流程提前塞答案”:本来系统安装向导会一步步问你用户名、密码、网络信息,无外设模式下没人回答,那就把答案预先写进卷子,开机后cloud-init自动替你答完。
3.2 user-data:创建账户、注入SSH公钥、设置密码
system-boot分区里的user-data文件,默认堆满了注释示例。你要做的,是把示例替换成自己真正的配置。这里给出一个经过验证的基础配置,可以直接套用:
#cloud-config hostname: pi5-server users: - name: myuser sudo: ALL=(ALL) NOPASSWD:ALL groups: users, admin lock_passwd: false passwd: $6$randomSalt$downx... ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... shell: /bin/bash ssh_pwauth: true package_update: false几个关键字段逐个解释一下:
hostname:建议第一次就设好,后面进系统再改虽然不难,但多一步就多一个风险。name:登录系统的用户名。不建议直接用root做主账号,日常操作还是用自己的普通用户加sudo权限更安全。passwd:不是明文密码,而是加密后的密文。可以用如下命令生成:
openssl passwd -6执行后会提示输入两次密码,输出的密文直接粘贴到YAML里就行。这个细节很关键,如果直接写明文密码,cloud-init会拒绝执行,用户根本建不出来。
ssh_authorized_keys:填你本机的SSH公钥。这一步强烈推荐做,因为公钥登录比密码登录安全得多,而且后面每次SSH进系统都不需要输密码。公钥文件一般位于你电脑的~/.ssh/id_rsa.pub,把内容复制进来即可。ssh_pwauth:设为true表示允许密码方式SSH登录。如果你已经配置了公钥,可以改成false。package_update: false:保持false。首次启动时机的网络栈可能还在初始化,这时候自动拉更新容易失败,而且会让整个启动过程异常漫长。等系统稳定后手动执行一次系统更新,可控性更好。
user-data文件的格式是YAML,缩进、冒号、引号都不能出错。我第一次配置的时候就是因为少打了一个空格,导致cloud-init直接报错,系统虽然启动了,但用户名压根没建出来,所有计划全部落空。所以编辑完这个文件之后,最好回头逐行检查缩进,这是新手踩坑最多的位置。
3.3 network-config:Wi-Fi与有线网络配置详解
接下来是network-config文件。如果你使用有线网络接路由器,这个文件通常不用大改,默认配置里eth0会通过DHCP自动获取IP。如果你想用Wi-Fi,就要手动填入无线网络信息,基本格式如下:
network: version: 2 wifis: wlan0: dhcp4: true access-points: "MyWiFi": password: "MyWiFiPass123"这里容易踩的坑不少,我逐一列出来:
- Wi-Fi接口的设备名是
wlan0,不要想当然地写成wifi0、wlan1之类。在树莓派5上,默认无线网卡接口就是wlan0。 access-points下面缩进要对齐,密码要放在password字段。如果路由器是企业版认证,还需要额外的auth配置;普通家庭路由器不需要。- SSID和密码尽量用双引号包起来。如果密码里包含感叹号、空格、分号这类YAML特殊字符,不加引号会被解析错。
- 如果你的路由器开了“双频合一”功能,某些固件会按设备自动分配频段,这可能导致连接不稳定。遇到Wi-Fi连不上的情况,先把双频合一拆开,单独连2.4GHz或5GHz再试,这是我实测有效的排障手段。
如果你的使用场景是纯有线连接,network-config甚至可以不改,只要确保user-data里把用户和SSH配置好就行。基于我自身的经验,首次无外设安装强烈建议用有线,等系统跑通之后再远程切换到Wi-Fi,步骤清晰且不容易把自己绕晕。
3.4 一个决定后续维护难度的选项:是否禁用cloud-init
meta-data文件通常只有一行,比如:
instance-id: pi5-001 dsmode: local这个文件一般不用动。但你需要理解cloud-init的“重复执行”机制:它通过instance-id判断是否是同一台机器。如果instance-id没变,即使你事后修改了SD卡上的user-data,下次重启时cloud-init也不会重新执行用户创建等模块。这是云环境的合理设计,但在无外设手工维护场景下,容易造成“明明改了配置却毫无效果”的错觉。如果你需要二次修改cloud-init配置,正确的做法是修改meta-data里的instance-id,或者执行sudo cloud-init clean --reboot重置状态。
如果你不想让cloud-init在后续启动中再参与任何操作,可以在user-data末尾加上:
runcmd: - [ systemctl, disable, cloud-init.service ]这样首次启动完成后,cloud-init服务会被禁用,之后的重启不会再被它干扰。我个人的习惯是:第一次部署时保留cloud-init,因为它能在排查首启问题时提供日志;确认系统完全正常之后,再决定要不要禁用。毕竟少一个后台机制,就少一个潜在的变量。
4. 刷写镜像与启动介质:从TF卡到NVMe
4.1 三种刷写方式与选择建议
镜像下载并验证完成之后,就该写入启动介质了。常用的刷写工具有好几种,我按自己的使用经验排序:
- balenaEtcher(Windows/macOS/Linux通用):图形界面,操作直观,选镜像、选目标盘、点Flash,三步完成。对新手最友好。它的一个短板是刷写过程中无法做太多自定义,但在当前场景下够用了。
- dd命令(Linux/macOS):命令行刷写,最灵活也最“硬核”。在Linux下可以这样写:
xzcat ubuntu-24.04.1-preinstalled-server-arm64+raspi.img.xz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync注意/dev/sdX要替换成TF卡对应的设备名,并且要非常确认目标设备,选错盘会把你电脑的整块硬盘抹掉。这个操作不可逆,执行之前务必用lsblk看一遍设备挂载情况。
- 树莓派官方Imager:自带不少镜像下载选项,也支持自定义镜像。但有个细节要注意:对于Ubuntu官方镜像,Imager烧进去之后不会自动帮你处理user-data配置,部分版本甚至会对镜像结构做预处理,导致写入结果和预期不完全一致。所以我个人更推荐前两种方式,尤其是第一次操作,用balenaEtcher最省心。
4.2 刷写后修改system-boot分区的注意事项
刷写完成、把TF卡重新插到电脑上之后,你会看到两个分区:system-boot(FAT格式)和writable(ext4格式)。system-boot分区可以直接打开,里面就有前面提到的user-data、network-config、meta-data三个文件。编辑完后安全弹出。
Windows用户这里有一个不太起眼但很典型的坑:用系统自带的记事本编辑YAML文件,保存时可能会把换行符改成CRLF,甚至加上UTF-8 BOM。cloud-init解析这种文件时可能直接报错。解决办法很简单:用Visual Studio Code、Notepad++这类专业编辑器打开,保存时强制选择UTF-8无BOM、LF换行。Linux和macOS自带的文本编辑器基本没有这个问题。
修改完配置之后,TF卡插入树莓派5之前,再快速检查一遍这几个要素:user-data里的YAML缩进对不对、network-config里的Wi-Fi密码引号有没有漏掉、SSH公钥有没有复制完整。这个检查也就是一分钟的事,却能避免后面至少半小时的排错时间。
4.3 NVMe的无外设注意事项与EEPROM救援方案
树莓派5通过专用FPC排线连接NVMe SSD,支持PCIe Gen2 x1,实测读写速度能到500MB/s左右,比TF卡快好几倍。如果打算长期把树莓派5当服务器用,NVMe几乎可以说是必选项。
不过无外设安装时,NVMe有几个额外需要注意的地方。第一个是引导顺序:树莓派5默认会优先读TF卡,再读NVMe。如果系统里还插着TF卡,哪怕TF卡上没有系统,设备也可能因为经历一次失败的引导尝试而拖慢启动流程,极端情况下会卡住。所以使用NVMe时,要么把TF卡拔掉,要么保证TF卡里放的是可用的救援系统,而不是乱七八糟的残留数据。
第二个是EEPROM引导固件。树莓派5的EEPROM需要更新到较新版本,才能稳定支持NVMe启动。如果通电后发现NVMe完全不识别,而你又没有显示器,最省事的救援办法是:准备一张TF卡,烧一个树莓派官方Raspberry Pi OS Lite镜像,在system-boot分区里创建一个空的ssh文件(Raspberry Pi OS检测到这个文件会自动开启SSH服务),插进设备启动,通过SSH登录后执行EEPROM更新命令。这个场景下“临时系统”只需要能启动和能联网,不需要额外配置。
这其实就是无外设维护中非常经典的思路:手边永远准备一张“救援SD卡”,它不一定装着完整系统,能引导、能联网、能SSH,就能解决绝大多数安装初期的底层问题。
5. 首次启动、IP发现与SSH连接验证
5.1 耐心等3-5分钟,别急着断言失败
镜像刷好、配置改好、TF卡插好、网线接好,接下来就是通电。这一步要特别强调耐心。树莓派5首次启动时,系统在进行分区初始化、cloud-init执行配置、软件包解压等一系列工作。我用过的设备里,从通电到IP出现在路由器上,普遍需要3到5分钟,个别时候会更久。如果你插电两分钟就开始反复扫描IP,大概率什么都查不到,然后心急火燎地判断系统坏了,开始重新刷卡——这个动作我见过不少人做过,包括我自己。
一个更合理的节奏是:插电之后,先干点别的事,过三五分钟再回来。期间注意观察树莓派5的状态LED是否规律闪烁。如果完全没有LED活动,那才有可能真的是供电或引导异常。只要LED有反应,就让子弹再飞一会儿。
5.2 找到IP的四种办法
设备启动之后,第一件事是把这台“无头”树莓派的IP地址找出来。按推荐顺序,一共有四种常用方法:
第一种是mDNS主机名解析。如果你在user-data里设置了hostname为pi5-server,那么在Mac和Linux终端里直接执行:
ping pi5-server.local如果通,就直接用这个域名SSH登录。Windows系统需要确认安装了Bonjour组件,一般来说Windows 10/11自带的网络发现也支持mDNS查询。这个方法最省事,不需要额外工具。
第二种是登录路由器后台。打开路由器管理页面,查看DHCP客户端列表,找到主机名类似pi5-server的设备。如果列表里没有显示主机名,可以从MAC地址的厂商信息判断,树莓派网卡的OUI一般可以被识别为Raspberry Pi相关设备。
第三种是局域网扫描。在电脑上执行:
nmap -sn 192.168.1.0/24或者直接用arp -a查看本机ARP缓存。如果局域网设备不多,这个方法非常快。扫描时注意把网段换成你自己局域网的网段。
第四种是串口控制台。如果上面三种方法全部无效,最后保障是用USB转TTL的串口线连接树莓派5的GPIO引脚,在system-boot分区的config.txt里加入enable_uart=1,重启后通过串口拿到真正的控制台。虽然这需要额外一根串口线,但总比搬一台显示器到现场方便得多。对于无外设的老手来说,串口控制台是最终极的兜底方案。
5.3 SSH登录后的三个必做动作
拿到IP后,执行SSH登录:
ssh myuser@pi5-server.local第一次连接会提示确认指纹,输入yes回车即可。如果你配了SSH公钥,这里应该直接就能免密登录;如果只设置了密码认证,输入你设置的登录密码。登录之后,有三件事建议立刻做:
第一,确认cloud-init执行成功:
sudo cloud-init status --wait输出为done就说明初始化流程顺利结束。如果输出error,后面会专门讲怎么看日志。
第二,更新系统:
sudo apt update && sudo apt upgrade -y首次启动时建议关闭package_update,就是为了把更新挪到这一步手动执行。安装完成之后重启一次,让新内核顺利生效。
第三,配置时区和主机名验证:
sudo timedatectl set-timezone Asia/Shanghai如果你设置了hostname,这一步顺便确认一下hostnamectl的输出和预期一致。到这里,无外设安装就已经基本成功了——系统正常启动、网络正常、SSH正常、账号正常,你已经在远程管理一台树莓派5的Ubuntu系统了。
6. 无外设安装的典型故障与排查链路
6.1 常见故障现象与对策对照
无外设安装的问题,由于没有屏幕,经常表现为“设备完全不可见”。下面我把实际遇到过的故障整理成一个对照表,方便快速定位:
| 故障现象 | 大概率原因 | 解决思路 |
|---|---|---|
| 插电后无任何反应,LED不亮 | 电源不达标或电源线损坏 | 更换5V/5A电源和原装线材 |
| 电源灯亮,但路由器里看不到新设备 | 镜像损坏、分区配置错误、引导介质问题 | 重新校验镜像哈希,重新刷写;确认TF卡/NVMe引导顺序 |
| 能看到设备上线但SSH连接被拒 | SSH服务未启动、用户名不存在、密码认证被禁 | 检查user-data配置;确认cloud-init执行日志 |
| SSH可以登录但网络经常断 | 供电不足导致无线网卡不稳定 | 换电源,或改用有线网络测试 |
| Wi-Fi始终连不上路由器 | password引号问题、双频合一冲突、SSID隐藏 | 检查network-config引号;关闭双频合一;临时隐藏SSID再试 |
| cloud-init执行报错 | YAML格式问题、metdata配置冲突 | 查看/var/log/cloud-init-output.log,逐行核对YAML缩进 |
| NVMe不识别 | EEPROM引导固件过旧、TF卡残留干扰 | 用救援SD卡更新EEPROM,拔掉TF卡再试 |
| 系统启动极慢或卡死 | 镜像刷写不完整、TF卡质量差 | 换一张可靠的TF卡重新刷写 |
这张表无法覆盖所有问题,但大多数情况下,问题都会落在“电源”“网络配置”“镜像损坏”“YAML格式”这几个圈子里。
6.2 黑盒排查的思维顺序
没有显示器时,系统的运行状态完全是一个黑盒。如果遇到问题,正确的排查顺序应该是:电源 -> 网络 -> 引导日志 -> 配置回看。
第一步先看硬件状态:树莓派5的电源LED是否常亮,活动LED是否在规律闪烁,风扇有没有转。LED完全没反应,基本可以断定是供电问题,先从电源线和适配器下手。如果硬件看起来正常,第二步就看网络:设备有没有出现在路由器客户端列表里?有没有响应ping?能出现IP,就说明系统至少引导成功了,问题集中在SSH和cloud-init这层。第三步看引导日志:通过串口控制台或救援系统,查看/var/log/cloud-init-output.log和/var/log/syslog。如果IP都没有,则回到镜像和配置本身:哈希校验过没有?user-data、network-config改对没有?TF卡有没有损坏?
这个思路能把一个看似无从下手的黑盒问题,快速收敛到几个具体的怀疑对象上。我自己的经验是,百分之九十以上的无外设安装失败,最终都能归结为以上四类原因中的一个。
6.3 我踩过的坑:cloud-init重复执行与instance-id机制
这里分享一个非常典型、也让我印象深刻的坑。我第一次部署无外设安装时,user-data配置正确,系统顺利起来了,SSH也能登录。后来因为需要创建另一个用户,我直接修改了TF卡上的user-data文件并重启,心想“这次机器起来应该就会自动创建新用户”。结果等了几分钟进去一看,新用户根本不存在的,旧配置也没有变化。
查了半天日志才明白,cloud-init通过meta-data里的instance-id判断“这是不是同一台机器实例”。如果instance-id没变,它不会重新执行用户创建等模块,只会在某些环境下应用网络和主机名层面的配置。所以修改完user-data之后想让它重新生效,必须同时修改meta-data里的instance-id,或者更彻底地执行sudo cloud-init clean --reboot清除状态。
这个坑在无外设环境下尤其要命,因为你看不到启动日志,会反复试“改了配置重启”这个动作,然后反复失望。明白instance-id机制之后,再遇到类似问题就能一击命中。
6.4 最后底牌:自制救援SD卡
无外设安装最坏的情况,是系统镜像本身损坏或配置出错,导致设备彻底无法引导。即使到这个地步,你依然不需要显示器。准备另一张TF卡,用树莓派官方Imager烧一个Raspberry Pi OS Lite(或其他带SSH的最小系统),然后在system-boot分区里创建一个空的ssh文件,插入设备通电,通过SSH登录救援系统,挂载坏掉的那张卡的ext4分区,修改或备份其中的配置文件。
这个救援思路的本质是:把一张“备用启动盘”常备在手边,让所有系统级别的问题都变成可远程处理的。我后来养成了一个习惯,每一台正式部署的树莓派5旁边,都会留一张已经烧好Raspberry Pi OS Lite、开启了SSH的TF卡,平时不插,出问题时插上就是一条救援通道。这套方法在无外设场景下非常值钱——它把“必须去现场找显示器”的可能性降到了最低。