Skip to content

Latest commit

 

History

35 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpenTina 构建说明(build/

本目录为固件与镜像构建入口:源码在 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

其中 chrpathdiffstattexinfomakeinfo)、rpcsvc-protorpcgen)为 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.conf

opentina-build.sh 也会在缺少该能力时尝试用 Docker/sudo -n 自动写入上述 sysctl。

若整机构建包在 proxychains4 下跑:sysctl 已是 0 时一般没问题;不要用 CLI unshare 自行探测(LD_PRELOAD 多线程会导致误报)。网络代理更建议只包下载步骤,而不是整个 bitbake

如果走 Docker 而直接在宿主跑 debian / ubuntu rootfs(设 OPENTINA_DEBIAN_USE_DOCKER=0OPENTINA_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-gnugenimage 等,见 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.imgrootfs.ext2Image.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


OP-TEE(整项目可选,默认开)

一条开关同时控制 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/*/configOPENTINA_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-memoryfirmware/optee,避免内核 Image 落在 0x40000000 的 32 MiB no-map 里并报 failed to reserve memory for node 'optee@40000000'


Buildroot(组件 br2

  • 配方位置scripts/recipes.sh 中的 build_br2 / clean_br2(组件名用 br2,避免与命令行 OPENTINA_ROOTFS=buildroot 混淆)。
  • 板级变量configs/<板>/configBUILDROOT_DEFCONFIG(默认 br2_opentina.defconfig,与 config 同目录)。
  • defconfig 模板configs/*/br2_opentina.defconfig — AArch64 + Bootlin 外部工具链 + 无内核(内核由本仓库 linux 组件构建)+ ext2 rootfsOP-TEE 开启时再编用户态 4.6.0(BR2_PACKAGE_OPTEE_CLIENT / OPTEE_TEST / OPTEE_EXAMPLESlibteectee-supplicant,SysV S30tee-supplicantxtest / 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>/opteeexport-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.cfgpartition root 使用镜像 rootfs.ext2,起始偏移 148M(紧接 128 MiB 的 boot 分区之后)。若板卡上块设备节点与 mmcblk0p4 不一致,请同步修改板级 EXTLINUX_ROOT(见下节)。

Ubuntu rootfs(组件 ubuntu

  • 源码:manifest 中的 openaw/ubuntusources/ubunturevision=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.fragmentCONFIG_TMPFSCONFIG_UNIX 等)。精简 defconfig 单独用于 systemd 会出现 tmpfs: Unknown parameter 'mode'Failed to find module 'unix' 并卡在 Failed to mount API filesystems。可用环境变量 LINUX_SYSTEMD_FRAGMENT 覆盖片段路径。

Debian rootfs(组件 debian

  • 源码:manifest 中的 openaw/debiansources/debianrevision=master)。
  • 配方scripts/recipes.sh 中的 build_debian / clean_debianOPENTINA_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_MBDEBIAN_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 内挂载)。

OEM 注入(客户扩展安装包与 overlay)

让客户在不 fork 本仓库的前提下,把私有 .deb、文件 overlay、收尾脚本注入到 Debian/Ubuntu rootfs。

  • 适用范围OPENTINA_ROOTFS=debianubuntu,且走 buildx 路径(默认);非 buildx 的 fallback(build-rootfs.sh debootstrap、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.mdsources/ubuntu/readme.md 中对应章节。


Yocto rootfs(组件 yocto

  • 源码:manifest 中的 openaw/meta-opentinasources/meta-opentinarevision=master)。首次构建会由 opentina-build.sh 自动执行 yocto-init.sh,在 sources/yocto/ 下拉取 Poky / meta-openembedded(体积大,见 layer 内 README.md)。
  • 配方build_yocto / clean_yocto 调用 sources/meta-opentina/opentina-build.shOPENTINA_ROOTFS=yocto 时默认组件链使用 yocto 替代 br2
  • 配置(可选,板级 config 或环境变量):
    • OPENTINA_YOCTO_PROFILEminimal(默认,opentina-image-minimal)或 qt(需 yocto-init.sh --qtopentina-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>.ext4output/<BOARD>/rootfs.ext2。若已构建 linux,叠入 staged *.ko
  • 示例./build.sh <BOARD> yocto build yocto(仅 rootfs,耗时长);完整镜像:./build.sh <BOARD> yocto build
  • 内核:与 Ubuntu/Debian 相同,yocto 构建 linux 时合并 linux-systemd.fragmentCONFIG_NETCONFIG_UNIXCONFIG_TMPFS 等)。未合并时 sysvinit/udev/dbus 会报 Function not implemented/var/volatile 失败。
  • 默认登录root / rootopentina / opentinaconf/include/opentina-default-users.inc,镜像构建后处理写入 shadow)。可在 local.conf 覆盖 OPENTINA_ROOT_PASSWORD 等。SSH 已启用 allow-root-login
  • 注意不要用 root 跑 bitbakeOPENTINA_DOCKER=1 的 OpenTina 镜像未预装完整 Yocto 宿主机依赖,建议在宿主机yocto 组件。Layer 阶段为 rootfs-onlylinux-dummy),与 linux / uboot / atf(以及可选的 optee)组件并行不冲突。
  • 若报 meta-openembedded/meta-oe 不存在:说明只拉了 poky、未拉 meta-oe。在 sources/meta-opentina 执行 ./yocto-init.sh 后重试;或 ./build.sh … yocto build yocto(会自动补跑 init)。

