Ubuntu 26.04 新装机第一刀:不想被 Snap 绑架,就这样干净卸掉它
先说结论
Ubuntu 26.04 新装系统后,如果你明确不想使用 Snap,可以卸载。正确姿势不是上来就
rm -rf /snap,而是先确认系统里有哪些 Snap 应用,迁移重要数据,再按顺序snap remove --purge,最后apt purge snapd并清理残留目录。本文给出完整背景、风险边界、人工执行方法、Agent 自动配置方法,以及 Windows 11 / Ubuntu 26.04 / macOS 26 三种一键脚本。脚本默认只预演,真正执行必须显式开启,不依赖第三方服务,也不包含任何真实内网地址、真实计算机名、私有域名或密钥。

图 1:AI 生成封面。卸载 Snap 应该像搬家:先点清箱子,再搬走,不要直接拆房子。
一、问题背景:为什么新装 Ubuntu 还要卸 Snap?
Snap 是 Canonical 推动的一套应用分发与沙箱机制。它的目标很明确:让应用打包一次,就能在多个 Linux 发行版上跑;应用和依赖一起发,减少系统库版本冲突;自动刷新,减少用户手动升级的负担。听起来很合理,也确实解决了不少桌面应用分发难题。
但很多人装完 Ubuntu 26.04 后,第一件事仍然是卸 Snap。原因通常不是“Snap 一无是处”,而是它和某些用户的使用习惯不匹配。
常见不适感有这些:
- 应用第一次启动慢,尤其是浏览器、IDE、聊天工具这类大应用;
snap自动更新不完全符合用户想要的维护窗口;/snap、/var/snap、~/snap多出一套目录,看起来和传统 Linux 文件布局不一致;- 某些应用的文件访问、主题、输入法、插件路径和 deb 版本表现不同;
- 服务器或极简开发机根本不需要桌面应用商店;
- 用户希望所有软件都由 APT、Flatpak、源码或容器统一管理。
可以打个比方:APT 像小区门口的菜市场,你买菜、回家、自己放冰箱;Snap 像预制菜加独立保温箱,包装更完整,运输更标准,但箱子占地方,开箱方式也不同。如果你每天只做简单饭,菜市场足够;如果你想省心、隔离、跨环境一致,保温箱也有价值。问题不是谁天然正确,而是你的厨房到底需要哪套规则。

图 2:真实命令截图。Ubuntu 26.04 的 resolute 软件源中提供 snapd,但极简容器镜像默认没有安装它;桌面版新装系统通常会带 Snap 生态。
二、问题表现:Snap 不只是一个命令,而是一套运行时
很多人以为卸载 Snap 就是删掉一个 snap 命令。实际不是。Snap 由几部分组成:
snapd:后台服务,负责安装、刷新、挂载、权限和应用生命周期;snap命令行:和 snapd 通信的客户端;/snap:常见的只读挂载入口;/var/snap:系统级 Snap 应用数据;~/snap:用户级 Snap 应用数据;/var/lib/snapd:snapd 的状态、缓存、挂载单元和元数据;- systemd 单元:比如 snapd socket、snap mount 单元等;
- 已安装的 Snap 应用:常见如浏览器、应用商店、固件工具、主题组件等。
所以,如果你只删目录,系统就像“只把门牌撕了,但租户、钥匙、水电单还在”。正确卸载要走包管理器和 Snap 自己的卸载路径,让它先把已安装应用、快照、挂载、服务状态处理掉。
官方文档也能侧面说明这一点:Snapcraft 的 Ubuntu 安装文档把 snapd 当作系统守护进程安装;Ubuntu snap(8) manpage中 snap remove --purge 的含义,是移除 Snap 时不创建自动删除快照;Snapcraft 快照文档也说明 Snap 会保存用户、系统和配置数据的快照。

