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)
注意: 磁盘空间是很多人忽略的坑。我第一次用 Yocto 时只分了 40GB,结果编译到一半磁盘满了,整个构建目录得删掉重来。建议至少留 100GB,尤其是你要构建带图形界面的系统时。

操作系统方面,我个人习惯用 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
小技巧: 如果你用的是 Ubuntu 20.04,默认 Python 是 3.8,够用。但如果你用更老的系统,记得先升级 Python。我曾经在 Ubuntu 18.04 上折腾了半天,最后发现 Python 版本太低,所有配方解析都报语法错误。

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 等,这时间跑不掉。

避坑指南: 我曾经在构建过程中不小心关掉了终端,结果 BitBake 进程被中断,再次构建时出现了各种奇怪的锁文件错误。解决办法是删除 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 本章知识体系

下面这张图帮你梳理了整个环境搭建的流程和关键节点:

Yocto 开发环境搭建流程 Yocto 开发环境搭建流程 宿主机准备 CPU / 内存 / 磁盘 安装依赖包 apt install 工具链 克隆 Poky git clone -b kirkstone 初始化构建环境 source oe-init-build-env 配置 local.conf MACHINE / 并行线程 首次构建 bitbake core-image-minimal 验证:runqemu 启动镜像 tmp/deploy/images/ 下的镜像文件 💡 关键提醒 • 首次构建耗时 1-2 小时,建议在 tmux/screen 中运行 • 磁盘空间不足时,可设置 DL_DIR 和 SSTATE_DIR 到其他分区

这张图把整个流程串起来了。你会发现,从宿主机准备到最终验证,每一步都有明确的输入和输出。我个人建议你按照这个顺序走,不要跳步。跳步的代价往往是回头排查问题,更浪费时间。

2.7 常见问题与解决

最后,分享几个我实际踩过的坑:

  • 磁盘空间不足: 构建过程中会下载大量源码包到 build/downloads 目录。如果你有多个项目,可以设置 DL_DIR 共享同一个下载目录,避免重复下载。
  • 网络超时: 有些源码包托管在 GitHub 或国外服务器上,下载可能很慢。可以配置代理,或者使用国内的镜像源。
  • Python 版本冲突: 如果你系统里装了多个 Python 版本,BitBake 可能会选错。确保 python3 指向正确的版本。
我的习惯: 每次构建前,我都会先执行 bitbake -c fetchall core-image-minimal,把所有的源码包先下载下来。这样即使网络断了,编译阶段也不会卡住。这个小技巧帮我省了不少时间。

好了,环境搭好了,系统也跑起来了。接下来,你就可以开始真正接触 Yocto 的核心——配方(Recipe)了。