2. 开发环境搭建:安装依赖包、配置Git与Repo、下载Poky与Meta层、首次构建最小系统

好,咱们正式开始动手。这一章,我会带你从零搭建一套完整的Yocto开发环境。说白了,就是让你的电脑具备「编译嵌入式Linux系统」的能力。

我记得第一次搭环境时,光装依赖就折腾了大半天。后来发现,很多坑其实是可以提前避开的。嗯,咱们一步步来。

2.1 安装系统依赖包

Yocto对宿主机的依赖挺多的。我个人习惯用Ubuntu 20.04 LTS或22.04 LTS,这两个版本我实测过,兼容性最好。你如果用的是其他发行版,比如Fedora或Debian,命令会略有不同,但原理一样。

先更新包管理器:

sudo apt update
sudo apt upgrade -y

然后安装核心依赖包。我建议你直接复制下面这行命令,别一个一个装,太慢了:

sudo apt install -y 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 python3-subunit zstd liblz4-tool \
file locales libacl1
注意: 如果你用的是Ubuntu 22.04,记得额外安装 python3-venv 包。我曾在项目中漏掉这个,结果编译到一半报错,排查了半天才发现是虚拟环境工具没装。

安装完成后,检查一下Python版本:

python3 --version

Yocto的Kirkstone版本要求Python 3.8以上。如果你版本太低,建议升级一下系统。

2.2 配置Git与Repo

Git是Yocto的命根子。所有的源码、meta层、补丁,全是通过Git管理的。所以,先把Git配置好。

配置用户名和邮箱:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

我个人习惯再加两个配置:

git config --global core.editor vim
git config --global color.ui true

这样提交代码时,默认用vim编辑,而且输出带颜色,看着舒服。

接下来是Repo工具。Repo是Google开发的一个Git仓库管理工具,专门用来管理多仓库项目。Yocto用它来管理Poky和各个meta层。

安装Repo:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后把 ~/bin 加到PATH里:

echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
小技巧: 如果你在墙内,访问Google的地址可能很慢。我曾经遇到过下载Repo超时的问题。你可以用国内的镜像源:curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo。清华的源,速度杠杠的。

验证Repo是否安装成功:

repo --version

看到版本号输出,就说明搞定了。

2.3 下载Poky与Meta层

Poky是Yocto的参考发行版,也是我们构建系统的起点。它包含了BitBake构建引擎、OpenEmbedded核心元数据,以及一系列基础配方。

先创建一个工作目录,我习惯叫 yocto-project

mkdir ~/yocto-project
cd ~/yocto-project

然后初始化Repo仓库。这里我选择Kirkstone分支,它是Yocto的长期支持版本(LTS),稳定性最好:

repo init -u https://git.yoctoproject.org/poky -b kirkstone

如果你网络不好,可以用国内镜像:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/poky -b kirkstone

初始化完成后,同步所有仓库:

repo sync

这个过程会下载Poky以及所有默认的meta层。根据你的网速,可能需要10到30分钟。趁这个时间,你可以泡杯咖啡。

同步完成后,看看目录结构:

ls -la

你会看到 metameta-pokymeta-yocto-bsp 等目录。这些就是Yocto的核心meta层。

核心概念: 每个meta层都包含一组配方(recipes)、配置文件和补丁。比如 meta 是OpenEmbedded核心层,meta-poky 是Poky的发行版配置层。我们后面添加的硬件支持层、应用层,都会放在这里。

2.4 首次构建最小系统

好,环境搭好了,代码也拉下来了。现在我们来编译第一个系统——一个最小化的嵌入式Linux镜像。它叫 core-image-minimal,只包含最基本的系统组件,比如内核、根文件系统、BusyBox等。

先设置构建环境。Yocto提供了一个脚本,帮我们初始化环境变量:

source oe-init-build-env build

执行后,你会自动进入 build 目录。这个目录是编译的工作区,所有临时文件和最终产物都会放在这里。

然后,检查一下 conf/local.conf 文件。这是构建的核心配置文件。我建议你至少修改以下几个参数:

参数 说明 我的建议值
MACHINE 目标硬件平台 qemux86-64(先用QEMU模拟器测试)
DL_DIR 源码下载缓存目录 /opt/yocto/downloads(避免重复下载)
SSTATE_DIR 共享状态缓存目录 /opt/yocto/sstate-cache(加速后续编译)
BB_NUMBER_THREADS 并行编译线程数 CPU核心数(比如 8
PARALLEL_MAKE make并行数 CPU核心数(比如 8

用vim打开配置文件:

vim conf/local.conf

找到对应行,修改成你的配置。我个人习惯把 DL_DIRSSTATE_DIR 放到 /opt/yocto/ 下,这样多个项目可以共享缓存,省时间。

重要提醒: 第一次编译时,不要贪心把 BB_NUMBER_THREADS 设得太大。我曾经在32核服务器上设了32,结果内存爆了,编译直接崩溃。建议先设成CPU核心数的一半,稳定后再调高。

配置完成后,开始编译:

bitbake core-image-minimal

第一次编译会下载大量源码包,包括Linux内核、GCC工具链、glibc库等。整个过程可能需要1到3小时,取决于你的网络和CPU性能。

编译过程中,你会看到类似这样的输出:

Loading cache: 100%
Parsing recipes: 100%
...
NOTE: Tasks summary: Attempted 2345 tasks of which 0 didn't need to be rerun and all succeeded.

看到 all succeeded,恭喜你,第一个最小系统编译成功了!

编译产物在 tmp/deploy/images/qemux86-64/ 目录下。你可以用QEMU启动它:

runqemu qemux86-64

你会看到一个Linux系统启动,并进入登录提示符。默认用户名是 root,没有密码。

我的经验: 第一次编译如果失败了,别慌。90%的情况是网络问题导致源码下载失败。你可以查看 tmp/log/cooker.log 文件,里面记录了详细的错误信息。最常见的错误是 fetch failed,重新执行 bitbake core-image-minimal 即可,Yocto会从断点继续编译。

嗯,到这里,你的开发环境就完全搭建好了。下一章,我们会在这个基础上,添加硬件支持层,让系统真正跑在物联网网关的硬件上。