开源 Yocto 项目指南
带有 Docker 设置提示的 Raspberry Pi 上的自定义 Linux 的开源 Yocto 项目指南
深入了解 Yocto Project,了解在任何硬件上的自定义 Linux 系统。非常适合开发人员和 嵌入式系统 爱好者。现在就开始建造吧!
探索 Yocto Project,这是一个开源计划,用于为任何硬件架构创建自定义 Linux 系统。了解如何使用 CROPS 进行跨平台开发,设置 Docker 容器,并为嵌入式和 IoT 设备构建定制的 Linux 映像。我们的指南涵盖了在 macOS 上的设置、配置构建环境以及针对 Raspberry Pi 进行优化。无论您是初学者还是专家,都可以找到满足 Linux 项目需求的最佳实践、工具和社区支持。
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.md 和 extra-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 许可证获得许可。