snap 打包格式最终让我们摆脱了依赖地狱,允许每个包都有自己的依赖副本。我对它如何做到这一点的技术细节很感兴趣。它如何处理:
- snap 是否取决于当前版本中已通过 deb 软件包安装的库版本?它是否忽略已安装的库?
- 不同的 snap 指定了同一个库的同一个版本?它能以某种方式进行重复数据删除吗?
- 很多 snap 程序可能会用到核心库的更新?OpenSSL 是一个巨大的痛点。
xdg-app 有个东西叫“运行时”:
xdg-app 中的一个基本概念是运行时/应用程序分离。每个应用程序都依赖于一个运行时,它提供应用程序所依赖的核心库。运行时通常由许多应用程序共享,但用户可以同时安装多个运行时。
在 OpenSSL 的情况下,它似乎是 xdg-apps 中运行时的一部分,因此对 OpenSSL 的更新应该透明地影响使用相同运行时的所有 xdg-apps。
答案1
前两种情况处理得非常巧妙。
讨论的有趣功能之一是对 Snap 软件包中的内容进行重复数据删除支持。Snap 将根据文件哈希自动对 Snap 之间共享的通用文件进行重复数据删除。文件系统层将进行重复数据删除,Snap 下载将进行重复数据删除(支持服务器),也许还会对来自链接器的映射库进行重复数据删除。重复数据删除是一项大工程,可能需要一段时间才能完全实现,但无论如何,这是一个有趣的目标。
来源:http://www.phoronix.com/scan.php?page=news_item&px=Ubuntu-Snappy-Deduplication
至于第三种情况,它们与您提到的运行时类似:
Snappy 机器由三层组成:系统层(由 Canonical 提供)、框架层(由供应商与 Canonical 合作生产,用于扩展基础系统)以及一组由供应商直接提供的 Snappy 应用程序。更新任何部分都只是意味着使用只读映像的新版本。恢复到以前的版本也同样容易。
来源:http://www.ubuntu.com/cloud/snappy
目前还没有很好的文档来描述框架,主要是因为他们似乎仍在研究框架的界限。以下是他们邮件列表中的摘录,可能有助于澄清一些问题。
我正在尝试使用框架来通过软件和服务来扩展 Snappy 基础系统,许多 snap 都需要这些软件和服务,但由于更新问题和大小,这些软件和服务不应包含在任何 snap 中。我对此最好的例子是 openssl 二进制文件。许多 snap 都需要它来生成和验证密钥和证书。
我想用框架解决的另一个问题是访问系统范围的资源,尤其是端口。例如,Web 服务器框架将为其他 snapps 提供方法,通过反向代理将其 Web 服务 API 和端点注入运行 Web 服务器的框架。
IRC 上有人告诉我我有点滥用框架概念,但这两个问题仍然经常出现在我的办公桌上。
来源:https://lists.ubuntu.com/archives/snappy-app-devel/2015-November/000442.html
答案2
我认为 snap 包不会检查哪些依赖项已经安装。它只是包括了所有依赖项和运行时(这也是 LibreOffice snap 包大小为 287 MB 而 flatpak 包大小约为 200MB 的部分原因)。
Snap 几乎包含软件运行所需的所有内容。我认为 Snap 之间不会共享任何内容。
但是,当 snap 更新时,它只会下载新的依赖项,而不是整个 snap。
答案3
关于 snap 打包处理共享依赖的方式,需要做更多的说明。
Snap 几乎包含软件运行所需的所有内容。我认为 Snap 之间不会共享任何内容。
其中一个答案中的这个陈述部分正确,但是除核心 snap 之外的所有已安装的 snap 包都依赖于两个包,其中一个是核心 snap。
snapd- 在 16.04 及更高版本中默认安装
核 - (核心 snap)在安装第一个 snap 包时会自动下载并安装
除了核心本身之外的所有 snap 包都依赖于核心 snap。如果核心 snap 出现问题,那么其他 snap 包中的部分或全部将无法工作。核心 snap 出现问题可以通过以下两种方式修复。
更新核心 snap。即使这不起作用,运行以下命令的结果也会提供有助于解决问题的其他信息。
sudo snap refresh core
卸载核心 snap 和所有 snap 包,然后重新安装它们。
sudo snap remove core snap-package1 snap-package2 sudo snap install core snap-package1 snap-package2