22个版本 (11个破坏性版本)

0.12.0 2024年5月22日
0.11.0 2023年3月5日
0.10.0 2022年3月16日
0.9.0 2021年10月8日
0.1.2 2019年2月22日

#17压缩

Download history 91/week @ 2024-05-17 24/week @ 2024-05-24 3/week @ 2024-05-31 4/week @ 2024-06-07 1/week @ 2024-06-14

1,363 每月下载量

MIT 许可证

3MB
5.5K SLoC

CI MIT licensed

bita

bita 是一个基于HTTP的文件同步工具,旨在通过数据重用实现低带宽使用。

  • 从远程克隆,同时重用任何本地文件或设备中的数据 📁
  • 使用文件或块设备作为输出进行克隆 💾
  • 使用任何常规HTTP/HTTPS服务器或服务托管存档 🔗
  • 使用 bitar 库将其包含在自己的项目中 💫
  • Rust 编写,以追求娱乐、性能和健壮性 🚀♥

软件更新

bita 是一个通用的文件同步工具,但它的开发是为了嵌入式/IoT系统的软件更新而考虑的。

软件更新是 bita 可能提供显著带宽降低的一个典型用例,其中可以预期新的软件镜像将包含大量已在更新系统上存在的数据。bita 可以识别系统上已存在的部分(),并从远程获取缺少的部分,同时输出与存档源文件精确匹配的克隆。

无需为不同的发布版本预构建补丁文件。无需运行任何特殊文件服务器。只需使用 bita compress 压缩发布镜像,将存档上传到任何HTTP文件托管站点。然后使用系统上可用的任何本地数据使用 bita clone 克隆存档。

concept

压缩

在压缩输入文件时,使用滚动哈希扫描块边界。默认设置下,大约每64 KiB应该找到一个合适的边界。块被定义为两个边界之间的数据。对于每个块,都会生成一个强哈希(使用blake2)。然后将输入文件中的块位置(偏移量和大小)以及强哈希存储在字典中。如果块的强哈希之前没有见过,则块数据也会使用brotli进行压缩,并插入到输出存档中。

最终存档将包含一个字典,描述输入文件中块的顺序以及重建输入文件所需的压缩块。存档还将包含在扫描输入文件块时使用的配置。

克隆

在克隆过程中,首先从远程存档中获取字典和块分割器配置。然后使用在构建存档时相同的配置扫描给定的种子文件中存在的块。扫描使用与构建存档时相同的配置。在种子文件中找到的任何块都将复制到输出文件中,位置由字典指定。当所有种子都被消耗后,如果还有缺失的块,将从中远程存档中获取、解压缩并插入到输出文件中。

为了在克隆时保持HTTP开销低,所有相邻的块将使用单个请求获取。如果可能,整个克隆操作将使用相同的连接。

bita还可以使用输出文件作为种子,并在原地重新组织块。除了出于节省带宽的明显原因外,这还可以让bita避免写入输出文件中已经存在的块。如果写入存储速度慢或者我们想避免在存储设备上产生撕裂,这可能很有用。

在写入输出之前,每个块(无论是从种子还是从存档获取的)都会通过其强哈希进行验证。bita在克隆过程中避免使用任何额外的存储空间,唯一写入的文件是给定的输出文件。

扫描块

将文件分割成块的过程在很大程度上受到了rsync中使用的流程的启发。其中,一个字节的字节数据窗口(对于RollSum默认为64,对于BuzHash默认为20)在输入数据中滑动。

对于窗口的每个位置,都会生成一个短校验和。如果我们假设校验和具有均匀分布,我们可以说在某个概率下,这个校验和将在每个n字节间隔的值域内,其中n代表平均目标块大小。

当校验和在这个值域内时,就找到了一个块边界。然后为最后一个边界和这个边界之间的数据生成一个强哈希(blake2)。强哈希用于识别这个块,而较弱的滚动哈希永远不会被存储,仅用于查找块边界。

平均目标块大小和块大小上下限是运行时可配置的。

服务器要求

提供bita存档的服务器可以是任何支持范围请求的HTTP/HTTPS服务器,这应该是大多数。

从crates.io安装

使用cargo安装bita

olle@home:~$ cargo install bita

从源代码构建

olle@home:~$ cargo build

使用rustls TLS后端以发布模式构建

olle@home:~$ cargo build --release --no-default-features --features rustls-tls

示例用法

从文件release_v1.1.ext4创建一个压缩存档release_v1.1.ext4.cba

olle@home:~$ bita compress -i release_v1.1.ext4 release_v1.1.ext4.cba

使用块设备/dev/mmcblk0p1作为种子,以及/dev/mmcblk0p2作为目标进行克隆

upgrader@device:~$ bita clone --seed /dev/mmcblk0p1 https://host/release_v1.1.ext4.cba /dev/mmcblk0p2

在克隆时使用输出(/dev/mmcblk0p1)作为种子

upgrader@device:~$ bita clone --seed-output https://host/release_v1.1.ext4.cba /dev/mmcblk0p1

也可以克隆本地存档

upgrader@device:~$ bita clone --seed-output local.cba local_output.file

使用stdin(-)和块设备/dev/sda1作为种子克隆位于https://host/new.tar.cba的文件

olle@home:~$ gunzip -c old.tar.gz | bita clone --seed /dev/sda1 --seed - https://host/new.tar.cba new.tar

比较两个文件系统镜像,查看它们在不同分块参数下的共享内容量

olle@home:~$ bita diff release_v1.0.ext4 release_v1.1.ext4
olle@home:~$ bita diff --hash-chunking BuzHash --avg-chunk-size 8KiB release_v1.0.ext4 release_v1.1.ext4

类似工具和灵感

依赖项

~16–31MB
~645K SLoC