各个系统的软件安装包格式浅析

如题。

一、Linux平台上的安装包格式

在Linux系统之前,最为广泛使用的系统之一是贝尔实验室开发的Unix。由于当时的硬件厂商很多,不同硬件之间存在很大的不兼容性(例如CPU指令集不一样)。因此,早期的软件分发方式是源代码分发,也就是说系统内置一份代码编译器,软件开发者只需要提供 .tar.gz 源代码包即可,用户下载源代码包后自行编译为可执行文件。

这一设计也被早期的Linux所继承。Linux系统内置了gcc编译器,可以完成对C/C++/Fortran/Go等语言编写的软件的编译。这种做法理论上解决了软件在不同设备上的兼容性问题。然而,随着计算机技术的发展,现在的一些大型软件的代码动辄几个GB(例如chrome和firefox的源代码已经达到了几十个GB之多,编译需要四个多小时) ,如果每个软件都要本地编译显然不现实;此外,一些商业软件的源代码是闭源的,这些软件只能以二进制可执行文件的形式发布。因此,对软件进行预编译和打包显得尤为必要。

在Linus Benedict Torvalds于1991年发布Linux系统以后,围绕Linux系统这一内核出现了许多的Linux发行版,后者除了Linux系统以外还带有完善的软件生态和包管理器(注意,Linux内核本身是不带任何包管理器的),这些发行版中比较著名的有debian和Red Hat等,这些发行版以及他们所带的包管理器深深影响了今天的Linux生态。

image.png

Wikipedia上有人用一张图片整理了Linux的各个发行版以及它们的上下游关系,可以点击这个链接进行查看。可以看出,Linux的发行版虽然很多,但如果粗略分类的话,大致可以分出Red Hat和debian两个大阵营,而这也和它们所采用的包管理器有关。下面我们将分别介绍这些包管理器格式。

(一)传统包管理器

1、rpm格式

rpm格式最初的名称叫做Red Hat Package Manager(“红帽包管理器”),是Red Hat发行版默认采用的包管理器格式。Red Hat发行版由红帽公司(Red Hat)开发和维护,后者是一家提供服务器系统解决方案和运维服务的商业公司。也正因为这一点,Red Hat发行版为世界各地的许多企业、公司等广为使用。Red Hat发行版还衍生出了许多Linux发行版,例如fedoraOS和centOS,这些发行版都以rpm格式作为包管理器格式。

rpm格式本质上是一种压缩包,其可以包含任意一组文件。大多数RPM文件都是“二进制RPM”(binary RPMs),包含某些软件的编译版本。也有少数属于“源代码RPM”(source RPMs),包含软件的源代码,安装过程需要进行编译。RPM还包含一些额外的文件,用于对安装包完整性进行校验。

能够对rpm进行解包和安装的包管理器软件包括rpm、yum、dnf等。rpm 是最早被开发出的包管理器软件(没错,包管理器软件和安装包格式同名)。使用rpm可以直接对软件包进行操作,例如安装一个软件包可以使用rpm -ivh package.rpm命令,卸载软件包可以使用rpm -e package命令。此外,rpm还提供了查询已安装软件包、验证软件包完整性等功 能。但是,使用rpm管理软件包需要手动解决依赖关系,这可能会给用户带来不便。

为了解决软件包之间的依赖关系的问题,Red Hat公司推出了yum 包管理器。yum全称Yellowdog Updater Modified(“Yellowdog升级器修改版”),其名称来自于Yellow Dog Linux的包管理器Yellowdog Updater。yum是基于rpm的包管理器,它解决了rpm需要手动解决依赖关系的问题。yum可以自动从指定的软件源中获取软件包及其依赖关系,并进行安装、更新和卸载等操作。yum的优点在于可以自动处理依赖关系,并且支持从多个软件源中获取软件包。此外,yum还提供了丰富的命令行选项和功能,如搜索软件包、查看软件包信息、清理缓存等。

dnf是Fedora、Red Hat Enterprise Linux(RHEL)和CentOS等发行版中默认的包管理器,它是yum的下一代替代品。dnf在功能和性能上进行了改进和优化,提供了更快、更稳定的软件包管理体验。与yum相比,dnf具有更快的元数据处理速度、更好的并发性能以及更简洁的命令行语法。此外,dnf还支持模块化内容、弱依赖关系处理、事务回滚等高级功能。

2、deb格式

deb是Debian软件包格式,文件扩展名为.deb,跟Debian的命名一样,deb也是因Debra Murdock(Debian创始人Ian Murdock的前妻)而得名。

