仅使用新文件中的更改来更新库文件

仅使用新文件中的更改来更新库文件

让我们假设以下场景,两台 Linux 计算机 A 和 B 通过特殊的硬件无线电链路连接,该链路并不总是可用。两个 Raspberry Pi 可能会出现这种情况。没有一台计算机可以访问互联网。

Linux A 有一个名为 libabc.so 的库,大小为 1GB,Linux B 有该库的源代码。假设 Linux B 中的某个用户更改了源代码中的单个常量并重新编译了库。

有没有什么方法或工具可以将更新从 Linux B 发送到 Linux A,而无需发送整个 1GB 重新编译的文件?

我正在考虑以git某种方式使用,但它不存储非文本文件的增量更改。据我了解rsync也会同步整个文件。在这两种情况下,我都无法通过无线电链路轻松访问另一台计算机中的文件系统。因此,在这两种情况下都会发送 1GB 的数据。另一种解决方案是在 Linux A 上克隆和更新源代码,但编译需要时间,而 Linux B 的性能要好得多。

最后的解决方案是我自己编写一个像这样的轻量级工具。但我怀疑已经有一些可用的东西了。

答案1

据我了解rsync也会同步整个文件。

它将同步文件。但默认行为(对于网络传输)不是在文件已存在的情况下发送整个数据,而是计算和比较滚动块校验和。如果存在共性,这会减少必须发送的数据。

Rsync 的工作原理实用概述

如果不跳过某个文件,则接收方的任何现有版本都会成为传输的“基础文件”,并用作数据源,这将有助于消除发送方必须发送的匹配数据。为了实现数据的远程匹配,为基础文件创建块校验和并在文件索引号之后立即发送到发送者。

...

如果发现块校验和匹配,则将其视为匹配块,并且任何累积的不匹配数据将被发送到接收器,然后是匹配块的接收器文件中的偏移量和长度,并且块校验和生成器将被推进到匹配块之后的下一个字节。

相关内容