第2章:Yocto开发环境搭建

好,咱们正式开始动手。搭建开发环境这件事,说难不难,说简单也不简单。我见过太多人卡在第一步——环境没配好,后面全是坑。这一章,我带你一步步把地基打牢。

2.1 宿主机要求

先说说硬件。Yocto是个吃资源的家伙,别指望拿个老旧笔记本就能跑得动。我个人习惯用一台至少16GB内存的机器,硬盘建议512GB以上,最好是SSD。为什么?因为Yocto编译过程中会下载大量源码包,解压、编译、打包,磁盘IO压力不小。

操作系统方面,我推荐Ubuntu 20.04 LTS或22.04 LTS。这两个版本我都在项目里用过,兼容性最好。当然,CentOS 7/8、Debian 11/12也行,但有些包名不一样,你得自己折腾一下。

最低配置要求:

  • CPU:4核以上(推荐8核)
  • 内存:8GB以上(推荐16GB)
  • 硬盘:100GB以上空闲空间(推荐256GB)
  • 操作系统:Ubuntu 20.04/22.04 LTS 64位

嗯,这里要注意:千万别用Windows子系统WSL1,文件系统性能太差。WSL2勉强能用,但我还是建议直接装双系统或虚拟机。我曾经在WSL2上折腾了一整天,最后发现一个文件权限问题浪费了三个小时——不值当。

2.2 安装必要工具包

Yocto依赖一堆工具包。说白了,它需要GCC、make、patch、bison、flex这些编译工具,还有Python、Perl这些脚本语言。不同发行版包名略有差异,我以Ubuntu为例。

打开终端,执行以下命令:

sudo apt-get update
sudo apt-get install gcc g++ make patch bison flex \
    diffstat texinfo chrpath wget \
    python3 python3-pip python3-venv \
    perl cpio unzip rsync file \
    libssl-dev libncurses-dev \
    gawk sed git-core lz4 zstd

你可能会问:怎么装这么多?其实每个包都有它的用处。比如chrpath用来修改二进制文件的rpath,diffstat用来统计补丁文件的变化量。我刚开始学Yocto时也嫌麻烦,后来发现少装一个包,编译到一半就报错,那才叫崩溃。

小技巧:如果你用的是Ubuntu 22.04,记得确认Python版本是3.10以上。Yocto的Kirkstone版本开始要求Python 3.8+,老版本会报错。

2.3 配置Git与Repo

Git是Yocto的命根子。所有源码都通过Git管理,你得先配好用户名和邮箱:

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

我个人习惯把credential.helper也配好,省得每次push都输密码:

git config --global credential.helper store

接下来是Repo工具。Repo是Google开发的,用来管理多Git仓库的工具。Yocto的源码分散在几十个仓库里,手动一个个clone太累。安装Repo很简单:

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里,不然每次开新终端都要重新设置。我曾经忘了这一步,结果第二天回来发现终端里找不到repo命令——嗯,这种低级错误犯一次就够了。

2.4 下载Yocto源码

环境配好了,咱们开始下载源码。Yocto的源码托管在git.yoctoproject.org,我们用repo来拉取。先创建一个工作目录:

mkdir ~/yocto
cd ~/yocto

然后初始化repo。以Kirkstone版本为例(这是Yocto 4.0,长期支持版):

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

这个过程会下载poky、meta-openembedded、meta-raspberrypi等一堆元层。网络好的话,大概10-20分钟。如果卡住了,别急,可以加个-j4参数并行下载:

repo sync -j4

注意:国内网络访问GitHub可能不稳定。如果你遇到下载失败,可以试试用gitee镜像:

repo init -u https://gitee.com/yocto-mirror/poky -b kirkstone

但镜像可能更新不及时,建议还是用官方源配合代理。

下载完成后,你会看到~/yocto目录下多了poky、meta-openembedded等文件夹。这就是Yocto的源码树了。你想想看,几十个仓库,一个命令搞定,是不是很爽?

2.5 首次构建最小系统

源码到手,咱们来构建第一个镜像。Yocto里有个叫core-image-minimal的镜像,它只包含最基本的Linux系统——内核、根文件系统、busybox,没有图形界面,没有额外工具。说白了,就是能启动到shell的最小系统。

先设置环境变量:

cd ~/yocto/poky
source oe-init-build-env build

这个命令会创建一个build目录,并自动切换到里面。同时,它会设置一系列环境变量,比如TEMPLATECONF、BBPATH等。我第一次运行这个命令时,看到屏幕上刷出一堆信息,还以为出错了——其实那是正常的。

接下来,修改conf/local.conf文件。用你喜欢的编辑器打开:

vim conf/local.conf

找到MACHINE变量,改成你目标板的型号。比如我用qemu模拟x86-64:

MACHINE = "qemux86-64"

如果你有真实硬件,比如Raspberry Pi 4,就改成:

MACHINE = "raspberrypi4-64"

然后设置并行编译数。我建议设为CPU核心数+1:

BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

好了,开始构建:

bitbake core-image-minimal

第一次构建会非常慢,因为要下载所有源码包并编译。我16核的机器第一次构建也花了将近40分钟。你可以去泡杯咖啡,或者看看文档。如果中途报错,别慌——八成是网络问题,重试一下就好。

构建成功后的输出:

构建完成后,镜像文件在tmp/deploy/images/qemux86-64/目录下。你会看到core-image-minimal-qemux86-64.rootfs.ext4、bzImage等文件。用qemu启动试试:

runqemu qemux86-64

如果一切顺利,你会看到一个Linux终端,输入root登录,没有密码。恭喜,你的第一个Yocto系统跑起来了!

2.6 避坑指南

最后,分享几个我踩过的坑:

  • 磁盘空间不足:Yocto构建过程中会生成大量临时文件,tmp目录可能膨胀到50GB以上。确保你的分区有足够空间。
  • 网络代理问题:如果你在公司内网,记得配好http_proxy和https_proxy环境变量。Yocto的下载器会读取这些变量。
  • Python版本冲突:系统自带的Python可能是2.7,但Yocto需要Python 3。用python3 --version确认一下。
  • 文件系统大小写敏感:Yocto的构建系统对文件名大小写敏感。如果你在macOS或Windows上使用不区分大小写的文件系统,会出问题。建议用Linux原生环境。

我曾经在构建到90%时因为磁盘空间不足而失败,那种感觉就像跑马拉松最后一公里摔了一跤。所以,提前检查磁盘空间,别偷懒。


好了,环境搭建就到这里。你手头应该有一个能跑起来的Yocto最小系统了。下一章,咱们聊聊设备树的基础知识——那才是咱们课程的核心。

可可精品资料库