2. 开发环境搭建:宿主机要求、安装必要软件包、克隆Poky仓库、初始化构建环境、首次构建最小系统
说实话,Yocto 项目入门最大的门槛往往不是概念有多难,而是环境没搭好就开始折腾。我见过太多新手在 Ubuntu 上缺了几个包,编译到一半报错,然后心态就崩了。这一章咱们就把地基打牢,一步步来。
2.1 宿主机要求
Yocto 对宿主机的硬件和系统有明确要求。别想着拿个树莓派或者 2GB 内存的旧笔记本去编译——你会等到怀疑人生。
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 双核 x86_64 | 4 核及以上 |
| 内存 | 4 GB | 8 GB 或更多 |
| 磁盘空间 | 50 GB 空闲 | 100 GB 以上(SSD 更佳) |
| 操作系统 | Ubuntu 20.04 / 22.04 LTS | Ubuntu 22.04 LTS |
| 文件系统 | ext4 | ext4(不要用 NTFS 或 FUSE) |
操作系统方面,我个人习惯用 Ubuntu 22.04 LTS。CentOS 和 Fedora 也能用,但社区文档和教程大多以 Ubuntu 为例,遇到问题好搜。Windows 用户?嗯,老老实实装个虚拟机或者 WSL2 吧。
2.2 安装必要软件包
Yocto 构建系统依赖一堆工具链和库。Ubuntu 上可以用 apt 一次性装完。我建议你直接复制下面这条命令,别一个一个装,太慢了。
sudo apt update
sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential \
chrpath socat cpio python3 python3-pip python3-pexpect xz-utils \
debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa \
libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev zstd \
liblz4-tool file locales libacl1
装完之后,检查一下 Python 版本。Yocto 的 Kirkstone 版本要求 Python 3.8 以上。
python3 --version
2.3 克隆 Poky 仓库
Poky 是 Yocto 的参考发行版,也是我们学习和定制的基础。说白了,它就是 Yocto 官方给你准备的一个样板工程。
我个人习惯把 Yocto 项目放在 ~/yocto 目录下。你可以按自己的喜好来,但路径里最好不要有中文或空格。
mkdir ~/yocto
cd ~/yocto
git clone git://git.yoctoproject.org/poky -b kirkstone
cd poky
这里我选了 kirkstone 分支,它是 Yocto 的长期支持版本(LTS),稳定且文档齐全。你可能会问:为什么不选最新的?嗯,做产品开发,稳定比追新重要。我在项目里吃过追新版本的亏——新特性没用到,反而被不兼容的 API 坑了一把。
克隆完成后,看看目录结构:
ls -l
你会看到 meta、meta-poky、meta-yocto-bsp 等目录。这些就是所谓的「层」(Layer)。Yocto 的核心思想就是分层管理,后面我们会详细讲。
2.4 初始化构建环境
克隆完 Poky 之后,还不能直接编译。你需要先初始化构建环境。这一步会设置一堆环境变量,并创建一个独立的构建目录。
cd ~/yocto/poky
source oe-init-build-env build
执行完这条命令,你会看到终端提示符变了,前面多了个 build 字样。这说明你已经进入了构建环境。同时,当前目录下会生成一个 build 文件夹,里面有几个关键文件:
conf/local.conf:本地构建配置,比如目标机器、并行编译线程数等。conf/bblayers.conf:层配置文件,告诉 BitBake 去哪些层找配方。
核心概念: oe-init-build-env 脚本本质上是一个环境加载器。它设置了 BBPATH、TEMPLATECONF 等变量,让 BitBake 知道去哪里找配置文件和层。每次打开新终端,你都得重新 source 一次。
我个人习惯给构建目录起个有意义的名字,比如 build-qemuarm64,这样一眼就能看出是为哪个目标平台编译的。
source oe-init-build-env build-qemuarm64
2.5 首次构建最小系统
环境初始化好了,接下来就是见证奇迹的时刻——构建一个最小 Linux 系统。Yocto 提供了一个叫 core-image-minimal 的目标,它只包含最基本的组件,能启动到 shell 提示符。
在构建之前,先检查一下 conf/local.conf 里的 MACHINE 变量。默认是 qemux86-64,也就是针对 QEMU 虚拟机的 x86_64 架构。如果你想为其他硬件编译,比如 Raspberry Pi,需要改成对应的机器名。
# 查看当前 MACHINE
grep MACHINE conf/local.conf
确认无误后,开始构建:
bitbake core-image-minimal
第一次构建会下载大量源码包和工具链,耗时很长。在我的 4 核笔记本上,大概需要 1-2 小时。你想想看,Yocto 要从源码编译整个 Linux 系统,包括内核、glibc、BusyBox 等,这时间跑不掉。
build/tmp 目录下的锁文件,或者干脆 rm -rf build/tmp 重新来过。所以,建议你在 tmux 或 screen 里跑构建,这样即使断网也不会中断。
构建成功后,你会看到类似这样的输出:
NOTE: Tasks summary: Attempted 1234 tasks of which 0 didn't need to be rerun and all succeeded.
生成的镜像文件在 build/tmp/deploy/images/qemux86-64/ 目录下。你可以用 QEMU 直接启动它:
runqemu qemux86-64
看到登录提示符了吗?输入 root,不需要密码。恭喜你,你已经拥有了一个完全由自己编译的 Linux 系统!
2.6 本章知识体系
下面这张图帮你梳理了整个环境搭建的流程和关键节点:
这张图把整个流程串起来了。你会发现,从宿主机准备到最终验证,每一步都有明确的输入和输出。我个人建议你按照这个顺序走,不要跳步。跳步的代价往往是回头排查问题,更浪费时间。
2.7 常见问题与解决
最后,分享几个我实际踩过的坑:
- 磁盘空间不足: 构建过程中会下载大量源码包到
build/downloads目录。如果你有多个项目,可以设置DL_DIR共享同一个下载目录,避免重复下载。 - 网络超时: 有些源码包托管在 GitHub 或国外服务器上,下载可能很慢。可以配置代理,或者使用国内的镜像源。
- Python 版本冲突: 如果你系统里装了多个 Python 版本,BitBake 可能会选错。确保
python3指向正确的版本。
bitbake -c fetchall core-image-minimal,把所有的源码包先下载下来。这样即使网络断了,编译阶段也不会卡住。这个小技巧帮我省了不少时间。
好了,环境搭好了,系统也跑起来了。接下来,你就可以开始真正接触 Yocto 的核心——配方(Recipe)了。