基于Yocto编译树莓派3B+

目录

  • 介绍
  • 直接下载
  • 系统说明
  • Ubuntu安装配置
  • 克隆依赖库
  • 克隆meta-rpi存储库
  • 设置构建生成目录
  • 自定义配置文件
    • 编辑bblayers.conf
    • 编辑local.conf
      • MACHINE
      • TMPDIR
      • DL_DIR
      • SSTATE_DIR
    • 超级用户密码
  • 运行构建
    • 准备构建环境
    • 构建镜像
    • 将二进制文件复制到SD卡(或eMMC)

介绍

Yocto ,是一个开源社区。它通过提供模版、工具和方法帮助开发者创建基于linux内核的定制系统,支持ARM, PPC, MIPS, x86 (32 & 64 bit)硬件体系架构。
Yocto Project™是一个开源的协作软件,提供模板、工具和方法帮你创建定制的 Linux 系统和嵌入式产品,而无需关心硬件体系。适合嵌入式Linux开发人员使用。极大地简化你的开发过程,因为你不用再从头裁剪一个完整的Linux发布版本,后者通常包括许多你并不需要的软件。
Poky有两个含义,第一个含义是用来构建Linux的构建系统,值得注意的该Poky仅仅是一个概念,而非一个实体:它包含了 BitBake工具、编译工具链、BSP、诸多程序包或层,可以认为Poky即是Yocto的本质;此外Poky还有另外一层意思,使用Poky系统得到的默认参考 Linux 发行版也叫Poky(当然,我们可以对此发行版随意命名)。
Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) [1] 是为学习计算机编程教育而设计),只有信用卡大小的微型电脑,其系统基于Linux。

直接下载

如果想快速使用编译好的系统镜像,可以点击下载。
安装到SD卡的说明在README。

系统说明

  • Yocto版本是3.1,[dunfell]分支。
  • 默认的5.4内核来自 repository。还有一个4.19的 recipe。
  • 这些都是使用eudev的sysvinit系统。
  • Qt版本是5.14,没有X11,也没有安装桌面。Qt GUI应用程序可以运行全屏使用Qt嵌入式linux插件之一,如eglfs或linuxfb,两者都提供了。默认是eglfs。
  • 包含了Python 3.8.2和许多模块。
  • 已经安装gcc/g++ 9.3.0和相关的构建工具。
  • 安装wireguard-linux-compat的wireguard。
  • 安装omxplayer是为了从命令行播放视频和音频,硬件加速。
  • 安装了Raspicam命令行工具,用于使用树莓派摄像头模块。
  • 这里有一个镜像示例,使用了两个树莓派音乐系统。他们使用IQaudIO Pi-DigiAMP+或HiFiBerry Amp+附加板和pianobar (Pandora internet radio基于控制台的客户端)。

Ubuntu安装配置

推荐使用18.04或20.04 Ubuntu 64位服务器进行构建。
至少需要安装以下软件包:

sudo apt-get install build-essential
sudo apt-get install chrpath
sudo apt-get install diffstat
sudo apt-get install gawk
sudo apt-get install libncurses5-dev
sudo apt-get install python3-distutils
sudo apt-get install texinfo

所有版本的Ubuntu,你应该通过在shell中运行这个命令来将默认的Ubuntu shell从dash改为bash

sudo dpkg-reconfigure dash

在弹出的窗口中选择 否 即可:基于Yocto编译树莓派3B+_第1张图片

克隆依赖库

对于所有上游存储库,使用[dunfell]分支。
首先主要的Yocto项目poky层

~$ git clone -b dunfell git://git.yoctoproject.org/poky.git poky-dunfell

然后依赖层在它下面:

~$ cd poky-dunfell
~/poky-dunfell$ git clone -b dunfell git://git.openembedded.org/meta-openembedded
~/poky-dunfell$ git clone -b dunfell https://github.com/meta-qt5/meta-qt5
~/poky-dunfell$ git clone -b dunfell git://git.yoctoproject.org/meta-raspberrypi
~/poky-dunfell$ git clone -b dunfell git://git.yoctoproject.org/meta-security.git

