From 52de99152410fa268f63a25a4ee28f6777c2db37 Mon Sep 17 00:00:00 2001 From: fanglinxu Date: Thu, 11 Sep 2025 15:38:03 +0800 Subject: [PATCH] oebridge: add introduction and usage doc * add doc for oebridge Signed-off-by: fanglinxu --- docs/image/oebridge/oebridge_architecture.png | Bin 0 -> 46504 bytes docs/source/features/index.rst | 1 + docs/source/features/oebridge.rst | 184 ++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 docs/image/oebridge/oebridge_architecture.png create mode 100644 docs/source/features/oebridge.rst diff --git a/docs/image/oebridge/oebridge_architecture.png b/docs/image/oebridge/oebridge_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..c296a74437d3683075b47ee9e7ae6573b078d976 GIT binary patch literal 46504 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 literal 0 HcmV?d00001 diff --git a/docs/source/features/index.rst b/docs/source/features/index.rst index 28d4e3b5568..77d4b015718 100644 --- a/docs/source/features/index.rst +++ b/docs/source/features/index.rst @@ -10,6 +10,7 @@ mica/index.rst ros.rst + oebridge.rst epkg.rst muslc.rst distributed_softbus.rst diff --git a/docs/source/features/oebridge.rst b/docs/source/features/oebridge.rst new file mode 100644 index 00000000000..76e6cd61b19 --- /dev/null +++ b/docs/source/features/oebridge.rst @@ -0,0 +1,184 @@ +oebridge北向通天塔 +####################### + + +总体介绍 +======== + +oebridge 是 openEuler Embedded 北向通天塔计划的核心组件,旨在打通 openEuler 服务器源与嵌入式系统的软件兼容复用通道。通过解决嵌入式与服务器端软件元数据不兼容、依赖链差异等问题,突破嵌入式北向生态软件数量有限的瓶颈,让嵌入式系统既能保留 Yocto 定制化优势,又能复用 openEuler 全站超 35000 款软件包的能力。 + +当前架构图如下,主要通过dnf包管理和openEuler源进行链接,后续将考虑如何更好的将嵌入式定制和epkg包管理进行结合。 + + .. figure:: ../../image/oebridge/oebridge_architecture.png + :align: center + + 图 1 oebridge基础架构 + + +特性功能 +======== + +1. 支持 Yocto 构建阶段打包 openEuler 服务器源软件 + +2. 支持嵌入式系统运行时通过 dnf 在线安装服务器源软件(开启特性后将自动集成dnf包管理工具) + + +构建指导 +======== + +通过 oebuild 指定 ``-f oebridge`` 进行特性使能,其他构建流程不变。 + +建议配合 ``-f systemd`` 来使用,因为服务器版本较多基础软件依赖systemd座位启动底座。使能代码示例: + + .. code-block:: console + + $ oebuild generate -p ${platform} -f oebridge -f systemd + +已提供了基于oebridge的xfce案例,可通过 ``-f oebridge-xfce`` 进行特性使能,其他构建流程不变。 + + .. code-block:: console + + $ oebuild generate -p ${platform} -f oebridge-xfce -f systemd + + +特别说明:部分老容器由于权限问题,需要在 ``oebuild bitbake`` 进入容器后,给于oebridge需要的目录权限: + + .. code-block:: console + + $ sudo chmod 777 /var/log/hawkey.log + $ sudo chmod 777 /var/cache/dnf/ + + +高阶定制——开发集成接口 +============================== + +**1. 元数据孪生接口** + +该接口通过 **ASSUME_PROVIDE_PKGS** 变量来控制,用于建立嵌入式软件包与 openEuler 服务器软件包的映射关系,以便在安装服务器软件包时候,不必重新覆盖嵌入式的等同软件包。 + +oebridge框架class中,已为每个yocto配方(recipe)中统一新增 ``ASSUME_PROVIDE_PKGS`` 变量,默认值为 ``openeuler-src`` 源码仓中对应软件 spec 文件定义的「全量包名/子包名」,支持按需在配方中自定义映射关系。 + +如发现有软件包的默认映射有偏差,可支持三种映射指定模式,满足不同场景的适配定制: + + .. code-block:: bash + + # 1. 全包默认指定:适用于全局统一映射 + ASSUME_PROVIDE_PKGS="包名1 包名2 ..." + # 2. ${PN} 特别指定:针对当前配方主包(PN)自定义映射 + ASSUME_PROVIDE_PKGS:${PN}="包名1 包名2 ..." + # 3. ${PN}-xxx特别指定:针对配方子包(如${PN}-devel)自定义映射 + ASSUME_PROVIDE_PKGS:${PN}-xxx="包名1 包名2 ..." + + +典型映射示例: + +=============== ==================================================================== +嵌入式recipe ASSUME\_PROVIDE\_PKGS 映射值 +=============== ==================================================================== +busybox which cpio vim-minimal diffutils systemd systemd-libs systemd-udev +glibc-external glibc glibc-common +base-files setup filesystem basesystem +=============== ==================================================================== + +**2. 离线集成拓展接口** + +该接口用于在yocto镜像制作时候,通过配置,直接集成openEuler源的软件包到镜像或文件系统中。 + +接口及配置方式上,支持3种软件扩展安装模式,适配不同场景需求: + +**(1) 模式 A:默认模式(快速依赖链模式)** + +* 用法:在离线安装列表中,通过追加服务器版本的包名(支持通配符),不带 ``:`` 后缀修饰 + +* 行为: 通过 ``dnf install`` 在host中安装服务器源软件到目标架构的 ``rootfs`` ,自动识别嵌入式基座包的元数据,已满足依赖的包不会重复安装 + +* 适用场景:用于追加基线北向软件,无依赖冲突场景,一般不需要修改当前的基线软件包。安装速度较快,但不支持 ``TARGET二进制的pre/post脚本执行`` (这种情况需要使用模式C)。 + +**(2) 模式 B:强制安装模式(单包强制模式)** + +* 用法:相比于模式A,在包名后添加 ``:force`` 标签 + +* 行为: 将先通过默认模式即 ``dnf install`` 安装一遍,然后会进一步通过 ``rpm -ivh`` 强制单包再重装一遍。 + +* 适用场景:嵌入式与服务器软件存在依赖冲突,需强制使用服务器版本(单包)的场景,目前已经有一份极限,一般不需要修改当前的基线软件包。 + +**(3) 模式 C: 仿真安装模式(兼容性强)** + +* 用法:相比于模式A,在包名后添加 ``:real`` 标签 + +* 行为: 将在A和B模式所涉及的软件包执行集成后,使用 ``QEMU+切根`` 的仿真环境进行 ``dnf install`` 。注意如果AB中已经包含了该软件包,相当于元数据已经存在,就不会再重新安装。 + +* 适用场景:普遍适用于需追加集成北向软件的场景,建议使用此接口来扩展OSV所需要的OE北向软件。 + + +示例如下(``meta-openeuler/recipes-core/packagegroups/packagegroup-oebridge.bb``) + + .. code-block:: python + + # will call dnf to install INSTALL_PKG_LISTS's pkgs when do_rootfs + # the :force tag will force to install by using rpm -ivh and cover the pkg whatever oee do. + # note that: + # do not add oee's rpm and dnf(it depends on python3), + # we should use oe2403's python modules due to python3 version diffs. + INSTALL_PKG_LISTS = " \ + libsigsegv \ + libev \ + info \ + chkconfig \ + kbd-legacy \ + kbd-misc \ + keyutils-libs \ + libutempter \ + libverto \ + man-db \ + newt \ + slang \ + kpartx \ + openssl-pkcs11 \ + crypto-policies \ + dracut \ + krb5-libs \ + libkcapi \ + os-prober \ + grubby \ + dnf \ + rpm \ + " + # we should ensure libstdc++ api is compatible, ohterwise we need oe's libstdc++. + # currently, oee's python3 is diff from oe2403, shoud use oe2403's pkg. + # other libs is incompatible with config, use oe's pkg, list is: + INSTALL_PKG_LISTS += " \ + python3:force \ + python3-pip:force \ + systemd-libs:force \ + libgomp:force \ + libvorbis:force \ + libogg:force \ + ncurses-libs:force \ + libsndfile:force \ + libsamplerate:force \ + flac:force \ + glib2:force \ + avahi-libs:force \ + gobject-introspection:force \ + " + # add for advance install oe pkgs using chroot target arch with qemu, need qemu-user-static of host + # note kernel bellow 6.9 patch need xorg-x11-server-1.20.11-32 + # see https://gitee.com/src-openeuler/xorg-x11-server/commit/d8c7ac6e53e01fa757e58ed044b9915756d826b1 + XFCE_PKG_LISTS = " \ + dejavu-fonts:real \ + liberation-fonts:real \ + gnu-*-fonts:real \ + wqy-zenhei-fonts:real \ + xorg-*:real \ + ${@bb.utils.contains('DISTRO_FEATURES', 'kernel6', '', 'xorg-x11-server-1.20.11-32*:real', d)} \ + ${@bb.utils.contains('MACHINE', 'hieulerpi1', 'xorg-x11-server-1.20.11-32*:real', '', d)} \ + xfwm4:real \ + xfdesktop:real \ + xfce4-*:real \ + xfce4-*-plugin:real \ + network-manager-applet:real \ + " + INSTALL_PKG_LISTS += "${@bb.utils.contains('DISTRO_FEATURES', 'oe-xfce', d.getVar('XFCE_PKG_LISTS'), '', d)}" + + -- Gitee