2. 开发环境搭建:宿主机要求、安装必要软件包、配置Git与Repo、下载Poky源码、首次构建最小系统
好,咱们正式开始动手了。这一章的目标很明确——把Yocto的开发环境搭起来,然后跑通第一个最小系统。我见过太多新手卡在这一步,要么是系统版本不对,要么是缺了某个包,折腾一整天还没开始编译。别急,跟着我的节奏来,半小时内你就能看到Poky的编译输出。
2.1 宿主机要求
先说硬件。Yocto编译是个吃资源的事,尤其是第一次构建,要下载大量源码包并交叉编译。我个人建议:
- CPU:4核以上,8核更佳。编译时能明显感觉到多核的优势。
- 内存:至少8GB,16GB比较舒服。我曾在4GB的虚拟机上试过,swap狂飙,编译到一半直接OOM。
- 磁盘:至少100GB空闲空间。一个完整的Poky构建下来,大概要占用30-50GB。如果你同时维护多个构建目录,空间需求会更大。
- 操作系统:Ubuntu 20.04/22.04 LTS 或 CentOS 7/8。我个人偏爱Ubuntu,包管理方便,社区支持也好。
2.2 安装必要软件包
Yocto对宿主机有一堆依赖。说白了,就是编译工具链、Python、Perl、一些库文件。不同发行版的包名略有差异,我以Ubuntu 22.04为例:
sudo apt update
sudo apt install gcc g++ make cmake patch diffstat texinfo \
chrpath wget cpio unzip tar bzip2 gzip lz4 zstd \
python3 python3-pip python3-pexpect python3-git \
xz-utils debianutils iputils-ping libssl-dev \
libncurses-dev libelf-dev liblz4-tool
嗯,这里要注意。有些包是Yocto的硬性要求,比如chrpath和diffstat,少了它们编译到一半会报错。我曾经在CentOS上漏装了texinfo,结果文档生成阶段直接挂掉,排查了半天才发现。
如果你用的是CentOS/RHEL,对应的命令是:
sudo yum install gcc gcc-c++ make cmake patch diffstat texinfo \
chrpath wget cpio unzip tar bzip2 gzip lz4 \
python3 python3-pip python3-pexpect python3-git \
xz-devel openssl-devel ncurses-devel elfutils-libelf-devel
2.3 配置Git与Repo
Yocto的源码管理依赖Git和Repo。Git大家都很熟了,Repo是Google开发的一个多仓库管理工具,用来同时管理Poky、meta层、BSP等多个Git仓库。
先确认Git版本:
git --version
建议1.8.3以上。然后配置你的用户信息:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
接下来安装Repo。其实Repo就是一个Python脚本,下载下来放到PATH里就行:
mkdir -p ~/.local/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.local/bin/repo
chmod a+x ~/.local/bin/repo
export PATH=$PATH:~/.local/bin
记得把~/.local/bin加到.bashrc或.zshrc里,不然每次开终端都要重新export。
https://mirrors.tuna.tsinghua.edu.cn/git/git-repo。
2.4 下载Poky源码
Poky是Yocto的参考发行版,也是我们学习的起点。下载Poky有两种方式:
方式一:直接Git clone
git clone git://git.yoctoproject.org/poky
cd poky
git checkout <tag> # 比如 dunfell, gatesgarth, honister
方式二:使用Repo(推荐)
Repo可以一次性拉取Poky及其所有依赖的meta层:
mkdir yocto-build
cd yocto-build
repo init -u git://git.yoctoproject.org/poky -b dunfell
repo sync
我个人习惯用Repo。为什么呢?因为实际项目中,你往往需要同时管理poky、meta-openembedded、meta-raspberrypi等多个仓库。Repo一条命令就能全部同步,省心。
下载完成后,目录结构大概是这样的:
yocto-build/
├── poky/
│ ├── meta/
│ ├── meta-poky/
│ ├── meta-yocto-bsp/
│ ├── scripts/
│ └── oe-init-build-env
├── .repo/
└── ...
2.5 首次构建最小系统
好,重头戏来了。第一次构建,我们选core-image-minimal——这是一个极简的Linux系统,只包含最基本的用户空间工具。说白了,就是能启动、能登录、能跑几个shell命令。
先初始化构建环境:
cd poky
source oe-init-build-env build
这个脚本会帮你创建build目录,并设置好一系列环境变量。执行完后,你会自动进入build目录。
然后编辑conf/local.conf,调整一些关键参数:
# 目标机器,默认是qemux86-64
MACHINE ?= "qemux86-64"
# 并行编译线程数,建议设为CPU核心数+1
BB_NUMBER_THREADS ?= "8"
PARALLEL_MAKE ?= "-j 8"
# 下载目录,可以共享给多个构建
DL_DIR ?= "/path/to/downloads"
# 共享状态缓存,加速后续构建
SSTATE_DIR ?= "/path/to/sstate-cache"
嗯,这里要特别说一下DL_DIR和SSTATE_DIR。如果你打算多次构建,或者同时维护多个项目,一定要把它们设到公共目录。我第一次没设,结果每次clean后都要重新下载所有源码包,浪费了大量时间。
接下来,开始构建:
bitbake core-image-minimal
第一次构建会非常慢,取决于你的网络和机器性能。一般来说,30分钟到2小时不等。BitBake会依次执行:
- 下载所有源码包(从源码镜像或原始地址)
- 校验完整性
- 解压、打补丁
- 配置、编译
- 打包成IPK/RPM/DEB
- 组装成根文件系统镜像
构建过程中,你可以用bitbake -s查看任务状态,或者用top观察CPU和内存使用。如果一切顺利,最后你会看到类似这样的输出:
NOTE: Tasks Summary: Attempted 1234 tasks of which 0 didn't need to be rerun and all succeeded.
构建产物在tmp/deploy/images/qemux86-64/目录下:
core-image-minimal-qemux86-64.rootfs.ext4
core-image-minimal-qemux86-64.rootfs.tar.bz2
core-image-minimal-qemux86-64.vmdk
...
你可以用QEMU直接启动它:
runqemu qemux86-64
看到登录提示符的那一刻,恭喜你——你的第一个Yocto系统跑起来了!
- 宿主机推荐Ubuntu 20.04/22.04,8GB内存+100GB磁盘起步
- 安装完整依赖包,缺一不可
- 用Repo管理多仓库,比纯Git更方便
- 第一次构建选core-image-minimal,验证环境正确性
- 善用DL_DIR和SSTATE_DIR加速后续构建
do_fetch失败,原因是某个源码包被墙了。解决方案是配置PREMIRRORS,指向国内的镜像源。具体配置方法,后面章节会详细讲。
好了,环境搭好了,第一个系统也跑起来了。接下来你就可以开始折腾了——换BSP、加软件包、改内核配置,Yocto的世界才刚刚打开。