使用 rsync 从 tar 恢复文件

使用 rsync 从 tar 恢复文件

我正在为一台嵌入式设备编写软件升级功能。目前,根文件系统的升级方式是获取新的 rootfs.tar.gz 文件并将其解压到根文件系统(覆盖现有文件并添加新文件)。但这不会删除新包中不存在的文件。

所以现在我必须 rm -rf 所有现有文件,然后解压新的 rootfs tar 文件。这似乎是一项艰巨的工作,需要花费很多时间,也许唯一改变的是一个配置文件。

相反,我希望能够将 .tar.gz 文件的内容同步到目录。这是否可以在不通过某种中介的情况下实现(意思是,无需将 tar 解压到临时目录然后执行 rsync)?

答案1

直接,没有任何办法可以做你想做的事。正如评论中提到的,存档挂载可能是一个选项,尽管它有自己的限制(其中之一是依赖于构建内核时启用的特定配置选项)。

但是,我想到了两种替代选择:

  1. 使用壁球FS图像而不是 gzip 压缩的 tar 文件。这些可以由内核直接安装,并且在许多情况下实际上比等效的压缩 tar 文件小。然后,您可以从已安装的 SquashFS 映像中使用 rsync。如果您使用 Buildroot 来实际构建根文件系统,则可以选择直接生成此类映像。

  2. 不要只使用一个根分区,而是使用两个。当您进行初始安装时,将所有数据写入两个分区,并将引导加载程序设置为仅从其中一个分区引导。升级系统时,核对另一个分区,在那里提取根存档,更新引导加载程序以从该分区引导,然后重新启动。虽然这将比您建议的运行更新花费更长的时间,但它有几个相当大的优点:

    • 它可以让您几乎立即回滚破坏某些功能的升级。您无需重新安装旧固件,只需更新引导加载程序即可从其他根分区引导并重新启动。
    • 这使得系统变得非常困难。由于您仅在更新完成后才更新引导加载程序,因此您可以保证不会因更新过程中断电而引导至部分根文件系统。
    • 它使得无需 RAID 即可从存储硬件中的静态数据损坏中恢复(尽管如果需要成为可靠的设备,无论如何您都应该认真考虑 RAID)。如果您知道当前版本“不好”,只需暂时回滚到前一个版本,然后重新安装新版本即可。
    • 它减少了停机时间。对于您的策略,您必须在设备功能离线的情况下完成几乎所有操作(否则您将面临更新过程中出现神秘故障的风险)。使用此方法,您可以将更新所需的停机时间减少到重新启动设备所需的时间。

相关内容