🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第7章-定制镜像菜谱与内核菜谱
记得三连,标为原始粉丝,感谢大神支持。
在嵌入式开发中,系统镜像不再是一个“装满软件的大杂烤”,而应是“按需定制的最小功能集合”。Yocto 项目提供了高度模块化的构建体系,而“镜像菜谱”(Image Recipe)正是你定义系统形态的核心手段。
本文将从实际操作出发,教你一步一步定制属于自己的 Linux 镜像 —— 一个只包含你需要内容的最小可运行系统,并验证其可用性。
一、什么是镜像菜谱?
镜像菜谱是一个 BitBake .bb
文件,告诉构建系统:
“请为我构建一个包含这些软件包、具备这些功能的系统镜像。”
它主要包括三个核心要素:
- 基础镜像类(inherit core-image / image / core-image-minimal 等)
- 要安装的包列表(IMAGE_INSTALL)
- 启用的系统特性(IMAGE_FEATURES)
示例代码:
SUMMARY = "My own embedded image"
LICENSE = "MIT"
inherit core-image
IMAGE_FEATURES += "package-management ssh-server-dropbear"
IMAGE_INSTALL += "packagegroup-core-boot"
二、创建你的第一个镜像菜谱(my-image)
1)准备构建环境
进入 Yocto 项目目录(如 poky):
source oe-init-build-env
确认 MACHINE
配置,例如:
echo 'MACHINE ??= "qemux86-64"' >> conf/local.conf
2)创建自定义层并添加
bitbake-layers create-layer ../meta-myimage
bitbake-layers add-layer ../meta-myimage
结构预期如下:
meta-myimage/
├—— conf/
│ └—— layer.conf
└—— recipes-core/
└—— images/
3)定义自定义镜像菜谱
新建文件:
mkdir -p meta-myimage/recipes-core/images
touch meta-myimage/recipes-core/images/my-image.bb
填入如下内容:
SUMMARY = "My minimal system with SSH and dpkg"
LICENSE = "MIT"
inherit core-image
IMAGE_FEATURES += "package-management ssh-server-openssh debug-tweaks"
IMAGE_INSTALL += "packagegroup-core-boot i2c-tools nano"
三、添加自定义程序:Hello from Yocto!
1)编写源代码
mkdir -p meta-myimage/recipes-apps/hello/files
创建文件 hello.c
:
#include <stdio.h>
int main() {
puts("Hello from Yocto World!");
return 0;
}
2)编写 BitBake 菜谱
新建 hello_1.0.bb
:
SUMMARY = "HelloWorld from Yocto"
LICENSE = "MIT"
SRC_URI = "file://hello.c"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} hello.c -o hello
}
do_install() {
install -d ${D}${bindir}
install -m 0755 hello ${D}${bindir}
}
3)加入到镜像中
编辑你的 my-image.bb
,追加:
IMAGE_INSTALL:append = " hello"
四、构建镜像
执行以下命令:
bitbake my-image
构建成功后,镜像文件将保存在:
tmp/deploy/images/qemux86-64/
常见输出文件包括:
my-image-qemux86-64.rootfs.ext4
my-image-qemux86-64.rootfs.wic
my-image-qemux86-64.manifest
五、启动测试镜像(使用 QEMU)
启动命令:
runqemu qemux86-64 my-image
登录成功后,输入:
hello
你将看到输出:
Hello from Yocto World!
验证成功!
六、调味技巧:镜像定制的进阶玩法
以下是一些你可以尝试添加的实用组件:
功能 | 加入方式 |
---|---|
支持 .deb 软件包安装 | IMAGE_FEATURES += "package-management" |
添加 Python 运行环境 | IMAGE_INSTALL += "python3 python3-pip" |
加入网络调试工具 | IMAGE_INSTALL += "net-tools iproute2" |
精简调试镜像 | 去掉 debug-tweaks ,用 busybox 替代 |
七、常见问题与排查指南
问题1:构建失败找不到应用程序
- ✅ 确认菜谱文件是否加入
meta-myimage
- ✅ 确认源代码路径是否写对:file://hello.c
- ✅
bitbake -e hello | grep SRC_URI
查看解析结果
问题2:镜像中找不到应用
- ✅ 确认
IMAGE_INSTALL
是否包含 hello - ✅
bitbake -e my-image | grep IMAGE_INSTALL
检查展开结果 - ✅ 登录系统后,用
which hello
,ls /usr/bin/hello
八、小结
镜像菜谱并不复杂,它更像是你系统功能的“菜单清单”。从一个基本的 .bb
文件出发,你就可以:
✅ 定义系统功能范围
✅ 安装自定义工具与程序
✅ 控制系统的启动行为与软件生态
当你熟练掌握 inherit
、IMAGE_INSTALL
和 IMAGE_FEATURES
,就掌握了 Yocto 的最核心能力之一。
📣 下节预告:如何自定义内核功能和驱动模块!
🎥 视频教程请关注 B 站:“嵌入式 Jerry”
🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第7章-定制镜像菜谱与内核菜谱
记得三连,标为原始粉丝,感谢大神支持。