就像回字有四種寫法一樣,Linux系統一個軟體通常不只有一種安裝方式,比如「Firefox瀏覽器」就有四種以上的裝法,好處是使用者可以根據自身情況選擇,壞處就是新手會不知所措。
本文敘說Ivon在使用桌面Linux發行版時,安裝應用程式的偏好方式,含有主觀意見。
Ivon主要使用的Linux發行版為Arch Linux和Ubuntu LTS。
之前寫過一篇 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。
2. Linux常見安裝軟體的方式#
本節列出常見的Linux軟體安裝方式。
- 透過套件管理員安裝,例如APT、Flatpak、Snap。可以用指令也可以用圖形軟體商店安裝。
- 下載二進位執行檔,解壓縮點選執行。
- 下載軟體開發者提供的指令稿(script),執行指令安裝,例如VMWare官方安裝指令稿、Nvidia驅動+CUDA。指令稿會將安裝檔自動塞到正確的位置。
- 手動複製原始碼,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發行版的軟體打包技術,其中最著名的三個分別是(點選看詳細介紹):
這三個技術都有共同目標:解決各Linux發行版軟體版本不一,開發者維護不易的問題,因此用統一打包格式,附贈一致的runtime版本,使應用程式一次打包後就可安裝在多個Linux系統上。
不過即使如此,不是所有應用程式都會提供原生套件管理員以外的版本。有的開發者可能認為提供deb套件或二進位檔就夠了,或者開發者根本不知道有這類格式存在。私以為,開發者只提供deb/rpm套件對其他Linux發行版的用戶來說十分不公平,為此有一個統一的套件安裝格式更好。
雖說要如何安裝軟體還是看開發者的說明為主,不過要是能選擇的話,我會優先選擇Flatpak的版本。下面我將談論AppImage和Snap的缺點。
3.1. 為什麼不用AppImage#
AppImage大部分Linux發行版應該都可以開箱即用,除少數使用muslc函式庫的除外。
AppImage沒有套件管理員機制,每個應用程式都是單一檔案。它將應用程式的runtime打包在一起,主打下載即用,類似Windows的免安裝exe那樣。
AppImage看似美好,然而預設情況下AppImage大多不會裝到系統裡面。也就是說不會顯示系統圖示,要啟動程式得到AppImage所在目錄點二下。由於AppImage跟一般應用程式無異,其資料放置位置是不統一的,可能會往您的家目錄倒垃圾。
此外,AppImage更新不易,使用者要手動抓新版覆蓋舊版。Linux不是Windows,以為下載一個執行檔就可以用二十年,這是值得商榷的安裝軟體方式。你不是在用Windows!也不是萬年不更新的機房伺服器!
雖然以上問題可以用「AppImage Launcher」解決,這仍然是不如有一個完整套件管理員來管理好。
3.2. 為什麼不用Snap#
Snap主要是Ubuntu在推行的格式,Ubuntu 20.04以後正式融入系統,Kubuntu、Lubuntu、Xubntu、Manjaro、openSUSE Leap也內建了Snap。
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)管理,下載應用程式很直覺。
內建Flatpak的發行版:Fedora、openSUSE Tumbleweed、CentOS、Linux Mint、Zorin OS。
其引入了沙盒機制,限制應用程式可以存取的資源,統一規範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安裝應用程式有了更多了解,更加知道如何選擇正確的安裝方法。