2. 搭建Yocto开发环境:宿主机要求、安装必要软件包、配置Git与Repo、下载Poky源码
好,咱们正式开始动手。搭建Yocto开发环境这件事,说难不难,说简单也不简单。我见过不少新手一上来就踩坑,折腾半天连bitbake都跑不起来。其实只要把几个关键点卡住,后面就顺了。
2.1 宿主机要求
Yocto对宿主机是有脾气的。不是随便拿台机器就能跑,尤其是磁盘和内存,这两样不够的话,编译到一半直接OOM,那叫一个崩溃。
最低配置 vs 推荐配置
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 双核 x86_64 | 4核以上 |
| 内存 | 4 GB | 8 GB 以上 |
| 磁盘 | 50 GB 空闲 | 120 GB 以上(SSD) |
| 操作系统 | Ubuntu 20.04 / 22.04 | Ubuntu 22.04 LTS |
| 文件系统 | ext4 | ext4(不要用NTFS/FAT) |
我个人习惯用Ubuntu 22.04 LTS,省心。CentOS Stream也行,但包名不一样,得自己折腾。磁盘一定要留够,我遇到过有人只分了40GB,编译到一半磁盘满了,整个tmp目录得删掉重来,血泪教训。
注意:Yocto编译过程中会产生大量临时文件,tmp目录轻松吃掉30-50GB。建议给build目录单独挂一个分区,或者至少确保家目录有100GB以上空闲。
2.2 安装必要软件包
Ubuntu上装依赖包,一条命令搞定。但要注意,不同Yocto版本对包的要求略有差异。这里以Poky Scarthgap(5.0)为例,这是目前最稳定的长期支持版本。
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 xterm python3-subunit mesa-common-dev zstd liblz4-tool \
file locales libacl1
嗯,这里要注意。如果你用的是Ubuntu 20.04,需要额外装python3.8和python3.8-venv。为什么?因为Yocto的bitbake底层依赖Python 3.8+的特性,20.04默认的Python 3.8没问题,但22.04默认是3.10,直接装就行。
我曾经在Ubuntu 18.04上折腾过,那叫一个痛苦。Python 3.6太老,很多recipe跑不起来。后来我学乖了,直接上22.04。
小技巧:装完包后,运行locale-gen en_US.UTF-8,确保locale设置正确。Yocto对locale敏感,如果没配好,编译时会出现奇怪的编码错误。
2.3 配置Git与Repo
Git是Yocto的命根子。Poky本身就是一个Git仓库,里面的layer也都是Git仓库。所以Git配置必须到位。
2.3.1 基础Git配置
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global color.ui auto
这三行是标配。不配的话,后面git commit会报错,虽然不影响下载,但万一你要提交patch呢?
2.3.2 配置Repo工具
Repo是Google开发的仓库管理工具,Yocto用它来管理多个Git仓库。说白了,就是一个脚本,帮你一次性拉取Poky、meta-openembedded、meta-raspberrypi等一堆layer。
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
然后把~/bin加到PATH里:
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
注意:Repo的官方源在国内可能访问慢。如果你遇到超时,可以用清华镜像:curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo。我当年在深圳出差时,连Google的CDN死活下不来,换了镜像秒搞定。
2.4 下载Poky源码
环境配好了,终于可以拉代码了。这里有两种方式:直接git clone,或者用Repo。我建议用Repo,因为后面集成Busybox时,你可能需要同时管理多个layer。
2.4.1 方式一:直接git clone(适合快速体验)
cd ~
git clone git://git.yoctoproject.org/poky -b scarthgap
cd poky
git tag -l | head -20 # 查看可用版本
这种方式简单粗暴,但只拉了一个Poky核心。如果你想加meta-openembedded之类的layer,还得手动git clone。
2.4.2 方式二:使用Repo(推荐)
先创建一个工作目录,然后初始化Repo:
mkdir ~/yocto-scarthgap
cd ~/yocto-scarthgap
repo init -u https://git.yoctoproject.org/poky -b scarthgap -m default.xml
repo sync
repo sync会拉取Poky以及默认的meta layer。这个过程取决于你的网速,一般5-15分钟。拉完后,目录结构是这样的:
yocto-scarthgap/
├── .repo/
├── meta/
├── meta-poky/
├── meta-skeleton/
├── meta-yocto-bsp/
├── oe-init-build-env
├── README
├── README.hardware
└── ...
你可能会问:为什么没有meta-openembedded?因为默认的default.xml只包含了核心layer。如果你需要额外的layer,可以修改.repo/manifest.xml,或者后期手动添加。
我的习惯:我会在repo init之后,先repo sync -j4,用4个线程并行下载,速度更快。但注意,不要用-j8以上,容易被服务器限流。
2.5 验证环境
源码下载完了,跑一下oe-init-build-env看看能不能正常初始化:
cd ~/yocto-scarthgap
source oe-init-build-env build
如果看到类似这样的输出,说明环境搭好了:
### Shell environment set up for builds. ###
You can now run 'bitbake <target>'
Common targets are:
core-image-minimal
core-image-full-cmdline
core-image-sato
core-image-weston
然后试试bitbake -s | grep busybox,看看能不能找到Busybox的recipe:
bitbake -s | grep busybox
busybox :1.36.1-r0
busybox-dev :1.36.1-r0
busybox-dbg :1.36.1-r0
busybox-ptest :1.36.1-r0
看到这个,说明Poky源码里已经自带了Busybox。嗯,这就是我们后面要集成的目标。
核心逻辑总结:搭建Yocto环境,本质上就是三件事——装对系统包、配好Git/Repo、拉对Poky分支。这三步走稳了,后面编译、集成、定制都是水到渠成的事。
这张图把整个流程串起来了。从宿主机准备开始,一步步走到验证环境。每个环节都有对应的检查点,照着做基本不会出问题。