图 3:真实文档截图。--purge 的重点是避免移除时自动创建快照,让卸载更干净。
三、问题分析:该不该卸?先看你的机器角色
我不建议把“卸 Snap”写成宗教战争。真正有价值的问题是:这台机器做什么?
如果它是一台给普通用户用的 Ubuntu 桌面机,默认浏览器、应用商店、图形工具都靠 Snap 管理,直接卸掉可能带来额外维护成本。你需要知道 Firefox、Thunderbird、Ubuntu Store 等应用之后从哪里装、如何更新、如何回滚。
如果它是一台开发机、服务器、虚拟机模板、CI 节点或自用极简桌面,卸掉 Snap 往往更容易管理。你会得到更少的后台服务、更少的挂载项、更传统的目录结构,以及更一致的软件来源。代价是:某些只提供 Snap 的应用需要换安装方式。
可以把它理解成整理书桌。Snap 不是垃圾,而是一套带盖收纳盒。对有些人来说,收纳盒让桌面更整齐;对另一些人来说,盒子太多,找东西更慢。如果你已经决定所有东西都放抽屉和文件夹,那就把盒子连同标签一起撤掉。
图 4:推荐流程是盘点、备份、移除应用、卸载 snapd、清理残留、按需阻止重装。
四、根因:为什么“卸不干净”经常发生?
卸 Snap 失败或卸不干净,常见根因有四类。
第一类是顺序错。用户先 apt purge snapd,再发现 snap 命令没了,没法优雅移除已有 Snap 应用。正确顺序应该是先 snap remove --purge,再 apt purge snapd。
第二类是忘了用户数据。~/snap 里可能有应用配置、下载缓存、浏览器 Profile 或登录状态。对完全新装系统,这通常不重要;对已经用了几天的桌面机,就要先看一眼。
第三类是被依赖重新装回来。你后续安装某些 metapackage、桌面组件或软件商店时,可能又把 snapd 拉回来。如果你强烈不想要 Snap,需要通过 APT pin 或 apt-mark hold 给它加一道护栏。
第四类是混淆了“系统能不能运行”和“桌面体验是否完整”。卸掉 Snap 后,Ubuntu 仍然能正常运行;但某些默认应用可能消失,需要用 deb、Flatpak、PPA、官方 tar 包或浏览器官网下载版本替代。
下面的 APT 模拟截图展示了一个重要事实:snapd 在 Ubuntu 26.04 中是普通 deb 包,能通过 APT 安装和卸载;脚本预演能在真正改系统之前看清包管理器准备做什么。

