为什么Ubuntu要转向Snap软件包?

为什么Ubuntu要放弃.deb包,转而使用.snap包?
至少目前他们还会保留.deb包用于正常发行。.deb已经是目前最流行的打包格式。
这里链接提供了Snap包格式的一些概念。但是现有的deb包会发生什么呢?转向Snap是否有明显的优势?值得付出这样的努力吗?

2链接已损坏。 - y30
4个回答

Snap试图解决Linux作为桌面操作系统的一个根本问题:软件可用性和软件分发。然而,Snap并不打算完全取代deb包。Snaps和Debs可以共存。
我是一个Linux爱好者,也是一个Linux应用程序的项目经理。虽然我喜欢整个Linux系统,但我无法忍受当前的软件包分发状态。像Snaps这样的通用应用格式旨在解决这个根本问题。
在Linux中,软件包是专门为单个版本的单个发行版构建的。通过大量调整,可以制作一个.deb软件包,在所有基于Debian的系统上运行,但这很复杂并且限制了开发人员。有时由于依赖项的版本锁定,这也不太实际。
如果我为Ubuntu 20.04创建一个deb软件包,它只能在那个版本上运行。我还必须为16.04、18.04、20.10等版本制作不同的软件包。仅仅为了Ubuntu就已经要做四个软件包了。我还需要为每个Debian版本、每个Fedora版本和每个openSUSE版本制作软件包。RPM在这方面更灵活,但锁定依赖问题仍然会妨碍安装。
这意味着如果我想发布应用程序的新版本,我必须创建超过20个软件包以覆盖大多数Linux发行版,但这仍然不能涵盖每个发行版。第二种可能性是等待发行版维护者将您的软件包添加到发行版中,但这通常需要荒谬的时间。此外,发行版维护者决定用户获得哪个版本,而不是软件开发人员。
使用Snap,单个软件包可以在支持Snap的每个发行版的每个版本上运行。请参见Installing snapd以获取支持Snap的许多发行版列表。
此外,使用Snap时,开发人员发布和维护软件包,而不是分发维护者。因此,作为开发人员,我可以向所有用户发布新版本,而无需等待其他人。
基本上,Snaps试图解决我对传统Linux软件包分发的所有讨厌之处。尽管需要注意的是,这些核心问题也在Flatpaks和在某种程度上AppImages中试图解决。关于哪种格式更好的讨论备受争议,比起这个回复来说,这是一个更长的话题。目前,我会说我可以接受运行任何一种通用格式,因为它们都有不同的工作方式,因此彼此之间不会冲突,可以同时运行这三种格式和传统软件包。如果必须选择,我可能会选择Flatpak,因为它们似乎在功能兼容性方面更加通用。
简而言之,
对于开发人员和用户来说,Linux软件包分发非常糟糕。Snaps、Flatpaks和AppImages旨在解决Linux系统的这个根本问题。
这个问题实际上是关于为什么要进行这个举措,但如果有人对了解Snaps是什么以及它们如何工作感兴趣的话,我创建了这个视频来详细解释结构。

