1. 从“Ghost 一键还原”到“心脏搭桥”:Jetson 刷机到底难在哪
第一次给 Jetson 刷系统的朋友,十个里有八个是带着“给笔记本重装 Windows”的心态去的。下载镜像、插上 U 盘、点几下“下一步”,最多半小时搞定——这是大多数人对“刷机”的默认认知。但当你真正把 Jetson 设备接上主机,打开终端,敲下第一条命令之后,你会发现事情完全不是那么回事。没有图形界面,没有“一键还原”,没有进度条告诉你“还剩 15 分钟”。屏幕上滚动的是一行行编译日志、分区表信息、USB 设备枚举记录,以及偶尔蹦出来的Error: Return value 1或者bct_mem相关的报错。整个过程更像是一场心脏搭桥手术:你需要精确知道每一根“血管”(分区)的位置,每一个“瓣膜”(引导配置)的参数,稍有不慎设备就进入 Recovery 模式反复重启,或者干脆黑屏不认。
这篇文章就是写给那些准备给 Jetson 系列设备(Nano、Orin NX、Orin Nano、AGX Orin 等)重装系统的朋友。不管你是想部署 YOLOv5 做边缘推理,还是想跑 Ollama 搭本地大模型,或者只是单纯想把系统盘从 eMMC 换到 NVMe SSD,刷机都是绕不过去的第一道坎。我会把整个流程拆开揉碎,从 APX 模式进入、bct_mem配置、分区表烧录,到刷完后首次启动的验证,每一步都讲清楚“为什么这么做”以及“不这么做会怎样”。文章里提到的命令和参数都经过实际验证,你可以直接抄作业,但建议先看懂逻辑再动手。
注意:Jetson 刷机不是“刷坏了再刷一次”那么简单。部分型号的引导配置一旦写错,设备会直接变砖,需要专用工具和短接操作才能救回来。动手前请确保你手头有完整的恢复方案。
2. 刷机前的核心概念拆解:APX、Recovery 与 bct_mem 到底是什么
2.1 APX 模式:Jetson 的“急救通道”
APX 是 NVIDIA 定义的一种 USB 设备模式,全称是Accessory Port eXtension。你可以把它理解成 Jetson 的“底层急救通道”——当设备正常系统无法启动、引导程序损坏、或者你主动想重刷固件时,就需要让设备进入 APX 模式。在这个模式下,Jetson 会以一个特定的 USB 设备 ID 出现在主机上,等待刷机工具通过 USB 总线直接写入数据。
进入 APX 模式的方法因型号而异。以 Jetson Nano 为例,你需要短接 FC REC 引脚(通常是载板上的一个按钮或跳线),然后上电。Orin 系列则通常通过按住 Recovery 按钮再上电的方式进入。进入成功后,在 Linux 主机上执行lsusb,你会看到类似0955:7c18 NVIDIA Corp.的设备条目。这个0955是 NVIDIA 的 USB 厂商 ID,后面的7c18是具体型号的 Product ID。不同型号的 Product ID 不同,比如 Orin NX 可能是0955:7323,AGX Orin 可能是0955:7023。确认设备出现在lsusb列表里,是刷机成功的第一步。
实操心得:很多新手卡在“设备没进 APX 模式”这一步。最常见的原因是短接时机不对——必须在通电之前就短接好,通电后再短接是无效的。另外,USB 线材质量也很关键,劣质线缆会导致设备枚举失败或者刷机中途断开。
2.2 Recovery 模式与 APX 的区别
这里需要澄清一个容易混淆的概念:Recovery 模式和APX 模式不是一回事。Recovery 模式通常指的是 Android 设备上的恢复分区启动模式,或者 Jetson 上通过 UEFI 进入的恢复环境。而 APX 模式是更底层的、在引导程序之前的 USB 通信模式。Jetson 刷机时,设备必须处于 APX 模式,而不是 Recovery 模式。有些教程会把两者混着说,导致操作者按错了按钮,设备进了 Recovery 却怎么也刷不进去。
判断方法很简单:如果lsusb能看到 NVIDIA 设备,那就是 APX 模式;如果设备屏幕亮了但显示的是 UEFI 菜单或恢复界面,那就是 Recovery 模式,需要重新断电、短接、上电。
2.3 bct_mem 与 bct 文件:引导配置的“心脏瓣膜”
bct是Boot Configuration Table的缩写,中文叫“引导配置表”。它是一组二进制配置文件,告诉 Jetson 的引导程序:内存参数是什么、时钟频率怎么设、启动设备是哪个、分区表长什么样。bct_mem则是与内存初始化相关的 BCT 文件,通常命名为bct_mem.xml或bct_mem.cfg,里面包含了 DDR 内存的时序参数、容量配置、通道映射等信息。
为什么bct_mem这么关键?因为 Jetson 的引导流程是:上电 → BootROM 读取 BCT → 初始化内存 → 加载引导程序 → 启动系统。如果bct_mem里的内存参数和实际硬件不匹配,BootROM 就无法正确初始化内存,设备会卡在最早期的阶段,连串口日志都出不来。这就是为什么刷机时选错配置文件会导致“变砖”——不是系统坏了,而是内存根本没被正确初始化。
不同型号的 Jetson 使用不同的bct_mem文件。Nano 的 DDR 是 LPDDR4,Orin 系列是 LPDDR5,参数完全不同。刷机工具通常会根据你选择的“目标板配置”自动匹配对应的 BCT 文件,但如果你手动指定了错误的文件,或者用了非官方修改过的配置,就会出问题。
3. 刷机工具链与镜像准备:选对工具就成功了一半
3.1 NVIDIA SDK Manager 与 flash.sh 的取舍
给 Jetson 刷系统,官方提供了两条路径:NVIDIA SDK Manager(图形化工具)和flash.sh(命令行脚本)。SDK Manager 适合新手,它会自动下载 BSP、根文件系统、CUDA 等组件,然后引导你完成刷机。但它的缺点也很明显:下载量大(动辄 10GB 以上)、依赖网络稳定、对主机环境要求高(Ubuntu 版本必须匹配)。而且 SDK Manager 在刷机过程中如果中断,恢复起来很麻烦。
flash.sh则是更底层、更可控的方式。它位于 Linux for Tegra(L4T)BSP 包的Linux_for_Tegra目录下。你只需要准备好 BSP 和根文件系统,然后执行类似sudo ./flash.sh jetson-nano-emmc mmcblk0p1的命令即可。这种方式不依赖网络,刷机速度快,而且可以精确控制每一个参数。对于需要批量刷机或者定制系统的场景,flash.sh是唯一选择。
我的建议是:第一次刷机可以用 SDK Manager 熟悉流程,但第二次开始就应该转向flash.sh。因为只有用命令行,你才能真正理解刷机过程中发生了什么。
3.2 BSP 包与根文件系统的版本匹配
刷机前必须确认三件事:BSP 版本、根文件系统版本、目标设备型号。这三者必须严格匹配。比如你下载的是 L4T 35.4.1 的 BSP,那么根文件系统也必须是 35.4.1 的,不能混用 35.3.1 的根文件系统。混用的后果通常是刷机过程看似成功,但设备启动后卡在登录界面或者反复重启。
BSP 包里包含了引导程序、内核、设备树、BCT 文件等。根文件系统则是完整的 Ubuntu 系统,包含用户空间的所有内容。NVIDIA 官网提供了“SD Card Image”和“Jetson Linux”两种下载。SD Card Image 是给 Nano 和 Orin Nano 用的,直接烧录到 SD 卡即可;Jetson Linux 则是完整的 BSP + 根文件系统,用于 eMMC 或 NVMe 刷机。
注意:Orin 系列(Orin NX、Orin Nano、AGX Orin)的刷机流程和 Nano 有较大差异。Orin 使用 UEFI 引导,分区结构更复杂,刷机时需要额外处理
esp分区和A/B分区槽位。如果你是从 Nano 迁移到 Orin,不要套用 Nano 的经验。
3.3 主机环境准备:Ubuntu 版本与依赖安装
刷机主机必须是 Linux 环境,官方推荐 Ubuntu 20.04 或 22.04。Windows 和 macOS 无法直接运行flash.sh,虽然可以用虚拟机,但 USB 直通问题很多,不推荐。主机上需要安装的依赖包括python3、build-essential、device-tree-compiler、libxml2-utils、abootimg等。这些依赖在 BSP 包的README里有详细列表,建议逐条安装。
另外,主机的 USB 控制器也会影响刷机。有些 USB Hub 会导致设备枚举不稳定,建议直接把 Jetson 插在主机后面的 USB 口上。如果主机是 USB 3.0 接口,刷机速度会快很多,但兼容性问题也更多。实测下来,USB 2.0 接口虽然慢,但稳定性更好。
4. 完整刷机实操:从进入 APX 到首次启动
4.1 进入 APX 模式并确认设备识别
以 Jetson Orin NX 为例,具体操作如下:
- 断开 Jetson 电源,确保设备完全断电。
- 找到载板上的 Recovery 按钮(通常是靠近 40-pin 排针的一个小按钮)。
- 按住 Recovery 按钮不放,然后插入电源适配器。
- 保持按住 3 秒后松开。
- 用 USB Type-C 线连接 Jetson 的调试口和主机。
- 在主机上执行
lsusb,确认出现0955:7323 NVIDIA Corp.。
如果lsusb没有显示 NVIDIA 设备,依次检查:USB 线是否支持数据传输(有些线只能充电)、Recovery 按钮是否按到位、电源是否足够(Orin NX 需要 19V 供电,功率不足会导致枚举失败)。
4.2 配置 BCT 与分区表
进入Linux_for_Tegra目录后,你需要确认目标板配置文件。对于 Orin NX,通常使用jetson-orin-nx-devkit.conf。这个文件里定义了bct_mem的路径、分区布局、启动设备等。你可以用cat查看内容,重点关注BCTFILE和DTBFILE两个变量。
如果需要自定义分区大小(比如把根分区从 16GB 扩大到 64GB),需要修改flash.xml或者对应的.conf文件。修改分区表时,务必保证APP分区(根文件系统分区)的起始地址和大小与bct_mem中的配置一致,否则刷机后系统无法挂载根分区。
实操心得:修改分区表前先备份原始文件。我见过有人把
APP分区大小改成了 0,结果刷完机设备直接进不了系统,只能重新短接 Recovery 再刷一遍。
4.3 执行刷机命令与过程解读
确认设备在 APX 模式后,执行:
sudo ./flash.sh jetson-orin-nx-devkit internal这条命令的含义是:使用jetson-orin-nx-devkit.conf配置,刷写到内部存储(eMMC 或 NVMe)。刷机过程会依次执行以下步骤:
- 读取 BCT:从配置文件中加载
bct_mem和bct文件。 - 初始化内存:通过 USB 向设备发送内存初始化参数。
- 烧录引导程序:写入
mb1、mb2、UEFI等引导组件。 - 烧录分区表:写入 GPT 分区表。
- 烧录根文件系统:将
system.img写入APP分区。 - 校验:读取写入的数据进行校验。
整个过程大约 10 到 20 分钟,取决于 USB 速度和镜像大小。刷机完成后,设备会自动重启。如果一切正常,你会看到串口输出 UEFI 启动日志,然后进入 Ubuntu 首次启动配置界面。
4.4 首次启动验证与常见异常处理
首次启动时,系统会进行初始化,包括生成 SSH 密钥、扩展根分区、配置网络等。这个过程可能需要几分钟。如果设备卡在 NVIDIA Logo 界面超过 5 分钟,可能是根文件系统损坏或者分区表不匹配。此时需要重新进入 APX 模式,重新刷机。
如果设备反复重启,串口日志显示Kernel panic - not syncing: VFS: Unable to mount root fs,说明根分区挂载失败。常见原因是APP分区的 UUID 和extlinux.conf中的root=参数不一致。解决方法是在刷机前检查bootloader/extlinux.conf文件,确保root=指向正确的分区。
5. 常见问题速查与避坑指南
5.1 刷机失败问题排查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
lsusb看不到 NVIDIA 设备 | USB 线不支持数据、Recovery 按钮未按、供电不足 | 换线、重新短接、检查电源 |
刷机中途报bct_mem错误 | BCT 文件与硬件不匹配 | 确认目标板配置文件正确 |
| 刷机完成但设备黑屏 | 根文件系统损坏、分区表错误 | 重新刷机,检查flash.xml |
| 设备反复重启 | 内核 panic、根分区挂载失败 | 检查extlinux.conf的root=参数 |
| 串口无输出 | 串口线接错、波特率不对 | 确认 TX/RX 交叉连接,波特率 115200 |
| 刷机速度极慢 | USB 2.0 接口、线材质量差 | 换 USB 3.0 接口和优质线材 |
5.2 独家避坑技巧
技巧一:先刷一次官方原版,再刷定制版。很多人一上来就刷自己编译的根文件系统,结果出问题后分不清是 BSP 的问题还是根文件系统的问题。先用官方原版刷一次,确认硬件和流程没问题,再替换根文件系统。
技巧二:保留串口日志。刷机时接上串口线,用minicom或picocom抓取启动日志。设备启动失败时,串口日志是唯一的诊断依据。没有串口日志,你只能靠猜。
技巧三:备份bct_mem和分区表。在修改任何配置之前,把原始的bct_mem.xml、flash.xml、extlinux.conf备份到安全位置。一旦改错,可以快速恢复。
技巧四:NVMe 刷机需要额外步骤。如果你想把系统刷到 NVMe SSD 而不是 eMMC,需要先刷一个引导到 eMMC,然后通过initrd刷写 NVMe。具体流程参考 NVIDIA 官方文档的“Flashing to NVMe”章节。直接对 NVMe 执行flash.sh是不行的,因为 BootROM 不识别 NVMe 设备。
5.3 刷机后的系统优化建议
刷完系统后,建议立即做三件事:第一,更新软件源并安装jetson-stats,方便监控 CPU、GPU、内存和温度;第二,配置 SSH 和 VNC,方便远程操作;第三,如果用于 AI 推理,安装对应的 CUDA、cuDNN、TensorRT 版本,并验证nvidia-smi和tegrastats输出正常。
对于部署 YOLOv5 或 Ollama 的场景,还需要注意存储空间。默认的 eMMC 只有 16GB,装完系统后剩余空间可能不到 5GB。建议在刷机时就扩大APP分区,或者把模型和数据放到外接 NVMe 或 SD 卡上。
6. 从刷机到部署:Jetson 系统维护的长期经验
刷机只是第一步,真正让 Jetson 稳定跑起来,还需要在系统维护上花心思。我自己的 Orin NX 跑了半年多的 YOLOv5 推理服务,中间经历过两次系统崩溃和一次 NVMe 掉盘。总结下来,有几个经验值得分享。
第一,不要频繁刷机。Jetson 的 eMMC 寿命有限,频繁刷写会加速磨损。如果只是系统配置乱了,优先考虑修复而不是重刷。比如网络配置错了,进 Recovery 模式挂载根分区修改即可,不需要全盘重刷。
第二,做好系统备份。刷完机、配置好环境后,用dd命令把整个 eMMC 或 NVMe 备份成镜像文件。下次系统出问题,直接恢复镜像,比重新刷机快得多。备份命令类似sudo dd if=/dev/mmcblk0 of=backup.img bs=4M status=progress,恢复时反过来即可。
第三,关注 L4T 版本更新。NVIDIA 会定期发布 L4T 更新,修复安全漏洞和驱动问题。但不要盲目追新,尤其是生产环境。新版本可能引入兼容性问题,建议先在测试设备上验证,确认稳定后再升级。
第四,散热是隐形杀手。Jetson Orin 系列在高负载下发热量很大,如果散热不好,会触发降频甚至死机。刷机后建议立即检查散热方案,必要时加装风扇或散热片。tegrastats可以实时查看温度,超过 80 度就要警惕了。
最后再分享一个小技巧:如果你需要批量刷机,可以把flash.sh封装成脚本,配合 USB Hub 和自动化测试工具,实现多台设备并行刷机。但要注意 USB 带宽限制,同时刷太多设备会导致枚举失败。实测下来,一个 USB 控制器同时刷两台比较稳妥。