OpenWrt rootfs(组件 openwrt

  • 源码:manifest 中的 openwrt/openwrtsources/openwrt(pin 在 openwrt-25.12 稳定分支,clone-depth=1)。也可设环境变量 OPENTINA_OPENWRT_DIR 指向本地已有的 OpenWrt 树(如已预热 build_dir/ 的 fork),跳过 manifest 克隆。
  • 配方scripts/recipes.sh 中的 build_openwrt / clean_openwrtOPENTINA_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 / armv8
    • OPENWRT_ROOTFS_MBmkfs.ext4 镜像大小,默认 2048(与 partitions.cfg root 分区一致)
    • 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 / 板载 GMAC DWMAC_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 device02_network_opentinaeth0 设为 LAN。
  • 示例./build.sh <BOARD> openwrt build;仅 rootfs:./build.sh <BOARD> openwrt build openwrt。首次构建会 bootstrap OpenWrt 自带工具链,耗时较长。
  • 注意:OpenWrt rootfs 已在 A7A 真机完成启动验证;armv8 subtarget 与两个 A733 设备定义位于 configs/common/openwrt-patches/,设备仍为 rootfs-only 占位(IMAGES :=,不产 per-device 镜像)。

extlinux 与 U-Boot cmdline

  • build_bootfs 生成的 extlinux/extlinux.conf 里,append 由板级 EXTLINUX_ROOTEXTLINUX_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 基址与驱动)。

./build.sh 命令总览

所有子命令前可重复加 --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.ext2OPENTINA_ROOTFS=ubuntu 时替代 br2
debian Debian rootfs:在 sources/debian/out/ 中取最新 .ext4 并拷贝为 rootfs.ext2OPENTINA_ROOTFS=debian 时替代 br2
yocto Yocto rootfs:bitbake opentina-image-minimal / -qt,ext4 拷贝为 rootfs.ext2OPENTINA_ROOTFS=yocto 时替代 br2
openwrt OpenWrt rootfs:取 bin/targets/…/openwrt-*-rootfs.tar.gzmkfs.ext4 -d 转为 rootfs.ext2OPENTINA_ROOTFS=openwrt 时替代 br2
bootfs 启动用 FAT 目录树(依赖 linux
image genimage 生成 sdcard.img 等(依赖 bootfsuboot,以及 br2 / ubuntu / debian / yocto / openwrt

依赖不满足时会报错退出(要求 output/<BOARD>/.done.<依赖组件> 存在)。

并行数

  • 环境变量 JOBS:未设置时使用 nproc,并写入 MAKEFLAGS=-j$JOBS

Docker(Ubuntu 24.04)

默认在宿主机执行;需要与 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.sockdocker-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


./build.sh init 与清单 XML

  • 实际调用: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

文档(sources/docs

  • 源码:manifest 中的 opentina-org/docssources/docsrevision=main)。
  • ./build.sh init 一并拉取;不是构建组件,不参与 build / clean
  • 项目概览、启动链、仓库地图与板级说明见该仓库 README中文 / English)。构建细节仍以本文为准。
  • 远端若尚无 main 分支(空仓库),init 会克隆空目录并跳过 --branch,避免整次 init 失败。

目录与产物

路径 说明
sources/ trusted-firmware-au-bootlinuxbuildrootubuntudebianmeta-opentinayocto/(Yocto 工作区,由 init 生成)、awbindocs 等(由 manifest 决定;根目录 .gitignore 已忽略)
output/<BOARD_NAME>/ 内核、dtb、rootfs.ext2u-boot.fexboot.imgsdcard.img.done.*
configs/<板级目录>/ configpartitions.cfgBOARD_NAME 可与目录名不同)
scripts/ recipes.shrepo_clone.shdocker-exec.shopentina-boards.sh
docker/Dockerfile 默认构建环境镜像定义

板级 configs/*/config 常用变量

在对应板子的 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.confroot= 等(默认 root=/dev/mmcblk0p4 rw rootwait,需与 GPT 根分区序号一致)
EXTLINUX_CONSOLE 写入 extlinux.confconsole / loglevel / earlycon
OPENTINA_OPTEE 1(默认)编 OP-TEE 全链;0 关闭。也可在命令行用 --optee / --no-optee

GitHub Actions(CI 镜像)

工作流 .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.0

Release 页文件名例如 demo_aiot_a733_v3-buildroot-optee-sdcard.img.xz(单附件上限约 2 GiB)。解压:xz -d <file>-sdcard.img.xz

完整矩阵:demo_aiot_a733_v3radxa_a7a × buildrootubuntudebianopenwrtyocto × opteeno-optee。某组失败不影响其它组。tag Release 会挂上已成功的镜像;若有组合缺失,Release notes 会列出缺失项,并标成 prerelease。Yocto / OpenWrt 的 job timeout 分别为 360 / 240 分钟。

ccache 只给 buildroot / openwrt / yoctomax-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)适用其自带条款。

About

About build config for Allwinner A733 series soc

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages