容器化包管理工具Snap

2021-08-08

< view all posts

Snap是一个比较特殊也较有争议的Linux包管理工具,从用户的角度,Snap最易被感知到的特点是all-in-one(无需依赖的)安装包和(强制的)自动更新。实际上Snap还有另一个鲜明的特点,就是容器化的软件安装。这篇笔记首先简单介绍Snap的安装和使用,之后讨论一些Snap的特性和争议。

安装和使用

Ubuntu等发行版自带了Snap,而其他很多Linux发行版则需要安装。具体可以参考此处。这里以Debian10为例,使用如下命令安装:

apt update
apt install snapd
snap install core

在官网的Store搜索到希望安装的软件后直接根据指引安装即可。一般来说对应的软件官网也会提供安装方式,如IDEA的安装方式

根据此处的文档,Snap每天会自动检查更新4次。强制的自动更新本身一些软件,如Windows很受诟病的一点,而将这个机制引入Linux的包管理确实也是饱受争议。如果希望应用总能保持最新的话,Snap确实是一个不错的选择。而在其它情况下则值得斟酌。

Snap的特性

首先说说容器化,通过Snap下载得到的“快照”是运行在容器当中,通过容器提供的接口和系统进行交互。因此容器屏蔽了不同Linux发行版之间的差异,发布者不需要为不同的Linux发布不同的编译版本,当然,需要和Snap提供的接口适配。

容器化的另一个特点是,Snap快照在其中打包了程序运行所依赖的所有库。因此通过Snap安装软件时,不需要像其它包管理工具那样首先处理并安装依赖。以上两点相结合,Snap大大扩展了软件的适用范围,尤其是对于小众的Linux发行版,可以通过Snap来获得通用的软件。同时节省了开发成本,开发人员不再需要提供特定于不同发行版的软件。

容器化也能够提高安全性。Snap快照在运行时会首先挂载一个独立的文件系统,和其之外的内容是隔离的。此外,Snap程序的运行还依赖于Linux内核的AppArmor Linux Security Module (LSM)沙箱,它提供对程序权限的管理控制,因此通过Snap安装的程序在请求敏感权限,如适用摄像头时会请求用户进行授权,从而提供更好的安全和隐私性。

这种容器化的安装方式当然也有其缺点,很明显的一点,打包所有依赖增加了安装包的体积和软件的空间占用。另外,软件在容器当中运行也不可避免地会损失一些性能。如果开发者对于Snap的接口和机制不够了解,还可能会导致较大的性能损失。在Snap的论坛上就有例子

同样得益于容器化,但是非常有争议的另一个特点就是Snap的自动更新功能。上面也提到过,Snap的自动更新是无法取消的。它提供了和Windows类似的推迟和暂停更新的功能,但是并不支持永久地关闭更新,除非使用一些hack的手段。

强制的自动更新确实能提高安全性,能够让严重漏洞在第一时间得到修复。不过另一方面,不是所有用户都会喜欢频繁更新使用软件的版本;实际上有的软件并不适合自动更新版本,例如服务器上的某些不能随意中断的任务,或者随着版本更新容易发生问题的驱动程序等。

尽管有不少批评的声音,但从Snap官网的商店内容就能看出,它确实受到了很多软件厂商的青睐。虽然限制了自由,但Snap提供的简单和易用性是其它包管理工具所难以比拟的,这毫无疑问是它得以流行的原因之一。另一方面,更新推送也是其它操作系统的应用商城标配的功能,它和软件厂商的利益是一致的,没有哪个软件公司会希望自己的用户几年都不更新软件版本:这样不仅提高维护成本,也几乎切断了软件生产者和用户的连接渠道。因此,软件公司也有动力开发适配Snap的软件版本,推动了Snap生态的壮大。