26哎呀,你说得好难啊,除了没有人支持那么多版本的Fedora、Debian或Ubuntu。等到16.04发布时,15.04已经停止维护了。等到Fedora 23发布时,F21只剩下不到一个月的寿命,刚好够人们跳过一个版本。虽然这也没什么关系。一旦你写好了基本的RPM规范文件或基本的Debian软件包,其他发行版只是稍作调整,然后使用Jenkins来为每个新版本构建它们。 - John Franklin
20Ubuntu的软件包适用于许多版本:14.04、15.10、16.04以及一些继续支持旧的LTS版本,比如12.04,该版本仍然得到支持。|| Fedora没有LTS版本,所以要支持的版本较少,但至少有2个版本,可能还有3个版本需要支持。|| 对你来说哪个听起来更好?A. 为一个发行版制作每个版本的同一应用程序的多个软件包,并为多个发行版做同样的事情。或者B. 为您的应用程序的每个版本制作一个snap,它可以在任何发行版和任何发行版的任何版本上运行。是的,在这种情况下我投票支持snaps。 - Michael Tunnell
5A. 多个软件包,因为选择B意味着我现在要负责跟踪snap中所有组件的安全更新,并在任何一个组件有安全更新时更新snap。让发行版来担心这个问题吧。|| 当一个发行版发布新版本时,并没有义务更新之前的版本。比如说Fedora 23有我的软件包的1.0版本,而Fedora 24有1.1版本。除非我将关键错误修复回溯到1.0.1版本,否则Fedora 23可能永远不会看到1.0的更新。即使是这种情况,我仍然在git的1.0分支上保留了原始的spec文件。 - John Franklin
1大多数人不同意你的观点,我可以告诉你一个事实,许多公司选择忽视Linux是因为选项A。|| 跟踪应用程序的安全性太难吗?无论是否使用snaps,开发人员都应该做到这一点。|| 没有义务更新之前的版本...这是真的,就像没有义务发布软件一样,但是根据发行版和发行版版本的任意拥有不同版本的软件是愚蠢的。我们在这个问题上似乎有根本的分歧,但我想我们可以就此打住,因为我们都不太可能改变主意。 - Michael Tunnell
1在我看来,更多的冗余和因此导致的性能下降并不是一个解决方案。无论如何,如果我们想要实现冗余,我们就不需要一个新的软件包管理系统。同意Wilf的观点,这只会造成更大的混乱。 - user447607
7@user447607 你对Snaps和Snappy的理解有误。不会有大量的冗余,而是会有运行时和选项来使Snaps依赖其他Snaps以节省空间。事实上,这已经是可能的。Snappy是一个不同的软件包管理系统,处理Snaps,而apt仍然与DEBs有关。Snaps并不取代DEBs,而是增强了DEBs,从而实现了混合方法。事实上,Snaps可以通过现有的DEBs自动生成。 - Michael Tunnell
@MichaelTunnell snaps和docker容器有什么不同/相同之处?在我看来,它们提供了类似的功能,对吗?附注:刚刚发现SNAP,感到很有趣。 - konung
4@konung Docker是纯粹的容器化技术,而Snaps不仅具备容器化功能,还能与系统核心组件进行集成。例如,Docker要求将所有内容都包含在容器中才能使用。然而,Snaps只需要包含必需的部分,然后可以从snap之外利用其他资源。Snaps还拥有更好的基础设施,因为Docker没有真正的更新机制,而Snaps利用了类似于Debian的APT软件包管理系统。我建议您查看我在原帖中提供的视频链接。我计划很快发布一个更新版本。 - Michael Tunnell
@MichaelTunnell 谢谢。我会在周末看的! - konung
@MichaelTunnell snap中的数据如何在版本之间持久保存?以MySQL snap为例,数据库数据存储在哪里?更新会对其产生什么影响?(不一定是MySQL,你熟悉的其他snap也可以作为示例) - konung
9@konung Snaps不是容器。很多人将它们与Docker进行比较,但Docker是真正的容器,而Snaps不是。Snaps类似于容器,但它们不是完整的容器,因为它们允许在限制范围之外进行例外处理。例如,设置/配置/数据等内容存储在Snap之外的/home文件夹中。这样,您可以拥有任意数量的Snap版本,所有版本共享相同的数据/配置。 - Michael Tunnell
不客气。很高兴我能帮到你。 :) - Michael Tunnell
我从Ubuntu换到了Arch。生活再也没有比这更简单的了。所有的软件包都是最新的,而apt-get却失败了。 - Qian Chen
@Elgs Qian Chen 直到你遇到一些应用程序更新而其他应用程序没有更新的依赖问题...此外,AUR需要重新构建你使用的每个应用程序,即使是稍微过时的依赖也会破坏pkgbuild...等等。所有操作系统都有问题,你只需要找出你愿意处理的问题。 - Michael Tunnell
@MichaelTunnell 我已经使用它六个月了,没有遇到任何问题。我对Ubuntu已经厌倦了,因为软件包管理器并不像我期望的那样工作。也许我对最新版本特别执着。而且在Arch社区,如果有什么问题,通常几小时内就会修复。公平地说,如果我不了解Arch Linux,Ubuntu仍然是最易用(我指的是桌面)的Linux系统。 - Qian Chen
3@Elgs Qian Chen,我并不是建议你不要使用它。我认为你应该使用你想要的任何东西。我只是更喜欢澄清关于Arch的陈述,这样人们就不会随机找到一些说它有多好而没有提到注意事项的帖子。它有很多优点,但也有缺点。实际上,我是一个Arch衍生版的贡献者,所以多年来我见证了许多起伏。 :) - Michael Tunnell
虽然需要注意的是,这些问题也可以通过Flatpaks来解决。所以,如果最终我们出现了许多类似Snap的系统,并且每个发行版都使用自己的系统,那么我们不就回到了起点吗? - Fran Marzoa
@Fran Marzoa,Snaps、Flatpaks和AppImages都可以独立于发行版运行,因此它们可以在任何发行版上运行。这意味着无论用户使用哪个发行版,所有内容都将对用户可用。 - Michael Tunnell
@MichaelTunnell 我明白,但是如果你在不同的系统中有相同的软件包,那么这样做会产生冲突吗? - Fran Marzoa
@Fran Marzoa实际上不是这样的,如果你愿意的话,你可以同时安装Snaps、AppImages、Flatpaks和DEBs/RPMs。同时运行某些组合可能会出现问题,但安装它们是没有问题的。例如,我现在同时安装了Firefox DEB和Snap。我一次只能运行DEB或者Snap,但我可以关闭一个并打开另一个而没有任何问题。 - Michael Tunnell
我从不使用sudo来安装第三方软件。很高兴发现我可以使用flatpak来安装vscode而无需加上sudo前缀。 - Marinos An
1根据我的经验,某些软件包的“snap”版本(例如Skype)与使用apt-get安装的相同软件相比,打开速度非常慢。 - jchook
@jchook 这在某些情况下是正确的,因为第一次加载时需要加载更多内容,但在初始加载过程之后,重复打开应该是没问题的。然而,Skype在apt中已经被弃用,所以Snap版本非常不同且更加庞大,这并不是一个好的例子。 - Michael Tunnell
@MarinosAn,使用AppImages时也不需要sudo,但Snaps的工作方式不同,它们无法像debs那样访问和修改每个系统文件。Flatpaks还有其他问题,比如不能自动更新。 - Michael Tunnell
1@MichaelTunnell Snaps可以通过现有的DEBs自动生成 - 文档中没有任何迹象表明这一点。事实上,构建Snaps总是比构建DEBs更困难,并且文档非常不完善。 - admirabilis
1而且,它們是否值得我 26 秒啟動時間中的 10.5 秒用於 snapd.service 和 snap.lxd.activate.service? - Jason Kleban
在我看来,绝对是这样!相比花几秒钟启动时间,而要等上几个月才能得到更新……嗯,我宁愿选择等待几秒钟的启动时间。 - Michael Tunnell
所以最大的优点是软件包有更多的发布/更新? - stephanmg
1@stephanmg 最大的优势是不会发生版本锁定。DEB/RPM风格的最大问题是,如果一个应用程序需要一个库的新版本,并且该库被锁定,那么该应用程序在整个系统升级之前将无法升级。Snaps允许应用程序绕过该锁定,这意味着每个应用程序都可以在可用时进行更新。安全限制也是一个很好的额外福利。:D - Michael Tunnell
1@MichaelTunnell 谢谢!现在这一切都变得很清楚了。 - stephanmg
1@stephanmg 不用谢 :D - Michael Tunnell