与拥有大公司背书的Red Hat不同,Debian从诞生之初就是一个由社区维护的Linux发行版,然而这并不能阻挡debian的强大。作为最早的Linux发行版之一,Debian在建立之初便被定位为在GNU计划的精神指导下进行公开开发并自由发布的项目。Debian以其坚守Unix自由软件的精神,以及给予用户的众多选择而闻名。在Debian系统的基础上发展出了许多著名的Linux发行版,例如Ubuntu(由英国公司Canonical开发和维护)、优麒麟 (ubuntu中文定制版)、Raspberry Pi OS(树莓派Linux开发板的官方系统)等。

和rpm格式类似,deb格式也是对软件的编译版本和源代码的打包格式。其诞生时间比rpm晚了几年,不过支持的特性也更丰富。

能够对deb进行解包和安装的包管理器软件包括apt-get、apt等。dpkg是deb包的解包和安装工具,类似于Red Hat系统上的rpm。apt-get这一高级包管理工具构建在dpkg的基础上,它是Debian系的诸多Linux发行版默认包管理器,提供了自定义软件源和自动处理依赖关系的功能。apt-get可以从指定的软件仓库中下载和安装软件包及其依赖项,使得软件包的管理变得更 加简单和方便。常用的apt-get命令包括 apt-get install package (安装软件包)和 apt-get remove package (卸载软件包)等。

apt是apt-get的下一代替代品,旨在提供更友好、更一致的命令行界面。apt与apt-get在功能上非常相似,但apt在命令语法和输出格式上进行了一些改进,使得它更加易于使用和阅读。此外,apt还支持一些 新的功能,如并行安装、进度条显示等。在最新的Debian和Ubuntu版本中,推荐使用apt来替代apt-get进行软件包管理。

另外,deb格式也为一些非debian系的系统所采用,例如在macOS上,flink 包管理器是对apt的移植,可以安装deb格式的包。此外,安卓系统上有一款著名的Linux终端程序叫做Termux ,其自带的Linux环境也使用apt进行安装包管理。

3、pacman格式

Linux发行版不止Red Hat系和Debian系。奉行简洁主义、致力于通过滚动更新来提供大多数软件的最新稳定版本的Arch Linux系统就为许多极客所喜爱,而这一系统提供的官方说明书 Arch Linux wiki 作为一份详细的Linux学习资料,也在许多圈子中广为人知。Arch Linux采用的包管理器叫做pacman,和apt/yum一样,这一包管理器可以解决安装过程中的依赖问题,自动下载并且安装所有需要的软件包,但是pacman的设计理念更简洁。

此外,与前面的系统不同,Arch Linux还有 Arch User Repository(AUR) 这一第三方存储库,这是一个面向Arch用户的社区驱动存储库,允许用户在此分发自己编写的软件包。

(二)第二包管理器

前面介绍的包管理器基本上都需要root权限才能进行软件的安装和卸载,并且依赖于特定的Linux发行版。如果有一种更加通用的包管理器,使软件安装包可以一次打包、不同发行版使用,则会大大方便用户的使用。这也是下面要介绍的第二包管理器的设计灵感来源。通过这些包格式分发的任何应用程序都可以在支持这些框架的任何Linux系统上运行。

1、flatpak格式

不依赖于特定发行版的包装格式在Linux生态系中在Flatpak前早已被提出过数次。2000年代早期,autopackage开始,2004年则是klik。到了2014年,klik便演化成AppImage,其目标是成为不依赖于特定散布版的便携式上游打包格式。Ubuntu母公司Canonical则于2016年发布了Snappy,其目标也是为了提供广泛的linux生态系一个通用的包装格式,其支持类似于Flatpak的格式,同时也支持应用程序商店式的数字发行与更新模式。

https://zh.wikipedia.org/zh-cn/Flatpak

Flatpak由红帽员工亚历山大·拉尔森(Alexander Larsson)开发,并于2015年正式发布。它是用C编程开发的,提供了在Linux发行版上安装应用程序的一种快速和直接的方法。

Flatpak的工作原理是将一个应用程序组合并编译成一个包。此前,Flatpak被称为xdg-app。这个特定的框架使用了在沙箱环境中运行应用程序而不需要根特权的概念。因此,一些flatpak应用程序不能访问和利用系统的全部资源。

Flatpak应用程序主要针对三种桌面环境——FreeDesktop、KDE和GNOME。不幸的是,Flatpak不支持任何后端工具,因为它只生成在Desktop环境中运行的应用程序。这是这个包管理器的一个主要缺点,因为它不支持服务器,除非用户安装像GNOME这样的桌面环境。

