快轉到主要內容

Linux應該用何種方法安裝應用程式,談談我的軟體安裝偏好來源

· 民國113年甲辰年
· ·
分類   Linux系統 Linux使用技巧
標籤   Flatpak Snap AppImage Freedesktop Specifications
目錄

就像回字有四種寫法一樣,Linux系統一個軟體通常不只有一種安裝方式,比如「Firefox瀏覽器」就有四種以上的裝法,好處是使用者可以根據自身情況選擇,壞處就是新手會不知所措。

本文敘說Ivon在使用桌面Linux發行版時,安裝應用程式的偏好方式,含有主觀意見。

Ivon主要使用的Linux發行版為Ubuntu LTS與Arch Linux。

之前寫過一篇Linux常用軟體,裡面簡單提到應用程式安裝方法,但沒有說明理由。

誠然,Linux好用的應用程式多得超乎一般人想像,可是安裝方法卻有很多種,給人造成困惑。

Linux安裝應用程式軟體的方式一大堆,如同以下改編xkcd的漫畫,每天都有新標準出現

我在寫教學文章也時常困擾:Arch Linux有包山包海的AUR,Ubuntu/Fedora/openSUSE用戶又該怎麼辦呢?每個發行版都有自己的補充軟體套件庫,我不可能每個發行版都顧到,有沒有一種適用每個發行版的安裝軟體作法?

所以我希望寫一篇解說Linux安裝應用程式的偏好,梳理Linux安裝軟體的方式,以及我個人選擇的最佳作法(best practice)供參考。

注意1:本文的使用情境以桌面版Linux為主,伺服器專業用途請優先以貴機構的需求來部署。

注意2:本文不是APT/DNF/YUM指令的操作教學,而是討論「怎樣選擇好的Linux軟體安裝方式」

用Linux的時候,您應該負起管理系統的責任,選擇方便管理,又不會破壞系統穩定性的安裝軟體方式,是很重要的。

TL;DR:簡單的原則,系統應用程式用原生套件管理員裝,桌面應用程式盡量用Flatpak裝。

1. 名詞定義
#

