轻松学习yocto: 10-Yocto 学习路线
到此, 我可以重建core-image-minimal 带有ssh-dropbear, pi image IP设置好了, windows也可以用putty 连接pi2, 接下来我学什么?
你现在其实已经跨过了一个非常重要的坎:
你不再只是“会编译 Yocto”,而是已经能从 recipe → BitBake → rootfs → WIC → SD Card →
Raspberry Pi → SSH,完整跑通一条链。
文章摘要本文为 Yocto 学习者规划了一条从“会编译”到“能定制”的清晰进阶路径。作者基于读者已成功构建并运行带 SSH 的 Raspberry Pi 镜像这一基础,提出了Yocto 第二阶段的九个核心实验,旨在帮助读者建立完整的嵌入式 Linux 产品开发思维:
- 从零编写最小 Recipe:通过一个纯 Shell Script 的
hello-yocto.bb,掌握从 Recipe 到最终在 Pi 上运行的完整流程。- 编写 Systemd Service:让应用开机自启,理解 Yocto 如何定义系统服务。
- 创建自己的 Layer:建立
meta-myproduct,学习通过 Layer 覆盖和扩展官方配置,这是工程化开发的基础。- 区分 local.conf 与 Layer:理解临时构建配置与产品级配置的边界,培养配置管理意识。
- 创建自定义 Image Recipe:告别
core-image-minimal,定义属于自己的产品镜像。- 深入 Kernel 定制:在理解上层构建流程后,再学习内核配置、模块和设备树。
- 使用 SDK 进行应用开发:为自定义镜像生成 SDK,在主机上进行交叉编译应用开发。
- 遵循结构化学习路线:提供了从 Recipe 到 BSP 的 11 个阶段学习表格,避免盲目学习。
- 巩固核心主线:强调应专注于 BitBake → Recipe → Package → Rootfs → Image 这条核心构建链,暂缓学习 Docker 等外围技术。
全文核心思想是:Yocto 是一个构建系统,其目标是让你能够定义和构建属于自己的完整 Linux 产品,而不仅仅是编译软件。下一步建议立即动手实践第一个实验:编写
hello-yocto.bb。
结合我们前面已经做过的 busybox.bb、busybox.inc、task dependency、do_compile/do_install/do_package、WIC 和 Dropbear,我建议不要马上去学别的 recipe。
下一阶段应该进入:
Yocto 第二阶段:从“构建系统”进入“定制系统”
我建议你按下面顺序走。
1. 我最建议你下一课:自己写一个最小 recipe
不要再解剖 BusyBox 了。
BusyBox 已经完成了它的教学使命:让你理解:
recipe ↓ BitBake metadata ↓ task ↓ do_compile ↓ do_install ↓ do_package ↓ package ↓ rootfs ↓ image现在我们反过来:
自己写一个 recipe,然后亲眼看它如何进入 Raspberry Pi 的 rootfs。
例如做一个:hello-yocto
最终 SSH 到 Pi2:
root@raspberrypi2:~# hello-yoctoHello Yocto!这个练习非常关键,因为你会真正掌握:
hello-yocto.bb │ ├── SRC_URI ├── do_compile ├── do_install ├── FILES:${PN}▼ package ▼ core-image-minimal ▼ WIC ▼ SD Card ▼ Raspberry Pi2这个练习非常关键,因为你会真正掌握:
hello-yocto.bb │ ├── SRC_URI ├── do_compile ├── do_install ├── FILES:${PN}▼ package ▼ core-image-minimal ▼ WIC ▼ SD Card ▼ Raspberry Pi2这次我们甚至可以不依赖任何复杂源码,先做一个纯 shell script recipe。
具体建议与补充说明:
- 结构优化:将这句关键提示从单纯的引用块提升为一个小节标题,例如“1.1 从最简单的 Shell Script Recipe 开始”,使其在视觉上更突出,逻辑层次更清晰。
- 逻辑深化:在此处补充一个简短的段落,解释“为什么从 Shell Script 开始”:
从纯 Shell Script 开始,可以让你完全专注于 Recipe 的元数据(metadata)和任务(task)流程本身,而无需被 C/C++ 编译环境、交叉编译工具链、源码补丁等复杂因素干扰。这是理解 BitBake 如何“打包”和“部署”一个软件的最干净起点。
- 案例补充:紧接着提供一个极简的
hello-yocto.bb示例框架,让抽象概念立刻变得具体可操作:
并附上对应的# hello-yocto.bbSUMMARY="A simple hello-yocto script"LICENSE="MIT"SRC_URI="file://hello-yocto.sh"do_install(){install-d${D}${bindir}install-m0755${WORKDIR}/hello-yocto.sh${D}${bindir}/hello-yocto}FILES:${PN}="${bindir}/hello-yocto"hello-yocto.sh脚本内容:#!/bin/shecho"Hello Yocto!" - 行动指引:在案例后增加一个“下一步动作”提示,引导读者立即实践:
动手试试:在你的 layer 中创建上述两个文件,然后运行
bitbake hello-yocto。观察tmp/work/目录下生成的日志和文件,特别是do_install任务将脚本安装到了哪个临时目录,以及最终它如何被包含进core-image-minimal的包列表中。 - 承上启下:最后用一句话衔接至下一个实验(systemd service),强化学习路径的连贯性:
当你成功在 Pi2 上运行
hello-yocto命令后,你将获得对 Recipe 生命周期的完整感性认识。接下来,我们就可以让这个“Hello World”在系统启动时自动运行,进入systemd service的实验。
- 然后做第二个实验:自己写 systemd service
比如:hello-yocto.service
让 Pi 启动之后自动运行:hello-yocto
然后你 SSH 进去:systemctl status hello-yocto
这一步会把你带到一个非常重要的概念:
recipe ↓ 安装文件 ↓ /etc/systemd/system/xxx.service ↓ systemd ↓ 开机启动你会开始真正理解:
Yocto 不只是“把软件编译出来”,而是决定目标 Linux 系统里面有什么,以及它怎么启动。
3. 第三个实验:正式创建自己的 Layer
现在你应该从:
poky/ meta-openembedded/ meta-raspberrypi/开始建立自己的:meta-myproduct/
例如:
meta-myproduct/ ├── conf/ │ └── layer.conf ├── recipes-example/ │ └── hello-yocto/ │ └── hello-yocto.bb └── recipes-core/ └──...然后:
bitbake-layers create-layer../meta-myproduct bitbake-layers add-layer../meta-myproduct以后你自己的所有东西都放进去:
meta-myproduct │ ├── recipes ├── configuration ├── services ├── patches ├── kernel config └── device tree这一步非常重要。
因为从这里开始,你不应该再修改:
poky/meta/... meta-raspberrypi/...而是:
通过自己的 layer 覆盖/扩展别人提供的东西。
这是 Yocto 真正的工程工作方式。
4. 第四个实验:学习 local.conf 和 layer 的边界
你现在应该开始刻意区分:
临时实验
build-rpi2/conf/local.conf和:
产品级配置
meta-myproduct/例如:MACHINE = “raspberrypi2”
可以是 machine/build 配置。
而:IMAGE_INSTALL:append = " dropbear"
虽然可以放 local.conf,但如果你要做正式产品,就应该逐渐移动到自己的 layer / image recipe 中。
最终形成:
local.conf ↓ 开发者个人/机器相关配置 meta-myproduct ↓ 产品本身的配置这个思想非常重要。
- 第五个实验:不要再只用 core-image-minimal
你现在应该创建自己的 image:my-product-image.bb
例如:
my-product-image │ ├── dropbear ├── busybox ├── hello-yocto ├── your-service └── your-config然后:bitbake my-product-image
最终:my-product-image-raspberrypi2.rootfs.wic
这时候你就真正开始从:
“我在编译 Yocto 的 image”
变成:
“我在定义自己的 Linux 产品。”
6. 第六阶段:Kernel
等上面的东西真正理解之后,再进入 kernel。
这一阶段非常值得你在 Pi2 上做:
Yocto │ └── Linux Kernel ├── kernel config ├── module ├── device tree └── patch例如:bitbake virtual/kernel
然后研究:bitbake -c menuconfig virtual/kernel
再研究:KERNEL_DEVICETREE
然后自己加一个 kernel configuration。
这一阶段你会第一次真正理解:
Yocto 并不是 Linux kernel。
Yocto 是构建系统,而 kernel 只是 Yocto 构建出来的一个组件。
7. 第七阶段:SDK
等你已经能做自己的 image 后,再学:bitbake -c populate_sdk
然后:
Yocto PC │ SDK ▼ Application Developer ▼ your-app ▼ ARM/Raspberry Pi然后你可以在 PC 上写:
#include <stdio.h>intmain(){printf("Hello Raspberry Pi\n");return0;}使用 Yocto SDK 编译:aarch64-poky-linux-gcc …
或者根据你的 Pi2 配置对应的 ARM toolchain。
这时候就进入:
Yocto + Embedded Linux Application Development
8. 所以,我给你安排的路线是
不要一下子学 20 个东西。
我们就按这个顺序:
- 我尤其建议你现在不要急着学 Docker、systemd 全家桶、Linux 驱动等
因为你现在最宝贵的是刚刚建立起来的这条“主线”。
我们应该趁热打铁:
然后我们把箭头反过来:
这会是你真正从“使用 Yocto”进入“掌握 Yocto”的转折点。
下一步
我建议我们直接开始 01:从零写第一个 hello-yocto.bb。
而且这次我会带你用我们之前解剖 BusyBox 的方法,一行一行追踪它从 .bb 文件到最终出现在 Pi2 /usr/bin/hello-yocto 的全过程
