我正在为一件嵌入式设备编写软件升级功能。目前,根文件系统通过获取一个新的 rootfs.tar.gz 文件并将其解压缩到根文件系统(覆盖现有文件并添加新文件)来升级。但这不会删除不在新包中的文件。
所以现在我将不得不 rm -rf 所有现有文件,然后解压缩新的 rootfs tar 文件。这似乎需要做很多工作,并且需要很多时间,而且可能唯一改变的是一个配置文件。
相反,我希望能够将 .tar.gz 文件的内容同步到目录。这是否可行而无需通过某种中介(意思是,无需将 tar 解压到临时目录然后执行 rsync)?
直接,没有任何方法可以做你想做的事。正如评论中提到的,archivemount可能是一个选项,尽管它有其自身的限制(其中一个是依赖于在构建内核时启用的特定配置选项)。
但是,我想到了两个替代选项:
使用SquashFS映像而不是 gzip 压缩的 tar 文件。这些可以由内核直接挂载,并且在许多情况下实际上比等效的压缩 tar 文件要小。然后,您可以从已安装的 SquashFS 映像中使用 rsync。如果您使用 Buildroot 实际为此构建根文件系统,则可以选择直接生成这样的图像。
而不是只有一个根分区,而是使用两个。进行初始安装时,将所有数据写入两个分区,并将引导加载程序设置为仅从其中一个分区引导。当您升级系统时,核对另一个分区,在那里提取您的根存档,更新引导加载程序以从中引导,然后重新启动。虽然运行更新需要比您建议的时间更长的时间,但它有几个相当大的优势: