Ubuntu Snap

2025年03月17日 | 阅读 9 分钟

什么是 Snap?

Snap 是由 Canonical 为操作系统开发的软件部署和打包系统,它应用于 Linux 内核。几个被称为 **_snaps_** 的软件包,以及使用它们的工具 **_snapd_**,适用于各种 Linux 发行版,并允许上游软件开发人员直接向用户分发其应用程序。Snap 是一个独立的应用程序,在沙盒中执行,并对主机系统进行调解访问。最初,Snap 是为云应用程序发布的,但后来也被移植用于桌面应用程序和物联网设备。

Snap 的功能

Ubuntu Snap

常见 Linux 软件包

Snap 是一个自包含的软件包,它实现了各种 Linux 发行版。它与传统的 Linux 软件包管理方法不同,后者需要为所有 Linux 发行版提供特别适配的软件包。

Snap 的文件格式是一个单独的压缩文件系统,采用 **_SquashFS_** 格式,使用 **_.snap_** 扩展名。此文件系统包含软件、它所依赖的库以及信息元数据。此元数据由 **_snapd_** 开发,用于为该软件设置一个适当形状的受保护沙盒。Snap 由主机操作系统定位,并在安装后文件被使用时解压缩。然而,它的好处是 snap 占用更少的磁盘空间,这意味着一些大型应用程序启动速度会更慢。

Snap 和其他常见 Linux 打包格式(如 **_Flatpak_**)之间的一个重要区别是,Snap 为任何类别的 Linux 软件提供支持,如物联网应用程序、服务器工具、桌面应用程序,甚至打印机驱动程序堆栈等系统服务。为了确保这一点,Snap 依赖于系统提供的一些功能,例如在 Snap 内部执行套接字激活的系统服务。这导致 Snap 仅在可以获取该 **_init_** 系统的发行版上运行最佳。

Snap 商店

它允许开发人员发布其采用 snap 封装的软件。上传到 Snap 商店的每个应用程序都会经过自动测试,例如恶意软件扫描。尽管如此,Snap 并没有捕捉到所有问题。在 2018 年 5 月的一个案例中,发现同一开发人员的两个应用程序包含加密货币矿工,这些矿工在应用程序执行时在后台运行。

Canonical 在发现此问题后,从 Snap 商店中删除了这些应用程序,并将 Snap 的所有权转移给第三方,第三方重新发布了不含任何矿工的 Snap。然而,Snap 的沙盒减少了恶意应用程序的影响,Canonical 建议用户仅从用户信任的发布商那里安装 Snap。

可配置沙盒

在 Snap 中,应用程序在容器中执行,对主机系统的访问受限。用户可以使用接口为应用程序提供对额外功能的访问,例如录制视频、访问 USB 设备和录制音频。这些接口与常规 Linux API 协商,以便应用程序可以在沙盒中运行而无需重写。

此外,桌面应用程序可以利用 XDG 桌面门户,这是一个由 Flatpak 项目创建的标准化 API,旨在为沙盒桌面软件提供对主机资源的访问。通常,这些门户提供比原生 Linux API 更好的用户体验,因为它们在应用程序使用摄像头等资源时会请求用户的许可。缺点是工具包和应用程序需要重写才能使用这些新的 API。

  • 此外,Snap 沙盒支持在 Snap 之间共享 Unix 套接字和数据。
  • 它通常用于在 Snap 之间共享常见的应用程序框架和库,通过避免重复来减小 Snap 的大小。
  • Snap 的沙盒严重依赖于上游 Linux 内核的 **_AppArmor Linux 安全模块_**。
  • 如果激活了另一个大型 **_Linux 安全模块_** (或 **_LSM_**),Snap 沙盒的安全性会降低,因为一个主要的 LSM 可以同时启用。
  • 因此,在 Fedora 等默认启用 **_SELinux_** 的发行版上,Snap 的沙盒会严重降级。
  • 然而,Canonical 正在与其他几家公司和开发人员合作,使其能够同时执行多个 LSM。
  • Snap 沙盒阻止了 Snap 桌面软件访问主机操作系统的“主题”,以阻止兼容性问题。
  • 此外,它还需要封装在一个独立的 Snap 中才能使用 Snap 的主题。

