2. 开发环境准备:Linux主机环境搭建、安装必要软件包、配置Git和Repo、设置代理和镜像源

好,咱们正式开始动手了。这一章要解决的是「工欲善其事,必先利其器」的问题。Yocto 项目对宿主机的依赖其实挺重的,说白了,你的 Linux 环境没搭好,后面编译到一半报错,那才叫崩溃。我刚开始接触 Yocto 时,就因为在 Ubuntu 上少装了几个包,折腾了整整一个下午。

所以这一章,我会带你一步步把环境捋顺。咱们的目标是:一台干净的 Linux 主机,装上所有必要的软件包,配好 Git 和 Repo,再搞定代理和镜像源。嗯,这样后面编译起来就顺畅多了。

2.1 选择 Linux 发行版

Yocto 官方推荐的是 Ubuntu 和 Fedora。我个人习惯用 Ubuntu 20.04 LTS 或 22.04 LTS,因为社区支持最好,遇到问题也容易搜到答案。你想想看,如果选一个冷门发行版,出错了连个参考都找不到,多耽误事。

这里有个硬性要求:必须是 64 位系统。32 位系统就别想了,Yocto 根本跑不起来。另外,磁盘空间至少留 100GB,我建议 200GB 以上。为什么?因为一次完整的编译,光是下载的源码和中间产物就能吃掉 50-80GB。我在项目中遇到过磁盘写满导致编译失败的情况,那叫一个尴尬。

推荐配置:

  • Ubuntu 20.04 LTS 或 22.04 LTS
  • CPU:4 核以上(8 核更佳)
  • 内存:8GB 以上(16GB 推荐)
  • 磁盘:200GB 以上 SSD

2.2 安装必要软件包

Yocto 编译过程中会用到大量工具链和库。Ubuntu 下,我们通过 apt 来安装。我建议你直接复制下面这组命令,一次性装完。别一个一个装,太慢了。

sudo apt update
sudo apt 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

装完之后,记得设置 locale。Yocto 对 locale 有要求,必须是 UTF-8。我遇到过因为 locale 没设对,导致 bitbake 解析配方文件时报错的情况。

sudo locale-gen en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

小提示:如果你用的是 Ubuntu 22.04,还需要额外安装 python3-is-python 这个包。因为 22.04 默认没有 /usr/bin/python 这个软链接,而 Yocto 有些脚本会直接调用 python。装了这个包,它就会把 python 指向 python3

2.3 配置 Git 和 Repo

Yocto 的源码管理依赖 Git 和 Repo。Git 大家都很熟了,Repo 是 Google 开发的一个多仓库管理工具,专门用来管理像 Yocto 这种由几十上百个 Git 仓库组成的项目。

2.3.1 配置 Git

先配好你的 Git 用户名和邮箱。这个很重要,因为 Yocto 的提交记录会用到这些信息。

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

我个人习惯还会配几个常用选项:

git config --global core.editor vim
git config --global color.ui auto
git config --global pull.rebase false

你想想看,如果不配 color.ui auto,Git 的输出全是黑白,看分支和状态时特别费眼。这些小细节,能省不少事。

2.3.2 安装 Repo

Repo 其实就是一个 Python 脚本。安装方法很简单:

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

然后把 ~/.local/bin 加到 PATH 里。编辑 ~/.bashrc,在末尾加上:

export PATH="$HOME/.local/bin:$PATH"

然后执行 source ~/.bashrc 让它生效。验证一下:

repo --version

如果能看到版本号,说明安装成功了。

注意:Repo 的官方下载地址有时会被墙。如果你在墙内,建议使用国内的镜像源。比如清华大学的镜像:https://mirrors.tuna.tsinghua.edu.cn/git/git-repo。我曾经在某个项目现场,网络环境受限,折腾了半天才发现是 Repo 下载不下来。后来改用国内镜像,一秒搞定。

2.4 设置代理和镜像源

Yocto 编译过程中需要从网络下载大量源码包。如果你在墙内,或者公司网络有代理,这一步必须提前配好。否则,编译到一半卡在下载环节,那滋味可不好受。

