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 |
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用来生成补丁统计信息。少一个,构建就可能中断。
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文件统一管理它们的版本。
--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. 组装镜像(将多个包组合成根文件系统镜像)
构建成功后,你可以在QEMU里执行uname -a、df -h等命令,感受一下这个只有几MB的根文件系统。嗯,麻雀虽小五脏俱全。
bitbake core-image-minimal即可。Yocto会从断点继续,不会从头开始。但如果你修改了配方或配置,建议先执行bitbake -c cleanall <recipe>清理缓存。
到这里,你的Yocto开发环境就搭建好了。这个最小系统虽然简单,但它验证了工具链、构建流程和QEMU模拟器的正确性。后续的配方裁剪、层管理、自定义镜像,都建立在这个基础上。