2、搭建Yocto开发环境:宿主机要求、安装必要软件包、下载Poky源码、配置Git与Repo、首次构建最小系统

说实话,搭建开发环境这件事,很多人觉得就是装个系统、跑个脚本。但Yocto不一样——它对你的宿主机有硬性要求。我见过不少新手在虚拟机里直接开搞,结果编译到一半磁盘满了,或者内存不够直接OOM。嗯,咱们先把地基打牢。

2.1 宿主机要求

Yocto的构建过程非常吃资源。我个人习惯用Ubuntu 20.04 LTS或22.04 LTS,这是社区支持最好的发行版。当然,CentOS、Debian、Fedora也能用,但坑会多一些。

项目 最低要求 推荐配置
CPU 4核 8核或更多
内存 8GB 16GB以上
磁盘空间 100GB 250GB以上(SSD)
操作系统 Ubuntu 20.04 Ubuntu 22.04 LTS
文件系统 ext4 ext4或btrfs
注意:千万不要用NTFS或FAT32分区来放Yocto构建目录。我在项目中遇到过因为文件系统不支持符号链接导致构建失败的情况,排查了半天才发现是挂载盘的问题。

2.2 安装必要软件包

Yocto依赖一堆基础工具。说白了,它需要完整的GNU工具链、Python、Perl和一些库。我建议直接用apt批量安装,省事。

# Ubuntu 20.04/22.04 通用
sudo apt update
sudo apt install gcc g++ make cmake git wget tar xz-utils \
    python3 python3-pip python3-venv python3-dev \
    chrpath diffstat gawk libncurses-dev \
    libssl-dev zlib1g-dev liblz4-tool \
    unzip texinfo gperf help2man \
    file locales libtool-bin

# 设置locale,避免构建时警告
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

你可能会问:「为什么装这么多?」其实Yocto在构建过程中会调用大量宿主机的工具。比如chrpath用来修改二进制文件的rpath,diffstat用来生成补丁统计信息。少一个,构建就可能中断。

小技巧:如果你用的是Ubuntu 22.04,记得把python-is-python3也装上。有些旧脚本默认调用python而不是python3,没这个软链接会报错。

2.3 下载Poky源码

Poky是Yocto的参考发行版,也是我们最常用的起点。我建议直接克隆Git仓库,而不是下载压缩包。为什么?因为后续切换分支、打补丁都方便。

# 创建工作目录
mkdir -p ~/yocto
cd ~/yocto

# 克隆Poky(以kirkstone分支为例)
git clone git://git.yoctoproject.org/poky -b kirkstone
cd poky

# 查看分支和标签
git branch -a
git tag | tail -10

这里有个细节:kirkstone是Yocto 4.0的长期支持版本(LTS),稳定性和兼容性都很好。我个人习惯用LTS版本做产品开发,因为社区会持续维护两年以上。

核心概念:Poky本质上是一个聚合仓库,它包含了BitBake构建引擎、OpenEmbedded核心元数据(OE-Core)以及一系列参考配方。你下载的不仅仅是代码,而是一整套构建系统。

2.4 配置Git与Repo

Git配置是基础,但容易被忽略。我见过有人因为没设置user.name和user.email,导致补丁提交失败。另外,如果你需要管理多个Git仓库(比如BSP、私有层),Repo工具会很有用。

# 配置Git全局信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor vim

# 安装Repo工具
mkdir -p ~/.local/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.local/bin/repo
chmod a+x ~/.local/bin/repo

# 将~/.local/bin加入PATH
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc
source ~/.bashrc

Repo本身是一个Python脚本,用来管理多个Git仓库的版本。在大型项目中,你可能会同时用到Poky、meta-openembedded、meta-raspberrypi等十几个层。Repo可以让你用一个manifest文件统一管理它们的版本。

避坑指南:我曾经在配置Repo时忘了加--no-repo-verify参数,结果因为网络问题导致签名验证失败。如果你在内网环境或网络不稳定,可以加上这个参数跳过验证。

2.5 首次构建最小系统

好了,环境搭好了,咱们来跑第一个构建。目标是最小系统镜像core-image-minimal,它只包含一个能启动的Linux内核和BusyBox根文件系统。说白了,就是能进shell,别的什么都没有。

# 进入Poky目录
cd ~/yocto/poky

# 初始化构建环境
source oe-init-build-env build

# 查看默认的构建目标
ls conf/
cat conf/local.conf | grep -E "^MACHINE|^DL_DIR|^SSTATE_DIR"

执行source oe-init-build-env后,你会自动进入build目录。这个脚本做了三件事:设置环境变量、创建conf目录、生成默认的local.conf和bblayers.conf。

在开始构建前,我建议先调整几个关键参数:

# 编辑 conf/local.conf
# 1. 指定目标机器(以qemux86-64为例)
MACHINE ?= "qemux86-64"

# 2. 设置并行编译数(建议为CPU核心数+1)
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

# 3. 开启共享状态缓存(加速后续构建)
SSTATE_DIR = "${TOPDIR}/../sstate-cache"
DL_DIR = "${TOPDIR}/../downloads"
经验之谈:把DL_DIR和SSTATE_DIR放在构建目录外面,这样你删除build目录时不会丢失下载的源码和编译缓存。我第一次构建时没注意,删了build目录后重新下载了十几个G的源码,心疼带宽。

然后,开始构建:

bitbake core-image-minimal

第一次构建会下载大量源码包,包括GCC、Linux内核、BusyBox、glibc等。根据你的网络和机器性能,这个过程可能需要1到3个小时。你可以去喝杯咖啡,或者看看文档。

构建完成后,输出在tmp/deploy/images/qemux86-64/目录下:

ls -lh tmp/deploy/images/qemux86-64/
# 你会看到类似这样的文件:
# core-image-minimal-qemux86-64.rootfs.ext4
# core-image-minimal-qemux86-64.rootfs.tar.bz2
# bzImage
# modules-*.tgz

用QEMU启动验证:

runqemu qemux86-64

如果一切顺利,你会看到一个QEMU窗口弹出,系统启动后进入登录提示符。默认用户名是root,没有密码。

构建流程总结:Yocto的构建过程可以简化为四个阶段:
1. 获取源码(从DL_DIR或网络下载)
2. 配置编译(根据配方执行configure和make)
3. 打包安装(将编译产物打包成IPK/RPM/DEB)
4. 组装镜像(将多个包组合成根文件系统镜像)

Yocto首次构建流程 source oe-init-build-env 配置local.conf bitbake core-image-minimal 下载源码(DL_DIR) 编译打包(TMPDIR) 组装镜像(deploy) 首次构建耗时约1-3小时,后续增量构建只需几分钟

构建成功后,你可以在QEMU里执行uname -a、df -h等命令,感受一下这个只有几MB的根文件系统。嗯,麻雀虽小五脏俱全。

常见问题:如果构建过程中断(比如网络超时),重新执行bitbake core-image-minimal即可。Yocto会从断点继续,不会从头开始。但如果你修改了配方或配置,建议先执行bitbake -c cleanall <recipe>清理缓存。

到这里,你的Yocto开发环境就搭建好了。这个最小系统虽然简单,但它验证了工具链、构建流程和QEMU模拟器的正确性。后续的配方裁剪、层管理、自定义镜像,都建立在这个基础上。