带您了解 Snap, AppImage 和 Flatpak 之间有什么不同

如果你使用过像 Windows 这样的操作系统,然后迁移到 Linux,你会意识到在 Linux 上安装应用程序和软件可能会不是很方便,尤其是如果你不知道在某个 Linux 发行版上安装特定软件的正确方法。

由于 Linux 是免费和开源的,所以有很多软件可用于 Linux 系统。您可能遇到过 Snap、AppImage 和 Flatpak 等术语。这些是在 Linux 系统中安装软件时使用的一些流行格式。

在这篇文章中,我们将研究这三种包格式之间的差异——Snap、AppImage 和 Flatpak。

带您了解 Snap, AppImage 和 Flatpak 之间有什么不同插图

我们为什么需要Snap, Flatpak 和 AppImage ?

早些时候,想要为各种 Linux 发行版分发应用程序的开发人员在打包方面面临许多挑战。这是因为市场上有许多 Linux 发行版,并且都使用不同的包管理系统。

例如,Ubuntu 和任何其他基于 Debian 的发行版使用 deb 软件包扩展,而 Fedora,CentOS,RHEL 使用 rpm 包扩展。因此,开发人员必须根据目标发行版打包他们的应用程序,如:Application_One.deb、Application_One.rpm 等。

为了使开发和打包 Linux 系统软件的整个过程变得简单快捷,开发人员构建了独立于分发的包格式。它们包括 Snap、Flatpak 和 AppImage。因此,任何以这些包格式分发的应用程序都可以在任何支持这些框架的 Linux 系统上运行(绝大部分 Linux 发行版都是支持的)。

因此,让我们深入研究每种包格式。

Snap

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

sudo snap install brave

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

Snap 有一个在线应用商店(Snapcraft),用户可以在那里查找和安装应用程序。这对用户来说是一个很大的优势,因为他们有一个大的池来搜索他们需要的任何软件包。Snapcraft 也由 Canonical 维护和控制。

带您了解 Snap, AppImage 和 Flatpak 之间有什么不同插图1

此外,Snapcraft 框架允许开发者开发他们的包,并将它们上传到 Snap 商店。你可以在 Snapcraft 页面的底部看到这些指导方针。—— 如何在30分钟内搞定一款应用

Flatpak

Flatpak 由 Red Hat 员工 Alexander Larsson 开发,并于2015年正式发布。它是用C编程开发的,提供了一种在 Linux 发行版上安装应用程序的快速而直接的方法。

Flatpak 的工作原理是将一个应用程序组合并编译为一个包。以前,Flatpak 被称为 xdg 应用程序。这个特殊的框架使用了在沙盒环境中运行应用程序的概念,而不需要root权限。因此,一些 Flatpak 应用程序无法访问和利用系统的总资源。

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

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

带您了解 Snap, AppImage 和 Flatpak 之间有什么不同插图2

AppImage

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

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

sudo chmod +x balena-etcher.AppImage
./balena-etcher.AppImage

与 Snap 和 Flatpak 软件包格式一样,AppImage 也有一个在线存储库来查找和下载 AppImage 软件包——– AppImage website

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

带您了解 Snap, AppImage 和 Flatpak 之间有什么不同插图3

比较: Snap vs. Flatpak vs. AppImage

我们已经了解了这些封装格式是什么以及我们为什么需要它们。现在让我们来比较一下这三个元素——Snap、Flatpak和AppImage。

控制权限

大多数Linux 应用程序需要访问系统中的不同资源,才能为您提供最佳性能。幸运的是,这些包格式允许您设置这些权限,并决定应用程序访问什么以及不应该访问什么。

Snap

Snap 为用户提供了一种图形和命令行方法来分配权限。要以图形方式分配权限,请启动 Ubuntu 软件中心并查找要管理的已安装应用程序。然后,单击“删除”按钮旁边的“权限”按钮。(新版 Ubuntu 22.04 找不到这些选项了,下面以命令行方式进行演示)

使用 snap connections 参数查看设置的权限。例如,要查看分配给 firefox 应用程序的权限,我们将使用以下命令:

snap connections firefox

显示结果:

