目錄

  • 1. 什麼是 Snap?
  • 2. Snap 的核心設計理念
  • 3. Snap 的目錄與文件結構總覽
  • 4. /snap 與 ~/snap:系統倉庫 vs 用户保險箱(原文擴展版)
  • 5. 版本與通道(channels)機制
  • 6. 沙箱與權限(Confinement)模型
  • 7. 常用命令速查表
  • 8. 舊版本與空間清理
  • 9. 與 apt / Flatpak / AppImage 的對比
  • 10. 常見問題 FAQ
  • 11. 總結速覽表
  • 12. 參考與延伸閲讀

1. 什麼是 Snap?

Snap 是 Canonical(Ubuntu 背後的公司)推出的一種跨發行版、原子更新、沙箱化的應用打包與發佈格式。它配套的運行與管理服務稱為 snapd,應用包本身稱為 snap

一句話概括:開發者把應用及其依賴打成一個只讀 SquashFS 鏡像,用户安裝後由 snapd 掛載運行,並通過嚴格(或放寬)的權限系統控制訪問宿主系統資源。


2. Snap 的核心設計理念

目標

説明

一次打包,多發行版運行

無需為不同發行版拆分構建(理論上)。

原子升級 / 可回滾

新版本並行掛載,切換指向即可;失敗可 revert。

沙箱 + 接口授權

通過 AppArmor、seccomp、cgroups 限制訪問;使用 interface(接口)來申請權限。

獨立依賴

避免“系統庫升級導致舊應用崩潰”問題。

自動刷新

默認每天定時檢查並更新。


3. Snap 的目錄與文件結構總覽

路徑

作用

是否可寫

/snap

掛載後的各應用版本目錄(只讀 SquashFS 展開點)


/var/lib/snapd/snaps

實際下載的 .snap 鏡像文件

否(root 管理)

/var/lib/snapd/state.json

snapd 狀態、刷新記錄


/var/snap/<app>/

部分應用的持久化/公共數據


/home/<user>/snap/<app>/

用户級配置、緩存、數據


/etc/systemd/system/snap-*.service

systemd unit(自動生成)

N/A

/var/cache/snapd/

緩存與下載中間文件

是(可清理)

注意:/snap 目錄裏看到的版本號子目錄其實是通過 snapd 把 SquashFS 鏡像 Loop 掛載後呈現出的只讀視圖。


4. /snap 與 ~/snap:系統倉庫 vs 用户保險箱(原文擴展版)

下面內容在原文基礎上重寫為 Markdown,並補充更多背景與示例。

4.1 /snap —— 系統級“程序倉庫”

可類比:Windows 的 C:\Program Files、macOS 的 /Applications

  • 作用:存放應用本體(已掛載的鏡像內容)。
  • 只讀:防止篡改,保證版本一致性。
  • 多版本並存:例如 spotify/123spotify/124,舊版本保留以便回滾。
  • 所有用户共享:節省重複安裝空間。

4.2 ~/snap —— 用户級“數據/配置保險箱”

可類比:C:\Users\<name>\AppData

  • 存放:個人配置、緩存、數據庫、登錄狀態等。
  • 獨立隔離:多用户互不干擾。
  • 更新/回滾時通常保留數據,避免丟失。

4.3 為什麼有看似“重複”目錄?

背後是 Bind Mount 與沙箱映射:

  • 應用在自身受限視圖裏訪問到的是“虛擬路徑”。
  • snapd 通過接口(interface)和 bind mount 暴露你明確允許的目錄或資源。
  • 好處:應用“以為”自己在一個自洽環境裏,提高可移植性與安全性。

4.4 快速對比

特性

/snap

~/snap

角色

程序本體(版本掛載點)

用户數據與配置

讀寫

只讀

可讀寫

作用範圍

系統級(共享)

當前用户

是否可刪

不應手動刪(破壞應用)

不建議隨意刪(丟數據)

更新影響

版本目錄增加/切換

數據通常保留重用

結論:兩個目錄互補,缺一不可。不要手工刪除,使用 snap remove --purge <app> 進行規範卸載。


5. 版本與通道(channels)機制

每個 Snap 應用有多個“通道” (channel):

  • stable(默認,穩定版)
  • candidate(準穩定)
  • beta(測試)
  • edge(最新提交,可能不穩定)

還可帶軌道(track),例如:1.0/stable2.0/edge,用於並行長期維護不同主版本。

示例:

