2、开发环境搭建:宿主机要求、安装必要软件包、配置Git和Repo、下载Yocto源码、首次构建体验

好,咱们正式开始动手了。搭建开发环境这件事,说简单也简单,说坑也多。我见过不少新手,一上来就急着编译,结果卡在某个依赖包上半天找不着北。所以这一章,咱们把基础打扎实。

2.1 宿主机要求

Yocto 对宿主机是有脾气的。说白了,它喜欢 Linux,而且是特定的发行版。我个人习惯用 Ubuntu 20.04 LTS 或 22.04 LTS,这两个版本我踩过的坑最少。

硬件方面,我建议你至少准备:

  • CPU:4 核以上,8 核更佳。编译时能跑满所有核心,时间差好几倍。
  • 内存:至少 8GB,16GB 以上才舒服。我遇到过内存不够,编译到一半直接 OOM 被杀掉,那叫一个郁闷。
  • 磁盘:至少 100GB 空闲空间。一个完整的构建,随随便便吃掉 50-80GB。建议用 SSD,机械硬盘会让你怀疑人生。
  • 操作系统:Ubuntu 20.04/22.04 LTS 或 CentOS 7/8。Windows 用户?嗯,老老实实装个虚拟机吧。
注意: 千万别在 WSL1 上跑 Yocto,文件系统性能太差。WSL2 勉强可以,但我还是推荐原生 Linux。

2.2 安装必要软件包

Yocto 的依赖包挺多的。不过别怕,一条命令就能搞定。我每次在新机器上搭建环境,都会先跑这个:

sudo apt-get update
sudo apt-get 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 libegl1-mesa libsdl1.2-dev \
    xterm python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1

为什么列这么多?我刚开始学的时候也嫌烦,后来发现少一个包,编译时就报错,查半天才发现是缺了 chrpath。嗯,一次性装好最省心。

如果你是 CentOS/RHEL 用户,命令换成:

sudo yum install -y gawk make wget tar bzip2 gzip python3 unzip perl patch \
    diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath \
    socat perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue \
    python3-pip xz which SDL-devel xterm

2.3 配置 Git 和 Repo

Yocto 的源码管理靠 Git 和 Repo。Repo 是 Google 搞的一个工具,用来管理多个 Git 仓库。说白了,Yocto 项目太大了,一个仓库装不下,Repo 帮你一把抓。

先配 Git:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global color.ui auto

这里有个小细节——邮箱最好用你注册 GitHub 的那个,不然提交记录里显示的是「Unknown」,看着别扭。

再装 Repo:

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

记得把 export PATH 加到 ~/.bashrc 里,不然每次开终端都要重新设。我曾经忘了这一步,折腾了半小时才反应过来。

2.4 下载 Yocto 源码

好,重头戏来了。我们以 Yocto 的 Kirkstone 版本为例(4.0 LTS,稳定得很)。

mkdir yocto-kirkstone
cd yocto-kirkstone
repo init -u https://git.yoctoproject.org/poky -b kirkstone
repo sync

repo sync 这一步会下载所有源码,大概几百 MB,取决于你的网速。我建议用个好点的网络,别在咖啡厅蹭网干这事,容易断。

下载完后,你会看到这样的目录结构:

yocto-kirkstone/
├── bitbake/        # 构建引擎
├── meta/           # 核心层
├── meta-poky/      # Poky 参考发行版
├── meta-yocto-bsp/ # 板级支持包
├── oe-init-build-env  # 环境初始化脚本
└── README
小技巧: 如果你只想下载某个特定机器的 BSP,可以只 repo sync 部分仓库。但新手阶段,我建议全量下载,省得后面缺东西。

2.5 首次构建体验

终于到了最激动人心的时刻——第一次编译!

先初始化构建环境:

cd yocto-kirkstone
source oe-init-build-env build

这条命令会创建一个 build 目录,并自动跳进去。你会看到终端提示符变了,多了个 build 字样。

然后,我们修改 conf/local.conf,指定目标机器。默认是 qemux86-64,也就是 QEMU 模拟的 x86 机器。咱们先拿这个练手:

# 在 local.conf 中
MACHINE = "qemux86-64"

接着,开始构建一个最小的镜像:

bitbake core-image-minimal

第一次构建会下载所有源码包,然后编译工具链、内核、根文件系统……整个过程大概 1-2 小时,看你的机器配置。我当年第一次跑,用的是 4 核 8GB 的笔记本,编译了整整 3 个小时。嗯,那会儿我边等边刷手机,差点睡着。

构建成功后,你会看到类似这样的输出:

NOTE: Tasks Summary: Attempted 1234 tasks, 0 not run, 0 cached.
NOTE: Build completed successfully.

生成的镜像在 tmp/deploy/images/qemux86-64/ 目录下。你可以用 QEMU 启动它:

runqemu qemux86-64

看到 QEMU 窗口里 Linux 启动起来的那一刻,成就感满满。

避坑指南: 我曾经在构建过程中遇到 disk space exhausted 错误。检查发现是 tmp/ 目录占满了磁盘。建议在 local.conf 中设置 DL_DIRSSTATE_DIR 到其他分区,比如:
DL_DIR = "/ssd/downloads"
SSTATE_DIR = "/ssd/sstate-cache"
这样能避免根目录被撑爆。

好了,到这里你已经完成了 Yocto 的首次构建。虽然只是一个小小的 core-image-minimal,但背后的流程——源码下载、依赖解析、并行编译、镜像打包——你已经全部体验了一遍。接下来,咱们就可以在这个基础上,加入自己的应用、驱动、配置,打造真正的高性能嵌入式系统了。