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)都会经历七个步骤。我画了一张图,帮你理清这个流程:

BitBake 构建流程:七个核心步骤 Fetch Extract Patch Configure Compile Install Package 每个步骤都有对应的 do_* 任务,例如 do_fetch、do_compile Fetch(获取) 从网络或本地 下载源码包 SRC_URI 指定来源 Compile(编译) 执行 make 等命令 生成二进制文件 OECMAKE/EXTRA_OECONF Package(打包) 生成 .ipk/.rpm/.deb 拆分 runtime 包 PACKAGES 变量控制 关键路径 WORKDIR = ${TMPDIR}/work/${MACHINE}/${PN}/${PV}-${PR} 所有步骤都在 WORKDIR 的子目录中完成

这七个步骤,每个都有对应的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系统。它不包含任何多余的东西,非常适合嵌入式设备。

核心要点: 构建最小系统的意义在于,你理解了Yocto的完整工作流。从Fetch到Package,每个步骤都清晰可见。以后构建更复杂的系统,无非是增加更多的层和软件包,流程是一样的。

好了,第一个最小系统已经跑起来了。你想想看,从零开始,用几条命令就构建出一个完整的Linux系统,是不是很有成就感?我在第一个项目里,光是理解这个流程就花了一周时间。现在你跟着走一遍,应该能省下不少弯路。

可可精品资料库