[Feelings & Sharing] 【科普】Linux发行版上的软件包管理器以及它们的优缺点
Tofloor
poster avatar
流浪的加菲
deepin
2024-06-05 14:20
Author

Linux好用的软件多得超乎一般人想像,可是安装方法却有很多种,即使是Ubuntu这种友善的发行版,一个软件不一定只有一种安装方式。我们常见的Linux软件安装包格式一大堆,如 AppImage、Flatpak、Snap、deb等(玲珑:等等,我还没有上车呢!🤧 )。以当前实用程度来排序,估摸着排序应该是Flatpak > AppImage > Snap。

当然不管大家使用什么发行版都可以遵循一个原则:系统应用程序用原生包管理器装,桌面应用程序可以用Flatpak安装

一、名词定义

  • 桌面应用程序(desktop application):这个就是我们通常意义上说的应用软件,包含:办公软件、图形设计、影片剪辑、音频处理、浏览器、游戏等等;
  • 系统应用程序(system software):粗暴点理解为没有GUI的软件,包含:桌面环境与附属程序、输入法、驱动程序、KVM虚拟机、Docker容器、Wine相容层等
  • 二进位执行文件(binary):可执行的程序文件。
  • 原生包管理器(native package manager):Linux发行版预载用于管理系统包的程序,并有对应的安装包格式,例如APT(.deb)、DNF(.rpm)、Pacman(.tar.gz)、Zypper(.rpm)、Portage。"通常"情况下Linux发行版只会有一个原生包管理器,且不能跨发行版使用。
  • 跨发行版包管理器(distribution-agnostic package manager):能跨Linux发行版使用的包管理器,并无绑定特定Linux发行版,例如Flatpak、Snap、玲珑。

二、Linux上软件安装方式

  1. 包管理器安装,例如APT、Flatpak、Snap。可以用终端命令从仓库安装,也可以从应用商店一键安装,也可以下载安装包了双击安装。
  2. 下载二进位执行文件,解压点执行。
  3. 下载软件开发者提供的脚本(script),执行安装,例如VMWare官方安装脚本、Nvidia驱动+CUDA。脚本会0将安装文件自动塞到正确的位置。
  4. 手动取得源码,make编译安装(install from source)。

Linux不是Windows,市面上比较少有安装向导(Installation Wizard)这类的图形化程序来辅助安装,顶多就是纯文字界面引导式的安装,咱们重点讨论桌面应用程序的安装。

桌面应用程序的安装

桌面应用程序甚少会需要动系统文件,而且需要经常更新保持最新版本,所以一般是直接通过包管理的方式安装,推荐优先级如下:

跨Linux发行版的包管理器 > 系统原生包管理器 > 下载二进位执行文件 > 手动编译

任何软件都应该被包管理器控管。shamed

每个发行版有不同的包格式和包名,此外还有同一个软件的不同版本存在兼容性问题,同一个软件的同一一个版本在同一个操作系统发行版的不同系统版本上也存在兼容性问题,这个时候使用"跨Linux发行版包管理器"来安装和管理应用就显得尤其必要了。

软件除了开发成本还有维护成本,软件生态的健康发展也离不开高效便捷的软件分发服务。(想象下我开发一个办公软件,在系统层面,要给银河麒麟、统信UOS、中科方德都适配一遍,在各系统版本上,SP1/SP2、1030/1060、V20/V23 都得支持;CPU架构层面,x86、ARM、龙芯都要支持,我要更新一次应用软件的版本,这个成本真的几何式增加)

跨Linux发行版的软件打包技术,其中最著名的三个分别是:AppImage、Flatpak、Snap

这三个技术都有共同目标:解决各Linux发行版软件版本不一,开发者维护不易的问题,因此用统一打包格式,附赠一致的runtime版本,使应用程序一次打包后就可安装在多个Linux系统上。kissing_heart

不过即使如此,不是所有应用程序都会提供原生包管理器以外的版本。有的开发者可能认为提供deb包或二进制文件就够了,或者开发者根本不知道有这类格式存在。很多的开发者只提供deb/rpm包。

AppImage

AppImage在大部分Linux发行版上应该都可以开箱即用,除少数使用muslc库的除外。

  • 优点

AppImage没有包管理器机制,每个应用程序都是单一文件,它将应用程序的runtime打包在一起,主打下载即用(类似Windows的免安装exe,双击即用)

  • 缺点

AppImage看似美好,然而AppImage大多不会装到系统里面,因为不需要安装也没有快捷方式,要启动程序得到AppImage所在目录点二下。另外,由于AppImage跟一般应用程序无异,其资料放置位置是不统一的,可能会往您的家目录"倒垃圾"。此外,AppImage更新不易,需要使用者要手动下载新版的包。

虽然以上问题可以用"AppImage Launcher"解决,这仍然是不如有一个完整包管理器来管理好。

Snap

Snap主要是Ubuntu在推行的格式,Ubuntu 20.04以后正式融入系统,Kubuntu、Lubuntu、Xubntu、Manjaro、openSUSE Leap也预载了Snap。

image.png

Snap通过Snapd来更新及管理软体包,支持通过应用商店(GNOME Software、KDE Discover)来安装和管理应用程序。

  • 优点

Snap设有一套权限机制,规定应用程序能访问的硬件资源。应用程序安装后,资料统一放在~/snap目录之下,方便删除。

  • 缺点

Snap会在系统建立一堆loop device,用系统指令lsblk查看很不美观。

Snap一律需要sudo才能安装应用程序,个别使用者安装的应用程序整个系统的人都会看到,无法隔离管理。