2.4.1 配置代理

如果你需要走 HTTP 代理,可以在 ~/.bashrc 中设置环境变量:

export http_proxy=http://你的代理地址:端口
export https_proxy=http://你的代理地址:端口
export ftp_proxy=http://你的代理地址:端口
export no_proxy=localhost,127.0.0.1,192.168.0.0/16

设置完后,记得 source ~/.bashrc 或者重新登录终端。验证一下:

curl -I https://www.google.com

如果能返回 HTTP 状态码,说明代理生效了。

小技巧:Git 也有自己的代理配置。如果你只配了系统代理,Git 可能不走。建议单独配一下:

git config --global http.proxy http://你的代理地址:端口
git config --global https.proxy http://你的代理地址:端口

这样 Git 的 clone 操作也会走代理,速度会快很多。

2.4.2 配置 Yocto 镜像源

Yocto 的源码包默认从 downloads.yoctoproject.org 下载。这个服务器在国外,速度很慢。我建议你换成国内的镜像源,比如清华大学的镜像。

具体做法是:在 Yocto 项目的 conf/local.conf 文件中,添加以下内容:

# 使用清华大学镜像源
PREMIRRORS_prepend = "\
    git://.*/.* http://mirrors.tuna.tsinghua.edu.cn/yocto/sources/ \n \
    ftp://.*/.* http://mirrors.tuna.tsinghua.edu.cn/yocto/sources/ \n \
    http://.*/.* http://mirrors.tuna.tsinghua.edu.cn/yocto/sources/ \n \
    https://.*/.* http://mirrors.tuna.tsinghua.edu.cn/yocto/sources/ \n \
"

这样配置后,Yocto 会优先从清华镜像下载源码包。如果镜像上没有,再回退到官方源。我在项目中用过这个配置,下载速度从几十 KB/s 提升到了几 MB/s,效果立竿见影。

2.4.3 配置 sstate 缓存镜像

除了源码包,Yocto 的 sstate 缓存也可以配置镜像。sstate 缓存是编译的中间产物,如果命中缓存,可以大幅缩短编译时间。配置方法如下:

# 使用 sstate 缓存镜像
SSTATE_MIRRORS = "\
    file://.* http://mirrors.tuna.tsinghua.edu.cn/yocto/sstate/PATH \n \
"

不过要注意,sstate 缓存镜像不是所有镜像站都提供。清华镜像目前是支持的,但缓存内容可能不是最新的。如果你需要最新的缓存,还是建议自己搭建一个 sstate 缓存服务器。

2.5 验证环境

所有配置都完成后,我们来验证一下环境是否就绪。写一个简单的测试脚本:

#!/bin/bash
echo "检查 Git 配置..."
git config --list | grep user
echo ""
echo "检查 Repo 版本..."
repo --version
echo ""
echo "检查 Python 版本..."
python3 --version
echo ""
echo "检查必要工具..."
for cmd in gawk wget diffstat unzip texinfo gcc chrpath socat cpio xz-utils; do
    if command -v $cmd > /dev/null 2>&1; then
        echo "  $cmd: 已安装"
    else
        echo "  $cmd: 未安装"
    fi
done

如果所有检查项都通过,恭喜你,开发环境已经准备好了。接下来,我们就可以正式开始 Yocto 的实战了。

本章小结:

  • 选择 Ubuntu 20.04/22.04 LTS 作为宿主机,64 位系统,磁盘 200GB+
  • 安装 gawk、wget、git、python3 等必要软件包
  • 配置 Git 用户名、邮箱,安装 Repo 工具
  • 设置 HTTP 代理和 Git 代理,配置清华镜像源加速下载
  • 验证环境,确保所有工具就绪

嗯,环境准备这部分看起来琐碎,但真的很重要。我见过太多人因为少装了一个包,或者代理没配好,浪费了大把时间。按照上面的步骤来,一步都不要跳过。下一章,我们就要开始拉取 Yocto 源码,搭建第一个构建环境了。