Flatpak有一个名为Flathub的在线商店,用户可以在那里找到并下载他们想要的应用程序。Flathub首次发布时,只允许开发者发布免费和开源的应用程序。然而,在更新了他们的条款和条件之后,开发人员现在甚至可以发布专有包。

2、snap格式

Flatpak背后有Red Hat公司的背书,而snap格式的背后则有Ubuntu母公司Canonical的背书。

Snap是由Canonical开发和维护的一个包管理器,于2014年首次发布。Snap是基于debian的发行版(比如Ubuntu)最好的备选包管理器之一。除了作为一个包存储,它还支持一个命令行界面来安装包。

它最初是为Ubuntu开发的,但已经很容易被其他Linux发行版采用,包括Arch、Linux Mint、CentOS、Gentoo和Fedora。这些发行版还包括对Snapcraft框架的支持。为了方便地维护包,Snap为所有Snap应用程序使用了一个中央包存储库。

同样的,Snap有一个在线应用商店(Snapcraft),用户可以在那里找到并安装应用程序。这对用户来说是一个相当大的优势,因为他们有一个大的库来搜索他们需要的任何软件包。Snapcraft也由canonical维护和控制。此外,Snapcraft框架允许开发者开发他们的包,并将它们上传到Snap商店。

然而,在推广snap格式时,Canonical公司有些操之过急,这导致了一些批评和争议。例如,在Ubuntu 22.04版本中,Firefox浏览器和chrome浏览器的下载方式从apt被替换为了snap,而snap版的Firefox浏览器稳定性欠佳(如何看待snap软件包? - 刘米藕的回答 - 知乎)。

下面这张表格比较了apt和snap两种包管理器的区别。如果更注重系统稳定性,使用apt可能更合适,因为它提供了经过测试和适应特定Ubuntu版本的软件包。如果需要使用最新版本的软件,或需要更大的独立性和隔离性,可以考虑使用snap

特征 apt snap
包的来源 Ubuntu软件仓库 Snap Store(独立仓库)
版本更新 通常稍滞后 通常提供最新版本
系统资源 共享系统库和依赖项 独立于系统,自包含依赖项
独立性 依赖系统库 自包含,不依赖系统库
隔离性 无隔离 应用隔离,避免库冲突
安装命令 sudo apt install sudo snap install
卸载命令 sudo apt remove sudo snap remove
更新命令 sudo apt update sudo snap refresh

3、AppImage格式

这个包格式是由Simon Peter开发的,并以Kik的名字首次发布到市场上。AppImage使用了与Java编程相同的概念——“编写一次,随处运行”或“一个应用程序,一个文件”。

AppImage包包含应用程序本身及其运行所需的所有依赖项 。一旦下载了文件,例如balena-etcher.AppImage,就不需要安装文件。只需为它分配正确的权限,使其可执行,然后运行它。例如,运行balena-etcher.AppImage文件,可以使用下面的命令:

1
2
sudo chmod +x balena-etcher.AppImage
./balena-etcher.AppImageCopy

从这一点上看,AppImage更像一种可执行文件的格式而非安装包格式。

像Snap和Flatpak包格式一样,AppImage也有一个在线仓库来查找和下载AppImage包——AppImage Hub网站。

要更新AppImage包,需要在下载文件时查看提供的更新指南。也可以使用AppImage Updater或下载新版本的应用程序。AppImage支持Arch Linux、Centos、Debian、Fedora、OpenSUSE、Red Hat Linux和Ubuntu。

4、玲珑格式

要谈到中国人在Linux生态中的贡献,就不得不提到Deepin OS(“深度操作系统”)。Deepin OS由武汉深之度公司开发,是国人自主知识产权的Linux发行版,最初在ubuntu系统的基础上进行重构,使用Qt框架重写了桌面管理器,即DDE(Deepin Desktop Environment),这是一个简洁美观、相当符合国人操作习惯的桌面管理器(强推!!!)。在后来的发展中,Deepin OS的上游系统逐渐从ubuntu迁移到debian,而现在他们已经实现了从Linux 内核直接构建系统,不依赖于任何发行版。

Deepin OS支持deepin store、deepin Music、deepin Movie等一系列第一方应用软件。除了深度原创应用外,它还包含了大量来自开源社区的应用软件,甚至通过WINE将一些windows平台上的软件如QQ和微信移植到了Deepin OS系统上,从而满足广大用户日常的学习和工作需求。(目前QQ有了比较完善的Linux版,但微信Linux版依然只是网页版套壳,所以Deepin OS的移植工作对于广大Linux用户来说意义重大)

