2. 开发环境搭建:宿主机要求、安装必要软件包、配置Git和Repo、下载Yocto源码、首次构建最小系统
搭建一个靠谱的开发环境,是Yocto项目的第一步。这一步要是没走稳,后面各种编译错误会让你怀疑人生。我刚开始接触Yocto时,就在环境上栽过跟头——装了个Ubuntu 22.04的桌面版,结果依赖包缺了一大堆,折腾了两天才把第一个镜像跑起来。
今天咱们就把这事一次性搞定。从硬件要求到软件配置,再到第一次构建,我会把踩过的坑都指出来。
2.1 宿主机硬件与操作系统要求
先说说硬件。Yocto构建是个吃资源的事,尤其是第一次全量编译。
| 硬件项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核或以上 |
| 内存 | 8GB | 16GB或以上 |
| 磁盘空间 | 100GB空闲 | 250GB以上(SSD) |
| 操作系统 | Ubuntu 20.04 LTS | Ubuntu 22.04 LTS / 24.04 LTS |
操作系统这块,Ubuntu LTS版本是最省心的。Debian、Fedora、OpenSUSE也能用,但依赖包的名字和版本号可能不一样,你得自己查文档。我建议新手直接上Ubuntu 22.04,社区支持最成熟。
2.2 安装必要软件包
Yocto构建需要一堆基础工具。别嫌多,这些都是编译器和构建系统的依赖。
在Ubuntu 22.04上,执行以下命令:
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
嗯,这里要注意。不同Ubuntu版本需要的包略有差异。比如Ubuntu 20.04需要额外装python3-distutils,而22.04已经内置了。
装完后,检查一下Python版本:
python3 --version
Yocto的Kirkstone版本(4.0)要求Python 3.8以上。如果你用的是Ubuntu 20.04,默认Python 3.8没问题。22.04自带3.10,更稳。
2.3 配置Git和Repo
Yocto源码管理依赖Git和Repo。Repo是Google开发的工具,用来管理多个Git仓库——Yocto的源码就是由几十个独立仓库组成的。
2.3.1 配置Git
先设置你的Git全局信息:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
这两个信息会记录在每次提交中。虽然咱们现在只是下载源码,但养成好习惯总没错。
另外,我建议把Git的缓存调大一点:
git config --global http.postBuffer 524288000
git config --global core.compression 0
为什么要调?因为Yocto源码仓库很大,网络不好的时候容易断。调大缓冲区能减少失败概率。我曾经在下载到90%时断掉,重来一遍,那个心情……你懂的。
2.3.2 安装Repo
Repo其实就是一个Python脚本。安装很简单:
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="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
验证一下:
repo --version
如果能看到版本号,说明装好了。
2.4 下载Yocto源码
环境准备好了,咱们开始拉代码。这里以Yocto 4.0 Kirkstone为例,这是目前最稳定的LTS版本。
先创建工作目录:
mkdir ~/yocto
cd ~/yocto
然后用Repo初始化:
repo init -u https://git.yoctoproject.org/poky -b kirkstone
repo sync
这个过程会下载Poky主仓库以及所有子模块。网络好的话,大概10-15分钟。如果中途断了,重新执行repo sync就行,它会断点续传。
下载完成后,看看目录结构:
cd poky
ls -la
你会看到meta、meta-poky、meta-yocto-bsp等目录。这些就是Yocto的元数据层。
2.5 首次构建最小系统
源码到手了,咱们来构建第一个镜像。目标是最小系统——core-image-minimal,它只包含一个能启动的Linux内核和基本的根文件系统。
2.5.1 初始化构建环境
Yocto提供了一个脚本来设置环境变量:
cd ~/yocto/poky
source oe-init-build-env build
执行后,你会自动进入build目录。这个脚本做了几件事:
- 设置
BITBAKE、BUILDDIR等环境变量 - 创建
conf目录,包含local.conf和bblayers.conf - 把BitBake和脚本工具加到PATH里
2.5.2 配置local.conf
打开conf/local.conf,找到这几项并修改:
# 目标机器,这里用qemu模拟的arm64
MACHINE ?= "qemuarm64"
# 并行编译线程数,建议设为CPU核心数+1
BB_NUMBER_THREADS ?= "8"
PARALLEL_MAKE ?= "-j 8"
# 下载目录,共享给多个构建
DL_DIR ?= "${TOPDIR}/../downloads"
# 共享状态缓存,加速后续构建
SSTATE_DIR ?= "${TOPDIR}/../sstate-cache"
DL_DIR和SSTATE_DIR放在构建目录外面,这样你删掉build目录重建时,不用重新下载所有源码包。我第一次没注意这个,删了build目录后重新编译,又等了两个小时。
2.5.3 开始构建
配置好了,执行构建命令:
bitbake core-image-minimal
然后就是漫长的等待。第一次构建需要下载所有源码包、编译交叉工具链、构建目标系统的所有组件。在8核、16GB内存的机器上,大概需要1-2小时。
构建过程中,你会看到类似这样的输出:
Loading cache: 100% |###########################################| Time: 0:00:00
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |#########################################| Time: 0:00:05
Parsing of 1234 .bb files complete. 0 cached, 0 parsed, 1234 targets.
...
NOTE: Tasks Summary: Attempted 2345 tasks of which 0 didn't need to be rerun and all succeeded.
看到最后一行all succeeded,说明构建成功了。
2.5.4 验证构建结果
构建完成后,镜像文件在tmp/deploy/images/qemuarm64/目录下:
ls tmp/deploy/images/qemuarm64/
你会看到core-image-minimal-qemuarm64.rootfs.ext4、zImage、qemuarm64.dtb等文件。这就是咱们的第一个嵌入式系统镜像。
用QEMU启动它试试:
runqemu qemuarm64 nographic
等几秒钟,你会看到Linux启动日志,最后出现登录提示符。默认用户名是root,没有密码。
2.6 本章知识体系
下面这张图总结了整个环境搭建的流程和关键节点:
2.7 常见问题与避坑
最后,分享几个我实际遇到过的问题:
- 磁盘空间不足:构建过程中
tmp目录会膨胀到几十GB。确保你的分区有足够空间,别像我一样把/home分区塞爆了。 - 网络超时:如果
repo sync频繁失败,试试换用国内镜像源,或者挂代理。Yocto的源码托管在git.yoctoproject.org,国内访问有时不太稳定。 - Python版本不匹配:如果你用的是Ubuntu 18.04,默认Python 3.6太旧了。升级到3.8以上,或者直接换Ubuntu 22.04。
- 构建卡在某个任务:别急着Ctrl+C。先看看日志,
tmp/log/cooker.log里通常有详细错误信息。我曾经因为一个依赖包没装,卡在glibc编译上两个小时才发现。
环境搭建这块,说白了就是一次性的体力活。只要按照步骤来,别跳步,基本不会出大问题。等第一个镜像跑起来,你会发现之前的所有折腾都值了。