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 构建第一个最小系统:从零到能跑
好,理论说完了,咱们来点实际的。构建一个最小系统,其实就三步:
- 初始化环境
- 配置目标
- 运行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
然后就是漫长的等待。第一次构建要下载源码、编译工具链、编译内核、构建根文件系统……我建议你泡杯咖啡,或者干脆去睡一觉。我第一次构建时,在公司的服务器上跑了将近两个小时。
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层的结构,教你如何自己写一个简单的层。