Install deb packages instead of Snaps on Ubuntu.
適用版本:Ubuntu 16.04以上
Oh snap! 這句話在英文裡面有「這下靠北了」的意思。
Snap是Canonical推行的跨發行版Linux套件格式,大概在Ubuntu 16.04以後內建於系統。讓老版本的系統也可以安裝最新版的套件,不受APT套件庫依賴的影響。
相關文章:Snap指令使用方式
雖然它本意是好的,但是Ubuntu 22.04之後便開始強迫大家使用。Canonical修改了Ubuntu套件庫的一部分套件,使得用戶在透過APT安裝特定應用程式的deb檔的時候,會自動重新導向Snap商店,下載對應的應用程式。
比如用APT執行指令apt install firefox
安裝Firefox瀏覽器,就會出現「正在連接到Snap商店」(==> Checking connectivity with the snap store
)的訊息,強迫用戶下載Snap版本的套件。就連Dockerfile使用Ubuntu Docker Image裡面執行apt install
也無法倖免。
這會造成許多問題,因為Snap格式打包的軟體跟deb原理是不一樣的,在測試某些軟體功能的時候就會出錯。有的Snap套件問題難以解決,這時候就得切換為deb版。
本文就是要來探討各種解決方案。繞過Ubuntu官方強加的限制,不要讓Ubuntu安裝到Snap的套件。
1. 方案探討#
列出幾種解決途徑,我個人偏好一+二的解決方案。
方案一:徹底移除Snap套件#
不建議這樣做,問題沒辦法解決。
Ubuntu的Snap套件是由常駐程式Snapd
管理的,理論上是能將這個服務關掉,並強制移除,再把它加入APT的黑名單防止日後系統更新自己裝回來。但我是建議就將Snap留著。然後降低Snap的優先權。
因為Ubuntu官方已經逐漸將自身套件庫的deb套件替換為Snap的版本,那些套件已經不再是原本的套件,已經變成了一個個空套件,安裝後只會重新導向Snap指令。譬如Firefox、Chromium、Thunderbird等等,在最新版Ubuntu 24.04就只提供Snap的套件,沒有deb版。
不信?使用指令apt show firefox
指令查詢套件資訊,會輸出以下結果,可以看到Firefox套件已經成為transitional package,實際會導向安裝Snap套件。
Package: firefox
Origin: Ubuntu
APT-Sources: http://tw.archive.ubuntu.com/ubuntu noble/main amd64 Packages
Description: Transitional package - firefox -> firefox snap
This is a transitional dummy package. It can safely be removed.
.
firefox is now replaced by the firefox snap.
你可能覺得把Snap服務直接刪除比較好,避免日後執行APT指令的時候又不小心裝到Snap套件。不過就像我上面說的,Ubuntu的deb套件已經變成空殼了,這樣做意義不大。
方案二:手動找deb或第三方PPA#
找額外的deb是最直接的做法。建議是使用PPA,方便自動更新。
找野生deb有風險,更新不便,它們也不見得是為Ubuntu建置的。Debian的套件不見得可以裝在Ubuntu,所以找PPA更好。
比如Firefox就有Mozilla官方經營的PPA,內含Mozilla官方建置的Firefox與Thunderbird。
Chromium則是有Rob Savoury的PPA。
方案三:改用其他套件格式#
好像把問題複雜化了……
Flatpak比Snap更受Linux社群歡迎,內建Flatpak的發行版比內建Snap的要多。安裝此格式的軟體能夠獲得更多支援。很多軟體都有打包為Flatpak版本。
另外,AppImage格式的軟體也是可以考慮的選項。沒有複雜的權限問題需要處理。
方案四:跳船到其他發行版#
Canonical的CEO已經明說,不會放棄Snap的道路。
如果真的不喜歡Snap的干涉,就用沒有Snap的發行版吧。
Ubuntu官方認可的發行版都得遵照Canonical公司政策使用Snap,包括Kubuntu、Lubuntu、Xubuntu等等,故必須使用Canonical管不到的系統。
除了老祖宗Debian沒有Snap之外,有很多基於Ubuntu的發行版是沒有採用Snap的,例如Linux Mint、Pop!_OS、Zorin OS、elementary OS。
2. 範例:安裝deb版的Firefox,取代Snap#
透過Mozilla官方的PPA取得deb版Firefox。再利用APT的Pinning功能,降低Snap套件的優先權。
其他軟體用deb取代Snap的步驟大抵上也是如此。
- 移除Snap版的Firefox
sudo snap remove --purge firefox
- 新增Mozilla官方的PPA套件庫
sudo add-apt-repository ppa:mozillateam/ppa
- 針對Firefox,新增APT設定檔
sudo vim /etc/apt/preferences.d/mozilla
- 填入以下內容,將Mozilla套件庫釋出的套件優先度提到最高,並將Ubuntu釋出的套件降至最低。這是為了防止APT安裝套件的時候去安裝到Ubuntu提供的套件,導致觸發Snap商店的安裝指令。
Package: *
Pin: origin packages.mozilla.org
Pin-Priority: 1000
Package: firefox*
Pin: release o=Ubuntu
Pin-Priority: -1
- 確認優先度規則是否套用成功
sudo apt policy firefox
- 接著,防止Ubuntu未來更新自行下載Snap版Firefox,新增Unattended Upgrades規則
sudo vim /etc/apt/apt.conf.d/51unattended-upgrades-mozilla
- 填入以下內容,設定只有Mozilla釋出的套件可以自動更新
Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";
- 安裝deb版Firefox
sudo apt install firefox firefox-l10n-zh-tw