这很简单。Snappy软件包包含所有所需的文件,而.deb软件包则依赖于其他软件包。
负面的一面是,Snappy更大,因为它包含了所有文件。但是,它的一个巨大优势是,您不会因为缺少依赖关系而遇到其他软件包的问题,如果您删除此软件包,也不会影响其他软件包。

16这也意味着安全的噩梦。哦,请证明我错了...因为如果我是对的,那将是如此可怕。 - Jürgen A. Erhard
42所以基本上他们正在走Windows的道路 - 这在过去被Linux用户嘲笑过,真是讽刺。 - Pithikos
2嘿 @JürgenA.Erhard,据我理解,每个软件包都有自己的库,比如加密模块,所以你不需要验证一个整体(即自行编译),而是必须分别处理每个软件包,这就是你所说的“安全噩梦”吗? - Ilya
1更正一下:“包含所有所需文件”并不准确,因为有一些核心的快照可以作为运行时。然而,这是在原始答案之后添加的,所以当时是正确的,但是自那时以来发生了很多变化。 - Michael Tunnell
1快照就像MAC的.pkg文件,它们大多是自包含的,包含了所有所需的内容。 - firstpostcommenter
@AlexWLBI,提供一些参考资料对于这个答案会非常有帮助,这样我们可以看到你获取这些信息的来源。 - Gabriel Staples
谈到安全性,我在r/kyrofa上读到了这个信息。“当Ubuntu发布时,Debs通常会被冻结,而且在整个Ubuntu发布过程中,该Deb通常不会更新。根据存储库的不同,它可能会接收到安全更新和一些错误修复,但这是例外情况。然而,Snaps位于发行版之外,可以随时进行更新,这意味着Snap可能比Deb要新得多。 .. PPA允许在发行版之外更新Debs,但这需要对特定人员的信任,而不是对Ubuntu维护者的信任。” - Long