除了定期更新之外,这些存储库应该不需要修改,并且可以在不同的项目或不同的开发板中重用。
jumpnow的公共元层改变一些上游包默认值和添加一些自定义配方。

~/poky-dunfell$ git clone -b dunfell https://github.com/jumpnow/meta-jumpnow

克隆meta-rpi存储库

在克隆之前,为meta-rpi存储库创建一个单独的子目录。这是您将进行自定义的地方。

~$ mkdir ~/rpi
~$ cd ~/rpi
~/rpi$ git clone -b dunfell git://github.com/jumpnow/meta-rpi

设置构建生成目录

设置构建生产目录,推荐根据不同的项目或开发板选择一个生成目录,这样可以快速地在项目之间切换。对于这个示例,把构建目录和meta-rpi放在同一层(~/rpi/)。
有两种方式创建构建目录:

  1. 一种是手动创建目录:
~$ mkdir -p ~/rpi/build/conf
  1. 另一种是使用Yocto环境脚本oe-init-build-env,自动创建构建目录和配置文件,如果构建目录不存在,Yocto环境脚本将创建它。
~$ source ~/poky-dunfell/oe-init-build-env ~/rpi/build

自定义配置文件

在meta-rpi/conf目录中有一些示例配置文件。
将它们复制到build/conf目录(删除’ -sample ')

~$ cd ~/rpi
~/rpi$ cp meta-rpi/conf/local.conf.sample build/conf/local.conf
~/rpi$ cp meta-rpi/conf/bblayers.conf.sample build/conf/bblayers.conf

如果你使用oe-init-build-env脚本来创建构建目录,它会在build/conf目录中生成一些通用的配置文件。

警告:在Yocto配置文件中定义目录路径时不要使用’ ~ '字符。

编辑bblayers.conf

在~/rpi/build/conf/bblayers.conf文件中,如果修改了前面说明中的任何路径,将${HOME}替换为系统上的meta-layer存储库的适当路径。

警告:不要在你的bblayer .conf中包含meta-yocto-bsp。Yocto BSP对树莓派的支持库是meta-raspberrypi。

如果完全按照上述路径配置的话则不需要修改,如下即可:

BBLAYERS ?= " \
    ${HOME}/poky-dunfell/meta \
    ${HOME}/poky-dunfell/meta-poky \
    ${HOME}/poky-dunfell/meta-openembedded/meta-oe \
    ${HOME}/poky-dunfell/meta-openembedded/meta-multimedia \
    ${HOME}/poky-dunfell/meta-openembedded/meta-networking \
    ${HOME}/poky-dunfell/meta-openembedded/meta-perl \
    ${HOME}/poky-dunfell/meta-openembedded/meta-python \
    ${HOME}/poky-dunfell/meta-qt5 \
    ${HOME}/poky-dunfell/meta-raspberrypi \
    ${HOME}/poky-dunfell/meta-security \
    ${HOME}/poky-dunfell/meta-jumpnow \
    ${HOME}/rpi/meta-rpi \
"

编辑local.conf

一般情况下,~/rpi/build/conf/bblayers.conf需要自定义的配置项有:

  • MACHINE
  • TMPDIR
  • DL_DIR
  • SSTATE_DIR

除了MACHINE配置项外,其他所有默认值都可以正常工作。

MACHINE

机器配置文件。如果设置MACHINE =“raspberrypi3”,则OpenEmbedded构建系统会在此目录中查找raspberrypi3.conf文件。如果您要为Yocto项目添加新机器的支持,请查看此目录meta-raspberrypi/conf/machine。

可供选择的机器配置有:

  • raspberrypi (BCM2835)
  • raspberrypi0 (BCM2835)
  • raspberrypi0-wifi (BCM2835)
  • raspberrypi2 (BCM2836 or BCM2837 v1.2+)
  • raspberrypi3 (BCM2837)
  • raspberrypi4 (BCM2838)
  • raspberrypi-cm (BCM2835)
  • raspberrypi-cm3 (BCM2837)

一次只能为一种类型的机器构建。

TMPDIR

这是临时构建文件和最终构建二进制文件输出的地方。预期至少使用50GB。
默认位置在build目录下,在本例中为~/rpi/build/tmp。
如果指定一个替代位置,请确保运行构建的用户可对该目录进行写操作。

DL_DIR

下载的源文件将存储在这里。你可以在配置和构建之间共享它,所以建议是在项目目录之外为它创建一个通用位置。确保构建的用户对目录具有写权限。
默认位置在构建目录~/rpi/build/downloads中。

SSTATE_DIR

这是另一个Yocto构建目录,它可以变得非常大,大于8GB。我经常把它放在我的主目录之外的其他地方。
默认位置在构建目录~/rpi/build/sstate-cache中。

超级用户密码

默认情况下只有一个登录用户,那就是root。
local.conf文件中的这两行代码将默认密码设置为:jumpnowtek

INHERIT += "extrausers"
EXTRA_USERS_PARAMS = "usermod -P jumpnowtek root; "

这两行代码强制在第一次登录时更改密码

INHERIT += "chageusers"
CHAGE_USERS_PARAMS = "chage -d0 root; "

如果您不希望登录时更改密码,可以将它们注释掉。
如果您根本不需要密码(比如开发时),注释这四行并取消注释这一行

EXTRA_IMAGE_FEATURES = "debug-tweaks"

#INHERIT += "extrausers"
#EXTRA_USERS_PARAMS = "usermod -P jumpnowtek root; "

#INHERIT += "chageusers"
#CHAGE_USERS_PARAMS = "chage -d0 root; "

登录后可以随时添加或更改密码。

运行构建

准备构建环境

您需要将Yocto环境源到您的shell中,然后才能使用bitbake。oe-init-build-env不会覆盖您定制的conf文件。

~$ source poky-dunfell/oe-init-build-env ~/rpi/build

### Shell environment set up for builds. ###

You can now run 'bitbake '

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-toolchain-sdk
    adt-installer
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
~/rpi/build$

注意:重启电脑、重新打开控制台的时候,都需要执行一次准备构建环境,否则下方命令无法执行(bitbake: command not found)。

构建镜像

要构建控制台镜像console-image,请运行以下命令:

~/rpi/build$ bitbake console-image

由于构建镜像需要先下载源码再编译,这是一个漫长的过程,一般建议用VPN代理进行构建。也可以先下载代码,准备完成后再进行编译:

bitbake console-image --runall=fatch

备注:这是一个使用代理下载的示例:

source poky-dunfell/oe-init-build-env rpi/build
export FETCHCMD_wget="/usr/bin/env /usr/bin/tsocks wget -t 2 -T 30 --passive-ftp --no-check-certificate"
export BB_ENV_EXTRAWHITE="FETCHCMD_wget"
bitbake console-image --runall=fetch

可能偶尔会遇到与包相关的构建错误,这些包要么无法下载,要么有时构建顺序混乱。简单的解决方案是清理失败的包并再次重新运行构建。

例如,我遇到内存不足导致boost编译失败,我将运行这个单独构建:

~/rpi/build$ bitbake -c cleansstate boost
~/rpi/build$ bitbake boost

然后继续完整的构建:

~/rpi/build$ bitbake console-image

直到下次构建时,镜像文件才会从TMPDIR删除。

将二进制文件复制到SD卡(或eMMC)

在构建完成后,可以在**/deploy/images/$MACHINE中找到引导加载程序、内核和rootfs映像文件,其中MACHINE来自你的local.conf

To be continue…

你可能感兴趣的:(#,Yocto,Yocto,树莓派,raspberry,pi)