在 Linux 系统中,使用 snap 安装软件包可以有效解决依赖冲突问题,并避免破坏其他应用程序的正常运行。Snap 软件包最初是为 Ubuntu 设计的,但现在已广泛应用于各种 Linux 发行版。
什么是 Snap 软件包?
过去,在 Linux 上安装应用程序往往令人感到沮丧。用户可能会发现安装过程中缺少特定的库或依赖项,或者版本过旧。为了解决这个问题,可能需要手动寻找并安装缺失的资源,却又可能导致其他应用程序因依赖库版本冲突而无法正常工作,陷入“修复一个,破坏一个”的恶性循环。
尽管包管理系统(例如 apt, dnf, 和 pacman)在一定程度上改善了这种情况,但当需要安装同一应用程序的不同版本,或遇到应用程序之间因依赖特定库版本而冲突时,仍然存在问题。
为了解决这些问题,出现了一种新的应用程序打包和部署系统,Snappy 就是其中一种流行的方案。它基于名为 Click 的打包和部署系统,该系统起源于 Ubuntu Touch 项目。AppImage 和 Flatpak 也是您可能遇到的其他类似系统。
这些系统将应用程序及其所有依赖项和其他要求打包到一个压缩文件中。然后,应用程序在一个微型容器中运行,实现沙盒隔离,与其他应用程序相互隔离。这意味着每个应用程序都有自己独立的依赖项和资源。
与传统的安装方式不同,这些软件包不会对需要相同资源但不同版本的其他应用程序造成任何问题。即使两个应用程序需要冲突的库版本,由于它们在各自的沙箱中运行,也可以同时安装和运行。
那么,这些“非传统”的软件包是如何工作的呢?其实,单个包文件会被下载、解压并挂载为一个 SquashFS 虚拟文件系统,然后以虚拟环境的形式呈现给用户。所有这些过程都在后台进行,用户只需知道已经安装了一个应用程序并可以正常使用。
当然,由于每个包文件都必须包含应用程序所需的所有资源,因此包文件可能会很大。例如,如果两个不同的 snap 应用程序都需要相同的资源,如 MySQL 或 Apache,它们各自会携带自己的副本,导致重复资源占用。
这是为了安装的简单性和消除资源冲突而做出的折衷方案。
安装 snapd
Snappy 在 Ubuntu 16.04 中引入,因此如果您的系统是该版本或更高版本,则可以直接使用。在我的机器上,Manjaro 18.04 已经安装了 Snappy,但在 Fedora 31 上,我需要手动安装。
“snap”既是包文件的名称,也是用于与它们交互的命令。实际上,snapd 守护进程是您需要安装的软件包的名称,如果您的计算机上还没有 Snappy。
要在 Fedora 上安装 snapd,请执行以下命令:
sudo dnf install snapd
如果需要在 Manjaro 上安装,可以使用以下命令:
sudo pacman -Sy snapd
sudo systemctl enable --now snapd.socket
通过 `snap version` 命令,您可以查看 snap 客户端、snapd 守护进程和软件序列号的版本信息。此外,还会显示您的 Linux 发行版名称和版本以及内核版本。
输入以下内容:
snap version
安装 Snap 包
安装 snap 包非常简单。您可以使用 `snap` 命令查找和安装您想要的软件包。
例如,要查找并安装 GIMP 图像编辑器,您可以输入以下命令:
snap find gimp
`snap find` 命令会搜索与关键词“gimp”匹配的结果并返回。它会找到所有匹配或包含搜索词的条目。
要安装其中一个软件包,请使用 “Name” 列中的值,如下所示:
sudo snap install gimp
在下载过程中,进度百分比会不断增加,同时会有一个进度条从终端窗口左侧移动到右侧。安装完成后,将显示一条消息(如下所示),通知您软件包已成功安装。
您可以使用 `df` 命令 检查 Linux 计算机上各种文件系统的容量和使用情况。如果我们将 `df` 命令的输出通过管道传输到 `grep` 命令,并搜索“gimp”,我们可以 定位 我们刚刚安装的软件包的条目。
输入以下命令:
df | grep gimp
这表明 snap 包被挂载,就像它是一个文件系统一样。挂载点位于 /snap 目录下的 `/snap/gimp/252`。 “252” 是该版本的 GIMP 的发行号。
文件系统列为 `/dev/loop18`。循环设备文件用于将常规文件作为块设备访问。它们通常用于在磁盘映像中挂载文件系统。在这种情况下,它们挂载了 snap 包中的 SquashFS 文件系统。“18” 表示这是此 Linux 计算机上使用的第 18 个 `/dev/loop` 设备文件。
我们可以使用 `df` 命令快速验证这一点。 我们将使用 `-t` (type) 选项将输出限制为仅显示 SquashFS 文件类型。
输入以下命令:
df -t squashfs
列出了已挂载的 SquashFS 文件系统。每个文件系统都由 `/dev/loop` 设备文件处理,总共有 18 个。
每个文件系统都挂载在 `/snap` 目录下的一个目录中。但这并不意味着计算机上安装了 18 个不同的 snap 包。因为这是一个 Ubuntu 发行版,默认已经安装了一些 snap 包,而我们刚刚安装了另一个。
此外,当您安装 `snapd` 时,它还会安装一些核心 snap 包来满足其他 snap 包的需求。
我们可以使用 `snap list` 命令列出已安装的 snap 包,如下所示:
snap list
输出结果略宽,因此列表的末尾如下所示。
这是完整的列表:
Name Version Rev Tracking Publisher Notes core 16-2.43.3 8689 stable canonical* core core18 20200124 1668 stable canonical* base gimp 2.10.18 252 stable snapcrafters - gnome-3-26-1604 3.26.0.20191114 98 stable/… canonical* - gnome-3-28-1804 3.28.0-16-g27c9498.27c9498 116 stable canonical* - gnome-calculator 3.34.1+git1.d34dc842 544 stable/… canonical* - gnome-characters v3.32.1+git3.b9120df 399 stable/… canonical* - gnome-logs 3.34.0 81 stable/… canonical* - gnome-system-monitor 3.32.1-3-g0ea89b4922 127 stable/… canonical* - gtk-common-themes 0.1-28-g1503258 1440 stable/… canonical* -
如您所见,这里安装了 10 个 snap 包,而不是 18 个。但是,这 10 个包产生了 18 个 SquashFS 文件系统。表格列是不言自明的,这里简单解释一下:
名称:已安装的 snap 包的名称。
版本:snap 包中软件的版本号。
Rev:snap 包的修订号。
跟踪:此 snap 包监视更新的通道。有四个:
稳定:默认通道。顾名思义,该频道包含最稳定的软件包。
候选:这个频道不太稳定,但非常接近它,因为它包含发布候选级别的软件,即代码已完整。在移至稳定通道之前,它会进行最终测试。
Beta:此渠道的质量处于开发周期的后期,但不能保证稳定性。
Edge:适用于早期构建测试人员。您不应将此频道用于重要工作或生产计算机。这里风险较高!
发布者:发布 snap 包的个人、公司或组织。如果它是经过验证的发布者(并且您的终端窗口支持 统一码),您会在发布者名称旁边看到一个绿色复选标记。如果不能显示复选标记,您会看到一个星号。
注意:任何评论或附加信息都会出现在这里。
快照频道
您可以使用 `info` 选项来获取 snap 包的详细描述。
snap info gtk-common-themes
这
我们可以看到包正在跟踪哪个通道,以及四个通道中每个通道的 snap 包中的软件版本。在大多数情况下,您应该保持在稳定通道。
snap 包每天检查四次,以查看它正在监视或“跟踪”的频道是否有更新的版本可用。如果要更改 snap 包跟踪的频道,可以使用 `refresh` 和 `–channel` 选项。
sudo snap refresh gtk-common-themes --channel=beta
这
如果有更新版本的软件可用,则会安装,但这里不是这种情况。不过,snap 包现在正在跟踪 beta 通道。一旦发布新的测试版,它将自动下载并升级。
可以使用 `–list` 选项检查是否有更新可用于您的计算机上安装的任何 snap 包。
sudo snap refresh --list
这
如果您的计算机上 snap 包正在跟踪的任何频道包含较新的软件版本,则会通知您。
sudo snap refresh gtk-common-themes
这
删除 snap 包
sudo snap remove gimp
这
快照备忘单
使用 snap 包非常简单,下面是一些常用命令的列表:
搜索包: `snap find package_name`
安装包: `sudo snap install package_name`
查看所有已安装的软件包:`snap list`
获取有关单个包的信息: `snap info package_name`
要更改包跟踪更新的频道: `sudo snap refresh package_name –channel=channel_name`
要查看是否有任何已安装的软件包有更新:`sudo snap refresh –list`
手动更新包:`sudo snap refresh package_name`
卸载包: `sudo snap remove package_name`