snap info chromium | grep -A5 channels
sudo snap refresh chromium --channel=beta

回滾:

sudo snap revert <app>

查看保留的舊版本(保留策略通常是最近 2 個已安裝 revision):

snap list --all | grep disabled

6. 沙箱與權限(Confinement)模型

模式

説明

典型場景

strict

默認;最強沙箱;僅通過接口訪問資源

瀏覽器、編輯器

classic

幾乎無限制(類似傳統安裝),需特別審批

codegolang 等需要訪問系統工具鏈的開發工具

devmode

開發調試模式,寬鬆且會記錄警告

開發者本地測試

權限通過 interface 聲明與連接:

snap interfaces <app>
# 手動連接(若自動未成功)
sudo snap connect <app>:removable-media

安全底層:AppArmor + seccomp + cgroups + namespaces。


7. 常用命令速查表

任務

命令

搜索應用

snap find <keyword>

查看已安裝

snap list

安裝

sudo snap install <name>

指定通道安裝

sudo snap install <name> --channel=beta

更新全部

sudo snap refresh

查看可更新

snap refresh --list

回滾某應用

sudo snap revert <name>

卸載

sudo snap remove <name>

卸載並清理數據

sudo snap remove --purge <name>

查看佔用空間

`du -h /var/lib/snapd/snaps

設置保留舊版本數

sudo snap set system refresh.retain=2

查看接口

snap interfaces <name>

手動連接接口

sudo snap connect <name>:<plug>

禁止自動刷新(臨時)

sudo snap set system refresh.hold=$(date --date="+7 days" +%Y-%m-%dT%H:%M:%S%:z)

提示:強行長期禁用更新不推薦,會有安全風險。


8. 舊版本與空間清理

8.1 為什麼空間佔用大?

  • 每個 revision 是一個完整鏡像(含依賴)。
  • 多版本並存 + 緩存 + 經典(classic)應用訪問更多資源。

8.2 清理舊 revision

  1. 查看:
snap list --all | grep disabled
  1. 刪除(注意謹慎):
sudo snap remove <name> --revision=<rev>
  1. 或使用 purge:
sudo snap remove --purge <name>

8.3 減少自動保留數量

sudo snap set system refresh.retain=2

8.4 清理緩存

sudo du -sh /var/cache/snapd
sudo rm -f /var/cache/snapd/*  # 安全:僅緩存

不要手動刪除 /snap/var/lib/snapd/snaps 中的鏡像文件,否則 snapd 狀態會失衡。


9. 與 apt / Flatpak / AppImage 的對比

特性

Snap

apt (deb)

Flatpak

AppImage

更新方式

原子更新,可回滾

依賴系統倉庫,非原子

原子(OSTree)

手動替換

沙箱

有(strict)

無(傳統)

有(bubblewrap)

基本無

依賴打包

內含大多數依賴

共享系統庫

runtime + app

全部內含

體積

相對偏大

最精簡

中等

中等~大

啓動速度

可能略慢(掛載+沙箱)


略慢(首次部署)


跨發行版





回滾

簡單

部分支持(需快照/apt pin)

支持

手工替換舊文件

權限管理

接口/plug-slot

手工(如 AppArmor)

Portal 權限

無統一機制


10. 常見問題 FAQ

Q1: 為什麼第一次啓動很慢? 需要掛載鏡像 + 生成用户數據 + 建立接口。

Q2: 為何磁盤佔用大? 含依賴、保留多個 revision、緩存未清理。

Q3: 可以直接刪除 /snap 嗎? 不行,會破壞運行;使用 sudo snap remove

Q4: 如何禁用 Snap? 極端方案是卸載 snapd 並替換為 deb/Flatpak,但 Ubuntu 22.04+ 某些桌面/核心組件依賴 snap(如 snap-storefirefox)。謹慎評估。

Q5: Classic 模式安全嗎? 它基本放棄沙箱隔離,適用於開發工具;來源可信即可。


11. 總結速覽表

關鍵詞

要點

Snap 本質

自包含只讀鏡像 + snapd 服務 + 接口權限模型

兩大目錄

/snap=程序;~/snap=用户數據

優勢

跨平台、一致性、原子更新、可回滾、沙箱化

劣勢

體積偏大、啓動稍慢、佔空間、自動刷新有爭議

管理建議

控制 revision 保留數;定期清理緩存;只從可信渠道安裝

不要做

手動 rm /snap/var/lib/snapd/snaps/*.snap