The comparison of Flatpak, Snap, AppImage, the three universal and distro-agnostic package formats of Linux.
Ivon將在這篇文章討論三個Linux套件格式的異同,他們分別是Flatpak、Snap、AppImage。
基於官方文件和Linux社群的意見,以及Ivon個人觀察撰寫而成。
文末分享這三個套件格式的使用方式。
這三小?我只聽過APT#
這不是三小,是三大跨Linux發行版的套件格式!Flatpak、Snap、AppImage這三個套件格式的目的相同,就是要解決跨Linux發行版安裝軟應用程式的問題。
我們知道Linux安裝應用程式,大部分是透過原生套件管理員(native package manager)下載安裝,像是Ubuntu的APT、Fedora的DNF、openSUSE的Zypper等等。Linux現在少說有100個以上的發行版(distribution),這就造成了軟體打包不一致問題。不同的發行版有不同的套件管理員,安裝應用程式指令不一樣。就連同一個系統,都可能在系統升級後發生套件依賴的(dependencies)衝突問題。
還有,各個發行版會維護自己的套件庫(repository),受歡迎的發行版會收錄很多程式,比方說Ubuntu、Arch Linux幾乎是什麼都有。相較之下,小眾發行版Void、Alpine要等社區成形後套件庫數量才會累積起來,不然就得手動從原始碼編譯了。這樣碎片化的情況,會讓應用程式版本不一致,造成更新不同步。
諸如以上種種問題,光是不同發行版之間的維護工作就會累死開發者了,使用者裝軟體也會覺得不便。所以試圖統一跨Linux發行版安裝應用程式的技術就出現了,目前常見的有三個,就是Flatpak、Snap、AppImage。
本文Ivon會嘗試比較他們的相同、不同之處。
如果你問Ivon哪個比較好?難以給出答案,要看用途,我在這篇文章有進一步說明。現在還沒有出現所謂的「萬用格式」。
套件數目#
只計算官方商店的數目,不計算第三方管道散佈的套件。
截至2025年1月
Flathub有2818個應用程式。
SnapCraft具體數量未知,根據2018年發表的文章,官方宣稱有4100個以上應用程式。
AppImageHub有1430個應用程式。
順帶一提,目前Ubuntu的APT套件庫有38475個套件。
用途取向#
儘管這三個套件管理器都宣稱自己是跨Linux發行版的套件格式,但他們的取向還是不太一樣的。
Flatpak主要提供圖形應用程式,少部份命令行程式。Flatpak因為沙盒的權限因素無法執行需要動到root權限的程式。適合桌面用戶使用。例如在較少更新的Debian安裝最新版的瀏覽器。或者在Arch Linux這類滾動發行版安裝Flatpak,減少因為系統套件更新太頻繁而導致程式崩潰的情況。
Snap提供圖形應用程式與命令行程式,能夠執行需要root權限的任務,適合桌面與伺服器用戶使用。例如在舊版的Ubuntu LTS系統安裝最新版本的Docker。
AppImage提供圖形與命令行程式,概念類似Windows的可攜式exe,或是macOS的dmg。能夠執行需要root權限的任務。適合桌面用戶使用。
支援的Linux發行版#
這三個套件格式應能在各大發行版使用。部份發行版已經內建支援,作為原生套件管理員的輔助方案,無需手動安裝。
Flatpak一開始是RedHat公司員工發起的專案。內建Flatpak套件管理器的發行版:RHEL、Fedora、CentOS、Rocky Linux、openSUSE、Manjaro、Linux Mint、Kubuntu等
Snap最早是Canonical公司發起的專案。內建Snap套件管理器的發行版:Ubuntu、KDE Neon、Manjaro、openSUSE、Solus、Zorin OS等
AppImage最初是由Simon Peter發起的專案,支援AppImage的發行版:無需套件管理器。Ubuntu 16.04以後發表、任一glibc的發行版都能使用。
系統資源佔用#
這三者啟動速度都比原生套件要慢一點點,Flatpak和AppImage的程式啟動的速度差不多,Snap要再慢一些。
三者啟動之後執行的效能應與原生套件沒有太大差異。
三者都會在安裝程式時一併安裝該個程式的依賴套件,故佔用硬碟空間比原生套件要肥大。
Flatpak會讓程式共用依賴套件,再利用重複資料刪除技術,節省一部分空間。
Snap會讓程式共用依賴套件,節省空間。
AppImage則是每個程式打包自己的依賴套件,理論上會更佔空間。
軟體分發管道#
Flatpak主要從GNOME基金會經營的Flathub下載,亦可以自訂遠端儲存庫。開發者能夠獨立分發.flatpak
格式的應用程式。但Flatpak程式脫離Flatpak套件管理器便無法使用。
Snap主要從Canocial經營的SnapCraft下載,亦可以使用其他商店。開發者能夠獨立分發.snap
格式的應用程式。但Snap程式脫離Snapd套件管理器便無法使用。
AppImage沒有固定的應用程式商店,除了AppImageHub之外,就是到Github開發者的Release頁面下載。AppImage沒有套件管理器,下載.AppImage
格式後點二下執行,能夠自由移動到其他電腦執行。尚提供解壓縮執行內部二進位檔的功能。
套件管理#
Flatpak可以免root權限安裝程式。Flatpak本身有套件管理器的功能,能夠自動更新。支援AppStream協定,能夠與桌面環境的應用程式商店整合。
Snap需要root權限安裝程式。Snap本身有套件管理器的功能,能夠自動更新。支援AppStream協定,能夠與桌面環境的應用程式商店整合。
AppImage沒有套件管理功能,只能簡單檢查軟體更新,使用者要手動下載並管理眾多的AppImage檔案。雖有第三方開發者製作AppImage套件管理工具,但不是內建的功能。
權限管理#
Flatpak提供沙盒權限,規範放置設定檔的位置,以及能存取的資統資源。遵守XDG標準,擁有一套Portal API規範程式存取系統資源的方式。
Snap提供沙盒權限,規範放置設定檔的位置,以及能存取的資統資源。遵守XDG標準,擁有一套Confinement的權限系統。
AppImage無任何權限管理,程式預設擁有的權限就跟一般二進位檔沒兩樣。遵守XDG標準。
命令行友好#
Flatpak啟動程式的指令一大串,像是flatpak run org.vim.Vim
,要設定alias,不適合命令行程式使用。
Snap安裝後會自動加入到PATH,能像一般二進位檔程式一樣執行。例如snap run vim
可以直接寫vim
。
AppImage不會自動加入PATH。由於檔案本身就是執行檔,執行的時候需要寫出完整檔名,很是不便。例如./vim.AppImage
對宿主機的依賴程度#
Flatpak把應用程式執行時的依賴套件包在一起,幾乎不受系統套件影響。
Snap把應用程式執行時的依賴套件包在一起,幾乎不受系統套件影響。
AppImage把依賴套件包在一起,但依賴宿主機系統套件的程度較高,很容易受到glibc版本影響。若宿主機系統並非使用glibc,而是musl libc,也得重新編譯。
可移植性#
Flatpak依賴Linux核心的cgroups功能,透過Bubblewrap實現沙盒化,程式打包的映像檔遵守OCI規範,利用OSTree管理更新。能移植到絕大多數的Linux發行版。
Snap的軟體透過SquashFS掛載,但系統需要支援Systemd才能用Snapd管理Snap套件,還必須有AppArmor管理應用程式權限。可移植性受限,僅適合在Ubuntu使用。
AppImage能在任一支援SquashFS的Linux發行版運作,適用於絕大多數的Linux發行版,就連chroot環境也能使用。
跨架構能力#
Flatpak部份程式支援x86與ARM架構,要看開發者有沒有打包。允許使用qemu-static模擬異質架構。
Snap部份程式支援x86與ARM架構,要看開發者有沒有打包。
AppImage執行檔需要針對x86與ARM架構個別編譯。