快轉到主要內容

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

· 民國114年乙巳年
·
切換繁體/簡體
分類   Linux系統 Linux使用技巧
標籤   Flatpak Snap AppImage Freedesktop Specifications
目錄

就像回字有四種寫法一樣,Linux系統一個軟體通常不只有一種安裝方式,常常使人不知道如何是好。

本文敘說Ivon在使用桌面Linux發行版時,安裝應用程式的偏好方式,含有主觀意見。這篇文章將專注討論如何選擇安裝軟體的方式,包括各種套件管理器的利弊,以及無法使用套件管理器的時候該怎麼安裝軟體。

Ivon主要使用的Linux發行版為Ubuntu LTS、Fedora、Arch Linux,教學側重Ubuntu,但一些概念是共通的。

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

誠然,Linux好用的應用程式多得超乎一般人想像,可是安裝方法卻有很多種,給人造成困惑。Linux安裝應用程式軟體的方式一大堆,同一個軟體可以有多種打包格式,如同以下改編自xkcd的漫畫,每天都有新標準出現!

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

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

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

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

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

1. 名詞定義
#

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

  • 桌面應用程式(application software, desktop application):一般常用的軟體,通常含有GUI圖形界面,這包含了文書處理(例如LibreOffice)、圖形設計GIMP、影片剪輯Kdenlive、音訊編輯Audacity、瀏覽器Firefox、遊戲Steam等等。

  • 系統應用程式(系統軟體,system software):系統與開發層面的軟體,包含:桌面環境與附屬應用程式、輸入法、驅動程式、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能夠跨發行版執行,但是它沒有套件管理功能。需要注意的是,pip、npm、cargo雖然也算套件管理員,但他們不是專為Linux系統設計的。

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

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

  1. 透過套件管理員安裝,例如APT、Flatpak、Snap。可以用指令也能用圖形軟體商店安裝。譬如apt intstall firefox
  2. 下載二進位執行檔,解壓縮點選執行。譬如Firefox有提供二進位檔版本下載。
  3. 下載軟體開發者提供的指令稿(shell script),執行指令安裝,例如Nvidia驅動+CUDA。指令稿會自動偵測發行版,並將程式需要的檔案自動塞到正確的位置。
  4. 取得軟體原始碼,手動make編譯安裝(install from source)。

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

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

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

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

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

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

要是使用原生套件管理員,就會遇到需要手動找套件名稱的問題。每個Linux發行版有不同的套件名稱,可能依賴項目也不一致,安裝後需要做額外設定。

此外還有軟體版本問題,Arch Linux與Fedora套件都是最新版可能無感,但以Ubuntu LTS來說,當下系統套件庫收錄的「桌面應用程式」套件其實很多是偏舊的,萬一想要新版本怎麼辦?此時不外乎是往APT加第三方套件庫來取得其他人維護的版本。然而這樣做有風險,如果說你加PPA的不是大型組織維護的,你如何確定未來系統更新後還能正常運作?如果該套件庫沒有即時更新,apt upgrade指令下去會出現一堆紅字的。

為此,我希望使用跨Linux發行版套件管理員來統一安裝過程,以及收到一致的應用程式版本。安裝桌面應用程式的時候用跨發行版套件管理員,要變更系統的時候才用原生套件管理員。

優先使用跨發行版的套件管理員
#

跨Linux發行版的套件管理員有很多種,說穿了就是在系統安裝第二個套件管理員啦。Linux社群經過多年開發,發展出了跨Linux發行版的軟體打包技術,其中最著名的三個分別是:Flatpak、Snap、AppImage。三者技術的詳細比較見此文

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

Flatpak > AppImage > Snap

這三個技術都有共同目標:解決各Linux發行版環境不一致,開發者維護不易的問題。因此用統一打包格式,鎖定依賴函式庫的版本,與系統隔離。使應用程式一次打包後就可安裝在多個Linux發行版上。

要如何安裝軟體還是看開發者的說明為主,不過要是能選擇的話,我會優先選擇Flatpak的版本,因為它由Redhat推動,並且提倡XDG Desktop Portal的標準,可以真正作到跨發行版,乃至跨桌面環境的使用體驗。

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

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

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

要掛在系統背景一直執行,或者需要sudo的應用程式也比較適合用原生套件管理員裝。

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

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

若是系統應用程式,首選就是原生套件管理員,跨發行版套件管理員可能幫不上忙。套件管理員我主要是安裝系統應用程式,現在比較少用來裝桌面應用程式。

優先程度:

開發者提供的套件庫 > 原生套件管理員的套件庫 > 下載二進位執行檔 > 手動編譯

開發者提供的套件庫就是非Linux發行版開發人員維護的套件庫,以Ubuntu的術語來說就是PPA,Fedora叫做COPR,Arch Linux是為AUR。

另外一個我會參酌的重要因素,就是看「軟體開發者」的建議安裝方法,例如Nvidia CUDA需要參考官方文件為主,而非直接無腦從Ubuntu套件庫裝。具體來說要信任哪一方的安裝軟體方法,這需要一點經驗判斷,很難說得準。

應使用原生套件管理員而非編譯安裝
#

動到系統不可不謹慎。在我們安裝系統應用程式的時候,因為會動到系統目錄(需要sudo才能執行指令安裝),其實仍然是以原生套件管理員為主,而非用手動編譯的方式安裝。

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

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

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

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

善用容器與虛擬機
#

滾動發行版的用戶不需要煩惱軟體版本太舊的問題,可Ubuntu LTS就有值得考慮的部份:部份軟體版本偏舊,萬一想要新版本怎麼辦?例如Python、NodeJS、QT、GCC版本?Python可能用Anaconda虛擬環境解決,其他軟體就沒這麼幸運了。

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

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

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

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

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

現在更流行的是使用輕量化的Docker或Podman。容器啟動速度非常快,能夠省去虛擬機的繁重負載,又能隔離開發環境,使開發工具的依賴套件不與一般應用程式互相衝突,讓開發軟體更加彈性。

5. 如果應用程式不能用套件管理器安裝呢?
#

桌面應用程式和系統應用程式都可能出現此問題。要是軟體開發者只提供二進位執行檔,沒有套件管理器打包怎麼辦?那就放到你看得到的位置,方便管理。

Linux發行版多半有規定使用者自行安裝的程式應該放在哪裡,譬如Ubuntu是/usr/local/bin或者~/.local/bin/,只要確保這些路徑有在$PATH環境變數裡面就好了。

再如,AppImage程式不需要安裝,如果一股腦全部丟到桌面又會很亂,那我會遵守AppImage Launcher的作法,將這些程式安裝到~/Applications目錄。這個目錄每次開啟檔案管理器的時候一眼就能見到,能夠快速點選啟動程式。

有時候我會把一些用tar打包的二進位檔程式也塞到~/Applications目錄,再製作一個Desktop Entry方便啟動。

6. 結論
#

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

相關文章

Flatpak vs Snap vs AppImage,跨Linux發行版的套件格式比較
分類   Linux系統 Linux使用技巧
標籤   Flatpak Snap AppImage Freedesktop Specifications
Linux如何解除安裝軟體並刪除乾淨
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Flatpak Snap AppImage
無法開啟檔案?用Flatseal調整Linux Flatpak應用程式權限 & flatpak override用法
分類   Linux系統 Linux使用技巧
標籤   Flatpak Freedesktop Specifications

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

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