rauc/rauc

GitHub: rauc/rauc

面向嵌入式 Linux 的安全可靠 OTA 更新框架,支持原子切换、签名验证和多引导程序

Stars: 1119 | Forks: 245

.. image:: rauc_logo_small.png :alt: RAUC logo :align: center # RAUC - 稳健的自动更新控制器 |LGPLv2.1| |CI_branch| |Codecov_branch| |Coverity| |codeql| |OSS-Fuzz| |Documentation| |Matrix| |CII Best Practices| |Repology| .. raw:: html Packaging status RAUC 控制嵌入式 Linux 系统上的更新过程。它既是一个作为更新客户端运行的目标应用程序,也是一个主机/目标工具,允许您创建、检查和修改更新文件(“*bundles*”)。 源代码:https://github.com/rauc/rauc 文档:https://rauc.readthedocs.org/ 聊天:libera.chat 上的 IRC 频道 ``#rauc``(桥接到 `Matrix 频道 #rauc:matrix.org `_) ## 功能特性 * **故障安全与原子性**: * 更新可以在任何时刻被中断,而不会破坏正在运行的系统。 * 更新兼容性检查 * 原子性引导加载程序更新(eMMC boot 分区,MBR,GPT) * 使用 OpenSSL 对更新进行**加密签名和验证**(基于 x.509 证书的签名) * 支持 **PKCS#11 令牌**(HSM)上的密钥和证书 * **灵活且可定制**的冗余/存储设置 * **对称**设置(Root-FS A & B) * **非对称**设置(恢复 & 正常) * 应用程序分区、数据分区等 * 允许将多个槽位分组,作为更新目标 * 内置 **HTTP(S) 流式传输**模式 * 目标设备上无需中间存储 * 类 Delta 的**自适应更新**支持 * 透明的下载优化选择 * 替代的网络 Delta 流模式(使用 casync 工具) * 基于 chunk 的二进制 delta 更新 * 特殊的 bundle 格式和外部 chunk 存储 * 面向多接收者的 Bundle **加密** * **Bootloader 支持**: * `grub `_ * `barebox `_ * `u-boot `_ * `EFI `_ * 自定义实现 * 存储支持: * 只读文件系统:SquashFS, EROFS, dm-verity 保护镜像等 * 读写文件系统:ext4, VFAT, UBIFS, JFFS2 * eMMC boot 分区(原子更新) * UBI 卷 * Raw NAND Flash(使用 nandwrite) * Raw NOR Flash(使用 flashcp) * MBR 分区表 * GPT 分区表 * 独立于更新源 * 简单的 Web 服务器(例如 lighttpd) * 软件分发服务器(例如带有 `rauc-hawkbit-updater `_ 的 **hawkBit**) * USB Stick * 可通过 **D-Bus** 接口控制 * 支持数据迁移 * 使用 libcurl 的网络协议支持(https, http, tftp/ftp, ssh, ...) * 多层更新定制 * 更新特定的扩展 * 系统特定的扩展 * 完全自定义的更新脚本 ### 主机功能 * 创建和签名更新 bundle * 重签名 bundle * 加密 bundle * 检查 bundle 文件 ### 目标设备功能 * 作为系统服务运行(D-Bus 接口) * 安装 bundle * 查看系统状态信息 * 更改对称/非对称/自定义槽位的状态 ## 目标设备要求 * 引导状态存储 * GRUB:SD/eMMC/SSD/磁盘上的环境文件 * Barebox:EEPROM/FRAM/MRAM 或 NAND Flash 上的状态分区 * U-Boot:环境变量 * EFI:EFI 变量 * 自定义:取决于实现 * Bootloader 中的引导目标选择支持 * 足够的大容量存储空间以容纳两个对称/非对称/自定义槽位 * Bundle 的存储位置和存储空间: * 对于 USB Stick 更新:Stick 上有足够的空间存放(压缩后的)bundle,目标设备上无需存储空间 * 对于 HTTP(S) bundle 流式安装:服务器上有足够的空间,目标设备上无需存储空间 * 对于自适应更新:目标设备上需要少量空间存储元数据 * 对于基于 casync 的更新:目标设备上需要临时的存储空间来存放下载的 chunks * 对于外部(非流式)下载:目标设备上需要足够的临时存储空间来存放(压缩后的)bundle * 硬件看门狗(可选,但推荐) * RTC(可选,但推荐) ## 用法 详情请参阅 `文档 `__。 ## 先决条件 ### 主机(构建)先决条件 - build-essential - meson - libtool - libdbus-1-dev - libglib2.0-dev - libcurl3-dev - libssl-dev .. code-block:: sh sudo apt-get install build-essential meson libtool libdbus-1-dev libglib2.0-dev libcurl3-dev libssl-dev 对于 HTTP(S) 流式支持,您还需要 netlink 协议头: .. code-block:: sh ``` sudo apt-get install libnl-genl-3-dev ``` 如果您打算使用 json-support,您还需要 .. code-block:: sh ``` sudo apt-get install libjson-glib-dev ``` ### 目标设备先决条件 所需的内核选项(``y`` 或 ``m``): - ``CONFIG_MD`` - ``CONFIG_BLK_DEV_DM`` - ``CONFIG_BLK_DEV_LOOP`` - ``CONFIG_DM_VERITY`` - ``CONFIG_SQUASHFS`` - ``CONFIG_CRYPTO_SHA256`` - ``CONFIG_BLK_DEV_NBD``(用于流式支持) - ``CONFIG_DM_CRYPT``(用于加密支持) - ``CONFIG_CRYPTO_AES``(用于加密支持) 为了在 RAUC Bundle 中使用带有 Busybox tar 的 tar 归档,您必须启用以下 Busybox 功能: - ``CONFIG_FEATURE_TAR_AUTODETECT=y`` - ``CONFIG_FEATURE_TAR_LONG_OPTIONS=y`` 根据实际使用的存储类型和/或文件系统,可能还需要其他目标工具。 文档章节 `Required Target Tools `_ 提供了关于这些的更详细列表。 ## 从源代码构建 .. note:: RAUC 旨在作为主机工具和目标工具(服务)构建。因此,它完全准备好使用 meson 进行交叉编译。 .. code-block:: sh ``` git clone https://github.com/rauc/rauc cd rauc meson setup build meson compile -C build # or 'ninja -C build' on meson < 0.54.0 ``` ## 手动安装 .. note:: 为了为目标设备准备 RAUC,强烈建议使用嵌入式 Linux 发行版构建套件,如 Yocto/OE、PTXdist 或 Buildroot。 在主机系统上,RAUC 可以直接从构建目录使用,或者选择安装。而在目标设备上,强烈建议进行安装,因为它还会解压正常运行 RAUC 所需的服务和 D-Bus 配置文件: .. code-block:: sh ``` meson install ``` ## 运行测试套件 .. code-block:: sh ``` sudo apt-get install qemu-system-x86 time squashfs-tools e2fsprogs python3-pytest python3-dasbus python3-aiohttp python3-requests python3-pyasn1 python3-pyasn1-modules # 运行所有测试为可选项: # sudo apt-get install faketime casync grub-common openssl softhsm2 opensc opensc-pkcs11 libengine-pkcs11-openssl mtd-utils nginx-light tree ./qemu-test ``` ## 创建 Bundle(主机) 创建一个包含要安装内容的目录: .. code-block:: sh ``` mkdir content-dir/ cp $SOURCE/rootfs.ext4 content-dir/ ``` 创建一个清单文件,描述将镜像安装到哪里以及一些元信息: .. code-block:: sh ``` cat >> content-dir/manifest.raucm << EOF [update] compatible=FooCorp Super BarBazzer version=2019.01-1 [image.rootfs] filename=rootfs.ext4 EOF ``` 让 RAUC 据此创建一个 bundle: .. code-block:: sh ``` rauc --cert autobuilder.cert.pem --key autobuilder.key.pem bundle content-dir/ update-2019.01-1.raucb ``` ## 启动 RAUC 服务(目标设备) 在 ``/etc/rauc/system.conf`` 中创建一个系统配置文件,并在后台启动服务进程: .. code-block:: sh ``` rauc service & ``` ## 安装 Bundle(目标设备) 要在目标设备上安装 bundle(从本地存储),运行: .. code-block:: sh ``` rauc install update-2023.02-1.raucb ``` 要从 Web 服务器安装 bundle(使用 RAUC 的内置 HTTP(S) 流式传输),运行: .. code-block:: sh ``` rauc install https://example.com/update-2023.02-1.raucb ``` ## 许可证 Copyright (C) 2015–2026 RAUC project RAUC 是自由软件;您可以根据自由软件基金会发布的 GNU Lesser General Public License 条款重新分发和/或修改它;适用许可证的 2.1 版本,或(根据您的选择)任何后续版本。 分发该库是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性的暗示保证。有关更多详细信息,请参阅 GNU Lesser General Public License。 您应该随此源代码收到一份 GNU Lesser General Public License 副本,请参阅名为 `COPYING`_ 的文件。如果没有,请参阅 https://www.gnu.org/licenses/。 .. |LGPLv2.1| image:: https://img.shields.io/badge/license-LGPLv2.1-blue.svg :target: #license .. _COPYING: https://raw.githubusercontent.com/rauc/rauc/master/COPYING .. |CI_branch| image:: https://github.com/rauc/rauc/workflows/tests/badge.svg :target: https://github.com/rauc/rauc/actions?query=workflow%3Atests .. |Codecov_branch| image:: https://codecov.io/gh/rauc/rauc/branch/master/graph/badge.svg :target: https://codecov.io/gh/rauc/rauc .. |Coverity| image:: https://scan.coverity.com/projects/22299/badge.svg :target: https://scan.coverity.com/projects/22299 .. |Documentation| image:: https://readthedocs.org/projects/rauc/badge/?version=latest :target: http://rauc.readthedocs.org/en/latest/?badge=latest .. |Matrix| image:: https://img.shields.io/matrix/rauc:matrix.org?label=matrix%20chat :target: https://matrix.to/#/#rauc:matrix.org .. |codeql| image:: https://github.com/rauc/rauc/workflows/CodeQL/badge.svg :target: https://github.com/rauc/rauc/actions/workflows/codeql.yml .. |OSS-Fuzz| image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/rauc.svg :target: https://oss-fuzz-build-logs.storage.googleapis.com/index.html#rauc .. |CII Best Practices| image:: https://www.bestpractices.dev/projects/5075/badge :target: https://www.bestpractices.dev/projects/5075 .. |Repology| image:: https://repology.org/badge/tiny-repos/rauc.svg?header=distribution%20packages :target: https://repology.org/project/rauc/versions
标签:A/B分区, Barebox, Bootloader集成, Buildroot, Bundle加密, casync, CVE, DNS 反向解析, eMMC, GPT, GRUB, HSM, HTTPS流式传输, MBR, Mender替代, OpenSSL, OTA更新, PKCS#11, RAUC, SWUpdate替代, U-Boot, Yocto, 冗余启动, 原子更新, 固件保护, 固件升级, 安全测试工具, 客户端加密, 嵌入式Linux, 嵌入式开发, 嵌入式系统, 差分更新, 故障安全, 数字签名, 文档安全, 断点续传, 漏洞管理, 物联网安全, 硬件安全模块, 系统健壮性, 软件开发工具包, 远程升级, 镜像管理, 防御持久化, 预握手, 验签