Snap是Canonical开发的一种通用Linux软件包格式。它的初衷是解决Linux长期以来的依赖问题,让软件在任何Linux发行版上都能“一次构建,到处运行”。 本意是好的,但是实际效果并不如何,应用使用squashfs文件系统,每次启动时需要解压和挂载。这导致了明显的延迟。并且由于每个Snap应用都捆绑了自己的依赖库,导致一些小应用的占用都大的离谱 (致敬Electron) 。 还有诸如强制自动更新导致用户失去控制权、中心化商店和闭源后端等令人诟病的问题,明显违背Linux哲学。 从Ubuntu 21.10开始,Ubuntu将Firefox的默认安装方式从 .deb 改为了 Snap,强制你使用Snap。
备份数据
注意
如果你之前使用过Snap Firefox,在操作前,请务必确认已经备份好了你的浏览器数据。
在终端中执行以下命令:
cp -r ~/.mozilla ~/mozilla-backup
cp -r ~/.cache/mozilla ~/mozilla-cache-backup彻底移除Snap
移除所有 Snap 应用:
bash# 此命令会列出当前安装的所有Snap包并逐个删除 for p in $(snap list | awk 'NR>1 {print $1}'); do sudo snap remove --purge "$p" done如果最终显示 “No snaps are installed yet”,就说明Snap应用已经全部删干净了。
停止并移除Snap服务:
bash# 停止并禁用Snap相关服务 sudo systemctl stop snapd sudo systemctl disable --now snapd.socket # 彻底清除snapd及其配置文件 sudo apt purge --autoremove snapd清理所有Snap残留目录:
bash# 删除Snap创建的各种目录 rm -rf ~/snap sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd锁定Snap并修复依赖:
bash# 锁定snapd,防止其被重新安装 sudo apt-mark hold snapd # 设置APT优先级,从根源上阻止snapd被安装 echo 'Package: snapd Pin: release a=* Pin-Priority: -10' | sudo tee /etc/apt/preferences.d/nosnap.pref # 修复可能因移除操作而损坏的依赖关系 sudo apt install -f
安装原生Firefox
添加Mozilla官方APT源:
bash# 创建存放GPG密钥的目录 sudo install -d -m 0755 /etc/apt/keyrings # 下载并导入Mozilla的GPG签名密钥 wget -q https://packages.mozilla.org/apt/repo-signing-key.gpg -O- | sudo tee /etc/apt/keyrings/packages.mozilla.org.asc > /dev/null # 添加Mozilla官方软件源 echo "deb [signed-by=/etc/apt/keyrings/packages.mozilla.org.asc] https://packages.mozilla.org/apt mozilla main" | sudo tee /etc/apt/sources.list.d/mozilla.list > /dev/null设置优先级,确保安装和更新都使用 .deb 版: 这是最关键的一步,能保证无论未来如何更新,系统都绝不会再切回Snap版。
bash# 设置APT优先级,强制从Mozilla官方源安装 Firefox echo 'Package: firefox* Pin: origin packages.mozilla.org Pin-Priority: 1000 Package: firefox* Pin: release o=Ubuntu Pin-Priority: -1' | sudo tee /etc/apt/preferences.d/mozilla-firefox这里
Pin-Priority: 1000表示优先从 Mozilla 官方源安装,而Pin-Priority: -1则彻底禁止从 Ubuntu 默认源安装 Firefox 的任何版本。安装DEB版Firefox:
bash# 更新并安装 sudo apt update sudo apt install firefox
验证
按理说到到此就应该完全移除Snap了,若不放心可以检查一下
# 检查snapd服务状态
snap list
# 或者
systemctl status snapd如果提示 command not found 或 Unit snapd.service could not be found,说明Snap已经被彻底移除。