Snappy Personal,他们对软件包管理/更新的新方法,旨在更快、更可靠、事务性更强,并具有更强的安全性。
至少有一个桌面版本将采用Snappy - 计划是将Ubuntu的Desktop-Next版本从.deb转换为Snappy Personal。
.deb仍然存在,普通用户可以通过将.deb转换为snappy来正常使用它。
Snappy将用于统一ioT中软件包管理的概念,ioT现在已经将其核心操作系统设置为snappy。此外,Snappy在更新方面提供了更好的方式,并且消除了更新/升级时出现问题的可能性,因为它使用整个映像的概念,这意味着更新只是一个完整的部分,因此不会失败。
阅读这些文章以获取更多信息:

http://www.webupd8.org/2015/04/ubuntu-desktop-to-eventually-switch-to.html

http://www.itworld.com/article/2914850/linux/is-ubuntu-moving-away-from-deb-packages-here-is-the-complete-story.html

还有一个来自Ubuntu on Air的QA视频,回答了很多问题。https://youtu.be/lHO8j8uo5Z4

10为什么他们不能制作一个具有向后兼容性的 .deb 版本 2 的软件包?为什么要在 Linux 社区中分裂?目前的计划是逐渐迁移到 Snappy,除非它彻底失败。 - Vishnudev K
他们希望在当前以Snappy为核心操作系统的物联网中统一软件包管理的概念。此外,Snappy提供了更好的更新方式,并且解决了更新/升级过程中可能出现的问题,因为它采用了整体镜像的概念,这意味着更新只需一个完整的部分,因此不会出现失败的情况。 - Maythux
3在Linux中,已经有很多不同的打包方法(这已经给第三方程序带来了问题),再增加一个只会让事情变得更糟糕 :-/ - Wilf
@Maythux. 什么是物联网(IoT)? - TRiG
物联网 - Maythux
8@Maythux https://xkcd.com/927/ - user
在我看来,更多的冗余和因此导致的性能下降并不是一个解决方案。无论如何,如果我们想要实现冗余,我们就不需要一个新的软件包管理系统。同意Wilf的观点,这只会造成更大的混乱。 - user447607
不会变得更乱了……我们已经有一个巨大的混乱,让公司忽视了Linux。即使有3种竞争格式,如Snap、Flatpaks和AppImages,我们通过将30-40个软件包减少到3个来简化了情况。这无疑是一种改进。 - Michael Tunnell

考虑今天转向“snappy Ubuntu Core”,如果你打算为他人创建一些东西,换句话说,一个“产品”。
该软件以“snaps”形式提供,鉴于其特性,我们可以确信安装和升级将按照原始创建者的意图在每个系统上正常工作。其他特点包括安全性,例如隔离执行和与系统通信以及配置已安装snaps的干净接口。
为了实现这样的目标,“snaps”与Debian软件包有很大的不同:
- “snaps”位于确定的隔离系统位置,而Debian软件包则可以将文件散布到各个地方。 - “snaps”没有维护脚本。
回到最初的问题“使用还是不使用”,如果你计划用Ubuntu Core替换你的桌面,我建议你坚持使用常规的Ubuntu桌面。我个人喜欢称之为“无所谓发行版”的Ubuntu Core,因为它本身什么都没有,但提供了一个非常好的构建块来提供某种功能,这就是为什么它在物联网领域如此受欢迎的原因。

5换句话说,它就像Windows所做的那样吗? - Vishnudev K
2这是一个很广泛的问题。Windows在特定方面有什么作用? - sergiusens
6我正在Windows上安装VLC,它会安装所有需要占用空间的软件包。而在Linux中,我们只会得到我们没有的软件包。这在更新和硬盘使用方面非常方便。 - Vishnudev K
2相似,没错。这与在手机上安装apk没有什么不同。应用程序可以根据需要随着其依赖关系的变化而发展。当然,也有办法将其分割开来,比如使用framework snaps,不过这需要进行严格的安全审查。与Windows不同的是,这里没有可能随意安装到任何位置的安装程序 - sergiusens