为reComputer Super构建定制Yocto镜像:从零到烧录的完整实践

发布时间:2026/8/2 17:26:04

为reComputer Super构建定制Yocto镜像:从零到烧录的完整实践 1. 项目缘起为什么要在 reComputer Super 上折腾 Yocto如果你手头有一台 NVIDIA Jetson 系列的开发板比如 reComputer Super通常基于 Jetson Orin NX 或 AGX Orin并且已经用腻了 NVIDIA 官方提供的 JetPack SDK那你可能和我一样开始琢磨一些更底层、更定制化的玩法。官方镜像固然稳定省心但它是一个“大而全”的套餐里面预装了你可能永远用不到的库、服务和图形界面。对于嵌入式产品开发尤其是对系统尺寸、启动速度、安全性和软件包版本有严格要求的场景这种“套餐”就显得过于臃肿和不可控了。这时Yocto Project 就进入了视野。它不是什么具体的 Linux 发行版而是一个开源协作项目提供了一套模板、工具和方法让你能够从头开始为你的嵌入式硬件“烘焙”出一个完全量身定制的 Linux 系统。你可以精确控制系统中包含的每一个软件包、版本、编译选项甚至初始化脚本。对于 reComputer Super 这样性能强大的边缘 AI 计算平台使用 Yocto 意味着你可以打造一个极度精简、只为你的 AI 推理应用服务的专用系统去掉所有冗余最大化利用硬件资源。我这次的目标很明确为 reComputer Super 构建一个最基础的、能启动到命令行的 Yocto 镜像并成功烧录到设备上。这听起来像是万里长征第一步但却是理解整个 Yocto 工作流和 Jetson 平台引导过程的基石。网上关于通用 Yocto 的教程很多但针对 Jetson 平台特别是较新的 Orin 系列且结合具体硬件载板如 reComputer的实践分享却比较零散。这个过程会涉及对 NVIDIA 提供的 BSPBoard Support Package层的理解、对 U-Boot 和内核的配置以及最终镜像的打包格式转换。接下来我就把这次从零开始构建到烧录的完整过程、遇到的坑以及解决方案详细记录下来。2. 前期准备理清概念与搭建构建环境在动手敲命令之前有几个关键概念必须理清这能帮你理解后续每一步在做什么而不是机械地复制粘贴。2.1 Yocto 核心概念扫盲首先Yocto 的构建过程高度依赖“层”Layer的概念。你可以把层理解为一个个模块化的食谱文件夹。最核心的是poky它提供了构建系统的基础框架和工具。针对特定的硬件你需要对应的 BSP 层比如meta-tegra就是 NVIDIA 为 TegraJetson 系列 SoC社区维护的 BSP 层。我们的reComputer Super载板信息通常包含在meta-tegra的特定机器配置中或者由载板厂商如 Seeed Studio提供额外的层。构建时这些层会像叠罗汉一样叠加起来共同决定最终镜像的内容。其次bitbake是 Yocto 的构建引擎你可以把它理解为一个超级智能的make命令。你告诉它你想“做”什么即构建目标如core-image-minimal它会根据各层提供的“食谱”.bb 文件自动解决依赖、下载源码、配置、编译、安装最终生成镜像。2.2 构建主机环境准备Yocto 构建对主机系统资源消耗巨大且对软件版本有要求。我是在一台 Ubuntu 22.04 LTS 的服务器上进行的建议至少满足以下条件CPU核心数越多越好构建过程高度并行化。内存至少 16GB推荐 32GB 或以上。内存不足是构建失败最常见的原因之一。磁盘空间至少预留 150GB 的剩余空间。源码、下载缓存和构建输出会占用大量空间。安装必要的宿主机构建工具包sudo apt-get update sudo apt-get install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool file注意这些包是 Yocto 官方文档推荐的基线。确保你的python3是默认的 Python 解释器。2.3 获取 Yocto 核心与 NVIDIA BSP 层我们选择 Yocto 的长期支持版本kirkstone4.0因为它相对稳定且meta-tegra对其支持成熟。# 1. 创建一个工作目录并进入 mkdir ~/yocto-recomputer cd ~/yocto-recomputer # 2. 克隆 pokyYocto 核心 git clone -b kirkstone https://git.yoctoproject.org/poky cd poky # 3. 克隆 meta-tegraNVIDIA BSP 层 git clone -b kirkstone https://github.com/OE4T/meta-tegra.git # 4. 克隆 meta-openembedded提供大量额外的软件包配方 git clone -b kirkstone https://git.openembedded.org/meta-openembedded现在你的目录结构应该是yocto-recomputer/ └── poky/ ├── meta-tegra/ └── meta-openembedded/2.4 创建构建目录并配置环境Yocto 建议在poky目录外创建一个独立的构建目录build这样保持源码的纯净。# 回到 yocto-recomputer 目录 cd ~/yocto-recomputer # 创建构建目录 source poky/oe-init-build-env build执行oe-init-build-env脚本后你的终端会切换到build目录并设置好一系列必要的环境变量。此时在build目录下会生成两个重要配置文件conf/local.conf和conf/bblayers.conf。conf/bblayers.conf定义构建过程中需要启用的“层”。我们需要编辑它加入meta-tegra和meta-openembedded。conf/local.conf定义本地构建配置如目标机器、并行线程数、下载目录等。3. 关键配置让 Yocto 认识你的 reComputer Super这是整个构建过程中最需要细心的一步配置错误会导致构建失败或生成的镜像无法启动。3.1 配置 bblayers.conf编辑conf/bblayers.conf在BBLAYERS变量中添加我们克隆的层。注意路径要正确使用${TOPDIR}来表示构建目录的上一级即poky所在目录。# 假设你在 build 目录下 vim conf/bblayers.conf找到BBLAYERS部分修改后类似这样请根据你的实际路径调整BBLAYERS ? \ ${TOPDIR}/../poky/meta \ ${TOPDIR}/../poky/meta-poky \ ${TOPDIR}/../poky/meta-yocto-bsp \ ${TOPDIR}/../poky/meta-tegra \ ${TOPDIR}/../poky/meta-openembedded/meta-oe \ ${TOPDIR}/../poky/meta-openembedded/meta-python \ ${TOPDIR}/../poky/meta-openembedded/meta-networking \ 这里我们添加了meta-tegra以及meta-openembedded下的几个常用子层oe, python, networking。3.2 配置 local.conf编辑conf/local.conf我们需要设置几个关键变量。vim conf/local.conf指定目标机器MACHINE这是告诉 Yocto 你要为哪种硬件构建。meta-tegra层支持多种 Jetson 设备。对于 reComputer Super基于 Jetson Orin NX 16GB对应的机器名通常是jetson-orin-nx-devkit。但务必查阅你的 reComputer Super 具体型号的文档Seeed Studio 的 Wiki 或meta-tegra的conf/machine/目录下的文件是权威参考。这里以jetson-orin-nx-devkit为例。MACHINE ? jetson-orin-nx-devkit启用 NVIDIA 的专有驱动和 CUDA既然用 JetsonGPU 和 CUDA 是关键。在local.conf文件末尾添加# 启用 NVIDIA 的专有驱动包 LICENSE_FLAGS_ACCEPTED commercial # 将 NVIDIA 的包加入镜像 IMAGE_INSTALL:append packagegroup-tegra-l4t-corepackagegroup-tegra-l4t-core是一个包组包含了 NVIDIA L4TLinux for Tegra的核心组件如驱动、固件、基础工具。优化构建参数可选但强烈推荐# 根据你的 CPU 核心数设置并行构建线程大幅提升速度 BB_NUMBER_THREADS 8 PARALLEL_MAKE -j 8 # 设置一个公共的下载目录避免不同构建重复下载 DL_DIR ? ${TOPDIR}/../downloads # 设置 SSTATE 缓存目录加速后续构建 SSTATE_DIR ? ${TOPDIR}/../sstate-cache3.3 选择镜像类型我们从一个最小的镜像开始core-image-minimal。它只包含能让系统启动到命令行的基础组件非常适合验证和作为定制起点。在local.conf中也可以指定但我们更常在bitbake命令中直接指定目标。4. 启动构建耐心等待系统“烘焙”配置完成后就可以开始漫长的构建过程了。在build目录下执行bitbake core-image-minimal按下回车后bitbake会开始它的工作。整个过程可能会持续数小时取决于你的网络速度和主机性能。它会依次执行以下任务解析元数据读取所有启用层的配置和食谱。下载源码从互联网上下载 Linux 内核、U-Boot、BusyBox 等所有需要的软件包源码。这是最耗时的阶段之一确保网络通畅。解压与打补丁解压源码并应用必要的补丁。配置与编译为每个软件包执行configure和make。安装与打包将编译好的文件安装到临时根文件系统最后打包成镜像文件。实操心得一关于网络与缓存构建过程需要从git、https等源站下载大量数据国内网络环境可能导致部分仓库克隆失败或极慢。有几种应对策略使用代理为git和curl配置全局代理。预下载Yocto 支持通过bitbake -c fetchall core-image-minimal命令只下载不解压编译可以在网络好的时候先运行此命令。共享 DL_DIR 和 SSTATE_DIR在团队中可以将这两个目录放在 NFS 或高速共享存储上新成员构建时直接复用缓存速度极快。构建过程中终端会输出大量日志。你可以关注最后几行它通常会显示当前正在执行的任务如do_compile和进度。如果遇到错误错误信息通常会比较明确地指出是哪个包recipe在哪个阶段task失败了。5. 成果提取与格式转换从构建输出到可烧录镜像构建成功完成后你会在build/tmp/deploy/images/jetson-orin-nx-devkit/目录下找到一堆输出文件。对我们最重要的有两个core-image-minimal-jetson-orin-nx-devkit.tegraflash.zip这是meta-tegra层为我们打包好的可以直接用于NVIDIA Flash Tools的刷机包。core-image-minimal-jetson-orin-nx-devkit.rootfs.tar.bz2这是根文件系统的压缩包在某些烧录方法中会用到。5.1 处理 tegraflash.zip 包tegraflash.zip是 NVIDIA 官方刷机工具flash.sh所需要的文件集合。我们需要将其解压并准备好刷机环境。# 进入镜像输出目录 cd ~/yocto-recomputer/build/tmp/deploy/images/jetson-orin-nx-devkit # 解压刷机包 unzip core-image-minimal-jetson-orin-nx-devkit.tegraflash.zip -d tegraflash解压后的tegraflash目录里包含了内核镜像Image、设备树tegra234-p3701-0000-p3737-0000.dtb具体文件名因机器而异、U-Boot、根文件系统镜像rootfs.img以及关键的配置文件flash.xml。5.2 准备刷机主机环境刷机需要在另一台运行 Linux通常是 Ubuntu的“主机”上进行这台主机通过 USB 数据线连接 reComputer Super。你需要在这台主机上安装 NVIDIA 的刷机工具。方法一使用 NVIDIA SDK Manager图形化适合新手安装 SDK Manager 后其内部已包含刷机工具链。但我们需要手动指定使用我们自制的刷机包。方法二手动安装 L4T Driver Package命令行更直接从 NVIDIA 开发者网站下载与你 Jetson 模块型号对应的L4T Driver PackageBSP。例如对于 Jetson Orin NX下载Jetson_Linux_R35.4.1_aarch64.tbz2版本号请以最新为准。解压并安装tar -xjf Jetson_Linux_R35.4.1_aarch64.tbz2 cd Linux_for_Tegra/ sudo ./apply_binaries.sh这个步骤会将必要的刷机工具如flash.sh和基础固件安装到当前目录。6. 烧录实战将自制系统写入 reComputer Super这是最令人兴奋也最紧张的环节。请务必按照步骤操作并确保设备供电稳定。6.1 设备进入恢复模式Force Recovery Mode断开 reComputer Super 的电源。用 Micro-USB 数据线必须是数据线不能是充电线连接 reComputer Super 的 Recovery或 USB-C口到主机的 USB 口。找到 reComputer Super 上的“Force Recovery”按钮通常是一个小孔需要用卡针按压和“Power”按钮。先按住“Force Recovery”按钮不放然后轻按一下“Power”按钮开机继续按住“Force Recovery”按钮约2秒钟后松开。在主机上执行lsusb命令如果看到NVIDIA Corp.设备说明已成功进入恢复模式。6.2 执行刷机命令假设你已经将之前解压的tegraflash目录复制到了Linux_for_Tegra/bootloader/目录下这是flash.sh脚本默认查找刷机文件的地方之一。你也可以通过参数指定路径。在Linux_for_Tegra目录下执行sudo ./flash.sh jetson-orin-nx-devkit mmcblk0p1jetson-orin-nx-devkit指定机器类型必须与MACHINE变量和刷机包匹配。mmcblk0p1指定将系统刷写到 eMMC 存储的第一个分区。关键点解析flash.sh在做什么这个脚本是 NVIDIA 刷机流程的封装。它会与处于恢复模式的设备通信。根据flash.xml配置文件将tegraflash目录中的bootloader/内容U-Boot、MB1/BCT 等低级固件通过 USB 发送并烧写到设备的特定存储区域。将内核Image、设备树*.dtb等文件发送并写入到 eMMC 的APP分区。将rootfs.img解压并写入到 eMMC 的rootfs分区。 整个过程在终端中有详细滚动日志请密切关注是否有[ERR]错误提示。6.3 首次启动与验证刷机完成后脚本会提示。此时你可以断开 USB 数据线给 reComputer Super 接入显示器通过 HDMI、键盘和稳定的电源非常重要Orin 系列功耗高必须使用官方推荐电源然后开机。如果一切顺利你会看到 U-Boot 的启动日志随后系统加载内核最终出现登录提示符。我们构建的core-image-minimal镜像默认的用户名是root无需密码。登录后你可以运行一些命令进行验证uname -a # 查看内核版本确认是 Yocto 构建的内核 cat /etc/os-release # 查看系统版本信息 nvidia-smi # 查看 GPU 状态如果安装了 NVIDIA 驱动包组此命令应可用看到熟悉的命令行并且关键硬件如 GPU被正确识别就标志着这次自定义 Yocto 镜像的构建与烧录取得了成功7. 踩坑记录与进阶思考7.1 常见构建失败与解决思路错误do_fetch失败网络超时或证书问题。解决这是最常见的问题。可以尝试为git配置代理或者手动将失败的软件包源码下载到DL_DIR目录中。Yocto 支持多种协议如git、https、svn检查recipes中的SRC_URI字段有时将git://改为https://可能有效。对于特定网站如git.yoctoproject.org可能需要寻找国内镜像源或手动下载。错误No space left on device。解决构建目录磁盘空间不足。Yocto 构建需要大量空间请确保build目录所在分区有超过 150GB 的可用空间。可以使用df -h检查。也可以将DL_DIR和SSTATE_DIR指向更大容量的磁盘分区。错误Machine ‘xxx‘ not found。解决MACHINE名称设置错误或者对应的 BSP 层meta-tegra没有正确添加到BBLAYERS。仔细检查拼写并去meta-tegra/conf/machine/目录下查看有哪些可用的.conf文件。7.2 烧录过程中的坑设备无法进入恢复模式确保使用的是数据线而非充电线。尝试主机上不同的 USB 口最好是 USB 2.0 口。在按按钮时序上多尝试几次。刷机过程在某个百分比卡住或报错检查 USB 连接是否稳定尝试更换数据线。检查主机是否为 Ubuntu 系统且刷机工具版本与 Jetson 模块匹配。检查tegraflash目录下的文件是否完整特别是flash.xml是否指向了正确的rootfs.img和Image文件路径。有时需要根据flash.xml的内容将文件放到Linux_for_Tegra/bootloader/下的特定子目录中。刷机成功但系统无法启动卡在 U-Boot这通常说明内核或设备树有问题。回顾构建日志检查内核配置defconfig是否正确。确认MACHINE变量选择的设备树文件.dtb是否与你的 reComputer Super 载板完全匹配。这是硬件适配中最关键的一环。7.3 后续定制化方向成功构建基础镜像只是起点Yocto 的强大之处在于深度定制添加自定义软件包为你自己的应用程序编写.bb食谱文件创建一个自定义层meta-custom将其加入BBLAYERS然后就可以通过IMAGE_INSTALL:append your-app将应用打包进镜像。裁剪系统在local.conf中使用PACKAGE_EXCLUDE或IMAGE_INSTALL:remove来移除不需要的包进一步缩小镜像。修改内核配置使用bitbake -c menuconfig virtual/kernel来交互式地配置 Linux 内核启用或禁用特定驱动和功能。优化启动速度研究meta-tegra中关于 bootcmd 和 extlinux 的配置精简启动流程。构建 SDK使用bitbake -c populate_sdk core-image-minimal可以生成一个工具链 SDK用于在主机上交叉编译你的应用程序。为 reComputer Super 构建 Yocto 镜像的过程是一次深入理解嵌入式 Linux 系统构成、硬件引导流程和大型项目构建系统的绝佳实践。它打破了官方 SDK 的“黑盒”让你获得了对系统从底层固件到上层应用的完全掌控权。虽然初次构建会遇到各种挑战但每一次排错都能加深你对系统的理解。当你最终看到自己“烘焙”的系统在强大的边缘 AI 设备上跑起来时那种成就感是无可替代的。这为后续部署专属的 AI 推理服务、打造高度定制化的边缘产品奠定了最坚实和灵活的基础。

相关新闻