尽管理论上Snap的源能够自建,Snap的软件源目前多只能使用Ubuntu官方的Snap Store来下载应用程序,没有第三方软件源介入的空间,且后端服务器完全是闭源软件,这等同于软件分发权力完全由Canonical控制。

另外,更麻烦的地方在于Ubuntu用指令安装部份APT包的时候,竟会强制重新导向为安装Snap版本的包。(手动吐口水~啊~tui!!😖 )

总而言之,Snap完全是以Ubuntu量身打造的包管理器,而且是半强迫使用,不适合其他Linux发行版用户。

Flatpak

Flatpak原名xdg-apps,将应用程序所需的runtime打包在一起,并通过Flatpak本身来管理、更新应用程序。支持用应用商店(GNOME Software、KDE Discover)在在安装和卸载应用程序。

预装Flatpak的Linux发行版有:Fedora、openSUSE Tumbleweed、CentOS、Linux Mint、Zorin OS等等。Flatpak软件来源主要是"Flathub",目前收录了2000款以上的应用程序,但有些组织也会自行经营Flatpak软件源,例如RedHat。

image.png

  • 优点

Flatpak引入了沙盒机制,限制应用程序可以访问的资源,统一规范APP存放资料的位置在~/.var目录下。 Flatpak可以选择将应用程序安装到系统,或者只安装给特定使用者,这样可以让一般使用者免sudo密码安装软件,并且只有该使用者能使用该程序。

Flathub跟Canonical的Snap Store不太一样,它不是一间私人企业平台,而是由GNOME非营利基金会经营的网站,提交应用程序无需费用,可自由在Github提交Flatpak包。使用者还可以自由更换Flatpak的远端软件源,不需要迁就Flathub单一平台来下载应用程序。

  • 缺点

软件包巨大。因为它把runtime包在一起的缘故,应用程序可能随便都占1GB以上。不过,只要多使用Flatpak安装应用程序,Flatpak就会让应用程序重复利用runtime,长久看来空间占用不是大问题。

沙盒权限问题。主要是对开发程序的软件不利。 Flatpak设计上就是不能跑需要sudo权限的东西的,它访问系统编译器有困难,所以Flatpak不适合装程序开发工具。

玲珑

玲珑这里就不细说了,感兴趣的可以看我之前写的帖子:

玲珑系列文章——玲珑简介-论坛-深度科技 (deepin.org)

系统应用程序的安装

系统应用程序安装在前面有提到过,建议首选原生包管理器,优先程度:

开发者提供的PPA > 包管理器的储存库 > 下载二进位执行文件 >手动编译

在我们安装系统应用程序的时候,因为会动到系统目录,其实仍然是以包管理器为主,大多数Linux发行版优先打包给包管理器使用。原生包管理器能做到安装、删除、升级、列出多余软件用一条指令解决。

另外一类情况需要注意,就是遵从"软件开发者"的建议安装方法,比如驱动程序,因为安装驱动程序是要与系统整合的。比如安装Nvidia驱动+CUDA,建议是加入Nvidia官方PPA,从Nvidia的源取得最新版本驱动,然后再用APT安装 ,而非从Nvidia网站下载安装脚本让它跑,这样要移除、升级驱动很麻烦。

Reply Favorite View the author
All Replies
流浪的加菲
deepin
2024-06-05 14:21
#1

沙发自己先坐咯yeah

Reply View the author
晚秋(lateautumn)
Moderator
2024-06-05 16:12
#2

我抢个板凳。学习了,谢谢分享。

Reply View the author
depend
deepin
2024-06-05 16:17
#3

tail 缺了个重要的包成员,那就是我最喜欢的Aur

Reply View the author
流浪的加菲
deepin
2024-06-05 16:18
#4
depend

tail 缺了个重要的包成员,那就是我最喜欢的Aur

我ArchLinux天下无敌是吧blush

Reply View the author
depend
deepin
2024-06-05 16:19
#5
流浪的加菲

我ArchLinux天下无敌是吧blush

tail 无敌的不是arch,是我大aur

Reply View the author
乾豫恒益
deepin
2024-06-05 17:12
#6

先收藏一下,然后再认真学习。。。

Reply View the author
Tonny
deepin
2024-06-05 17:17
#7
It has been deleted!
流浪的加菲
deepin
2024-06-05 17:38
#8
Tonny It has been deleted!

我觉得容器对开发者和用户来说都好啊。doubt

对于开发者:在多个发行版、多个系统版本上分发软件会变得事半功倍啊;

对于用户:安装软件再也不用考虑系统兼容性,再也不会出现系统升级后,软件不能用了的情况,也不用考虑安装软件影响系统稳定性;

Reply View the author
兆兆嘟嘟嘟
deepin
2024-06-05 20:25
#9

pacman格式写错了,应该是.pkg.tar.zst。

Reply View the author
兆兆嘟嘟嘟
deepin
2024-06-05 20:38
#10

要不要再加入函数式特殊包管理器(格式)的介绍?比如nix。

Reply View the author
ljq790615
deepin
2024-06-05 22:13
#11

期望玲珑能做的和flatpak一样好用。

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2024-06-05 23:51
#12

这知识科普的可以,赞~

Reply View the author
流浪的加菲
deepin
2024-06-06 09:53
#13
兆兆嘟嘟嘟

要不要再加入函数式特殊包管理器(格式)的介绍?比如nix。

哈哈,我觉得Nix、Guix等这些太冷门了,我也没体验过,就没放进去写。

Reply View the author
兆兆嘟嘟嘟
deepin
2024-06-06 12:46
#14
流浪的加菲

哈哈,我觉得Nix、Guix等这些太冷门了,我也没体验过,就没放进去写。

可以问问@SamLukeYes

Reply View the author