如何卸载Snap?

我使用Ubuntu已经有12年了,最近几个版本中的snap真是令人失望。它引发了很多问题。升级后,Chromium由于以下错误无法启动:
chromium_chromium.desktop[122932]: snap-confine has elevated permissions and is not confined but should be. Refusing to continue to avoid permission escalation attacks: Operation not permitted

如果一个软件包在新版本中更改了配置,它有责任使其正常工作。现在,每次启动后我都必须重新配置它。
sudo apparmor_parser -r /etc/apparmor.d/*snap-confine*

如何完全卸载 Snap 并使用常规的 apt 重新安装其包?
我没有很多由 Snap 处理的软件包。
snap list
Name               Version             Rev   Tracking         Publisher   Notes
chromium           85.0.4183.121       1328  latest/stable    canonical✓  -
core18             20200724            1885  latest/stable    canonical✓  base
gnome-3-34-1804    0+git.3556cb3       60    latest/stable    canonical✓  -
gtk-common-themes  0.1-36-gc75f853     1506  latest/stable    canonical✓  -
snap-store         3.36.0-80-g208fd61  467   latest/stable/…  canonical✓  -
snapd              2.46.1              9279  latest/stable    canonical✓  snapd

我的问题是如何安全地移除 snap。从 snap 列表中,我看到 gnome 依赖于 snap。

2在Ubuntu 20.04上,apt install chromium-browser命令只会重新安装snap软件包,因为该程序现在是通过此方式提供的(已经有几个版本了)。 - guiverc
卸载snap(如果有办法的话)不会解决你的问题。我曾经遇到过与snap相关的Chromium问题。我的“解决方案”是通过谷歌的.deb安装包安装谷歌浏览器。至少对于Chromium来说,我认为这是你唯一的选择。 - Ray
你看过 Snapcraft 的文档了吗?因为它很明确地在 "入门" 部分说明了如何移除 Snaps。此外,这个问题之前已经有人问过:如何手动卸载 Snap 包? - Artur Meinild
使用sudo snap remove命令可以删除所有的snaps,然后您可以使用sudo apt remove命令来移除snapd。 - Artur Meinild
2@Ray 我已经有了 Google Chrome,但我想要同时拥有两个浏览器。在Linux社区,我们为开源程序感到自豪。可惜的是,在Ubuntu上,Google Chrome比Chromium表现更好。 - Googlebot
@Googlebot 说得对。然而,我们不能轻易地认为“为开源项目感到自豪”。要拥有这些开源项目,就需要有人来做,而这些人就是你和我...我们也有可能有不同的工作。有些人的日常工作与任何开源编码都没有交集。因此,当事情不完全符合我们的期望时,我们也必须能够理解。除非我们愿意抽出自己的时间来帮助那个特定的开源项目。我没有关注过关于snap背后的讨论...所以我无法回答“为什么”。 - Ray
1OP的问题中有一个重要的点尚未得到解答:“从快照列表中,我看到gnome依赖于snap。”那么当snap list中列出gnome时,是否可以移除snapd而不会导致任何问题? - calocedrus
请注意下面由Neil发布的Don Prince的新回答。它完全涵盖了所有内容,并安装了Chromium,是真正的Chromium,从已知最新的有效Deb软件包中安装,并将其固定在apt中,以确保它不会再次转移到snap中。 - NeilG
1是的,Snap会引起问题,占用过多的磁盘空间,并且不安全。我找到了一篇很棒的文章: 《如何在Ubuntu 22.04中移除Snap应用并阻止其重新安装》 https://ubuntuhandbook.org/index.php/2022/04/remove-snap-block-ubuntu-2204/ 按照指示完全阻止Snap的重新安装。 - Zen99
3个回答

在Ubuntu 20.04 LTS中(但也适用于22.04及其后续版本,即当前版本),我按照以下步骤删除了snapd:
# stop snapd services
sudo systemctl stop snapd && sudo systemctl disable snapd

# purge snapd
sudo apt purge snapd

# remove no longer needed folders
rm -rf ~/snap
sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd /usr/lib/snapd /root/snap

然后,为了避免其他应用程序重新安装它(chromium-browser 是一个恢复 snapd 的应用程序的例子,即使通过 apt 安装),您可以通过发出以下命令创建一个名为 no-snap.pref 的文件:
sudo -H gedit /etc/apt/preferences.d/no-snap.pref

然后将其中的内容复制如下:
# To install snapd, specify its version with 'apt install snapd=VERSION'
# where VERSION is the version of the snapd package you want to install.
Package: snapd
Pin: release a=*
Pin-Priority: -10

3太棒了,谢谢。我已经将这个写入了一个脚本:https://github.com/BryanDollery/remove-snap - Software Engineer
这个脚本看起来好像可以做到一切:http://blog.pagefault-limited.co.uk/remove-snapd-from-ubuntu-kubuntu-20-04-and-restore-chromium-apt-deb-package - NeilG
1在最近的一个VPS上的20.04安装中,还有/root/snap/lxd目录。 - fdk1342
感谢这个指南。不幸的是,我收到了一个错误信息:删除snap firefox和修订版2088 rm: 无法删除'/var/snap/firefox/common/host-hunspell/en_US.aff':只读文件系统.... dpkg: 处理软件包snapd时出错(--purge): 即使阅读了https://forum.snapcraft.io/t/sdb5-mounted-on-firefox/31897,我也不知道如何删除剩余的块设备。 - Mario
1前一段时间,我用firefox .deb替换了firefox snap。这似乎是从snap沙盒/容器到根文件系统的链接的一个遗留问题。由于某种原因,sudo snap remove firefox无法断开此链接...我不知道如何手动删除该链接。 - Mario

完全赞扬Don Prince提供的全面有效解决方案,this link链接真是太棒了!
我建议您逐个运行这些命令。有些您可能不需要,而有些可能需要额外的一两行。
运行评论中列出的探索性信息命令,以确定您安装的具体情况。
此外,还会安装上次已知的Deb软件包Chromium,并将其固定,以防止snapd再次接管。太棒了!感谢Don!
#!/bin/bash

# probably best to manually type this commands individually checking for problems
 
# snap list | grep -v "^Name" | awk {'print "sudo snap remove " $1'}
 
sudo snap remove snap-store
sudo snap remove gtk-common-themes
sudo snap remove gnome-3-28-1804
sudo snap remove gnome-3-34-1804
sudo snap remove core18
sudo snap remove snapd
snap list # expect: No snaps are installed yet. Try 'snap install hello-world'.
 
sudo umount /run/snap/ns
 
sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service
sudo systemctl disable snapd.autoimport.service
sudo systemctl disable snapd.apparmor.service
 
sudo rm -rf /etc/apparmor.d/usr.lib.snapd.snap-confine.real
 
sudo systemctl start apparmor.service
 
# df | grep snap | awk {'print "sudo umount " $6'}
sudo umount /snap/chromium/1424
sudo umount /snap/gtk-common-themes/1514
sudo umount /snap/gnome-3-28-1804/145
sudo umount /snap/core18/1944
sudo umount /snap/snapd/10492
sudo umount /var/snap
 
sudo apt purge snapd
 
# find / -type d -iname '*snap*'
# (I left the kernel entries well alone)
rm -rf ~/snap
sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd /usr/lib/snapd
sudo rm -rf /root/snap /root/snap/snap-store /usr/share/doc/libsnapd-glib1 /usr/share/doc/gir1.2-snapd-1
 
cat <<EOF | sudo tee /etc/apt/preferences.d/snapd
Package: snapd
Pin: origin *
Pin-Priority: -1
EOF
 
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-xalt7x-chromium-deb-vaapi
Package: *
Pin: release o=LP-PPA-xalt7x-chromium-deb-vaapi
Pin-Priority: 1337
EOF
 
sudo add-apt-repository ppa:xalt7x/chromium-deb-vaapi
 
sudo apt update
sudo apt-get install chromium-browser

1Pin-Priority: 1337 - hobs

我同意你关于snaps的观点。

我已经完全从我的系统中移除了snaps,方法如下:

sudo apt-get purge snapd
rm -rf ~/snap                                      
sudo rm -rf /snap                                  
sudo rm -rf /var/snap                              
sudo rm -rf /var/lib/snapd 

现在系统运行良好,尽管我不得不在可用时用APT或.deb文件版本替代snap程序。不幸的是,在我的情况下,我丢失了一个我需要的应用程序,但这是我必须付出的代价,但我获得了一些磁盘空间,启动时间也稍微缩短了。
gnome仍然安装并正常工作,就像以前一样。

gnome shell version shown in terminal


4sudo apt purge snapd 可以为您完成最后的三个 rm 操作,并以一种具有未来性的方式实现。 - hobs