本節定義全文用到的名詞。

  • 桌面應用程式(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發行版,例如Nix、Guix、Flatpak、Snap、Homebrew。雖然AppImage能夠跨發行版執行,但是它沒有套件管理功能。

2. Linux常見安裝軟體的方式
#

本節列出常見的Linux軟體安裝方式。

  1. 透過套件管理員安裝,例如APT、Flatpak、Snap。可以用指令也可以用圖形軟體商店安裝。
  2. 下載二進位執行檔,解壓縮點選執行。
  3. 下載軟體開發者提供的指令稿(script),執行指令安裝,例如VMWare官方安裝指令稿、Nvidia驅動+CUDA。指令稿會將安裝檔自動塞到正確的位置。
  4. 手動複製原始碼,make編譯安裝(install from source)。

Linux不是Windows,市面上比較少有安裝精靈(Installation Wizard)這類的圖形化程式來輔助安裝,頂多就是純文字界面引導式的安裝。

值得注意的是,即使是Ubuntu這種友善發行版,一個軟體不一定只有一種安裝方式,比如「Firefox瀏覽器」就有四種裝法,就像回字有四種寫法一樣。好處是使用者可以根據自身情況選擇,壞處就是新手會不知所措,因此下面我會討論在不同的環境下,應該採取何種方式。

3. 桌面應用程式應該如何安裝
#

桌面應用程式甚少會需要動到系統檔案,而且我希望收到最新版本的應用程式,所以要是能選擇的話,我偏好的優先順序:

跨Linux發行版的套件管理員 > 系統原生套件管理員 > 下載二進位執行檔 > 手動編譯

為什麼?我認為每個軟體都應該被套件管理員追蹤。

每個發行版有不同的套件名稱,可能還要做一些額外設定。此外還有軟體版本問題,Arch Linux套件都是最新版可能無感,但以Ubuntu LTS來說,如果你要安裝的不是軟體驅動程式檔案管理員這些底層的東西,那麼Ubuntu收錄的「桌面應用程式」套件其實很多是偏舊的,萬一想要新版本怎麼辦?此時不外乎是往APT加PPA(第三方套件庫)來取得其他人維護的版本,然而這樣做有風險。如果說你加PPA的不是大型組織維護的,你如何確定未來系統更新後還能正常運作?如果該套件庫沒有即時更新,apt upgrade指令下去會出現一堆紅字的。

為此,我希望使用跨Linux發行版套件管理員來統一安裝過程,以及收到一致的應用程式版本。

其中跨Linux發行版的套件管理員的偏好程度:

Flatpak > AppImage > Snap

跨Linux發行版的套件管理員有很多種,說穿了就是在系統安裝第二個套件管理員啦。本節解釋為何我優先採用Flatpak,而非其他格式。

Linux社群最近幾年來發展出了跨Linux發行版的軟體打包技術,其中最著名的三個分別是:Flatpak、Snap、AppImage。詳細比較見此文

這三個技術都有共同目標:解決各Linux發行版軟體版本不一,開發者維護不易的問題,因此用統一打包格式,附贈一致的runtime版本,使應用程式一次打包後就可安裝在多個Linux系統上。

不過即使如此,不是所有應用程式都會提供原生套件管理員以外的版本。有的開發者可能認為提供deb套件或二進位檔就夠了,或者開發者根本不知道有這類格式存在。私以為,開發者只提供deb/rpm套件對其他Linux發行版的用戶來說十分不公平,為此有一個統一的套件安裝格式更好。

要如何安裝軟體還是看開發者的說明為主,不過要是能選擇的話,我會優先選擇Flatpak的版本。下面我將談論AppImage和Snap的缺點。

3.1. 為什麼不用AppImage
#

AppImage大部分Linux發行版應該都可以開箱即用,除少數使用musl libc函式庫的除外。

AppImage沒有套件管理員機制,每個應用程式都是單一檔案。它將應用程式的runtime打包在一起,主打下載即用,類似Windows的免安裝exe那樣。

AppImage看似美好,然而預設情況下AppImage大多不會裝到系統裡面。也就是說不會顯示系統圖示,要啟動程式得到AppImage所在目錄點二下。由於AppImage跟一般應用程式無異,其資料放置位置是不統一的,可能會往您的家目錄倒垃圾。

此外,AppImage更新不易,使用者要手動抓新版覆蓋舊版。Linux不是Windows,以為下載一個執行檔就可以用二十年,這是值得商榷的安裝軟體方式。你不是在用Windows!也不是萬年不更新的機房伺服器!

雖然以上問題可以用「AppImage Launcher」解決,這仍然是不如有一個完整套件管理員來管理好。

3.2. 為什麼不用Snap
#

Snap主要是Ubuntu在推行的格式,Ubuntu 20.04以後正式融入自家的系統。

Snap透過Snapd來更新及管理套件,支援用應用程式商店(GNOME Software、KDE Discover)管理,下載應用程式直覺。

其設有一套權限機制,透過AppArmor規定應用程式能存取的硬體資源。應用程式安裝後,資料統一放在~/snap目錄之下,方便刪除。

但是,Snap會在系統建立一堆loop device,用系統指令lsblk查看很不美觀。

此外Snap一律需要sudo才能安裝應用程式,雖然這給了Snap安裝系統軟體的能力(例如部署Nextcloud伺服器),但也導致安裝應用程式不方便,個別使用者安裝的應用程式整個系統的人都會看到,無法隔離。

最重要的一點,儘管Snap的儲存庫理論上可以自架,但目前一律只能使用Ubuntu官方的Snap Store來下載應用程式,沒有第三方儲存庫介入的空間,且後端伺服器完全是閉源軟體。儘管統一來源能防止軟體多重版本的問題,但這也等同軟體分發權力完全由Canonical控制。更麻煩的地方在於,Ubuntu用指令安裝部份APT套件的時候,竟會強制重新導向為安裝Snap版本的套件。

總而言之,Snap完全是以Ubuntu量身打造的套件管理員,而且是半強迫使用,不適合其他Linux發行版用戶。

3.3.為什麼應該使用Flatpak
#

Flatpak原名xdg-apps,將應用程式所需的runtime打包在一起,並透過Flatpak本身來管理、更新應用程式。支援透過應用程式商店(GNOME Software、KDE Discover)管理,下載應用程式很直覺。

其引入了沙盒機制,限制應用程式可以存取的資源,統一規範APP存放資料的位置在~/.var目錄下。Flatpak可以選擇將應用程式安裝到系統,或者只安裝給特定使用者,這樣可以讓一般使用者免sudo密碼安裝軟體,並且只有該使用者能使用該程式。

Flatpak軟體來源主要是Flathub,目前收錄了2000款以上的應用程式,但有些組織也會自行經營Flatpak儲存庫,例如RedHat。Flathub跟Canonical的Snap Store不太一樣,它不是一間私人企業平台,而是由GNOME非營利基金會經營的網站,提交應用程式無需費用,可自由在Github提交Flatpak套件。使用者還可以自由更換Flatpak的遠端儲存庫,不需要遷就Flathub單一平台來下載應用程式。

由此可見,Flatpak適合安裝一般的桌面應用程式,並且安裝過程統一、跨發行版、不受單一公司控制,沒有Snap那樣的缺點。

當然,Flatpak也有缺點,那就是軟體很肥,還有沙盒權限問題。因為它把runtime包在一起的緣故,應用程式可能隨便都佔1GB以上。不過,只要多使用Flatpak安裝應用程式,Flatpak就會讓應用程式重複利用runtime,長久看來空間佔用不是大問題。

至於沙盒權限問題,主要是對開發程式的軟體不利。Flatpak設計上就是不能跑需要sudo權限的東西的,它存取系統編譯器有困難,所以Flatpak不適合裝程式開發工具。

3.4. 真的沒辦法再用原生套件管理員裝
#

有些剛在Github發表的新興專案,他們可能只會提供deb檔安裝,此時就真的沒辦法了,只好先用原生套件管理員APT安裝,更慘的是手動make編譯。

要掛在背景、需要sudo的應用程式也比較適合用原生套件管理員裝。

不過只要軟體有了一定名氣,通常就會有人幫忙打包成Flatpak、Snap、AppImage了,如果可以的話我會優先嘗試Flatpak版。

4. 系統應用程式應該如何安裝
#

若是系統應用程式,首選依然是原生套件管理員。套件管理員我主要是安裝系統應用程式,現在比較少用來裝桌面應用程式。

優先程度:

開發者提供的PPA(如果有的話) > 套件管理員的儲存庫 > 下載二進位執行檔 > 手動編譯

另外一個我會參酌的重要因素,就是看「軟體開發者」的建議安裝方法,例如Nvidia驅動+CUDA以官方文件為主,而非直接無腦從Ubuntu儲存庫裝。

4.1. 動到系統不可不謹慎
#

在我們安裝系統應用程式的時候,因為會動到系統目錄(sudo),其實仍然是以套件管理員為主,因為大多數Linux發行版套件優先打包給套件管理員使用。

原生套件管理員能做到安裝、刪除、升級、列出多餘軟體都用一條指令解決。如果採取手動編譯安裝軟體,後面要升級或刪除都會很不方便,不如將一切都交給套件管理員管。

Ubuntu安裝Nvidia驅動+CUDA為例,雖有四種安裝方式,但最好的辦法就是將其與系統整合:加入Nvidia官方PPA,從Nvidia的套件庫取得最新版本驅動,然後再用APT安裝,而非從Nvidia網站下載安裝指令稿讓它跑,這樣要移除、升級驅動很麻煩。

安裝Wine的時候也一樣,因為Ubuntu收的套件偏舊,優先以Wine官方提供的PPA為主,才有最新版的Wine。

在安裝Python、NodeJS、Java等開發工具的時候,同樣也是先用套件管理員安裝。

4.2. 開發善用容器與虛擬機
#

Ubuntu LTS有值得考慮的一點:部份軟體版本偏舊,萬一想要新版本怎麼辦?例如Python、NodeJS、QT版本?Python可能用Anaconda虛擬環境解決,其他軟體就沒這麼幸運了。

同樣地,往APT加PPA(第三方套件庫)來取得其他人維護的新版本是一個方式,這樣做同樣有風險。PPA若不是大型組織維護的,如何確定未來系統更新後還能正常運作?如果該套件庫沒有即使更新,apt upgrade指令下去會出現一堆紅字的。

不加PPA的話,另外作法是手動編譯安裝開發工具,但我不想要這樣啊!

此時虛擬機和容器就是一個解法。

考慮這點:假設某桌面應用程式需要用到Python套件,但是你需要裝特定版本的Python套件進行開發,從而導致二者衝突。

可以善加利用Linux的虛擬化開發環境!Linux的開發環境現有QEMU/KVM和Docker等工具。你要的環境只有舊版Ubuntu才有?何必裝雙系統!直接開個QEMU/KVM虛擬機就可以開工了,KVM還可以將GPU硬體資源直通給虛擬機用呢。

現在更流行的是使用輕量化的Docker技術,省去虛擬機的繁重負載,可以隔離開發環境,使開發工具的依賴套件不與一般應用程式互相衝突,讓開發軟體更加彈性。

5. 結論
#

希望看完之後您能對Linux安裝應用程式有了更多了解,更加知道如何選擇正確的安裝方法。

參考資料
#

相關文章

將Linux AppImage變成真正的可攜式軟體!Portable mode使用方式
分類   Linux系統 Linux使用技巧
標籤   AppImage
fontconfig調整Linux中文預設字體的優先順序,修正字體模糊、Emoji亂碼的問題
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Arch Linux Freedesktop Specifications
Linux如何設定開機自動執行應用程式,XDG Autostart與Systemd Service用法
分類   Linux系統 Linux使用技巧
標籤   Freedesktop Specifications GNOME KDE Plasma Systemd

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。