本目录为固件与镜像构建入口:源码在 sources/,产物在 output/<BOARD_NAME>/,板级配置在 configs/。
宿主机(默认)
最小依赖(Debian / Ubuntu,与 docker/Dockerfile 对齐,外加 U-Boot pylibfdt 需要的 swig):
sudo apt install -y \
bc bison build-essential ca-certificates chrpath cpio device-tree-compiler \
diffstat dosfstools flex g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
genimage git libgnutls28-dev libssl-dev make mtools patch perl \
python3 python3-cryptography python3-pyelftools python3-setuptools \
rpcsvc-proto rsync swig texinfo u-boot-tools wget xz-utils其中 chrpath、diffstat、texinfo(makeinfo)、rpcsvc-proto(rpcgen)为 Yocto/BitBake HOSTTOOLS 所需。若未装系统包,sources/meta-opentina/opentina-build.sh 会尝试把部分工具解压到 ~/.local/bin。
Ubuntu 24.04+ / Yocto: AppArmor 默认限制无特权 user namespace,BitBake 会报 User namespaces are not usable。一次性放开:
echo 'kernel.apparmor_restrict_unprivileged_userns=0' | sudo tee /etc/sysctl.d/99-bitbake-userns.conf
sudo sysctl -p /etc/sysctl.d/99-bitbake-userns.confopentina-build.sh 也会在缺少该能力时尝试用 Docker/sudo -n 自动写入上述 sysctl。
若整机构建包在 proxychains4 下跑:sysctl 已是 0 时一般没问题;不要用 CLI unshare 自行探测(LD_PRELOAD 多线程会导致误报)。网络代理更建议只包下载步骤,而不是整个 bitbake。
如果不走 Docker 而直接在宿主跑 debian / ubuntu rootfs(设 OPENTINA_DEBIAN_USE_DOCKER=0 或 OPENTINA_UBUNTU_USE_DOCKER=0),再补:
sudo apt install -y debootstrap qemu-user-static binfmt-support其余:
- AArch64 交叉工具链(默认
aarch64-linux-gnu-gcc,板级OPENTINA_CROSS_COMPILE可覆盖)。 - 已克隆的源码树(见下文
./build.sh init)。
可选:Docker 构建环境
- 安装 Docker,用于
OPENTINA_DOCKER=1或--docker时在 Ubuntu 24.04 镜像内构建(镜像内已含gcc-aarch64-linux-gnu、genimage等,见docker/Dockerfile)。
cd /path/to/build # 本 README 所在目录
# 1. 拉取源码(默认 manifest,可换路径)
./build.sh init
# 2. 查看支持的板子与 rootfs 类型
./build.sh targets
# 3. 编译(将 BOARD_NAME 换成 targets 里列出的名字)
./build.sh <BOARD_NAME> build产物示例:output/radxa_a7a/sdcard.img、rootfs.ext2、Image.gz、dtb、u-boot.fex、(开启 OP-TEE 时还有)tee.bin 等。
OP-TEE 为整项目可选(默认开)。开启时启动链:BROM → boot0 → SPL FIT(BL31 + BL32/OP-TEE + U-Boot)→ TF-A → OP-TEE → U-Boot → Linux。关闭时(--no-optee / OPENTINA_OPTEE=0):BROM → boot0 → SPL FIT(BL31 + U-Boot)→ TF-A → U-Boot → Linux。
一条开关同时控制 BL32、ATF dispatcher、U-Boot SPL FIT、内核驱动、Buildroot 用户态和各 rootfs 的 TA 安装。
| 方式 | 说明 |
|---|---|
./build.sh --optee <BOARD> build |
显式开启(与默认相同) |
./build.sh --no-optee <BOARD> build |
关闭:不编 optee,ATF SPD=none,U-Boot SUNXI_BL32_BASE=0,不合并 linux-optee.fragment,Buildroot 去掉 OPTEE_* 包 |
OPENTINA_OPTEE=0 ./build.sh <BOARD> build |
与 --no-optee 相同 |
板级 configs/*/config 里 OPENTINA_OPTEE="${OPENTINA_OPTEE:-1}" |
板级默认;命令行 / 环境变量优先 |
优先级:--optee / --no-optee 与已导出的 OPENTINA_OPTEE > 板级默认 > 1。
从开切到关(或反过来)后需要重编 atf + uboot(以及 linux / rootfs),否则会留下旧的 SPD=opteed / FIT BL32。
关闭 OP-TEE 时,build_linux 会从板级 DTB 删掉 TZDRAM/SHM reserved-memory 和 firmware/optee,避免内核 Image 落在 0x40000000 的 32 MiB no-map 里并报 failed to reserve memory for node 'optee@40000000'。
- 配方位置:
scripts/recipes.sh中的build_br2/clean_br2(组件名用br2,避免与命令行OPENTINA_ROOTFS=buildroot混淆)。 - 板级变量:
configs/<板>/config里BUILDROOT_DEFCONFIG(默认br2_opentina.defconfig,与config同目录)。 - defconfig 模板:
configs/*/br2_opentina.defconfig— AArch64 + Bootlin 外部工具链 + 无内核(内核由本仓库linux组件构建)+ ext2 rootfs。OP-TEE 开启时再编用户态 4.6.0(BR2_PACKAGE_OPTEE_CLIENT/OPTEE_TEST/OPTEE_EXAMPLES;libteec、tee-supplicant,SysVS30tee-supplicant;xtest/optee_example_*用 OpenTina 的 TA SDK 编,不要开BR2_TARGET_OPTEE_OS)。BL32 仍由optee组件构建。关闭 OP-TEE 时配方会关掉上述包,也不再要求 TA SDK。 - TA(仅 OP-TEE 开启):
br2-post-build.sh(以及 ubuntu/debian/yocto/openwrt 的镜像 overlay)把output/<BOARD>/optee里export-ta_*/ta/*.ta装到/lib/optee_armtz;xtest / optee-examples 的 TA 由对应 BR 包装进同一目录(需先编optee)。安全存储目录/data/tee。改过 TA 后要重编对应 rootfs 并重烧 root 分区,只烧u-boot.fex不会更新它们。 - 板上验证(仅 OP-TEE 开启):
xtest(回归;首次建议xtest -l看用例),以及optee_example_hello_world等。 - 仅构建 rootfs:
./build.sh <BOARD> build br2(需已init克隆sources/buildroot)。 - 分区:
configs/*/partitions.cfg中partition root使用镜像rootfs.ext2,起始偏移148M(紧接 128 MiB 的boot分区之后)。若板卡上块设备节点与mmcblk0p4不一致,请同步修改板级EXTLINUX_ROOT(见下节)。
- 源码:manifest 中的
openaw/ubuntu→sources/ubuntu(revision=master)。 - 配方:
scripts/recipes.sh中的build_ubuntu/clean_ubuntu;命令行使用OPENTINA_ROOTFS=ubuntu时,默认组件链里的 rootfs 步骤为ubuntu而非br2。 - 构建:优先
sources/ubuntu/docker/build-rootfs-buildx.sh(需本机 Docker buildx;./build.sh --docker会把宿主机 Docker socket/CLI 挂进容器)。原生 arm64 可设OPENTINA_UBUNTU_USE_DOCKER=0后直接跑mk-base-ubuntu.sh/mk-ubuntu-rootfs.sh。 - 环境变量(可选,可在板级
config中 export):UBUNTU_RELEASE(默认24.04)、UBUNTU_ARCH(默认arm64)、OPENTINA_MOTD_BANNER_FILE(自定义登录 ASCII/文本,见sources/ubuntu/readme.md)。 - 产物:仓库内
ubuntu-rootfs.ext4拷贝为output/<BOARD>/rootfs.ext2,与 Buildroot 共用partitions.cfg的 root 分区。若已构建linux,会把.staging-linux-modules中的*.ko叠进该镜像。 - 示例:
./build.sh <BOARD> ubuntu build;仅 rootfs:./build.sh <BOARD> ubuntu build ubuntu。 - 内核:
OPENTINA_ROOTFS=ubuntu构建linux时会在LINUX_CONFIG(如a733_minimal_defconfig)之上合并configs/common/linux-systemd.fragment(CONFIG_TMPFS、CONFIG_UNIX等)。精简 defconfig 单独用于 systemd 会出现tmpfs: Unknown parameter 'mode'、Failed to find module 'unix'并卡在 Failed to mount API filesystems。可用环境变量LINUX_SYSTEMD_FRAGMENT覆盖片段路径。
- 源码:manifest 中的
openaw/debian→sources/debian(revision=master)。 - 配方:
scripts/recipes.sh中的build_debian/clean_debian;OPENTINA_ROOTFS=debian时默认组件链使用debian替代br2。 - 构建:优先
sources/debian/docker/build-rootfs-buildx.sh(需本机 Docker buildx;./build.sh --docker同样挂宿主机 Docker);原生 arm64 可OPENTINA_DEBIAN_USE_DOCKER=0后执行mk-lite-rootfs.sh。 - 环境变量(可选):
DEBIAN_RELEASE(默认trixie,亦可用bookworm)、DEBIAN_ARCH(默认arm64)、ROOTFS_EXT4_MB、DEBIAN_MIRROR等(见sources/debian/readme.md)。 - 产物:
sources/debian/out/debian-*-lite-*.ext4(取最新)拷贝为output/<BOARD>/rootfs.ext2。若已构建linux,同样叠入 staged*.ko。 - 示例:
./build.sh <BOARD> debian build;仅 rootfs:./build.sh <BOARD> debian build debian。 - 内核:与 Ubuntu 相同,
debian构建linux时合并linux-systemd.fragment。 - 启动参数:
build_bootfs会在 extlinux 的append中追加systemd.gpt_auto=0,避免 systemd 自动挂载不存在的/boot(GPT 上 FAT 启动区由 U-Boot 使用,不在 rootfs 内挂载)。
让客户在不 fork 本仓库的前提下,把私有 .deb、文件 overlay、收尾脚本注入到 Debian/Ubuntu rootfs。
-
适用范围:
OPENTINA_ROOTFS=debian或ubuntu,且走 buildx 路径(默认);非 buildx 的 fallback(build-rootfs.shdebootstrap、mk-lite-rootfs.sh等)若检测到 OEM 请求会直接报错——避免客户资产被静默丢弃。 -
目录约定:
<OEM_DIR>/ packages/ *.deb — 由 apt-get install ./packages/*.deb 安装 rootfs-overlay/ cp -a 到 / (文件树合并) post.sh chroot 内执行(chmod +x;可选) -
路径选择优先级:环境变量
OPENTINA_OEM_DIR> 板级configs/<板>/oem/> 无(no-op)。 -
依赖策略:不使用
apt-get -f install——packages/*.deb的依赖必须由 base apt 源(trixie/noble main)或同目录下的其它.deb共同满足;不能满足时docker build直接失败,立即暴露缺失依赖,避免镜像被 apt 隐式修复弄脏。 -
与
EXTRA_DEBS的区别:EXTRA_DEBS用于从上游 apt 源拉额外公开包;OEM 用于客户私有 / 闭源 / 自编译产物。两者可并存。 -
示例:
OPENTINA_OEM_DIR=/path/to/oem ./build.sh <BOARD> debian build debian
-
回归测试:
tests/oem/build-test-debs.sh生成两套样例 bundle(good/依赖可解;broken/故意Depends: nonexistent-…),用于验证 happy-path 安装 + fail-fast 行为。详见sources/debian/readme.md与sources/ubuntu/readme.md中对应章节。
- 源码:manifest 中的
openaw/meta-opentina→sources/meta-opentina(revision=master)。首次构建会由opentina-build.sh自动执行yocto-init.sh,在sources/yocto/下拉取 Poky / meta-openembedded(体积大,见 layer 内 README.md)。 - 配方:
build_yocto/clean_yocto调用sources/meta-opentina/opentina-build.sh;OPENTINA_ROOTFS=yocto时默认组件链使用yocto替代br2。 - 配置(可选,板级
config或环境变量):OPENTINA_YOCTO_PROFILE:minimal(默认,opentina-image-minimal)或qt(需yocto-init.sh --qt,opentina-image-qt)YOCTO_MACHINE/OPENTINA_YOCTO_MACHINE:默认a733-aiot(layer 当前机器名;与 OpenTina 板级BOARD_NAME独立,内核仍由本仓库linux组件构建)OPENTINA_YOCTO_DIR:Yocto 工作区,默认sources/yocto
- 产物:
sources/yocto/build-opentina/tmp/deploy/images/<MACHINE>/opentina-image-*-<MACHINE>.ext4→output/<BOARD>/rootfs.ext2。若已构建linux,叠入 staged*.ko。 - 示例:
./build.sh <BOARD> yocto build yocto(仅 rootfs,耗时长);完整镜像:./build.sh <BOARD> yocto build - 内核:与 Ubuntu/Debian 相同,
yocto构建linux时合并linux-systemd.fragment(CONFIG_NET、CONFIG_UNIX、CONFIG_TMPFS等)。未合并时 sysvinit/udev/dbus 会报Function not implemented、/var/volatile失败。 - 默认登录:
root/root,opentina/opentina(conf/include/opentina-default-users.inc,镜像构建后处理写入 shadow)。可在local.conf覆盖OPENTINA_ROOT_PASSWORD等。SSH 已启用allow-root-login。 - 注意:不要用 root 跑 bitbake;
OPENTINA_DOCKER=1的 OpenTina 镜像未预装完整 Yocto 宿主机依赖,建议在宿主机编yocto组件。Layer 阶段为 rootfs-only(linux-dummy),与linux/uboot/atf(以及可选的optee)组件并行不冲突。 - 若报
meta-openembedded/meta-oe不存在:说明只拉了 poky、未拉 meta-oe。在sources/meta-opentina执行./yocto-init.sh后重试;或./build.sh … yocto build yocto(会自动补跑 init)。
- 源码:manifest 中的
openwrt/openwrt→sources/openwrt(pin 在openwrt-25.12稳定分支,clone-depth=1)。也可设环境变量OPENTINA_OPENWRT_DIR指向本地已有的 OpenWrt 树(如已预热build_dir/的 fork),跳过 manifest 克隆。 - 配方:
scripts/recipes.sh中的build_openwrt/clean_openwrt;OPENTINA_ROOTFS=openwrt时默认组件链使用openwrt替代br2。 - 定位:OpenWrt 只作为 rootfs 供应商——boot 链(ATF / U-Boot / 内核 / dtb,以及可选的 OP-TEE)全部复用本仓库组件;OpenWrt 自产的内核、kmod 与 per-device 镜像全部丢弃,只消费 target 级
openwrt-*-rootfs.tar.gz。 - OpenWrt 补丁:先应用
configs/common/openwrt-patches/*.patch,再应用configs/<board>/openwrt-patches/*.patch;每组内按字典序git apply到 OpenWrt 树(应用前先把补丁涉及文件 reset 回 HEAD,保证可重复执行)。 - 配置(板级
config):OPENWRT_CONFIG:板级目录下的.config种子(如openwrt.config),拷贝后经make defconfig归一化OPENWRT_TARGET/OPENWRT_SUBTARGET:默认sunxi/armv8OPENWRT_ROOTFS_MB:mkfs.ext4镜像大小,默认2048(与partitions.cfgroot 分区一致)OPENWRT_JOBS:覆盖 OpenWrt make 并行数(默认JOBS)
- 产物:
bin/targets/<TGT>/<SUBTGT>/openwrt-*-rootfs.tar.gz解包后mkfs.ext4 -d生成output/<BOARD>/rootfs.ext2。解包时会删除 OpenWrt 自带的lib/modules/(kmod 按它自己的内核 ABI 编译,如 6.12.x,与sources/linux不匹配),再拷入 linux 组件 staged 的*.ko。 - 内核:
OPENTINA_ROOTFS=openwrt构建linux时合并configs/common/linux-openwrt.fragment(tmpfs / unix socket / 板载 GMACDWMAC_SUN55I+REALTEK_PHY/ bridge / nftables 等 builtin,供 procd / netifd / firewall4 使用;kmod 已丢弃,缺特性只能往 fragment 加 builtin)。可用LINUX_OPENWRT_FRAGMENT覆盖路径。 - rootfs overlay:打包 ext4 时把
configs/common/openwrt-files/叠进镜像——79_move_config改挂 p3 FAT boot(不再误挂 raw p1 boot0),并用静默fw_printenv去掉 Failed to find NVMEM device;02_network_opentina把 eth0 设为 LAN。 - 示例:
./build.sh <BOARD> openwrt build;仅 rootfs:./build.sh <BOARD> openwrt build openwrt。首次构建会 bootstrap OpenWrt 自带工具链,耗时较长。 - 注意:OpenWrt rootfs 已在 A7A 真机完成启动验证;
armv8subtarget 与两个 A733 设备定义位于configs/common/openwrt-patches/,设备仍为 rootfs-only 占位(IMAGES :=,不产 per-device 镜像)。
build_bootfs生成的extlinux/extlinux.conf里,append由板级EXTLINUX_ROOT与EXTLINUX_CONSOLE拼接(默认root=/dev/mmcblk0p4 rw rootwait+console=ttyS0,115200 loglevel=9)。- 使用 U-Boot distroboot / extlinux 时,内核实际拿到的 cmdline 主要来自这里的
append;请与 U-Boot defconfig 里可能存在的CONFIG_BOOTARGS/bootcmd保持一致,避免 root / console 冲突。若需要更早串口输出,可在EXTLINUX_CONSOLE中加入 SoC 对应的earlycon=...(需查阅 UART 基址与驱动)。
所有子命令前可重复加 --docker(等价于本次执行启用容器),或单独使用 --docker-shell(见下文「Docker」)。
--optee / --no-optee 同样写在子命令之前,控制整条链是否编 OP-TEE(见下节)。
这些前缀必须出现在子命令之前(解析后会被剥掉,再按下面语法处理)。
| 用法 | 说明 |
|---|---|
./build.sh |
无参数:列出板子与 rootfs 类型,并提示常用命令。 |
./build.sh targets 或 ./build.sh list |
同上列表,仅打印后退出。 |
./build.sh init [MANIFEST_XML] |
按 XML 清单克隆/跳过已有仓库到 sources/(默认 scripts/opentina-manifest.xml)。 |
./build.sh <BOARD_NAME> build [COMPONENT…] |
构建;未写 COMPONENT 时按顺序构建全部组件。 |
./build.sh <BOARD_NAME> clean [COMPONENT…] |
清理对应组件及 .done 标记。 |
./build.sh <BOARD_NAME> <ROOTFS> build … |
显式指定 rootfs 后再 build / clean(见下表)。 |
第一参数 BOARD_NAME
- 必须与
configs/*/config中的BOARD_NAME=...一致(不是仅目录名;脚本会扫描所有板级配置)。
ROOTFS(可选)
| ROOTFS | 行为 |
|---|---|
| (省略) | 等价于 buildroot,即 ./build.sh BOARD build 与 ./build.sh BOARD buildroot build 相同。 |
buildroot |
命令行里的「发行版槽位」:当前与省略相同,会跑完整组件链(含 br2 Buildroot 根文件系统)。 |
ubuntu |
在 sources/ubuntu 中构建 lite rootfs,拷贝为 output/<BOARD>/rootfs.ext2(组件名 ubuntu)。 |
debian |
在 sources/debian 中构建 lite rootfs,拷贝为 output/<BOARD>/rootfs.ext2(组件名 debian)。 |
yocto |
在 sources/meta-opentina + sources/yocto 中 bitbake rootfs,拷贝为 output/<BOARD>/rootfs.ext2(组件名 yocto)。 |
openwrt |
在 sources/openwrt(或 OPENTINA_OPENWRT_DIR)中构建 rootfs tar,mkfs.ext4 -d 转为 output/<BOARD>/rootfs.ext2(组件名 openwrt)。 |
COMPONENT(可选,可多个,空格分隔)
默认依次构建全部;指定时只处理列出的组件(顺序即执行顺序):
| 组件 | 含义 |
|---|---|
optee |
OP-TEE OS(BL32,tee.bin 加载到 DRAM 0x40000000)。仅 OPENTINA_OPTEE=1 时出现在默认组件链 |
atf |
Trusted Firmware-A(BL31;开启 OP-TEE 时 SPD=opteed,关闭时 SPD=none) |
uboot |
U-Boot(依赖 atf;开启 OP-TEE 时还依赖 optee,SPL FIT 含 BL31+BL32+U-Boot,否则只有 BL31+U-Boot) |
linux |
Linux 内核与 dtb(开启 OP-TEE 时合并 linux-optee.fragment) |
br2 |
Buildroot:在 sources/buildroot 中按板级 BUILDROOT_DEFCONFIG 生成 rootfs.ext2(开启 OP-TEE 时含 tee-supplicant / libteec / xtest / optee_example_*),拷贝到 output/<BOARD>/rootfs.ext2 |
ubuntu |
Ubuntu rootfs:在 sources/ubuntu 中生成 ubuntu-rootfs.ext4 并拷贝为 rootfs.ext2(OPENTINA_ROOTFS=ubuntu 时替代 br2) |
debian |
Debian rootfs:在 sources/debian/out/ 中取最新 .ext4 并拷贝为 rootfs.ext2(OPENTINA_ROOTFS=debian 时替代 br2) |
yocto |
Yocto rootfs:bitbake opentina-image-minimal / -qt,ext4 拷贝为 rootfs.ext2(OPENTINA_ROOTFS=yocto 时替代 br2) |
openwrt |
OpenWrt rootfs:取 bin/targets/…/openwrt-*-rootfs.tar.gz 经 mkfs.ext4 -d 转为 rootfs.ext2(OPENTINA_ROOTFS=openwrt 时替代 br2) |
bootfs |
启动用 FAT 目录树(依赖 linux) |
image |
genimage 生成 sdcard.img 等(依赖 bootfs、uboot,以及 br2 / ubuntu / debian / yocto / openwrt) |
依赖不满足时会报错退出(要求 output/<BOARD>/.done.<依赖组件> 存在)。
并行数
- 环境变量
JOBS:未设置时使用nproc,并写入MAKEFLAGS=-j$JOBS。
默认在宿主机执行;需要与 Dockerfile 一致的环境时,任选其一进入容器再跑同一套参数:
# 单次命令在容器内执行
./build.sh --docker radxa_a7a build
# 整个 shell 会话都在容器里构建
export OPENTINA_DOCKER=1
./build.sh radxa_a7a clean
./build.sh radxa_a7a build
# 只打开容器里的交互 shell(仓库已 bind-mount 到相同路径)
./build.sh --docker-shell| 变量 / 参数 | 说明 |
|---|---|
OPENTINA_DOCKER=1 |
本次进程在宿主机上时,若存在 docker 命令则 exec 进默认镜像再执行 build.sh。设为 0 可关闭(在曾 export OPENTINA_DOCKER=1 的 shell 里恢复宿主机构建)。 |
--docker |
与上类似,仅作用于当前命令(可写多次,效果同开)。 |
--optee / --no-optee |
打开 / 关闭整项目 OP-TEE(须写在子命令前;会传入 Docker)。 |
--docker-shell |
不进 build.sh 子命令,直接进入镜像内 bash -il。 |
OPENTINA_SKIP_DOCKER=1 |
强制宿主机:即使环境里带了 OPENTINA_DOCKER=1 也不进容器。 |
OPENTINA_DOCKER_IMAGE |
默认 opentina-buildenv:24.04;镜像不存在或 docker/Dockerfile 更新后,由 scripts/docker-exec.sh 执行 docker build。 |
OPENTINA_DOCKER_HOSTNAME |
容器主机名(提示符里 @ 之后),默认 opentina。 |
容器内会设置 OPENTINA_IN_DOCKER=1,避免 build.sh 再套一层容器。若宿主机有 /var/run/docker.sock,docker-exec.sh 会把它和宿主机 docker CLI / buildx 插件挂进容器,这样 ubuntu / debian rootfs 仍可走宿主机 Docker buildx(仓库以相同路径 bind-mount,buildx 输出路径才能对上)。容器默认加上 --security-opt seccomp=unconfined,否则 BitBake 的 unshare(CLONE_NEWUSER) 会被 Docker seccomp 拦掉(即使宿主机 apparmor_restrict_unprivileged_userns=0)。
需要 git@ 克隆时,宿主机上建议配置 SSH agent 或挂载密钥;docker-exec.sh 会尝试传递 SSH_AUTH_SOCK 与只读挂载 ~/.ssh。
- 实际调用:
scripts/repo_clone.sh --gitclone <manifest>。 - 默认清单:
scripts/opentina-manifest.xml(<remote>、<default revision>、<project>)。 clone-depth:可在<manifest>或单个<project>上写正整数做浅克隆;不写或写full/0等为完整历史(详见 manifest 注释)。- 环境变量
OPENTINA_REMOTE_FETCH:若设置,覆盖 manifest 里所有<remote fetch="...">(便于切换 HTTPS / SSH 基地址)。 OPENTINA_SOURCES_DIR:检出根目录,默认$OPENTINA_BUILD_ROOT/sources。OPENTINA_BUILD_ROOT:构建仓库根,一般无需改。
同步已存在仓库(非 init):可直接执行:
./scripts/repo_clone.sh --sync ./scripts/opentina-manifest.xml- 源码:manifest 中的
opentina-org/docs→sources/docs(revision=main)。 - 由
./build.sh init一并拉取;不是构建组件,不参与build/clean。 - 项目概览、启动链、仓库地图与板级说明见该仓库 README(中文 / English)。构建细节仍以本文为准。
- 远端若尚无
main分支(空仓库),init会克隆空目录并跳过--branch,避免整次 init 失败。
| 路径 | 说明 |
|---|---|
sources/ |
trusted-firmware-a、u-boot、linux、buildroot、ubuntu、debian、meta-opentina、yocto/(Yocto 工作区,由 init 生成)、awbin、docs 等(由 manifest 决定;根目录 .gitignore 已忽略) |
output/<BOARD_NAME>/ |
内核、dtb、rootfs.ext2、u-boot.fex、boot.img、sdcard.img、.done.* 等 |
configs/<板级目录>/ |
config、partitions.cfg(BOARD_NAME 可与目录名不同) |
scripts/ |
recipes.sh、repo_clone.sh、docker-exec.sh、opentina-boards.sh 等 |
docker/Dockerfile |
默认构建环境镜像定义 |
在对应板子的 config 中可设置(示例见 configs/radxa_a7a/config):
| 变量 | 说明 |
|---|---|
BOARD_NAME |
与命令行第一个参数一致,用于 awbin 路径、output/ 子目录名等 |
PRETTY_NAME |
仅用于 ./build.sh targets 展示 |
OPENTINA_CROSS_COMPILE |
默认 aarch64-linux-gnu-;TF-A、U-Boot、Linux 共用此前缀(与 docker 镜像内工具链一致) |
FDT_NAME |
拷贝到 output/ 的设备树文件名 |
UBOOT_CONFIG |
make …_defconfig 名 |
LINUX_CONFIG |
内核 defconfig 名 |
PARTITION_CONFIG |
genimage 配置文件路径(一般为 $OPENTINA_BUILD_ROOT/configs/<目录>/partitions.cfg) |
BUILDROOT_DEFCONFIG |
Buildroot 片段 defconfig 文件名(位于同一板级目录,默认 br2_opentina.defconfig) |
EXTLINUX_ROOT |
写入 extlinux.conf 的 root= 等(默认 root=/dev/mmcblk0p4 rw rootwait,需与 GPT 根分区序号一致) |
EXTLINUX_CONSOLE |
写入 extlinux.conf 的 console / loglevel / earlycon 等 |
OPENTINA_OPTEE |
1(默认)编 OP-TEE 全链;0 关闭。也可在命令行用 --optee / --no-optee |
工作流 .github/workflows/images.yml:
| 触发 | 行为 |
|---|---|
pull request → tina-dev |
7 个 job:demo_aiot_a733_v3 的 buildroot / yocto / ubuntu / debian / openwrt(optee)+ demo buildroot / no-optee + radxa_a7a buildroot / optee。仅改 *.md / LICENSE / .gitignore 的 PR 不触发。产物在该次 run 的 Artifacts(保留 14 天),不发 Release |
| workflow_dispatch | 完整矩阵;也可选只跑上述 PR 子集 |
| push 新 tag | 完整矩阵,成功项打成 xz 后发布同名 GitHub Release |
git tag v1.0.0
git push origin v1.0.0Release 页文件名例如 demo_aiot_a733_v3-buildroot-optee-sdcard.img.xz(单附件上限约 2 GiB)。解压:xz -d <file>-sdcard.img.xz。
完整矩阵:demo_aiot_a733_v3、radxa_a7a × buildroot、ubuntu、debian、openwrt、yocto × optee、no-optee。某组失败不影响其它组。tag Release 会挂上已成功的镜像;若有组合缺失,Release notes 会列出缺失项,并标成 prerelease。Yocto / OpenWrt 的 job timeout 分别为 360 / 240 分钟。
ccache 只给 buildroot / openwrt / yocto(max-size: 1G),避开 GitHub 每仓库 10 GB 缓存上限把 20 个 2 G 条目互相挤掉。Ubuntu / Debian 走 Docker buildx,宿主 ccache 收益低,不开。
CI 在 Ubuntu 24.04 runner 上装与 docker/Dockerfile 对齐的宿主依赖(scripts/ci-install-deps.sh),不再套一层 ./build.sh --docker,以便 Ubuntu/Debian rootfs 走宿主机 Docker buildx。Yocto job 会放开 kernel.apparmor_restrict_unprivileged_userns,并尽量把工作区放到 /mnt(回收 runner 的 swapfile)。默认 opentina-image-minimal 余量够用;若以后接 HMI/qt(mesa + llvm),需要更大 runner。
./build.sh init 要拉 opentina-org 下的 linux / u-boot 等仓。若这些仓是私有的,在仓库 Secrets 里加 OPENTINA_GH_TOKEN(能读对应 project 的 PAT);公开仓用默认 GITHUB_TOKEN 即可。
./build.sh this-is-not-a-board
# 或省略必填参数,触发 usage会打印内置用法摘要(与本文对应;以脚本为准)。
以仓库上层或本目录已有 LICENSE / 说明为准;厂商二进制(如 awbin)适用其自带条款。