[What]Yocto Project --> 构建树莓派 3B 发行版

参考书籍:Embedded Linux System with the Yocto Project

  • 书籍比实际的yocto版本要低,所以yocto的详细命令需要参考其对应版本手册

参考链接:Building Respberry Pi Systems with Yocto

运行环境:

  • ubuntu18.04 amd64
  • yocto 2.5.1

学了这么多,不实践一下是不行的。

现在尝试在对树莓派 3B 的底层硬件不熟悉的情况下,通过前面 yocto 的基础知识构建一个发行版。

根据前面的学习,可以先猜测一下要在基于 poky 的基础上构建树莓派的发行版需要至少这些步骤:

  1. 获取树莓派的 layer
  2. 基于当前 layer 说明配置 layer 中的变量
  3. bblayers.conf 中加入此 layer
  4. 根据发行版的需求,修改 image 和 distro 的配置
  5. 构建并测试

layer 的获取

meta-rpi便提供了树莓派的 layer,这个是基于官方 meta-raspberrypi 做的修改。

切换到合适分支

通过查看其 README 可以发现,目前其最新维护的版本支持的 yocto 分支是 warrior , 所以我也需要将当前分支 sumo 切换到 warrior

依赖 layer 的获取

README 中也说明了其依赖了其他在 warrior 下的 layer:

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

好了,现在获取 meta-rpi :

mkdir ./rpi
cd ./rpi
git clone -b warrior git://github.com/jumpnow/meta-rpi

创建构建目录

对应新的 target,需要为其创建新的 build dir:

source ./oe-init-build-env ./rpi/build

配置

meta-rpi/conf 中就具有示例配置,可以直接替换构建目录中的 conf ,然后在此基础上修改:

cp ../meta-rpi/conf/local.conf.sample conf/local.conf
cp ../meta-rpi/conf/bblayers.conf.sample conf/bblayers.conf

修改 bblayers.conf

根据当前目录架构,修改 layer 的路径:

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
    /home/cec/github/poky/meta \
    /home/cec/github/poky/meta-poky \
    /home/cec/github/poky/meta-openembedded/meta-oe \
    /home/cec/github/poky/meta-openembedded/meta-multimedia \
    /home/cec/github/poky/meta-openembedded/meta-networking \
    /home/cec/github/poky/meta-openembedded/meta-perl \
    /home/cec/github/poky/meta-openembedded/meta-python \
    /home/cec/github/poky/meta-qt5 \
    /home/cec/github/poky/meta-raspberrypi \
    /home/cec/github/poky/rpi/meta-rpi \
"

修改 local.conf

检查 MACHINE

变量 MACHINE 代表目标板,此值必须得设定对,不然编译结果将无法运行。

目前我用的是树莓派 3B,在 meta-raspberrypi/conf/machine 可以看到这些名称:

include                 raspberrypi2.conf     raspberrypi4-64.conf  raspberrypi-cm.conf
raspberrypi0.conf       raspberrypi3-64.conf  raspberrypi4.conf     raspberrypi.conf
raspberrypi0-wifi.conf  raspberrypi3.conf     raspberrypi-cm3.conf

通过查看 raspberrypi 官网可以知道 3B 的 SOC 型号是 BCM2837 64bit CPU,那么当前 MACHINE 就应该赋值 raspberrypi3

  • 之前尝试过 raspberrypi3-64.conf 但在编译时生成 zimage 报错

修改 DL_DIR 和 SSTATE_DIR

同样,在前期学习中我已经将这两个文件夹定向到了构建目录之外,所以这里也需要指向之前的文件夹,以减少构建时间。

DL_DIR ?= "/home/cec/github/poky/downloads"
SSTATE_DIR ?= "/home/cec/github/poky/sstate-cache"

设置密码

默认用户 root 的密码通过变量 EXTRA_USERS_PARAMS 指定,这里默认为 jumpnowtek

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

上面这两行用于第一次启动时,强制让用户修改密码。

如果想要无密码登录,那么可以在 image feature 中加入 debug-tweaks ,这样的话原来设置密码的那几行都要屏蔽掉。

构建

现在配置已经完成,接下来便可以开始构建。

而且在 local.conf 中可以看到默认的串口 1 波特率是 115200。

由于目前我这个板不带液晶,那么实际运行就要通过串口来观察了。

编译

在前面的学习中可以知道:yocto 默认带了很多 image 供基础编译,但根据其说明我们需要:

bitbake concole-image

之前缓存那么多的下载文件都用不上,又是一个漫长的等待……

其中,文件 bcm2837-bootfiles 试了很多次都失败,最后还是使用 axel 来下载,然后修改其 bbappend

RPIFW_DATE = "20190823"
SRCREV = "7163480fff007dc98978899b556dcf06f8a462c8"

SRC_URI[md5sum] = "e2bf5bd0d7e584239eb94e3c139e6a61"
SRC_URI[sha256sum] = "6aa835679207557234ded04cad6f9d0b4405943e8c98c01eed47234fb006f87d"

RPIFW_SRC_URI = "file://${DL_DIR}/firmware-${SRCREV}.tar.gz"
RPIFW_S = "${WORKDIR}/firmware-${SRCREV}"

do_unpack() {
    tar -C ${WORKDIR} -xzf ${DL_DIR}/firmware-${SRCREV}.tar.gz
}

最终的编译输出位于: /home/cec/github/poky/rpi/build/tmp/deploy/images/raspberrypi3

制作 SD 卡

分区

当前使用的 layer 提供了 meta-rpi/scripts/mk2parts.sh 脚本来完成 SD 卡的分区。

  • 将 SD 卡分为 boot 分区和 rootfs 分区
    • boot 分区存放 bootloader,kernel,devicetree,config file
    • rootfs 分区存放根文件系统

使用 lsblk 查看当前 SD 卡的名称后使用 mk2parts.sh

cd ./rpi/meta-rpi/scripts
sudo ./mk2parts.sh sdb

然后创建挂载点,便于后期脚本挂载:

sudo mkdir /media/card

配置环境变量

当前使用的 layer 提供了 copy_boot.sh 脚本和 copy_rootfs.sh 脚本来完成 SD 卡的制作。

在使用这两个脚本前,需要设置变量 OETMPMACHINE , 对应 yocto 的 TMPDIRMACHINE

根据上面的配置,可以知道我们的 TMPDIR 的路径是: /home/cec/github/poky/rpi/build/tmp ,=MACHINE= 就是 raspberrypi3

export OETMP=/home/cec/github/poky/rpi/build/tmp
export MACHINE=raspberrypi3

写入分区

先写入 boot 分区:

./copy_boot.sh sdb

可以看到 boot 分区有这些内容:

bcm2709-rpi-2-b.dtb               bootcode.bin  fixup4db.dat  fixup_x.dat   start4x.elf   zImage
bcm2710-rpi-3-b.dtb               cmdline.txt   fixup4x.dat   overlays      start_cd.elf
bcm2710-rpi-3-b-plus.dtb          config.txt    fixup_cd.dat  start4cd.elf  start_db.elf
bcm2710-rpi-cm3.dtb               fixup4cd.dat  fixup.dat     start4db.elf  start.elf
bcm2835-bootfiles-20190823.stamp  fixup4.dat    fixup_db.dat  start4.elf    start_x.elf

再写入 rootfs 分区:

./copy_rootfs.sh sdc console

可以看到 rootfs 分区就已经是一个完整的根文件系统了。

启动

插入 SD 卡,接上串口即可启动,输入用户名 root 即可登录系统。

Last Updated 2019-09-20 五 07:49.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)