一些流行的主题由 Snap 开发人员打包,但一些主题尚未支持,不常见的主题需要手动安装。如果主题不存在 Snap 包,那么用户需要选择可用的最佳主题。工作仍在继续,以提高第三方在 Snap 中打包主题以及自动安装不常见系统主题的效率。

原子化和自动更新

Snapd 每天多次在后台使用原子更新检查每个 Snap 的可用更新并安装它们。更新可以回滚并应用 **_差分编码_** 以减小下载大小。

同时,发行商可以通过渠道更新和发布其软件的多个版本。所有渠道都有特定的风险和跟踪,代表在该渠道上发布的软件的稳定性和版本。默认情况下,Snap 使用渠道,即 **_latest/stable_**,它将在应用程序安装期间有新版本可用时自动更新到新版本。发行商可以创建额外渠道,以便用户可以选择连接到其软件的特定版本。

  • 如果发行商在新渠道中发布新的大版本,那么用户可以在选择时手动更新到任何下一个版本。
  • 原子更新可以通过一些技巧关闭。
  • 还有几种方法可以配置更新以适应特定要求。
  • 用户可以通过描述渠道选择停留在软件的特定主要版本。
  • 此外,他们可以构建更新间隔,以便有时间手动检查更新。
  • _例如_,以下命令将检查上周五 23:00 到 01:00 之间的更新

他们还可以获取长达 60 天的更新。更新会自动计量或禁用连接。一些用户抱怨,即使有这些类型的控件,也无法完全关闭自动更新。

Snapcraft

对于开发人员来说,它是一个将程序打包成 Snap 格式的工具。它可以在 Snap 支持的任何 Linux 发行版、Microsoft Windows 和 macOS 上执行。Snapcraft 在虚拟机中使用 multipass 构建软件包,以确保构建的输出相同,无论它是在哪个操作系统或发行版上构建的。

Snapcraft 支持多种编程语言(如 Rust、C/C++、Python、JavaScript、Java 和 Go)和构建工具。此外,它还允许从多个来源导入应用程序的元数据,例如 **_shell 脚本、git、AppStream_** 和 **_setup.py 文件_**。

Snap 的采用

最初,Snap 只支持全 Snap Ubuntu Core 的发行版,但在 2016 年 6 月,它被移植到各种各样的 Linux 发行版,成为通用 Linux 软件包的格式。Snap 需要 systemd,systemd 几乎存在于所有(但并非所有)Linux 发行版中。其他类 Unix 系统(如 **_FreeBSD_**)不受支持。Chrome 操作系统不直接支持 Snap,仅从其中安装的支持 Snap 的 Linux 发行版(如 Gallium 操作系统)支持。

几个 Linux 发行版开箱即用支持 Snap,例如 Ubuntu(及其衍生版,如 Xubuntu 和 Kubuntu)、Li-f-e、Solus、KDE Neon、Zorin OS 和 Manjaro。此外,Snap 也适用于其他几个发行版,例如 OpenSUSE、Red Hat Enterprise Linux、Raspbian、Pop! OS、Parrot Security OS、Open Embedded、Linux Mint、Kali Linux、GalliumOS、Fedora、Elementary OS、Debian 和 CentOS。

  • 几家桌面软件开发公司在 Snap Store 中发布其软件,包括 Spotify、Mozilla、Microsoft(用于 PowerShell、Skype、Visual Studio Code、.NET Core 3.1 的 Linux 版本)、KDE、JetBrains 和 Google。
  • 此外,Snap 还用于物联网环境,范围从面向消费者的产品到卫星通信网络和企业设备管理网关。
  • Snap 最终被服务器应用程序开发人员使用,例如 Travis CI、Nextcloud、Kata Containers 和 InfluxDB。

Canonical 在 2019 年决定在未来的 Ubuntu 版本中将 **_Chromium 网页浏览器_** 从 APT 包切换到 Snap。他们表示,Snap 使在所有支持的 Ubuntu 版本上支持 Chromium 变得更加高效。这使他们能够将工程资源集中在其他 Ubuntu 桌面部分。由于这一决定,像 Linux Mint 这样的 Ubuntu 衍生版不得不选择切换到 Chromium 的 Snap 版本,或者管理由 Canonical 管理的 Chromium 包版本。

