
最近在搞 Jetson Orin Nano 的小伙伴应该都有同感官方推荐用 SD 卡烧录系统但真拿 SD 卡跑起来那个速度和稳定性实在让人着急。我刚入手 Orin Nano 的时候老老实实按官方文档烧了一张 128G 的 SD 卡结果跑 YOLO 推理的时候动不动就因为 IO 瓶颈卡顿训练日志滚动都肉眼可见地掉帧后来实在忍不了直接把系统挪到了 NVMe SSD 上。这篇文章我就把自己的完整方案分享出来不靠 SD 卡直接用 NVMe 硬盘盒给 Orin Nano 离线烧录 Ubuntu整个过程断网可操作镜像提前下载好后面全部本地完成。适合刚入手 Jetson 设备、想跳过 SD 卡直接用 SSD 当系统盘的开发者也适合需要在无网环境下批量部署设备的朋友。文章里会包含我的硬件选型踩坑记录、完整的烧录步骤、以及几次差点把系统搞坏的排查经验希望能帮你少走弯路。1. 内容整体设计与思路拆解先梳理一下整个方案的核心思路搞清楚为什么“离线烧录 NVMe”值得折腾以及它和官方默认流程到底差在哪里。1.1 为什么我坚决不想用 SD 卡跑 JetsonNVIDIA 官方确实把 SD 卡作为 Orin Nano 的默认启动介质这主要是因为 SD 卡方案对新手最友好——读卡器人手一个刷机工具也好找。但 SD 卡跑 Jetson 有个致命问题IO 性能完全跟不上。看一组我实测的数据对比就明白了。项目普通 SD 卡U3 级别NVMe SSDPCIe 3.0顺序读取80 ~ 100 MB/s800 ~ 1200 MB/s顺序写入30 ~ 50 MB/s500 ~ 800 MB/s4K 随机读取2 ~ 5 MB/s30 ~ 60 MB/s温度表现负载高时明显发热加散热片后稳定长时间稳定性容易掉速、数据损坏可靠很多实际体验上用 SD 卡启动后开机进入 Ubuntu 桌面大约要 40 秒以上Docker 镜像多装几个就明显感觉到卡顿。而换到 NVMe 后开机压在 15 秒内跑模型推理时系统负载明显下降尤其是多线程训练数据加载的场景速度快得不是一点半点。还有一个特别容易被忽视的问题SD 卡在频繁写入下寿命堪忧。Jetson 设备往往 7x24 小时跑任务系统日志、Docker 容器层、模型缓存都在持续写盘。普通 SD 卡在这种负载下撑几个月就可能出现坏块随后就是莫名奇妙的文件系统崩溃。NVMe 固态的寿命和掉电保护机制比 SD 卡强太多了。1.2 “离线烧录”和官方在线刷机的本质区别官方推荐的方式是使用 SDK Manager把 Orin Nano 进入 Recovery 模式后由 PC 端工具通过 USB 线把系统推送到设备。这个方式有两大痛点第一SDK Manager 会强制检查网络并自动下载组件没代理的环境下载慢到怀疑人生第二如果你要同时部署多台设备每次都要走一遍网络下载流程效率太低。离线烧录的逻辑完全不同先在 PC 端把 Ubuntu 系统镜像完整地写入到 NVMe 硬盘里然后把硬盘安装到 Orin Nano 上设备直接从 NVMe 启动。这一步省掉了设备端所有网络依赖镜像文件提前准备好一次下载后面反复使用。那有人会问无论在线还是离线不都是在给 NVMe 写系统吗本质上都是“把镜像写入目标盘”区别在于操作顺序和驱动方式。SDK Manager 是设备处于 Recovery 模式时由 PC 通过 USB 把系统分区逐块写入设备内部的存储介质而我的方案是直接把 NVMe 接到电脑上当成一块普通移动硬盘整盘写入镜像再装回设备。离线方案对网络零依赖只要电脑能跑 balenaEtcher 或者 dd 命令就行。1.3 整个流程的大致路径理一下我最终确定并验证稳定的完整路径在 PC 上下载 Jetson 官方 Ubuntu 系统镜像.img 格式或者从 SDK Manager 缓存中提取。用读盘工具balenaEtcher / Rufus / dd把镜像写入 NVMe SSDNVMe 放在硬盘盒里通过 USB 连接到 PC。写入完成后把 NVMe 从硬盘盒取出安装到 Orin Nano 开发板的 M.2 插槽。开发板通电进入引导流程系统从 NVMe 启动。首次启动后进入 Ubuntu 初始化设置完成系统配置。这里最核心的一点就是整个烧录过程不依赖网络不依赖 SDK Manager甚至连设备都不用先进入 Recovery 模式。只要 PC 能识别 USB 硬盘盒镜像写入成功后面的流程基本就是插上开机的事。2. 核心细节解析与实操要点这个方案里踩坑最多的其实是硬件选择和镜像来源先花点篇幅把这些关键细节理清楚。2.1 NVMe 硬盘盒的选型经验NVMe 硬盘盒是实现整个方案的关键道具它的作用是把 M.2 NVMe SSD 转成 USB 接口让 PC 能够识别并写入系统。市面上的硬盘盒主控方案非常多常见的有 Realtek RTL9210B、JMicron JMS583、ASMedia ASM2362 等。我个人优先推荐 RTL9210B 主控的硬盘盒原因有三一是兼容性好对 Linux 和 Windows 的 UAS 协议支持很完善二是发热控制还不错持续写入大量数据时不容易掉盘三是很多品牌都支持固件升级后期遇到兼容问题还能救一救。选硬盘盒还有一个硬指标必须支持 USB 3.1 Gen210Gbps或以上接口。有些廉价盒子只有 5Gbps 的 USB 3.0 速度虽然也能用但写入镜像的时候时间会明显拉长。一张 20GB 的系统镜像在 10Gbps 接口下大约 3-4 分钟写完在 5Gbps 接口下要 6-8 分钟差距不小。如果电脑没有 Type-C 口记得买带 USB-A 转接头或者带双头线的版本否则到手没法用很耽误事。2.2 系统镜像怎么获取离线烧录的前提是你手上得有镜像文件。有两条路可以走。一条是直接下载 NVIDIA 官方发布的 Jetson 专用 Ubuntu 镜像。NVIDIA 对于 Orin 系列提供了 board support package 和 pre-built image最新版本的预编译镜像可以在官方下载页面找到文件名通常是jetson-orin-nano-XXXX-XXXX.img之类。下载下来后解压就能得到用于写入的完整镜像。另一条是从 SDK Manager 里提取。如果你之前已经用 SDK Manager 在线刷过一台设备在它的缓存目录里其实存有完整的镜像文件。路径一般在~/Downloads/nvidia/sdkm_downloads/或者 SDK Manager 安装目录下的某个子目录。找到那个大体积的.img文件直接拿来用即可。这个方式对网络环境差、又想给多台设备装系统的人特别实用相当于一次下载无限次复用。要注意的是镜像版本必须和你的设备匹配Orin Nano 8GB 和 16GB 版本的镜像不能混用。烧录前一定要确认设备是哪个型号否则启动时会各种报错轻则不能引导重则分区表错乱。2.3 写入工具选择图形化还是命令行我把常见的三种写入镜像方式做了个对比方便大家根据自己情况选。工具支持平台优点缺点推荐场景balenaEtcherWin / macOS / Linux界面友好傻瓜式操作自动校验偶尔会有写入校验慢的问题新手首选RufusWindows速度快选项多界面偏专业点错容易误操作Windows 用户追求速度dd 命令Linux / macOS灵活无额外依赖脚本化写错设备名风险极高熟悉命令行的老手我个人的建议是如果是在 Windows 上操作直接用 balenaEtcher 最省心如果是在 Ubuntu 主机上操作可以lsblk确认好设备路径后用dd写入顺便还能结合pv看写入进度。2.4 关于 Jetson 从 NVMe 启动的机制说明很多人第一次听说这个方案时会问Jetson 开发板不都是从 SD 卡启动吗它真的能从 M.2 NVMe 启动答案是肯定的。Jetson Orin Nano 的 BootROM 支持从多种介质启动包括 SD 卡、USB、NVMe。实际上Orin Nano 官方载板的 M.2 Key M 插槽就是为用户自己加装 NVMe SSD 而准备的系统完全可以装在上面直接引导。只是官方文档里把 SD 卡方案放在最前面导致很多人没注意到这一点。还有一点需要明白在离线烧录方案里NVMe 通过硬盘盒外接到电脑对电脑来说它就是一个普通 U 盘电脑根本不关心你写的是给谁用的镜像。写入完成后NVMe 回到 Jetson 的 M.2 插槽上设备通过 NVMe 协议直接读取分区表并引导系统。整个过程不存在“驱动不识别”的问题因为 Jetson 的固件原生支持 NVMe不用额外刷引导器。3. 实操过程与核心环节实现接下来是完整的实操环节。我会按顺序逐步操作同时告诉你怎么确认每一步是否成功遇到问题如何定位。这部分内容全部来自我实际跑通过的操作。3.1 准备工作清单硬件方面Jetson Orin Nano 开发板8GB 或 16GB 版本NVMe SSD建议 256GB 及以上容量推荐三星 980、西数 SN770、铠侠 BG 系列这类发热友好的盘M.2 NVMe 硬盘盒RTL9210B 主控优先USB Type-C 数据线注意不要拿充电线凑数很多线只有电源线没有数据线一台运行 Windows 或 Linux 的 PC电源适配器Orin Nano 开机用建议原装 DC 电源软件方面已下载并解压的 JetPack 对应版本 Ubuntu 镜像.img 文件balenaEtcher 安装包或者 Linux 上直接用 dd如果烧录后需要验证可以准备一个etcher自带的校验功能或者 md5sum 工具3.2 第一步把 NVMe SSD 安装到硬盘盒这一步看起来简单但细节不能马虎。打开硬盘盒外壳找到 M.2 插槽把 SSD 的金手指对准插槽大约 30 度角插入直到金手指完全没入插槽。这里关键的一步把 SSD 的尾部用盒子里配的固定螺丝拧紧。很多硬盘盒是靠一个塑料卡扣或者螺丝固定的如果固定不牢固写入过程中因为震动或者接触不良导致掉盘轻则写入失败重则分区表损坏。装好 SSD 后先别急着盖盖子。把硬盘盒通过 USB 线接到电脑然后执行下面的命令确认识别情况。在 Linux 上lsblk -o NAME,MODEL,SIZE,VENDOR在 Windows 上打开磁盘管理看有没有出现一个“未初始化”的磁盘。只要能识别到而且容量和你的 SSD 容量对得上就说明硬件链路没问题。3.3 第二步写入系统镜像用 balenaEtcher 的流程是这样的打开 balenaEtcher点击“Flash from file”选择你下载的 Ubuntu 镜像.img文件。点击“Select target”选择你的 NVMe SSD 磁盘。确认目标盘无误后点击“Flash!”开始写入。写入过程中会有一个明显的进度条。写入完成后balenaEtcher 会自动做一次校验这一步不要跳过等它跑完。校验的意义在于确认写入后的数据和原始镜像一致避免出现写了一半掉盘导致的“能开机但是系统文件损坏”这种尴尬情况。如果是 Linux 上用 dd 命令流程是这样的# 先确认设备路径假设是 /dev/sdb sudo lsblk # 写入镜像注意是 of/dev/sdb不是 /dev/sdb1 sudo dd ifjetson-orin-nano-XXXX.img of/dev/sdb bs4M statusprogress convfsyncdd 命令没有进度百分比所以建议加statusprogress参数它能显示实时写入字节数和速度。写入完成后用sync命令确保缓存落盘再拔线。3.4 第三步写入完成后的确认与安全弹出写入完成后不要急着拔 USB。先在电脑上把硬盘盒正常弹出。如果在 Windows 上直接拔Windows 会认为“设备正在使用中”极端情况下会触发缓存数据丢失。正确做法任务栏右下角找到“安全删除硬件并弹出媒体”图标选择弹出对应的磁盘。弹出后可以通过lsblk重新插拔确认一下分区是否已经生成。正常写入后的 NVMe 会包含多个分区比如APP分区、kernel分区、rootfs分区等大小和数量因镜像版本而异但至少能看到一个几 GB 的分区和一个大容量的 Linux 文件系统分区。如果你发现整盘只有一个未分配空间或者完全认不到分区那说明写入失败了需要重新检查镜像文件是否完整、硬盘盒连接是否稳定。还有一种可能是镜像格式不是标准.img而是.raw或其他压缩格式需要先解压再写入。3.5 第四步把 NVMe 装到 Jetson 上这一步是整个过程中最容易出错的尤其是第一次拆装 Jetson Orin Nano 的朋友。先看看你的 Orin Nano 载板。在开发板正面靠近散热风扇的位置有一个 M.2 Key M 插槽它是为了加装 NVMe SSD 预留的。找到一个合适的位置把 SSD 安装上去。具体操作步骤断开 Orin Nano 的所有电源线。拧下 SSD 位置的固定螺丝有些型号是一个黄铜螺丝座有些是一个小金属卡扣。把 NVMe SSD 以大约 30 度角插入 M.2 插槽直到金手指完全进入。把 SSD 尾部下压对准螺丝孔拧紧固定螺丝。这里有个特别容易被忽略的点M.2 插槽有“全长”和“半长”之分也就是 2280 和 2242 规格。Orin Nano Developer Kit 原装的是 2280 规格也就是标准全长所以 2280 的 SSD 直接装没问题。但如果你买的是 2242 短盘就要确认有没有对应的固定螺丝位。实际上 Orin Nano 原装板上大多是 2280 设计用 2242 短盘反而可能没有螺丝位固定到时候只能靠插槽自身的摩擦力撑住长时间震动容易松。装好后确认 SSD 金手指没有外露、螺丝已经拧紧就可以接上电源开机了。3.6 第五步首次启动与系统初始化首次通电开机如果你用的是 HDMI 连接显示器应该能看到 NVIDIA logo 或者 Ubuntu 的引导界面。这一步如果卡住多半是镜像写入有问题而不是硬件问题。正常启动后Ubuntu 会进入 OOBE开箱体验流程让你设置用户名、密码、时区、键盘布局等。这些都根据个人习惯设置就行。有一点要特别提醒首次启动时系统会自动进行磁盘分区扩展。如果你的 NVMe 是 500GB而镜像默认 rootfs 分区只有 16GB 或 32GB系统会在首次启动时自动扩展根分区到整个磁盘。这个过程是自动的但需要一两分钟期间会看到黑屏或命令行日志滚动不要断电等它自己完成重启。进入桌面后用df -h看一下根分区的容量如果显示容量已经扩展到整个磁盘说明一切正常。4. 常见问题与排查技巧实录这部分内容价值最高因为整个方案里最容易出问题的点几乎都在硬件识别、写入和启动这三个环节。我把实际操作中遇到的典型问题整理了一下。4.1 硬盘盒插到电脑上没反应这是最高频的问题。排查思路按顺序查第一确认线材是数据线。很多 USB-C 线是纯充电线内部只有电源线没有数据线插上后电脑只能给硬盘盒供电但识别不到设备。换一根手机原装数据线测试通常能解决。第二确认硬盘盒的供电。部分高速 NVMe 硬盘盒对供电要求比较高插在电脑前置 USB 口可能供电不足。优先插在后置 USB 口、或者用带辅助供电的硬盘盒。第三确认主控固件是否需要升级。RTL9210B 主控的老固件对某些 SSD 兼容性不好表现为“识别后掉盘”或者“写入时断开”。去硬盘盒品牌官网找固件升级工具更新一下就能解决。4.2 写入镜像时报错“write error”或者中途掉盘这个问题大概率是 SSD 本身的问题或者硬盘盒的散热没做好。SSD 在高负载写入时温度会骤升如果硬盘盒没有散热垫或者 SSD 本身发热量大主控会进入过热保护直接断开连接。解决方式拆开硬盘盒确认 SSD 表面有没有贴上散热垫。很多便宜的硬盘盒只给了散热片但不给导热垫。更好的做法是把 SSD 装好后先不盖盖子用一个小风扇对着吹等写入完成再装回去。我实测这样操作后写入 20GB 镜像全程稳定不掉盘。还有一种情况是 SSD 本身有坏块。用 CrystalDiskInfo 或者 Linux 的 smartctl 工具查一下 SSD 的健康度有问题就换盘别硬撑。4.3 写入完成后插到 Jetson 上启动不了首先确认镜像版本和设备型号匹配。Orin Nano 8GB 和 16GB 版本的引导分区格式不一样刷错镜像启动时大概率卡在 NVIDIA logo 或者直接无显示。其次确认 NVMe 安装到位。拔下来重新安装一次保证金手指完全插入固定螺丝拧紧。我遇到过因为螺丝没拧紧导致 SSD 翘起接触不良系统完全无响应的情况。再一个可能原因镜像写入工具的问题。有些镜像写入工具写入时不完整尤其是用了某些“快速格式化”或“分区调整”功能的工具。建议优先用 balenaEtcher 的默认模式不要手动调整任何分区选项。4.4 启动后系统能进但 rootfs 容量不对这个很常见因为镜像里预制的 rootfs 分区只有十几 GB首次启动后自动扩展是依赖nvidia-oem服务或者 systemd 的 growpart 机制。如果你看到df -h里根分区还是镜像默认大小可以手动执行扩展命令sudo systemctl enable nvresizefs.service sudo systemctl start nvresizefs.service sudo resize2fs /dev/nvme0n1p1nvresizefs.service是 NVIDIA 镜像自带的扩容服务手动触发后重启根分区就会扩展到整个磁盘。4.5 常见问题速查表现象可能原因解决办法PC 识别不到硬盘盒线材仅供电、USB 口供电不足换数据线、换后置 USB 口写入中途掉盘SSD 过热、主控固件旧加散热垫、升级固件写入完成但无法启动镜像与设备型号不匹配核对 Orin Nano 8GB/16GB 镜像启动后 rootfs 容量小自动扩容服务未触发手动启动 nvresizefs.service开机卡在 NVIDIA logoNVMe 接触不良重新安装 SSD 并确认固定系统频繁卡顿 IO 高SSD 正品存疑用 smartctl 检查健康度和温度5. 独家经验分享与部署优化建议最后这部分是我在使用过程中的心得体会以及一些可以在实际环境中落地的最优实践结合环境进行优化。5.1 做好磁盘备份遇到问题不慌张整个离线烧录方案最爽的一点就是可重复性极强。只要镜像文件在手任何时候觉得系统玩坏了拿出硬盘盒插上 SSD重新写入一遍镜像就能满血复活整个过程不用联网、不用进 Recovery 模式。我强烈建议保存两张卡一张是原始镜像文件放在 PC 上别动另一张是写入流程的备忘。一旦系统出问题十分钟恢复效率非常高。5.2 安装位置能影响寿命散热是王道Jetson 最怕的是长时间高负载运行NVMe 也一样。Orin Nano 的 M.2 插槽背面就是 PCB正面靠近风扇的风道。建议在 SSD 和 M.2 插槽之间贴一张薄薄的导热垫把热量传递给金属屏蔽罩或者外壳。另外不要在 Jetson 运行时安装新的 SSD 或者拔插 NVMe虽然带电插拔对 M.2 接口没有硬性损伤但数据丢失的风险真的不值得冒。5.3 多设备批量部署直接用镜像制卡如果你需要部署多台 Orin Nano比如做小集群或者多节点边缘计算设备那么这台“制卡机”PC 硬盘盒的流程可以完全流水线化。提前把镜像文件放到本地每台设备装好 SSD 后用读卡器批量写盘写完后插入设备启动即可。这里有个小技巧系统启动并完成初始化后可以先在源机上装好所有需要的软件、写好配置脚本、创建好快照然后把这个已经配置好的 SSD 作为“母盘”用dd把整盘导出为自定义镜像。后续所有设备都刷这个自定义镜像就能做到开箱即用大大减少重复配置工作。操作命令大致是# 在 Linux PC 上读取已经配置好的整个 SSD sudo dd if/dev/sdb ofmy_custom_jetson.img bs4M statusprogress这样导出的镜像会把分区结构、系统配置、已装软件完整保留后续用 balenaEtcher 写入新盘插上 Jetson 就能直接用不用重新初始化。5.4 从 SD 卡迁移到 NVMe 的另一种思路如果你已经在 SD 卡上装好了一套系统暂时不想重新初始化也可以用dd把 SD 卡整个克隆到 NVMe 上。具体做法是把 NVMe 通过硬盘盒接到电脑同时插入 SD 卡然后# 假设 SD 卡是 /dev/sdaNVMe 是 /dev/sdb sudo dd if/dev/sda of/dev/sdb bs4M statusprogress克隆完成后把 NVMe 装回 Jetson开机时进入引导菜单通常是连按 ESC 或者改启动顺序选择从 NVMe 启动即可。这个方法最大的好处是所有已安装的软件、库、配置都完整迁移不用从头折腾环境。根据我个人经验来说NVMe 硬盘盒 离线烧录这套组合已经成了我处理 Jetson 设备部署问题的首选方案。它省去了每次都要联网、每次都要下载的繁琐流程也让“系统盘”这项资源彻底告别了 SD 卡的性能瓶颈。无论你是刚接触 Orin Nano 的新手还是需要批量部署的老手这套思路都值得收藏起来回头真正动手时会发现原来给 Jetson 换系统也可以这么简单干脆。