Yocto项目构建(3)——构建和部署树莓派镜像

所有操作使用普通用户,不能是管理员权限。yocto的用户权限是普通用户。

1、使用Poky源代码的scarthgap分支,路径:yocto/poky

2、meta-raspberrypi层包含与树莓派硬件相关的元数据、菜谱、类文件和工具文件。

获取meta-raspberrypi的scarthgap分支:

cd yocto

git clone -b scarthgap https://git.yoctoproject.org/meta-raspberrypi/

.

├── classes

│ └── sdcard_image-rpi.bbclass

├── conf

│ ├── layer.conf

│ └── machine

├── COPYING.MIT

├── docs

│ ├── conf.py

│ ├── contributing.md

│ ├── extra-apps.md

│ ├── extra-build-config.md

│ ├── index.rst

│ ├── ipcompliance.md

│ ├── layer-contents.md

│ ├── Makefile

│ ├── readme.md -> ../README.md

│ └── requirements.txt

├── dynamic-layers

│ ├── meta-python

│ ├── multimedia-layer

│ ├── networking-layer

│ ├── openembedded-layer

│ └── qt5-layer

├── files

│ └── custom-licenses

├── img

│ ├── balena.png

│ └── LF_17_02_Yocto-Badge-Update_Compatible_Final_Blank.png

├── kas-poky-rpi.yml

├── lib

│ └── oeqa

├── README.md

├── recipes-bsp

│ ├── armstubs

│ ├── bootfiles

│ ├── common

│ ├── formfactor

│ ├── gpio-shutdown

│ ├── rpi-eeprom

│ ├── rpi-u-boot-scr

│ └── u-boot

├── recipes-connectivity

│ ├── bluez5

│ └── pi-bluetooth

├── recipes-core

│ ├── images

│ ├── packagegroups

│ ├── psplash

│ └── udev

├── recipes-devtools

│ ├── bcm2835

│ ├── pi-blaster

│ ├── python

│ ├── raspi-gpio

│ └── raspi-utils

├── recipes-graphics

│ ├── cairo

│ ├── kmscube

│ ├── libsdl2

│ ├── libva

│ ├── mesa

│ ├── piglit

│ ├── raspidmx

│ ├── userland

│ ├── vc-graphics

│ ├── wayland

│ └── xorg-xserver

├── recipes-kernel

│ ├── bluez-firmware-rpidistro

│ ├── linux

│ └── linux-firmware-rpidistro

├── recipes-multimedia

│ ├── gstreamer

│ ├── omxplayer

│ ├── picamera-libs

│ ├── python3-picamera

│ ├── rpidistro-ffmpeg

│ └── x264

├── recipes-sato

│ └── libwpe_%.bbappend

└── wic

└── sdimage-raspberrypi.wks

https://git.yoctoproject.org/

3、设置构建环境

初始化构建环境,在yocto目录下新建了rasp_build并自动切换了进去

source poky/oe-init-build-env rasp_build

将meta-raspberrypi层添加到构建环境的conf/bblayers.conf

yocto/rasp_build# bitbake-layers add-layer ../meta-raspberrypi/

得到:

yocto/rasp_build# cat conf/bblayers.conf

POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf

changes incompatibly

POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"

BBFILES ?= ""

BBLAYERS ?= " \

/learn/yocto/poky/meta \

/learn/yocto/poky/meta-poky \

/learn/yocto/poky/meta-yocto-bsp \
/learn/yocto/meta-raspberrypi \

"

4、BitBake构建目标镜像

通过bitbake -e | grep XX命令可以查看当前构建环境所有的配置。

查看meta-raspberrypi层中所有的机器配置文件。

yocto/rasp_build# ls ../meta-raspberrypi/conf/machine/ -all

total 72

drwxr-xr-x 3 root root 4096 12月 11 19:48 .

drwxr-xr-x 3 root root 4096 12月 11 19:48 ..

drwxr-xr-x 2 root root 4096 12月 11 19:48 include

-rw-r--r-- 1 root root 461 12月 11 19:48 raspberrypi0-2w-64.conf

-rw-r--r-- 1 root root 382 12月 11 19:48 raspberrypi0-2w.conf

-rw-r--r-- 1 root root 291 12月 11 19:48 raspberrypi0.conf

-rw-r--r-- 1 root root 585 12月 11 19:48 raspberrypi0-wifi.conf