Ubuntu 上的 Snap 软件包

Snap 定义了 Snap 安装文件和 Snap 命令。Snap 将应用程序及其所有依赖项收集到一个压缩文件中。这些依赖项可能是数据库或 Web 服务器、库文件,或应用程序启动和执行所需的任何其他内容。

Snap 使安装更容易,因为它避免了依赖地狱的痛苦。当新应用程序无法执行时,就会出现这种情况,原因可能是所需的资源不可用,版本错误,或者其安装覆盖了以前应用程序所需的文件,导致它们无法执行。

我们可以假定 Snap 在安装时被解压缩并提取文件。然而,在运行时,Snap 文件被放置在一个块循环设备上。这允许访问文件的内部 **_SquashFS_** 文件系统。应用程序以隔离和封装的方式运行,因此其文件不会干扰系统上存在的文件。我们甚至可以安装同一应用程序的多个版本,它们不会相互冲突或交叉污染。

  • 安装文件的缺点是比经典的 DEB 文件更大。
  • 此外,它们占用更多的硬盘空间。
  • 所有需要特定资源的应用程序都通过 Snap 安装自己的副本。
  • 这并不是最动态的硬盘空间使用方式。
  • 然而,硬盘越来越便宜,越来越大,传统主义者仍然抵制所有应用程序都在自己的迷你容器中执行的奢侈做法。
  • 此外,启动应用程序的速度也较慢。
  • 此外,Snap 还因不遵循桌面主题和其自动更新而受到批评。
  • 有些人持怀疑态度,因为 Snap 不一定由软件作者创建。因此,他们不认为它们是 100% 官方的。

因此,Canonical 用一个默认安装 Snap 的 Ubuntu 软件应用程序取代了 Focal Fossa。

Ubuntu 软件中心

要列出安装在计算机上的文件系统(即 **_SquashFS_**),我们可以使用 **_df_** 命令。我们将使用 **_-t_** 选项将结果限制在我们感兴趣的文件系统。

命令如下:


Ubuntu Snap

然后,我们将使用命令列出已安装的 Snap


Ubuntu Snap

有两个不同的 Snap 对应于 GNOME 桌面,两个对应于 Snap 的核心功能,一个用于 Snap Store,一个用于 GTK 主题。此外,snap-store 应用程序本身也是一个 Snap。

注意:如果在终端窗口中执行命令 snap-store,则应用程序是 Ubuntu 软件。

我们通常会通过选择其图标来执行 Ubuntu 软件。我们使用命令行启动它,以证明在表面之下,它现在是 snap-store 软件


Ubuntu Snap

Ubuntu 软件看起来和我们想象的一样。我们可以找到以前的所有软件。

让我们找到并安装应用程序 **_“sqlitebrowser”_**。输出屏幕显示应用程序的信息。我们可以选择安装选项来安装应用程序。

如果我们不知道,我们不会怀疑引擎盖下的修改。我们需要向下滚动,我们会看到一些新的和 Snap 特定的信息。

信息列表提供了以下详细信息

Ubuntu Snap
  • 通道: 它是安装将从中拉取应用程序的通道。
  • 许可证: 它指定许可证的类型。
  • 版本: 它指定版本的类型。
  • 来源: 它是 Snap 将从中下载的来源(Canonical 的 Snapcraft Snap 商店是 io
  • 开发人员: 开发人员是制作 Snap 或编写应用程序的人。
  • 下载大小: 它指定 Snap 文件的大小。

通道可以是以下之一

Ubuntu Snap
  • 候选: 它不太稳定。尽管如此,它非常接近稳定通道,因为它包含发布候选级别的软件。
  • 稳定: 这是默认通道,包含最可靠和稳定的软件包。
  • Edge: 它是为好奇和早期构建测试人员准备的。我们不应该将其用于任何重要的事情。
  • Beta: 它是开发后期周期质量,但不保证稳定。

安装过程完成后,我们可以再次使用以下命令检查已安装的 Snap 列表


Ubuntu Snap