離線安裝Ubuntu的Snap軟體,將之變成可在離線環境部署。
1. Snap的問題#
SnapCraft/Snap Store為Canonical經營的Linux應用程式商店,收錄了各式各樣的軟體,全部使用Snap格式打包,方便使用者從統一的商店下載更新。
當你執行snap install
指令的時候,系統多半都是從Snap Store下載套件的。
不過Snap Store伺服端是閉源軟體,很多Linux用戶會拿這點攻擊,認為Canonical想壟斷市場,透過這招把人跟Ubuntu的生態系綁死,不如Flatpak的Flathub要開放。
但是你知道嗎,Snap其實是可以離線安裝的。根據Snap的官方文件指出,Snap安裝檔並非強制透過Snap Store分發,使用者能夠用指令安裝其他來源的Snap套件。
為了消除大家的疑惑,The Register的記者直接在2023年Ubuntu Summit活動詢問官方開發者關於Snap離線安裝的問題,並獲得了肯定的答案。 Canonical shows how to use Snaps without the Snap Store
這代表什麼呢?你能夠下載Snap檔案,拷貝到隨身碟,再放到不能聯網的Ubuntu環境安裝,當作一種可攜式軟體使用。
還有,Snap Store理論上是能夠自架的,不存在被Canonical壟斷的問題。可惜目前幾乎沒有人這樣幹,所以目前收錄最多Snap軟體的網站依然是Snap Store。
2. 準備Snapd#
Snap套件的副檔名為.snap
,使用SquashFS打包,內含程式二進位檔和依賴套件,還有一個. assert檔案,內含數位簽章與權限資訊。
要安裝Snap套件的電腦必須先裝有Snapd。
儘管理論上可以將Snap解壓縮把二進位檔直接拿出來跑,但是這樣會有動態連結檔路徑的問題,故我們這裡不討論這種玩法。
建議還是裝 Snapd,負責管理Snap套件。Ubuntu 16.04以上系統應該就有內建Snapd了。
3. 離線安裝Snap套件#
然後要取得Snap套件。Snap套件要怎麼取得呢?大部分開發者會選擇把Snap套件上傳到Snap Store,比較少會提供snap套件的。
因此這裡就有兩種安裝路徑。
從Snap Store下載套件並安裝#
你可以從Snap Store下載Snap,但不要安裝到目前的系統。
所有的軟體都依賴Ubuntu Core,所以必須先下載這個Snap套件
snap download ubuntu-core
接著再下載你要的應用程式套件,例如Firefox
snap download firefox
下載會得到若干.snapt副檔名的依賴套件,還有.assert副檔名的數位簽章。
.
├── ubuntu-core_1797.assert
├── ubuntu-core_1797.snap
├── firefox_5361.assert
└── firefox_5361.snap
把這些檔案複製到另一部Ubuntu電腦。
再用以下指令,匯入數位簽章
sudo snap ack ubuntu-core_1797.assert
sudo snap ack firefox_5361.assert
再安裝Snap套件
sudo snap install ubuntu-core_1797.snap
sudo snap install firefox_5361.snap
從其他網站下載Snap套件安裝#
部分開發者會在GitHub提供.snap安裝檔,而不是叫你到Snap Store下載,例如……額,我還真找不到幾個開發者這樣幹的XD
這種的Snap套件通常沒有數位簽章,所以你在安裝的時候要加上--dangerous
參數,強制安裝。
sudo snap install <.snap檔案> --dangerous
4. 更新離線安裝的Snap套件#
如果是從Snap Store下載的Snap套件,未來會由Snapd自動更新。
使用--dangerous
參數安裝的套件不會收到自動更新,必須重新安裝新版本。
另外,Snapd的自動更新可以用這個指令關掉:
sudo snap refresh --hold
5. 自架Snap Store#
Snap Store理論上是能夠自架的,可以作為企業或組織內部分發軟體的管道,請參考 Dedicated Snap Stores
還有比較特殊的用法,你想從Snap Store下載軟體,但是又不想更新太頻繁,那麼你就可以用快取工具 Snap Store Proxy自訂更新時間。