4、Poky参考发行版初探:Poky目录结构、meta层分析、构建第一个最小系统

好,咱们正式开始动手了。前面几章聊了Yocto是什么、能干什么,现在该把袖子撸起来,看看Poky这个参考发行版到底长什么样。

Poky这个名字,我刚开始接触时觉得挺奇怪。后来才知道,它其实是Yocto项目官方维护的一个参考构建系统。说白了,就是给你一个现成的模板,让你知道怎么组织代码、怎么配置、怎么编译。我个人习惯把Poky比作「样板间」——你不需要从零开始砌墙,直接在这个基础上改改就能住人。

4.1 Poky目录结构:先认路,再开车

你下载好Poky之后,第一件事就是看看它的目录。别急着跑bitbake,先花五分钟把路认清楚。我在项目中遇到过好几次,同事一上来就改配置,结果改错了地方,折腾半天才发现是目录搞混了。

典型的Poky目录长这样:

poky/
├── bitbake/           # 构建引擎,核心中的核心
├── build/             # 构建输出目录(默认没有,需要你创建)
├── meta/              # 核心meta层,包含基础配方
├── meta-poky/         # Poky发行版配置层
├── meta-yocto-bsp/    # 参考BSP层,支持QEMU和一些开发板
├── meta-selftest/     # 自测试层
├── scripts/           # 辅助脚本
├── oe-init-build-env  # 环境初始化脚本
└── README             # 你懂的,先读我

嗯,这里要注意:build目录一开始是不存在的。你需要运行oe-init-build-env这个脚本,它才会自动创建。我刚开始学的时候,傻乎乎地自己mkdir了一个,结果bitbake根本不认——它要找的是脚本生成的那个。

4.2 meta层分析:每一层都有自己的使命

Yocto里最核心的概念就是「层」(Layer)。你可以把每一层想象成一个乐高积木块,不同的积木块拼在一起,就构成了完整的系统。

咱们来看看Poky自带的这几个层分别干什么:

层名 作用 我的评价
meta 核心层,包含OE-Core的基础配方 别动它,除非你知道自己在干什么
meta-poky Poky发行版的默认配置 改配置主要改这里
meta-yocto-bsp 参考板级支持包 移植新板子时,参考它的写法
meta-selftest 测试用例 平时用不到,但写层时可以参考

为什么会这样分层?说白了就是为了解耦。你想想看,如果所有东西都塞在一个大目录里,你想换一个BSP,就得把整个系统翻一遍。有了层,你只需要换掉meta-yocto-bsp,其他部分纹丝不动。

我曾经在一个项目里,客户要求同时支持三块不同的板子。如果没有分层,我估计得维护三套完全不同的代码。有了层之后,我只需要写三个不同的BSP层,核心系统共用一套,省了至少一半的工作量。

4.3 构建第一个最小系统:从零到能跑

好,理论说完了,咱们来点实际的。构建一个最小系统,其实就三步:

  1. 初始化环境
  2. 配置目标
  3. 运行bitbake

第一步,初始化环境:

cd poky
source oe-init-build-env build_qemu

运行完这个命令,你会发现自己已经自动跳到了build_qemu目录下。这就是脚本的功劳——它帮你创建了构建目录,还把环境变量都设好了。

第二步,看看配置文件:

ls conf/
# 你会看到:
# bblayers.conf   local.conf   templateconf.cfg

bblayers.conf里定义了你要用哪些层,local.conf里是各种构建参数。默认情况下,Poky已经帮你配好了QEMU(模拟器)的目标,你基本不用改。

第三步,开始构建:

bitbake core-image-minimal

然后就是漫长的等待。第一次构建要下载源码、编译工具链、编译内核、构建根文件系统……我建议你泡杯咖啡,或者干脆去睡一觉。我第一次构建时,在公司的服务器上跑了将近两个小时。

注意:第一次构建一定要保证网络畅通。Poky会从网上拉取大量源码包,如果网络不稳定,很容易中途失败。我曾经在客户现场演示时,因为网络代理没配好,bitbake跑到一半卡住了,场面一度非常尴尬。

4.4 构建完成后,你得到了什么?

构建成功后,输出文件都在tmp/deploy/images/qemux86-64/目录下。你会看到:

  • bzImage — 内核镜像
  • core-image-minimal-qemux86-64.ext4 — 根文件系统
  • core-image-minimal-qemux86-64.qemuboot.conf — QEMU启动配置

你可以直接用runqemu命令启动它:

runqemu qemux86-64

然后你就会看到一个Linux小系统在窗口中启动了。虽然它只有最基本的功能——能登录、能跑几个命令——但这就是你亲手构建出来的第一个Yocto系统。

小技巧:如果你觉得core-image-minimal太简陋,可以试试core-image-base,它多了网络支持和一些基础工具。我平时调试时,一般先用core-image-minimal验证构建流程没问题,再换成core-image-base做功能测试。

4.5 避坑指南:我踩过的那些坑

最后分享几个我实际遇到过的问题,希望能帮你少走弯路:

  • 磁盘空间不足:一次完整构建大概需要30-50GB空间。我有个同事在笔记本上构建,结果磁盘满了,构建到一半报错。建议至少留80GB空闲。
  • 不要用root用户构建:Yocto官方明确说不支持root。我曾经图省事用root跑,结果各种权限问题,最后只能删掉重来。
  • 构建目录不要放在NFS或网络挂载上:文件锁会出问题。我吃过这个亏,构建到一半莫名其妙地卡死,查了半天才发现是NFS的问题。
  • 如果构建失败,先看日志:别急着重新跑。日志在tmp/log/tmp/work/下面,错误信息一般都很明确。我见过太多人一失败就重跑,结果同样的错误反复出现。

嗯,这一章的内容差不多就这些。你先把Poky跑起来,感受一下整个流程。下一章我们会深入分析meta层的结构,教你如何自己写一个简单的层。