deepin.png

最初,Deepin OS也使用apt-get进行包管理功能。随着Deepin OS的发展,开发人员感到apt-get无法满足一些功能,因此随着Deepin OS V23版本的发布,玲珑 包管理器也随之发布了。

根据官网的介绍,玲珑包管理器名称来源于“八宝玲珑塔,蕴含芥子乾坤般的另一个世界,状似七层实非七层,以逞道法之变化”。玲珑包管理器提升了易用性,解决 debrpm依赖冲突问题,同时加强安全防护,实现了应用权限管理机制,还支持应用增量更新。玲珑包管理器支持命令行调用,也支持图形界面下的安装和管理操作。

二、Windows平台上的安装包格式

参考:
https://zhuanlan.zhihu.com/p/571758477
https://learn.microsoft.com/zh-cn/windows/uwp/packaging

Windows 主要有4种安装程序格式,分别是MSI,EXE、AppX和MSIX。

MSI格式是Windows最基本的安装格式。MSI是Microsoft Installer的简写, 它使用微软提供的标准安装卸载界面,本质上 MSI 就是一个数据库,包含该软件的所有必要数据。安装过程不会检测该软件是否已经存在于计算机,或者是否缺少什么必备组件,它会直接覆盖安装路径中的所有文件。这种简单粗暴的方式,非常适合无人值守的情况,驱动程序大多也是用 MSI 格式安装。

EXE安装程序则更普及。本质上,EXE就是一个可执行程序,大多数Windows程序都是EXE格式。因为是程序,所以能实现更多功能,比如检测已安装项,允许自定义安装路径,安装包语言,安装密码,打开网址,版权协议显示,检测安装缺失的必备运行库,以及更漂亮酷炫的安装界面等等。上述功能需要软件厂商在发布EXE安装包时自己实现,Windows只负责执行这些EXE格式的安装程序。

AppX 是 Windows 8 后推出的新安装格式,用于 UWP 应用的安装。它继承了 MSI 的优点,就像手机软件的安装过程一样,几乎没有给用户任何选项,它允许直接覆盖升级,完全干净的卸载。另一个重要的特点在于,Appx 程序运行在沙盒中,不能访问其他应用内存、文件,因此安全性更高。这个安装格式之所以没有火起来,估计主要是对开发者太不友好,限制了软件权限,封包AppX 格式还必须重写。此外,低版本的Windows也无法使用这一格式。

MISX文件格式则是AppX的后继者,其集成了Windows之前的文件格式安装技术,并继承了UWP的特性,更加安全和可靠,网络带宽优化,磁盘空间优化,程序自定义,并支持全部的Windows应用程序,而且MSIX使程序可更干净地卸载。现在的Windows应用商店提供的程序安装包都是MISX格式,此外Windows官方发布的一些应用程序也以MISX格式提供安装包。

MSIX安装器将支持所有的 Windows 文件格式,包括 Win32、WPF、WinForm 和 UWP。这样开发者只要遵循 MSIX 封装协议,将开发的应用程序封装为 .MSIX 格式后发布到Windows 10 应用商店,或其他网站,用户下载后就可以根据自己实际需要自行选择安装方式。另外国内很多流氓安装软件经常卸载软件后还留下文件夹和注册表。使用 MSIX 安装的程序都被放在类似「沙盒」的环境中,所有文件、注册表都按规则存放(例如 AppData 文件夹),卸载时所有数据都会被删除不会有残留。

能够使用的 MSIX 文件都必须要有受信任的根签名,并且上传到应用商店的软件都需要经过微软的审核。所以MSIX 格式可以给用户带来更大的安全感,但这样也可能需要签名或审核,可能需要给微软支付费用或审核,所以对于个人开发者或资金不足的软件工作室,有可能还是会选择免费的 EXE 格式,而不是马上就迁移到MSIX格式。另外 MSIX 格式甚至可以在 Windows7,Linux 等更多平台上直接运行。

三、macOS平台上的安装包格式

参考: https://www.jianshu.com/p/2cc5675afb1e#

主要有两种格式:PKG & DMG

  • PKG 安装包的安装类过程似 Windows 系统里的安装程序,双击之后自动运行安装向导,根据提示进行安装。
  • DMG 安装包(实际上是一个虚拟磁盘文件),双击该文件,等待加载,然后会打开一个访达(Finder)窗口。通常里面包括该软件App本身,以及应用程序(Applications)文件夹的快捷方式。直接拖拽复制该软件App到「应用程序」文件夹即可。可近似理解为 Windows 里的绿色软件安装方式,只要复制进本地磁盘就行了。