-rw-r--r-- 1 root root 387 12月 11 19:48 raspberrypi2.conf

-rw-r--r-- 1 root root 1096 12月 11 19:48 raspberrypi3-64.conf

-rw-r--r-- 1 root root 644 12月 11 19:48 raspberrypi3.conf

-rw-r--r-- 1 root root 1127 12月 11 19:48 raspberrypi4-64.conf

-rw-r--r-- 1 root root 690 12月 11 19:48 raspberrypi4.conf

-rw-r--r-- 1 root root 1128 12月 11 19:48 raspberrypi5.conf

-rw-r--r-- 1 root root 1417 12月 11 19:48 raspberrypi-armv7.conf

-rw-r--r-- 1 root root 1574 12月 11 19:48 raspberrypi-armv8.conf

-rw-r--r-- 1 root root 413 12月 11 19:48 raspberrypi-cm3.conf

-rw-r--r-- 1 root root 235 12月 11 19:48 raspberrypi-cm.conf

-rw-r--r-- 1 root root 398 12月 11 19:48 raspberrypi.conf

树莓派4B使用的配置文件是 raspberrypi4-64.conf和raspberrypi4.conf,分别构建64位和32位的linux系统。这里选择64位,将rasp_build/conf/local.conf中MACHINE字段中"qemux86-64"改为"raspberrypi4-64"

使用bitbake构建rpi-test-image镜像:

bitbake rpi-test-image

#Yocto Project(BitBake 是其核心工具)明确禁止使用 root 权限运行 BitBake

报错:

Yocto 为了合规,默认拒绝编译带有特殊 /restricted 许可证的包,而树莓派的 BCM43456 无线固件恰好包含这类许可证,因此被拦截。解决方法:

yocto/rasp_build$ vim conf/local.conf

#在文件末尾增加

加入synaptics-killswitch许可证到白名单 LICENSE_FLAGS_ACCEPTED += "synaptics-killswitch"

重新执行yocto/rasp_build$ bitbake rpi-test-image

完成构建后,在yocto/rasp_build/tmp/deploy/images/raspberrypi4-64目录下可以找到生成的wic镜像文件。

ls *.rootfs.wic.bz2 -all

lrwxrwxrwx 2 tmp tmp 60 12月 11 22:50 rpi-test-image-raspberrypi4-64.rootfs.wic.bz2 -> rpi-test-image-raspberrypi4-64.rootfs-20251211122910.wic.bz2

5、将镜像部署到SD卡

使用树莓派官方推荐的Raspberry Pi Imager工具。

安装Raspberry Pi Imager在ubuntu系统。

sudo snap install rpi-imager

6、meta-raspberrypi层分析

yocto含有三种元数据层:发行版层、BSP层和软件层。其中meta-raspberrypi属于BSP层。

6.1 层配置

路径yocto/meta-raspberrypi/conf/layer.conf

主要完成指定元数据文件的路径和名称,定义层的标识符,设置该层在在构建过程中的优先级,指定对mate层的依赖关系,支持uboot配置,动态加载dynamic-layers目录下的扩展层和相关菜谱文件。

6.2 硬件配置

yocto/meta-raspberrypi/conf/machine/下是为树莓派平台定制的多个机器配置文件。机器配置文件负责配置相关硬件选项,在conf/local/conf配置文件中的MACHINE变量负责选择指定配置文件。

主要完成:

  • 设置硬件配置匹配字段;
  • 添加特性;
  • 增加外部扩展功能;
  • 性能优化(添加最新的头文件);
  • 基础硬件配置;
  • 内核配置;
  • uboot配置及引导;
  • 启动固件配置。

6.3 内核配置

内核配置不仅涉及大多数硬件支持,还决定系统整体性能和兼容性。

  • yocto/meta-raspberrypi/recipes-kernel/linux目录下是mate-raspberrypi层的内核配置文件位置。其中files目录下是内核配置片段文件,允许用户根据需求修改内核配置。
  • 内核菜谱选择在机器配置文件设置PREFERRED_PROVIDER和PREFERRED_VERSION变量指定。通过如下两个命令查看当前构建环境针对树莓派4B使用的内核菜谱信息:

执行:bitbake -e | grep "PREFERRED_PROVIDER_virtual\/kernel"

输出:PREFERRED_PROVIDER_virtual/kernel="linux-raspberrypi"

执行: bitbake -e | grep "PREFERRED_VERSION_linux-raspberrypi"

