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 用户?嗯,老老实实装个虚拟机吧。
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
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_DIR 和 SSTATE_DIR 到其他分区,比如:
DL_DIR = "/ssd/downloads"
SSTATE_DIR = "/ssd/sstate-cache"
这样能避免根目录被撑爆。
好了,到这里你已经完成了 Yocto 的首次构建。虽然只是一个小小的 core-image-minimal,但背后的流程——源码下载、依赖解析、并行编译、镜像打包——你已经全部体验了一遍。接下来,咱们就可以在这个基础上,加入自己的应用、驱动、配置,打造真正的高性能嵌入式系统了。