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
注意:千万别用Windows的WSL1来跑Yocto,文件系统性能太差。WSL2勉强能用,但我个人还是推荐原生Linux。虚拟机也行,但磁盘一定要给足。

操作系统这块,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

如果能看到版本号,说明装好了。

注意:Repo会定期更新,建议每几个月重新下载一次。旧版本的Repo可能无法同步最新Yocto源码。

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就行,它会断点续传。

核心概念:Poky是Yocto的参考发行版,包含了BitBake构建引擎、OpenEmbedded核心元数据以及一系列参考配方。说白了,它就是Yocto的"样板间"。

下载完成后,看看目录结构:

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,没有密码。

里程碑:看到这个登录提示符,意味着你的Yocto开发环境完全搭建成功了。从零到第一个可启动系统,你已经走完了最艰难的一步。

2.6 本章知识体系

下面这张图总结了整个环境搭建的流程和关键节点:

Yocto开发环境搭建流程 硬件与OS准备 CPU≥4核 / RAM≥8GB 安装系统依赖包 gcc / python3 / chrpath等 配置Git与Repo user.name / http.postBuffer repo sync 下载Poky oe-init-build-env 生成conf/local.conf和bblayers.conf 配置local.conf MACHINE / DL_DIR / SSTATE_DIR bitbake core-image-minimal 首次构建约1-2小时 验证:runqemu qemuarm64 nographic 登录提示符 → 环境搭建成功 关键提醒: • DL_DIR和SSTATE_DIR建议放在构建目录外,避免重复下载 • 首次构建耗时较长,建议用screen或tmux在后台运行 • 如果构建中断,重新执行bitbake会从断点继续

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编译上两个小时才发现。

环境搭建这块,说白了就是一次性的体力活。只要按照步骤来,别跳步,基本不会出大问题。等第一个镜像跑起来,你会发现之前的所有折腾都值了。