asd@ubuntu-2204:~$ snap connections firefox
接口                      插头                              插槽                      注记
audio-playback          firefox:audio-playback          :audio-playback                 -
audio-record            firefox:audio-record            :audio-record                   -
avahi-observe           firefox:avahi-observe           :avahi-observe                  -
browser-support         firefox:browser-sandbox         :browser-support                -
camera                  firefox:camera                  :camera                         -
content[gnome-42-2204]  firefox:gnome-42-2204           gnome-42-2204:gnome-42-2204     -
content[gtk-3-themes]   firefox:gtk-3-themes            gtk-common-themes:gtk-3-themes  -
content[icon-themes]    firefox:icon-themes             gtk-common-themes:icon-themes   -
content[sound-themes]   firefox:sound-themes            gtk-common-themes:sound-themes  -
cups-control            firefox:cups-control            :cups-control                   -
dbus                    -                               firefox:dbus-daemon             -
desktop                 firefox:desktop                 :desktop                        -
desktop-legacy          firefox:desktop-legacy          :desktop-legacy                 -
gsettings               firefox:gsettings               :gsettings                      -
hardware-observe        firefox:hardware-observe        :hardware-observe               -
home                    firefox:home                    :home                           -
joystick                firefox:joystick                :joystick                       -
mount-control           firefox:host-hunspell           :mount-control                  -
mpris                   -                               firefox:mpris                   -
network                 firefox:network                 :network                        -
network-bind            firefox:network-bind            :network-bind                   -
network-observe         firefox:network-observe         -                               -
opengl                  firefox:opengl                  :opengl                         -
personal-files          firefox:dot-mozilla-firefox     :personal-files                 -
removable-media         firefox:removable-media         :removable-media                -
screen-inhibit-control  firefox:screen-inhibit-control  :screen-inhibit-control         -
system-files            firefox:etc-firefox             :system-files                   -
system-packages-doc     firefox:system-packages-doc     :system-packages-doc            -
u2f-devices             firefox:u2f-devices             :u2f-devices                    -
unity7                  firefox:unity7                  :unity7                         -
upower-observe          firefox:upower-observe          :upower-observe                 -
wayland                 firefox:wayland                 :wayland                        -
x11                     firefox:x11                     :x11                            -
asd@ubuntu-2204:~$

要向应用程序授予权限,我们只需选择特定的权限并使用如下所示的 snap connect 命令:

snap connect firefox:camera

要删除权限,请使用 snap disconnect 命令:

snap disconnect leafpad:camera

Flatpak

Flatpak 还提供了一种图形和命令行方法来为 Flatpak 应用程序分配权限。我们将通过单击特定包上的 “权限” 按钮,使用 GNOME 桌面环境进行图形化设置。

要查看通过终端分配给 Flatpak 的权限,请使用以下命令:

flatpak info --show-permissions com.github.jeromerobert.pdfarranger

记得用 Flatpak 包的名称替换 com.github.jeromerobert.pdfarranger。要获取系统上所有 Flatpak 软件包的列表,请执行以下命令:

flatpak list

AppImage

在撰写本文时,AppImage 没有为用户提供分配和删除权限的方法。然而,开发人员暗示,他们将来可能会包含此功能。

Sandboxing (沙箱)

沙箱是指应用程序运行在与主机完全隔离的环境中的情况。通过使用上面讨论的 api 和权限实现与主机资源的任何交互。

Snap 在沙箱应用程序中使用修改过的 AppArmor,而 Flatpak 则使用命名空间。AppImage 包不是沙箱包,也不需要 sudo (root)特权来运行。

应用程序可移植性

当我们谈论可移植性时,我们指的是从一个系统到另一个系统共享应用程序,甚至将文件上传到云的容易程度。目前唯一获胜的软件包管理器是 AppImage。对于 Snap 和 Flatpak 等其他包格式,您需要对应用程序本身进行打包,并包括它所依赖的子依赖项。

不幸的是,整个打包过程并不容易,需要执行各种命令。

本机主题支持

Snap、Flatpak 和 AppImage 这三种包格式都支持 GTK 和 Qt 应用程序的原生外观,但有一些小的限制。

例如,Snap 和 Flatpak 应用程序与系统主题一起打包,以实现正确的系统外观。因此,如果你正在调整第三方主题和图标,Snap 或 Flatpak 应用程序的图形界面可能会有点不对劲。也许文本、图标或光标可能不是你想要的。这不能被视为一个关键问题,因为随着时间的推移已经有了重大改进。

然而,在各种应用中总是存在一些显著的差异。

下面是这三种包格式之间的差异的比较表。

特征SnapFlatpak AppImage
权限控制是的是的
沙盒是的是的是的
强制沙盒是的是的
可靠的便携性是的
系统主题支持Yes (with caution)Yes (with caution)Yes (with caution)
包括捆绑库是的是的是的
包含 – 单个可执行包是的
在线软件/应用商店是的是的是的
自动应用更新是的是的Yes (With caution)
ChromeOS (Chromebook) 支持是的是的是的
在线商店中可用的应用程序数量Highest numberLowestAverag

写在最后:

我相信这篇文章已经让你很好地理解了我们今天拥有的独立于发行版的包格式——Snap、Flatpak 和 AppImage。尽管每个 Linux 发行版都带有其包管理器,但这些第三方软件包格式已被证明非常高效和可靠。

因此,您可以访问更多可用于其他发行版的应用程序。此外,不熟悉 Linux 系统的用户可以使用这些包格式(尤其是 AppImage)轻松安装应用程序,而无需执行多个命令来安装所需的依赖项。

标签

发表评论