7.6 RDK S100构建系统开发指南
7.6.1 概述
本章节主要针对需要对RDK构建系统进行定制化修改的介绍,rdk_gen的使用说明,请参考rdk_gen仓库的README.md。
基本的使用说明:
# 在线镜像构建,从地瓜及第三方APT源下载依赖的deb包
sudo ./pack_image.sh
# 离线镜像构建,只安装out/product/deb_packages下的deb包,使用此选项时请确保out/product/deb_packages内的deb符合预期,同时out/product/rootfs_packages下已有预编译根文件系统包
sudo ./pack_image.sh -l
# 仅搭建deb包编译环境,不打包镜像
sudo ./pack_images.sh -p
# 构建所有deb包
./mk_debs.sh
# 构建特定deb包,以hobot-configs为例
./mk_debs.sh hobot-configs
7.6.2 根文件系统预编译包构建说明
RDK S100的根文件系统由multistrap+chroot构建生成。
multistrap
官方文档
工具简介
总结而言,multistrap
是独立于debbootstrap
工具的另一套debian/Ubuntu等以apt源为基础生成根文件系统的工具。它基于一个/多个配置文件定义生成根文件系统所使用的apt源,以及需要默认生成哪些包。
与debootstrap
最大的区别 有以下几点:
- 灵活性:
multistrap
允许用户完全自定义新生成的根文件系统内的所有包,包括apt源内标记为必选的包,但是用户需要自行保证根文件系统的完整性和可用性; - 生成流程:
multistrap
不同于debbootstrap
,它的生成流程可以概括为以下几个步骤,最大的区别在于第四步,multistrap
只进行包的解压缩,没有对包进行配置(也就是执行[pre/post]install脚本): - 读取配置文件
- 根据配置文件从获取指定的apt源的元数据
- 根据配置文件尝试下载指定的包
- 根据配置文件解压缩指定的包
在地瓜提供的
multistrap
编译脚本中,我们基于实践经验,通过使用binfmt-support + chroot
,在sudo权限下实现了对包的配置,以达到用户制作的根文件系统可以直接烧录上板使用。
配置文件简介
multistrap
的配置文件支持单文件/多文件两种形式。多文件情况下可以通过“include”字段将基础版本所包含的所有内容添加上后,只针对特定版本进行配置,极大的方便了多文件系统的维护工作。
以下章节内容的配置文件在S100的代码路径:samplefs/configs
:
$ tree samplefs/configs/
samplefs/configs/
├── jammy-base.conf
├── jammy-desktop.conf
├── jammy-server.conf
└── pip-requirements.list
0 directories, 4 files
基本格式介绍
详细的字段介绍请参考官方文档,这里主要针对地瓜的配置文件中的重要配置进行说明。
- 字段:
key1=value1
的格式,定义了某个字段“key1”的值为“value1” - 字段集(stanza/section):通过定义“
[Some-Section]
”来归集从该行开始,到下一个“[Next-Section]
”为止中间所有字段为一个“Section
”
重点字段介绍:
- include
- 定义需要include的配置文件的路径
- bootstrap
- 定义生成根文件系统所使用的apt源和要下载并解压缩的包所在的字段集
- aptsources
- 定义生成的根文件系统中路径/etc/sources.list.d/内会保存的apt源所在的字段集。注意,这个源不一定需要与bootstrap中用于生成根文件系统的源 保持一致,但我们强烈建议aptsources定义的apt源是bootstrap定义的源的超集。
- source/suite/components/omitdebsrc
- 定义apt源使用的关键字。可以参考apt源格式定义
- source:apt源的根链接,与apt源格式的“uri”字段匹配
- suite:apt源的suite,与apt源格式的“suite”字段匹配,一般代表该源对应的系统code name+属性,例如Ubuntu的jammy/focal/jammy-updates/jammy-security
- components:apt源的component,与apt源格式的“component”字段匹配,同样可以添加多个
- omitdebsrc:拉取apt元数据及包时,是否下载deb包对应的src包,一般配置为“true”,即不下载deb包对应的src包,以加速构建。
- packages
- 用于定义需要拉取的包的字段,一个packages字段可以定义多个包,包之间以空格分隔,多个packages字段的合集会作为最终的包定义。
多文件配置示例
请参考代码路径samplefs/configs/jammy-desktop.conf
RDK S100的实现
配置文件设计
RDK S100上,multistrap的配置文件默认分为3部分:
- jammy-base.conf:用于配置RDK S100通用的默认根文件系统配置,包括使用的apt源,RDK S100所有版本默认包含的包等;
- jammy-desktop.conf:用于配置RDK S100桌面版根文件系统基于jammy-base.conf新增的包;
- jammy-server.conf:用于配置RDK S100服务器版根文件系统基于jammy-base.conf新增的包;
构建流程说明
用户一般使用samplefs/make_ubuntu_samplefs.sh
脚本来进行根文件系统的构建,如果使用sudo调用该脚本,则根文件系统构建过程会包括对包的配置,耗时会显著增加。
如果不使用sudo调用该脚本,则构建过程不会包括对包的配置,耗时会相对减少,但是首次启动需要在板端使用命令rm -rf /var/lock/* ; dpkg --configure -a --force-confdef --force-confold ; systemctl enable /etc/systemd/system/S*.service
命令来初始化系统并重启以确保系统正常工作。
推荐使用sudo调用samplefs/make_ubuntu_samplefs.sh。
调用samplefs/make_ubuntu_samplefs.sh
脚本需要在samplefs目录下进行。
在不添加参数的情况下直接在使用sudo ./make_ubuntu_samplefs.sh
,脚本默认构建桌面版镜像,也就是使用jammy-desktop.conf
文件来构建根文件系统。
指定使用的配置文件的命令:sudo ./make_ubuntu_samplefs.sh build <config_file_name>
,例如新增的配置文件为:new-desktop.conf
,则命令就是:sudo ./make_ubuntu_samplefs.sh build new-desktop.conf
,new-desktop.conf
文件需要放到samplefs/configs
文件夹内。
脚本构建流程图如下:
裁剪/自定义根文件系统的方法
apt源(deb包的control信息)中的Priority字段会区分裁剪/自定义的流程。 multistrap默认会将所有Priority为“Required”的包进行安装。 地瓜定义important包也会被安装。