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
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, 嵌入式开发, 嵌入式系统, 差分更新, 故障安全, 数字签名, 文档安全, 断点续传, 漏洞管理, 物联网安全, 硬件安全模块, 系统健壮性, 软件开发工具包, 远程升级, 镜像管理, 防御持久化, 预握手, 验签