4. 构建第一个最小系统
说实话,很多初学者第一次接触Yocto时,都会被那一堆配置文件吓到。我当年也是这样,对着bitbake命令发呆了好久。但别担心,今天我们就用Poky来构建一个最小Linux系统——core-image-minimal。这个过程走一遍,你就能理解Yocto的核心工作流了。
4.1 准备工作:获取Poky
Poky是什么?你可以把它理解成Yocto项目的参考实现。它包含了构建系统所需的一切:BitBake构建引擎、元数据、以及各种工具链配置。
获取Poky很简单,直接克隆它的仓库:
git clone git://git.yoctoproject.org/poky
cd poky
git checkout -b my-build scarthgap
我个人习惯用scarthgap分支,这是Yocto 5.0的长期支持版本。你想想看,生产环境选LTS版本,心里踏实。
4.2 初始化构建环境
进入Poky目录后,我们需要初始化构建环境。这一步会设置各种环境变量,并创建一个构建目录。
source oe-init-build-env build-minimal
执行完这条命令,你会发现自己自动进入了build-minimal目录。这个目录就是我们的工作区。里面有个conf文件夹,放着两个关键配置文件:
- local.conf:本地构建配置,比如目标机器、并行任务数等
- bblayers.conf:指定要使用的层(layers)
嗯,这里要注意:oe-init-build-env脚本会修改你的Shell环境。所以每次打开新终端,都要重新执行一次source命令。
4.3 配置local.conf
对于最小系统,我们只需要改几个关键参数。打开conf/local.conf,找到并修改以下内容:
# 目标机器,这里用qemu模拟的x86-64
MACHINE ?= "qemux86-64"
# 并行编译任务数,建议设为CPU核心数+1
BB_NUMBER_THREADS ?= "8"
PARALLEL_MAKE ?= "-j 8"
# 下载目录,避免重复下载
DL_DIR ?= "/path/to/your/downloads"
为什么要设BB_NUMBER_THREADS?说白了,BitBake会同时处理多个任务。我刚开始做项目时,设了个16线程,结果把服务器搞崩了。后来学乖了,老老实实设成8。
4.4 开始构建:bitbake core-image-minimal
配置好了,直接开干:
bitbake core-image-minimal
这条命令会触发整个构建流程。第一次构建时间很长,因为要下载工具链、源码包,还要编译一大堆东西。我建议你泡杯咖啡,或者干脆让它跑一晚上。
构建过程中,你会看到屏幕上不断滚动的日志。别慌,这是正常现象。BitBake会告诉你当前在做什么:
NOTE: Executing Tasks
NOTE: Running task 123 of 456 (ID: 0, /path/to/recipe.bb:do_fetch)
NOTE: Running task 124 of 456 (ID: 1, /path/to/recipe.bb:do_extract)
...
4.5 理解构建过程:七个核心步骤
构建过程中,每个软件包(BitBake里叫recipe)都会经历七个步骤。我画了一张图,帮你理清这个流程:
这七个步骤,每个都有对应的do_*任务。我们来逐个拆解:
4.6 步骤详解
1. Fetch(获取)
BitBake根据SRC_URI变量指定的地址,下载源码包。下载的文件会放在DL_DIR目录中。我遇到过最坑的事:客户内网不能访问外网,所有源码都得手动下载放到DL_DIR里。那段时间,我天天对着U盘拷文件。
2. Extract(解压)
下载完成后,BitBake会把源码包解压到WORKDIR下的source子目录。这一步会自动处理各种压缩格式:.tar.gz、.tar.bz2、.zip等等。
3. Patch(打补丁)
解压后,BitBake会应用所有补丁文件。补丁文件通常放在recipe目录下的files文件夹中。我曾经为了修一个内核驱动bug,写了三个补丁文件,折腾了两天。
4. Configure(配置)
这一步执行配置脚本,比如./configure或cmake。配置参数由EXTRA_OECONF或EXTRA_OECMAKE变量控制。
5. Compile(编译)
执行make命令,把源码编译成二进制文件。这一步最耗时,也最容易出问题。你想想看,几百个软件包挨个编译,哪个环节出错都得排查。
tmp/work/<machine>/<recipe>/temp/log.do_compile。我每次排查问题,第一件事就是看这个日志。
6. Install(安装)
编译完成后,BitBake会把生成的文件安装到一个临时目录(D变量指定的路径)。这个目录模拟了目标系统的根文件系统结构。
7. Package(打包)
最后一步,把安装好的文件打包成.ipk、.rpm或.deb格式。每个软件包会被拆分成多个子包,比如busybox、busybox-dbg、busybox-dev等。
4.7 构建产物在哪里?
构建完成后,所有产物都在tmp目录下。关键路径如下:
| 目录 | 说明 |
|---|---|
tmp/deploy/images/qemux86-64/ |
最终镜像文件,比如 core-image-minimal-qemux86-64.rootfs.ext4 |
tmp/deploy/rpm/ |
生成的RPM包(如果选择了RPM格式) |
tmp/work/ |
每个recipe的工作目录,包含源码、编译产物、日志等 |
tmp/sstate-control/ |
共享状态缓存,用于加速后续构建 |
4.8 验证最小系统
镜像生成后,可以用QEMU启动它:
runqemu qemux86-64
你会看到一个Linux终端启动起来。登录进去,看看这个最小系统里有什么:
- 一个精简的Shell(通常是BusyBox)
- 基本的文件系统结构(
/bin、/sbin、/etc等) - 没有图形界面,没有桌面环境
- 整个镜像大小只有几十MB
这就是core-image-minimal——一个能跑起来的最小Linux系统。它不包含任何多余的东西,非常适合嵌入式设备。
好了,第一个最小系统已经跑起来了。你想想看,从零开始,用几条命令就构建出一个完整的Linux系统,是不是很有成就感?我在第一个项目里,光是理解这个流程就花了一周时间。现在你跟着走一遍,应该能省下不少弯路。
可可精品资料库