Snap 基本操作
本文整理日常使用 snap 的指令。 名詞與機制請先參考 Snap 概念。
搜尋與安裝
# 在 Snap Store 搜尋
snap find hello-world
# 顯示 snap 資訊,包含各 channel 目前的 revision
snap info hello-world
# 安裝,預設使用 latest/stable
sudo snap install hello-world
# 指定 channel
sudo snap install hello-world --channel=latest/edge
# classic snap 需要明確同意
sudo snap install code --classic
# 安裝本機 .snap,沒有簽章所以要加 --dangerous
sudo snap install ./hello_1.0_amd64.snap --dangerous
查看狀態
# 已安裝的 snap,包含 version、revision、channel
snap list
# 指定 snap 的詳細資訊
snap info hello-world
# 查看有哪些 app 與 service,以及是否啟動
snap services
# 查看最近的 snap 變更(安裝、更新、連接等)
snap changes
更新、回復與移除
# 更新全部或單一 snap
sudo snap refresh
sudo snap refresh hello-world
# 切換 channel
sudo snap refresh hello-world --channel=latest/beta
# 回到前一個 revision
sudo snap revert hello-world
# 查看下次自動更新的時間
snap refresh --time
# 暫停自動更新(可指定時間,例如 72h)
sudo snap refresh --hold=72h hello-world
# 移除,預設會建立資料 snapshot;--purge 則不保留
sudo snap remove hello-world
sudo snap remove --purge hello-world
管理權限
Strict snap 需要透過 interface 的 connection 才能存取資源,原理請參考 Snap 概念中的 Interface 章節。
# 查看指定 snap 的 plug、slot 與連接狀態
snap connections hello-world
# 查看某個 interface 有哪些 plug 與 slot
snap interface removable-media
# 手動連接;格式為 <snap>:<plug> <提供者>:<slot>,提供者省略時為系統
sudo snap connect hello-world:removable-media
# 中斷連接
sudo snap disconnect hello-world:removable-media
連接狀態中的 - 表示沒有連接,這是 permission denied 最常見的原因。
管理 Service 與設定
# 啟動、停止、重啟 service,--enable 同時設定開機自動啟動
sudo snap start --enable <name>.<service>
sudo snap stop <name>.<service>
sudo snap restart <name>
# 查看 service 的 log
sudo snap logs <name>
sudo snap logs -f <name>.<service>
# 讀寫 snap 的設定(由 snap 作者自行定義 key)
sudo snap set <name> <key>=<value>
sudo snap get <name>
資料路徑與環境變數
Snap 在執行時會設定這些環境變數,路徑中的 <revision> 會隨更新改變。
| 變數 | 路徑 | 特性 |
|---|---|---|
$SNAP |
/snap/<name>/<revision> |
唯讀,snap 本體 |
$SNAP_DATA |
/var/snap/<name>/<revision> |
可寫,每個 revision 各一份,更新時會複製 |
$SNAP_COMMON |
/var/snap/<name>/common |
可寫,所有 revision 共用 |
$SNAP_USER_DATA |
~/snap/<name>/<revision> |
可寫,使用者資料,每個 revision 各一份 |
$SNAP_USER_COMMON |
~/snap/<name>/common |
可寫,使用者資料,所有 revision 共用 |
- 需要跨更新保留的資料放在
common - 需要與 revision 綁定、可隨
snap revert回復的資料放在$SNAP_DATA
疑難排解
Permission denied
- 用
snap connections <name>確認需要的 interface 是否已連接 -
查看 AppArmor 的拒絕紀錄,找出被擋下的路徑與 interface
-
用
sudo snap connect補上 connection
進入 snap 的環境除錯
Service 無法啟動
# 查看 log 與狀態
sudo snap logs -n=50 <name>
snap services <name>
# 查看 systemd unit,名稱為 snap.<name>.<service>.service
systemctl status snap.<name>.<service>.service