2、开发环境搭建:宿主机要求与首次构建

好,咱们正式开始动手了。这一章我带你搭好开发环境,把Yocto跑起来。说实话,环境搭建这一步看着简单,但坑不少。我见过太多人卡在依赖包没装全、磁盘空间不够这些基础问题上。咱们一步步来,别急。

2.1 宿主机要求

Yocto对宿主机有硬性要求。不是随便一台Linux都能跑的。我个人习惯用Ubuntu LTS版本,比如20.04或22.04。Debian也行,但Ubuntu的社区支持更活跃,遇到问题好搜。

硬件最低要求:

  • CPU:4核以上(推荐8核)
  • 内存:8GB以上(推荐16GB)
  • 磁盘:100GB空闲空间(推荐200GB+)
  • 文件系统:ext4(别用NTFS或FAT32,Yocto的硬链接会出问题)

磁盘这块我要多说一句。Yocto构建过程中会产生大量临时文件,一个最小系统构建下来大概要30-50GB。如果你同时维护多个项目,200GB很快就用完了。我在项目中吃过这个亏,构建到一半磁盘满了,那叫一个崩溃。

2.2 安装必要软件包

Yocto依赖一堆系统工具。Ubuntu 20.04/22.04上,执行下面这条命令就行:

sudo apt-get update
sudo apt-get 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版本需要的包略有差异。比如Ubuntu 22.04需要额外装python3-pip,而20.04可能不需要。我建议你装完后跑一下Yocto自带的检查脚本,后面会说到。

小技巧:如果你用的是Debian,记得先启用backports源,否则某些包版本太旧。我曾在Debian 11上折腾了半天,最后发现是chrpath版本不够新。

2.3 配置Git和Repo

Yocto源码管理依赖Git和Repo。Git大家应该都熟,Repo是Google开发的Android源码管理工具,Yocto也用它来管理多个Git仓库。

先配Git:

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global color.ui auto

然后装Repo。我建议用Google官方的安装方式:

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

记得把export PATH=~/bin:$PATH加到~/.bashrc里,不然每次开终端都要重新执行。我曾经忘了这一步,每次构建前都要手动export,烦得很。

2.4 下载Yocto源码

Yocto的源码通过Repo来同步。咱们以最新的稳定分支kirkstone为例:

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

这个过程取决于你的网络。第一次同步大概要下载1-2GB数据。如果网络不好,可以加-j4参数并行下载:

repo sync -j4

同步完成后,你会看到这些核心目录:

目录/文件 说明
poky/ Yocto核心层,包含BitBake和OpenEmbedded
meta/ 基础元数据层,提供通用配方
meta-poky/ Poky发行版配置
meta-yocto-bsp/ 参考板级支持包
scripts/ 辅助脚本,比如检查环境的oe-check-env

注意:不要用sudo执行repo sync。Yocto构建过程中会创建大量文件,如果用root权限下载,后续普通用户可能无法正常读写。我见过有人图省事用sudo,结果构建时各种权限报错。

2.5 首次构建最小系统

好,源码到手了。咱们来构建第一个最小系统。Yocto里有个叫core-image-minimal的目标,它只包含最基本的Linux内核和根文件系统,非常适合用来验证环境。

先设置构建环境:

cd poky
source oe-init-build-env build

这条命令会做三件事:

  • 创建build目录(如果不存在)
  • 生成conf/local.confconf/bblayers.conf
  • 设置环境变量,把BitBake加入PATH

然后检查一下local.conf,确保关键参数正确:

# 指定目标机器,默认是qemux86-64
MACHINE ??= "qemux86-64"

# 并行编译线程数,建议设为CPU核心数+1
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

# 下载目录,可以复用,避免重复下载
DL_DIR ?= "${TOPDIR}/../downloads"

我个人习惯把DL_DIR设到构建目录外面,这样多个项目可以共享下载的源码包,省带宽也省时间。

开始构建:

bitbake core-image-minimal

第一次构建会花很长时间。为什么?因为Yocto要从源码编译整个工具链、内核、根文件系统。在我的8核机器上,第一次构建大概要1.5小时。如果网络慢,下载源码包的时间会更长。

提速技巧:如果你有现成的sstate缓存,可以配置SSTATE_DIR指向它。Yocto会跳过已编译的组件,速度能快好几倍。我在团队里就搭了一个共享sstate服务器,大家构建时间从2小时降到了20分钟。

构建完成后,输出在tmp/deploy/images/qemux86-64/目录下。你会看到:

  • core-image-minimal-qemux86-64.rootfs.ext4 — 根文件系统镜像
  • core-image-minimal-qemux86-64.rootfs.tar.bz2 — 根文件系统压缩包
  • bzImage — 内核镜像

用QEMU启动试试:

runqemu qemux86-64

看到登录提示符了吗?默认用户名root,没有密码。恭喜,你的第一个Yocto系统跑起来了!

避坑指南:如果runqemu报错说找不到qemu-system-x86_64,说明你没装QEMU。执行sudo apt-get install qemu-system-x86就行。我曾经在Ubuntu Server上构建,默认没装图形界面,结果QEMU启动不了。后来加了-nographic参数才搞定。

嗯,环境搭建就到这儿。下一章咱们会深入Yocto的层结构,看看怎么添加自己的软件包。你先把这个最小系统跑通,后面就好办了。