图 5:真实命令截图。先模拟,再执行,是系统维护里最便宜的保险。
五、如何解决:人工自动执行
下面给出三种脚本。它们的用途不同:
- Ubuntu 26.04 脚本:在目标 Ubuntu 本机执行,真正卸载 Snap;
- Windows 11 脚本:从 Windows 通过 SSH 登录 Ubuntu 目标机,远程执行同一套逻辑;
- macOS 26 脚本:从 Mac 通过 SSH 登录 Ubuntu 目标机,远程执行同一套逻辑。
三套脚本都默认 dry-run。只有显式加执行开关时才真正修改系统。
5.1 Ubuntu 26.04 本机脚本
保存为 remove-snap-ubuntu2604.sh。先预演:
bash remove-snap-ubuntu2604.sh
确认输出后执行:
EXECUTE=1 HOLD_SNAPD=1 bash remove-snap-ubuntu2604.sh
脚本如下:
#!/usr/bin/env bash
set -euo pipefail
EXECUTE="${EXECUTE:-0}"
HOLD_SNAPD="${HOLD_SNAPD:-0}"
BACKUP_DIR="${BACKUP_DIR:-$HOME/snap-removal-backup-$(date +%Y%m%d-%H%M%S)}"
if [ "$EXECUTE" = "1" ]; then
MODE="EXECUTE"
else
MODE="DRY-RUN"
fi
run() {
if [ "$EXECUTE" = "1" ]; then
"$@"
else
printf '[dry-run] '
printf '%q ' "$@"
printf '\n'
fi
}
as_root() {
if [ "$(id -u)" -eq 0 ]; then
"$@"
else
sudo "$@"
fi
}
echo "Mode: $MODE"
echo "Backup directory: $BACKUP_DIR"
echo
echo "== System =="
cat /etc/os-release | sed -n '1,8p'
echo
if ! command -v snap >/dev/null 2>&1; then
echo "snap command not found. snapd may already be absent."
else
echo "== Installed snaps =="
snap list --all || true
echo
echo "== Save inventory =="
run mkdir -p "$BACKUP_DIR"
if [ "$EXECUTE" = "1" ]; then
snap list --all > "$BACKUP_DIR/snap-list.txt" || true
snap saved > "$BACKUP_DIR/snap-saved.txt" 2>/dev/null || true
printf 'Saved inventory to %s\n' "$BACKUP_DIR"
fi
echo
echo "== Remove installed snaps with --purge =="
mapfile -t snaps < <(snap list --all 2>/dev/null | awk 'NR>1 {print $1}' | sort -u | tac)
for name in "${snaps[@]:-}"; do
[ -n "$name" ] || continue
run as_root snap remove --purge "$name"
done
fi
echo
echo "== Purge snapd package =="
run as_root apt-get purge -y snapd
run as_root apt-get autoremove --purge -y
echo
echo "== Remove leftover directories =="
for path in /snap /var/snap /var/lib/snapd "$HOME/snap"; do
if [ -e "$path" ]; then
run as_root rm -rf "$path"
fi
done
echo
if [ "$HOLD_SNAPD" = "1" ]; then
echo "== Add APT guard for snapd =="
run as_root apt-mark hold snapd
run as_root install -d -m 0755 /etc/apt/preferences.d
if [ "$EXECUTE" = "1" ]; then
as_root tee /etc/apt/preferences.d/no-snapd.pref >/dev/null <<'EOF'
Package: snapd
Pin: release *
Pin-Priority: -10
EOF
else
echo "[dry-run] write /etc/apt/preferences.d/no-snapd.pref"
fi
else
echo "APT guard skipped. Set HOLD_SNAPD=1 if you want to block accidental reinstall."
fi
echo
echo "== Verification =="
if command -v snap >/dev/null 2>&1; then
echo "snap command still exists: $(command -v snap)"
else
echo "snap command is absent."
fi
dpkg-query -W snapd 2>/dev/null || echo "snapd package is absent."
echo "Done."
这个脚本故意没有自动删除浏览器书签、下载文件或任何用户文档。它只处理 Snap 自己的包、服务和目录。就像搬家公司只搬贴了“Snap”标签的箱子,不会顺手翻你的抽屉。
5.2 Windows 11 一键远程脚本
Windows 上不能卸 Ubuntu 本机的 Snap,但可以通过系统自带 OpenSSH 客户端远程操作目标 Ubuntu。保存为 Remove-Snap-From-Ubuntu.ps1。
先预演:
powershell -ExecutionPolicy Bypass -File .\Remove-Snap-From-Ubuntu.ps1 -Target <ubuntu-target> -User <user>
确认后执行:
powershell -ExecutionPolicy Bypass -File .\Remove-Snap-From-Ubuntu.ps1 -Target <ubuntu-target> -User <user> -Execute -HoldSnapd
脚本如下:
param(
[Parameter(Mandatory=$true)][string]$Target,
[string]$User = "root",
[switch]$Execute,
[switch]$HoldSnapd
)
$ErrorActionPreference = "Stop"
$mode = if ($Execute) { "EXECUTE" } else { "DRY-RUN" }
$hold = if ($HoldSnapd) { "1" } else { "0" }
$executeFlag = if ($Execute) { "1" } else { "0" }
Write-Host "Target: $User@$Target"
Write-Host "Mode: $mode"
$remoteScript = @'
set -euo pipefail
EXECUTE="${EXECUTE:-0}"
HOLD_SNAPD="${HOLD_SNAPD:-0}"
run(){ if [ "$EXECUTE" = "1" ]; then "$@"; else printf '[dry-run] '; printf '%q ' "$@"; printf '\n'; fi; }
as_root(){ if [ "$(id -u)" -eq 0 ]; then "$@"; else sudo "$@"; fi; }
echo "Mode: $([ "$EXECUTE" = "1" ] && echo EXECUTE || echo DRY-RUN)"
cat /etc/os-release | sed -n '1,8p'
if command -v snap >/dev/null 2>&1; then
snap list --all || true
snaps="$(snap list --all 2>/dev/null | awk 'NR>1 {print $1}' | sort -u | tac || true)"
for name in $snaps; do run as_root snap remove --purge "$name"; done
else
echo "snap command not found."
fi
run as_root apt-get purge -y snapd
run as_root apt-get autoremove --purge -y
for path in /snap /var/snap /var/lib/snapd "$HOME/snap"; do [ -e "$path" ] && run as_root rm -rf "$path"; done
if [ "$HOLD_SNAPD" = "1" ]; then
run as_root apt-mark hold snapd
if [ "$EXECUTE" = "1" ]; then
as_root install -d -m 0755 /etc/apt/preferences.d
printf 'Package: snapd\nPin: release *\nPin-Priority: -10\n' | as_root tee /etc/apt/preferences.d/no-snapd.pref >/dev/null
else
echo "[dry-run] write /etc/apt/preferences.d/no-snapd.pref"
fi
fi
command -v snap >/dev/null 2>&1 && echo "snap still exists" || echo "snap command is absent."
dpkg-query -W snapd 2>/dev/null || echo "snapd package is absent."
'@
$envLine = "EXECUTE=$executeFlag HOLD_SNAPD=$hold bash -s"
$remoteScript | ssh "$User@$Target" $envLine
这里的 <ubuntu-target> 是占位符,不要把真实内网地址、真实机器名或私有域名写进公开文章、截图或脚本仓库。
5.3 macOS 26 一键远程脚本
macOS 同样通过 SSH 操作 Ubuntu 目标机。保存为 remove-snap-from-ubuntu-macos.sh。
先预演:
bash remove-snap-from-ubuntu-macos.sh <user> <ubuntu-target>
确认后执行:
EXECUTE=1 HOLD_SNAPD=1 bash remove-snap-from-ubuntu-macos.sh <user> <ubuntu-target>
脚本如下:
#!/usr/bin/env bash
set -euo pipefail
USER_NAME="${1:?usage: bash remove-snap-from-ubuntu-macos.sh <user> <ubuntu-target>}"
TARGET="${2:?usage: bash remove-snap-from-ubuntu-macos.sh <user> <ubuntu-target>}"
EXECUTE="${EXECUTE:-0}"
HOLD_SNAPD="${HOLD_SNAPD:-0}"
ssh "${USER_NAME}@${TARGET}" "EXECUTE=${EXECUTE} HOLD_SNAPD=${HOLD_SNAPD} bash -s" <<'REMOTE'
set -euo pipefail
run(){ if [ "${EXECUTE:-0}" = "1" ]; then "$@"; else printf '[dry-run] '; printf '%q ' "$@"; printf '\n'; fi; }
as_root(){ if [ "$(id -u)" -eq 0 ]; then "$@"; else sudo "$@"; fi; }
echo "Mode: $([ "${EXECUTE:-0}" = "1" ] && echo EXECUTE || echo DRY-RUN)"
cat /etc/os-release | sed -n '1,8p'
if command -v snap >/dev/null 2>&1; then
snap list --all || true
snap list --all 2>/dev/null | awk 'NR>1 {print $1}' | sort -u | tac | while read -r name; do
[ -n "$name" ] && run as_root snap remove --purge "$name"
done
else
echo "snap command not found."
fi
run as_root apt-get purge -y snapd
run as_root apt-get autoremove --purge -y
for path in /snap /var/snap /var/lib/snapd "$HOME/snap"; do
[ -e "$path" ] && run as_root rm -rf "$path"
done
if [ "${HOLD_SNAPD:-0}" = "1" ]; then
run as_root apt-mark hold snapd
if [ "${EXECUTE:-0}" = "1" ]; then
as_root install -d -m 0755 /etc/apt/preferences.d
printf 'Package: snapd\nPin: release *\nPin-Priority: -10\n' | as_root tee /etc/apt/preferences.d/no-snapd.pref >/dev/null
else
echo "[dry-run] write /etc/apt/preferences.d/no-snapd.pref"
fi
fi
command -v snap >/dev/null 2>&1 && echo "snap still exists" || echo "snap command is absent."
dpkg-query -W snapd 2>/dev/null || echo "snapd package is absent."
REMOTE
六、Agent 自动配置方法
如果你让 Codex、Claude、OpenClaw、HermesAgent 之类的 Agent 操作,建议不要只丢一句“帮我卸 Snap”。更稳妥的提示词如下:
你要在一台 Ubuntu 26.04 目标机上卸载 Snap。
要求:
1. 不要输出、记录或提交任何真实内网 IP、完整主机名、私有域名、密钥或令牌。
2. 先只读检查:/etc/os-release、command -v snap、snap list --all、snap saved、apt-cache policy snapd、df -h。
3. 给出影响评估:哪些 Snap 应用会消失,是否有 Firefox/Store/桌面组件替代方案。
4. 先运行 dry-run 脚本,不允许直接执行删除。
5. 我确认后,才允许以 EXECUTE=1 执行。
6. 执行后验证:snap 命令是否消失、snapd 包是否卸载、/snap、/var/snap、/var/lib/snapd 是否还存在。
7. 如需阻止 snapd 被重新安装,使用 HOLD_SNAPD=1,并说明可逆操作。
Agent 的价值不是“比你更敢删”,而是“比你更有耐心地先检查”。它应该像仓库管理员:先盘点、贴标签、给你清单、等你签字,再搬走。不要让 Agent 直接扮演拆迁队。
图 6:人工和 Agent 用的是同一条安全路径:检查、预演、确认、执行、验证。
七、卸完之后怎么替代常见应用?
卸掉 Snap 后,最常见的问题是浏览器和应用商店。
Firefox 可以选择 Mozilla 官方 deb、Mozilla APT 仓库、Flatpak、tar 包或第三方仓库。生产环境建议优先选官方来源,并确认更新机制。不要为了“去 Snap”随便加来路不明的 PPA。
图形应用商店如果依赖 Snap,你可以不用它,改用 apt search、apt install、Flatpak 的图形前端,或者直接从软件官网下载安装包。服务器上通常根本不需要应用商店。
如果只是讨厌某一个 Snap 应用,不一定要卸整套 snapd。你可以只移除那个应用,再换 deb 版或 Flatpak 版。卸载整套 Snap 适合“我明确不想让这台机器出现 Snap 运行时”的场景。
八、回滚:后悔了怎么办?
如果你没有设置 APT guard,恢复很简单:
sudo apt-get update
sudo apt-get install -y snapd
sudo systemctl enable --now snapd.socket
如果你设置了 HOLD_SNAPD=1,先解除:
sudo apt-mark unhold snapd || true
sudo rm -f /etc/apt/preferences.d/no-snapd.pref
sudo apt-get update
sudo apt-get install -y snapd
然后根据需要重新安装应用:
sudo snap install firefox
注意:如果你之前用 --purge 删除了应用,自动移除快照不会保留。重要数据必须在卸载前备份。
九、Q&A
Q1:Ubuntu 26.04 卸 Snap 会不会导致系统不能启动?
通常不会。snapd 是应用分发运行时,不是内核、init、驱动或基础 shell。但桌面应用可能少一些,需要替代安装方式。
Q2:能不能只 sudo apt purge snapd?
不建议。这样可能跳过已安装 Snap 应用的正常移除路径。更稳妥的顺序是先 snap remove --purge,再 apt purge snapd。
Q3:为什么要用 --purge?
因为 Snap 移除应用时可能保存自动快照。新装系统通常没有必要保留这些快照,--purge 更符合“干净卸载”的目标。
Q4:~/snap 可以删吗?
如果你确认里面没有重要应用数据,可以删。脚本只在执行模式处理它,且建议新装机越早处理越安全。已经使用一段时间的机器应先备份。
Q5:卸掉 Snap 后 APT 会不会又装回来?
可能。某些包或桌面组件可能依赖或推荐 snapd。强烈不想要 Snap 的机器可以使用 apt-mark hold 和 APT preferences 阻止自动重装,但这也可能让某些包安装失败。
Q6:服务器也需要卸吗?
如果服务器是极简用途,并且你不用 Snap 部署应用,卸掉能减少后台组件和目录噪音。但如果你依赖 certbot、lxd 或其他 Snap 版本应用,就不要盲目卸。
Q7:这是不是意味着 Snap 很差?
不是。Snap 的隔离、自动更新和跨发行版分发有实际价值。本文解决的是“我明确不想在这台 Ubuntu 26.04 上使用 Snap 时,如何卸得干净、可验证、可回滚”。
十、最后的建议
新装 Ubuntu 26.04 后,是否卸 Snap,取决于机器角色。家用桌面用户如果主要使用默认应用,保留 Snap 可能更省心;开发机、服务器、模板机、追求传统 APT 管理的用户,卸掉 Snap 也完全合理。
真正重要的是方法:别直接删目录,别跳过预演,别忘记数据,别把真实内网信息写进脚本和截图。系统维护不是比赛谁的命令短,而是看谁能在出问题时解释清楚、回滚得回来。