输出:PREFERRED_VERSION_linux-raspberrypi="6.6.%"

  • 分析linux-raspberrypi_6.6.bb菜谱

路径yocto/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.6.bb

SRC_URI:指定内核的源代码git仓库、引入内核元数据仓库yocto-kernel-cache辅助修改和配置内核;

linux-raspberrypi.inc文件:路径在yocto/meta-raspberrypi/recipes-kernel/linux,包含通用内核配置包含文件;

  • linux-raspberrypi.inc文件包含的recipes-kernel/linux/linux-yocto.inc使的树莓派内核菜谱能够利用yocto项目的内核工具,简化内核的配置和构建过程。
  • KBUILD_DEFCONFIG变量指定树莓派4B的默认内核配置。默认KBUILD_DEFCONFIG:raspberrypi4-64 ?= "bcm2711_defconfig"
  • RDEPENDS变量指定依赖关系,为树莓派4B的内核指定必要依赖项,确保所有必须的内核组件都被正确包含。
  • DEPLOYDEP变量保证在执行内核部署时,armv7架构的内核首先被部署,从而为其他内核组件的部署提供必要的依赖。

6.4 图形系统配置

路径yocto/meta-raspberrypi/recipes-graphics,包含多个菜谱文件、追加菜谱文件及相关配置文件。

mesa:图形库;

wayland:显示协议;

xorg:窗口系统;

raspidmx:在树莓派上构建和安装dispmanX API示例应用,演示低级显示控制;

userland:提供树莓派用户空间多媒体,支持图形渲染与视频编解码及硬件封装;

vc-graphics:提供树莓派的videocore图形库。

6.5 硬件测试镜像菜谱

为了进行硬件配置测试。meta-raspberrypi层创建了rpi-test-image.bb镜像菜谱。该菜谱用于构建基础的树莓派测试镜像,确保硬件适配和系统功能正确性。

路径:yocto/meta-raspberrypi/recipes-core/images/rpi-test-image.bb

该镜像菜谱以core-image-base.bb为基础,提供了系统基本硬件支持和控制台功能;

COMPATIBLE_MACHINE变量确保该镜像菜谱仅适用于树莓派硬件;

7、Kickstart文件

在meta-raspberrypi/conf/machine/include/rpi-base.inc文件的WKS_FILE变量中定义了wic工具使用的Kickstart(后缀.wks)文件的名称。

默认变量值是sdimage-raspberrypi.wks(路径:meta-raspberrypi/wic/sdimage-raspberrypi.wks)

通过运行"wic list images"命令,可以查看当前构建环境中所有可用的Kickstart文件及其功能描述。

  • wic工具可以调用插件功能,路径:poky/scripts/lib/wic/plugins。imager插件用于定义如何将分区内容写入最终镜像文件,负责处理镜像的整体布局和结构,将多个分区整合到一个可启动的镜像中。
  • source插件提供一种在wic镜像生成过程中自定义分区内容的机制,在wks文件中使用--source参数指定。
  • 使用BitBake构建出未分区的镜像或相关组件(文件系统和内核),wic提供两种操作模式:Raw模式和Cooked模式。
相关推荐
逆小舟3 小时前
【RTOS】任务间通信IPC
单片机·嵌入式硬件
Ronin3053 小时前
【Linux网络】多路转接select
linux·网络·select·多路转接
zhuzewennamoamtf3 小时前
Linux设备树理解和应用
linux·运维·服务器
电化学仪器白超3 小时前
《可编程固定阻值电子负载的制作与自动化标定技术》
python·单片机·嵌入式硬件·自动化
我科绝伦(Huanhuan Zhou)3 小时前
Linux 环境下 SQL Server 自动收缩日志作业创建脚本(Shell 版)
linux·运维·数据库·sql server
三佛科技-134163842123 小时前
LP3799FAES-B 反激式电源控制器芯片 典型应用电路
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
徐徐图之!3 小时前
五、【阶段一运维基础 之 干货!!!】安装 Vmware 和 CentOS
linux·运维·centos
黑客思维者4 小时前
XGW-9000 网关 DDR4/LPDDR4 内存子系统信号完整性仿真细化设计
开发语言·python·嵌入式硬件·ddr4·信号仿真
Felven4 小时前
华为昇腾310P模型转换失败问题解决
linux·python·模型训练·昇腾·310p