嵌入式软件 - Yocto 构建树莓派 4 计算机的屏幕截图

Yocto 构建 Raspberry Pi 4

(在 Docker 环境中)

Docker 容器中运行的 Yocto

Yocto 文档中有一章(2.2.2)针对设置 CROss 平台(CROPS)作为设置原生 Linux PC 的替代方案。此替代方案使用 Docker 容器构建自定义系统映像(例如用于 Raspberry Pi)。很遗憾,文档中对于在 Mac OS X (Monterey) 上设置此环境存在一些小错误。### 设置用于 Mac OS X 的 Docker 容器

要在 Linux、Windows 和 Mac OS X 上使用 CROPS Docker,需要一些特殊设置。在设置 Yocto 的容器之前,必须创建一个 Docker 卷以存储结果。此外,还使用 Docker Samba 容器在 Mac OS X 中提供文件。#### 创建 Docker 卷 在终端窗口中输入以下命令:

docker volume create --name raspberry
docker run -it --rm -v raspberry:/workdir busybox chown -R 1000:1000 /workdir

创建并运行 Samba 容器

OSX 不会允许您连接到本地运行的 Samba 共享。因此,您首先必须创建一个 127.0.0.1 的别名 127.0.0.2。

sudo ifconfig lo0 127.0.0.2 alias up

然后创建 Samba 容器,这允许您查看 Docker 卷中文件:

docker create -t --expose 445 -p 127.0.0.2:445:445 --name samba -v raspberry:/workdir crops/samba

由于您始终需要有别名才能连接到 Samba 容器,因此您可以将 Samba 的启动和别名组合起来,如下所示:

docker start samba && sudo ifconfig lo0 127.0.0.2 alias up

现在,您可以在文件浏览器中打开 Workdir。在查找器中点击“Command-K”,在服务器地址框中键入“smb://127.0.0.2/workdir”,然后单击“Connect”(连接)。现在,您应该可以在查找器中看到 Docker 卷的内容。### 创建并启动 Yocto 容器

要在终端窗口中创建和/或启动 Yocto 容器类型:

docker run --rm -it --name=crops-poky -v raspberry:/workdir crops/poky:ubuntu-20.04 --workdir=/workdir

设置容器中的构建环境

当 Docker 容器启动时,终端提示如下:“pokyuser@d4ddfe042587:/workdir”。现在,您可以设置构建环境。### 克隆 Poky 版本

在我的案例中,我使用名为“Honister”的 3.4 版 Yocto,因为 meta-raspberry 层目前不适用于较新的 Poky 版本。第一次您必须克隆 Poky 存储库:

git clone -b honister git://git.yoctoproject.org/poky poky-honister

如果您想将 Poky 更新到最新版本:

cd poky-honister
git pull --all --prune

Raspberry Pi 的其他 meta 层

更改为“poky-honister”并克隆以下存储库:meta-raspberry、meta-openembedded 以及需要时的 meta-qt5

cd poky-honister
git clone -b honister git://git.yoctoproject.org/meta-raspberrypi
git clone -b honister git://git.openembedded.org/meta-openembedded
git clone -b honister https://github.com/meta-qt5/meta-qt5.git

设置构建配置

离开 poky-honister 目录,这样就退到 /workdir。现在使用脚本 oe-init-build-env 运行构建环境的 source 命令。

cd ..
source poky-honister/oe-init-build-env rpi-build

这样创建了一个新目录“rpi-build”(您可以起自己的名字)和一个包含 bblayers.conf、local.conf 和 templateateconf.cfg 文件的 conf 目录。由于容器中没有安装文本编辑器,您或者必须在 Mac OS X 中编辑已装入的 Samba 卷中的配置文件,或者必须在容器中安装文本编辑器。为此,您必须在 Yocto 容器运行时打开第二个终端窗口,并在具有根权限的容器中启动 Bash shell:

docker exec -it --user=root crops-poky bash
apt-get install nano
exit

然后,您可以作为 Pokyuser 在 Yocto 容器中编辑配置文件。

编辑器并非永久安装。离开容器并再次进入后,您必须重新安装

首先在 bblayers.conf 文件中添加 meta-raspberry

nano conf/bblayers.conf

添加"/workdir/poky-honister/meta-raspberrypi ",就像这个样子:

BBLAYERS ?= " \
  /workdir/poky-honister/meta \
  /workdir/poky-honister/meta-poky \
  /workdir/poky-honister/meta-yocto-bsp \
  /workdir/poky-honister/meta-raspberrypi \
  "

然后保存。#### 接下来编辑 local.conf

编辑文件 local.conf:

nano conf/local.conf

更改以下行:

  • MACHINE ??= "qemux86-64" -> MACHINE ??= "raspberrypi4-64"

根据您要使用的 Raspberry 的不同(Raspberrypi0、Raspberrypi0w、Raspberrypi3、Raspberrypi3-64、Raspberrypi4、Raspberrypi4-64 等)

取消以下行的注释:

  • DL_DIR ?= "${TOPDIR}/downloads"
  • SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
  • TMPDIR = "${TOPDIR}/tmp"

在末尾添加以下行,运行目标到 SD 卡的 sdimg to flash:

  • IMAGE_FSTYPES = "ext4.xz rpi-sdimg"
  • SDIMG_ROOTFS_TYPE = "ext4.xz"

保存 local.conf 文件。#### 执行第一个镜像的 Bitbake 命令

现在您有了可以构建第一个镜像的最低设置:

bitbake -k core-image-minimal

Yocto 文档中,可以找到可用镜像描述的简短说明。例如:

  • core-image-minimal:仅能够允许设备启动的小镜像。- core-image-base:全面支持目标设备硬件的仅控制台镜像。- core-image-full-cmdline: 安装了功能更全面的 Linux 系统功能的仅控制台镜像。过了一段时间后(第一次可能是数小时的时间),Bitbake 完成,您可以在以下目录中找到 sdimg 文件:
/workdir/rpi-build/tmp/deploy/images/raspberrypi4-64

额外配置

额外 Raspberry 硬件配置

要设置特定的硬件设置,您可以查看 extra-apps.mdextra-build-config.md。您还可以在 meta-raspberrypi/docs 目录中找到这些文件。Meta 层还提供了配合 Bitbake 使用的镜像配置“rpi-test-image”。该镜像基于“core-image-base”,其中包括 meta-raspberrypi 中的大多数软件包和一些媒体样本。

bitbake -k rpi-test-image

额外软件配置

根据您正在使用的镜像构建配置,您可能需要安装额外的软件包。您可以通过在 local.conf 文件中添加一些设置来执行此操作。例如,添加以下行,以设置 ssh-server、pi-user 和 systemd:

## packages
IMAGE_INSTALL:append = " openssh-sftp-server sudo python3 python3-pip rpi-gpio raspi-gpio"
IMAGE_FEATURES:append = " ssh-server-openssh"

## systemd settings
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME:init_manager = "systemd"
VIRTUAL-RUNTIME:initscripts = ""
IMX_DEFAULT_DISTRO_FEATURES:append = " systemd"

或添加 python:

IMAGE_INSTALL:append = " python3 python3-pip rpi-gpio raspi-gpio"

“ python3 python3-pip rpi-gpio raspi-gpio”中的起始空格非常重要,因为文本附加到现有配置中,需要使用这个空格分隔。

版权许可

版权所有 © 2022 Interelectronix e.K.
本项目源代码根据 GPL-3.0 许可证获得许可。

致谢