如何停止snapd自动更新?

我刚刚安装了Ubuntu 18.04。几分钟后,我注意到我的带宽非常低。我安装了nethogs并意识到/usr/lib/snapd/snapd正在消耗我的网络。

问题:

  1. 我该如何禁用它?它真的让我无法使用互联网。
  2. 在安装Ubuntu时,我可以禁用snap软件包系统吗?

非常感谢,


1我认为保留一种获取现有 Snap 软件包安全更新的方式很重要。让系统没有自动化的安全升级程序将是一个巨大的倒退。但当然也需要一种管理带宽过度使用的方法。 - nealmcb
2这个脚本将启动Snap服务,执行刷新操作,然后再次禁用它:https://gist.github.com/rubo77/15366925051dd214b18c306f9389a573 - rubo77
@karel,决定方向应该使用什么?另一个问题似乎已经回答了“如何停止snapd自动更新”的问题,而这个问题只回答了“如何停止snapd”,这就是为什么我投票关闭这个问题的原因。(而且这个问题的主要答案甚至都不起作用) - Merlijn Sebrechts
2如果至少Snap守护程序问我是否要立即更新将会很有帮助,因为更新正在运行的应用程序(例如Chrome)通常会导致应用程序崩溃。有时我会收到“新软件更新可用-安装/查看/取消”消息,但当我单击“查看”时,我无法看到更新,它们通常只是自动安装了。真的很烦人。 - w-sky
7@nealmcb 真正的倒退是Ubuntu走向微软的方式,强制在我们的计算机上安装软件,即使是高级用户也无法选择退出。更糟糕的是,尽管微软的强制更新令人讨厌,Snap的自动更新却存在安全风险,因为它们会从任意供应商自动更新。我信任某个供应商足够安装他们的应用程序今天(可能经过一些审查),并不意味着我明天也会信任他们。你不认为自动更新本身可能存在安全问题吗?告诉这一点给Solar Wind的客户听听看。 - obe
1非常好说,@obe!有太多竞争的优先事项.... - nealmcb
7个回答

你可以通过点击开始按钮,然后搜索“启动应用程序”并更改设置来禁用服务的自动启动。
如果这些答案没有帮到你,你可以尝试以下操作: sudo systemctl mask snapd.service - 将该服务完全禁用,将其链接到 /dev/null;你将无法手动启动或启用该服务。 sudo systemctl unmask snapd.service - 移除与 /dev/null 的链接,并恢复启用和手动启动该服务的能力。
如果您需要更新一个snap程序,您可以解除掩码并启动服务,然后使用命令“snap refresh”。

3这应该被视为真正的答案。所谓的“官方”答案只是在拖延时间。 - Emandudeguy
1答案应该显示如何打开该服务对话框。 - doug
1这样做会禁用安全更新,使系统在下次未修补新漏洞时变得容易受到攻击。 - nealmcb
在我的Ubuntu Budgie 18.10发行版上,我通过点击开始按钮然后搜索"启动应用程序"找到了设置。然而,这并没有解决问题。自动更新仍然继续进行。 - Martin Andersson
13安全更新是指每隔一段时间(可能在屏幕锁定时)使用1Mb/s的速度进行几秒钟的更新,而不是在我玩游戏时以1Mb/s的速度持续五分钟,这是对我的互联网连接的滥用。在执行几个lsof命令之前,我以为这是一种奇怪的恶意软件。 - Avio
在启动应用程序中,我没有看到快照助手。但第二个解决方案很好用,谢谢。 - rubo77
2如果我屏蔽snapd,那么我已经安装的snap应用程序会崩溃或者在下次启动时无法工作吗?我想禁用自动更新,但仍然想使用snap应用程序。 - Rumesh Madhusanka
1@RumeshMadhusanka 我测试了mask / stop / disable并没有导致崩溃,即使snap.service在HTOP中不存在,我的Opera浏览器snap仍然可以正常工作。(遗憾的是,在重新启动或同一会话期间,您需要手动再次start以加载snaps。) - prosody-Gabe Vereable Context
1所以这就是为什么自从过去半年我一直依赖移动数据计划后,我的数据消耗得如此之快!非常感谢Snap开发团队!现在告诉我,我错过了提前通知,唉! - ecv
这并没有停止服务。根据systemctl的手册页面,使用以下命令运行: --now选项可以用于确保单元也被停止。手册还建议mask可能只在重启前生效,但在重启后,服务会被正确禁用。 - Tony Barganski

Snap软件包是获取比以前更多软件的好方法。 现在您可以通过Snap软件包获取Skype、最新的LibreOffice、最新的GIMP、所有JetBrains IDE甚至游戏。
所有这些都可以使用Ubuntu软件应用程序安装,无需使用命令行。
对您来说,重要的问题是,您真的需要禁用Snap软件包吗?
要暂时禁用Snap软件包(直到重新启动或者您运行start为止):
sudo systemctl stop snapd.service

要永久禁用Snap软件包:
sudo systemctl stop snapd.service
sudo systemctl disable snapd.service

重新启用 Snap 包:
sudo systemctl reenable snapd.service
sudo systemctl start snapd.service

5回答无效:仅仅禁用snapd是不够的。尽管如此,我的系统在重启后还是会启动snapd。 - johannes_lalala
10禁用没有起作用,重新启动后它会自动重新启用。你需要使用sudo systemctl mask snapd.service来屏蔽该服务,以确保重启时不会启动(如果你不想重启,可以手动停止它)。 - rubo77
2禁用snapd后,Firefox和Chromium无法正常工作了:错误:无法与服务器通信:Post http://localhost/v2/snapctl:拨号unix /run/snapd-snap.socket:连接:没有这样的文件或目录 错误:未连接到gnome-3-38-2004内容接口。有没有办法禁用snapd但仍然能使用互联网浏览器? - Thomas

你可以停止并隐藏你的snapd服务:
systemctl mask snapd.service
systemctl stop snapd.service

然后使用这个脚本,它将让你能够轻松地更新你的快照:
#!/bin/bash

# this script unmasks and starts the snapd service, do a refresh and disables it again

set -x
systemctl unmask snapd.service
systemctl start snapd.service
systemctl status --no-pager snapd.service
snap refresh
systemctl mask snapd.service
systemctl stop snapd.service
sleep 2
kill -9 $(pgrep snapd)

把它放在/usr/local/sbin/snap-update中,并使用chmod +x赋予可执行权限。
然后你只需要运行:
sudo snap-update

我创建了一个这里的要点,在安装新的快照后还会删除旧的快照。
注意:如果你运行apt自动更新程序,并且有一个由snapd管理的软件包需要更新,如果snapd被屏蔽了,它将会卡住,所以请记得在这种情况下取消屏蔽snapd并重新开始apt upgrade

我尝试使用sudo nethogs wlp4s0来确定/usr/lib/snapd/snapdpid。 然后使用sudo kill -9 pid_of_the process杀死了这个进程。 接着使用sudo systemctl disable snapd.service禁用了这个进程。 从那以后,我的生活变得平静了。我的数据使用量也得到了控制。

3+1 对于 nethogs,真是个不错的工具!但是要停止 snapd 服务,你可以简单地使用 pgrep:一行命令:sudo kill -9 $(pgrep snapd); sudo systemctl stop snapd.service; sudo systemctl mask snapd.service - rubo77

你可以像这样更改快照的更新时间,比如说,将其设置为星期一凌晨12点。
sudo snap set system refresh.timer=mon,12:00

然后你需要刷新它。
sudo snap refresh

如上所述,您还可以暂时禁用更新。
sudo systemctl stop snapd.service

快照更新由应用开发者控制。如果你不想让某个特定的快照更新,你可以要求开发者创建一个“静态”频道,他们只需不进行更新即可。更新将变得简单,只需使用sudo snap refresh <snap> --channel=<new-version>命令切换频道。

我看到Nextcloud是这样处理的;他们似乎有一个版本12的频道,以及其他一些频道,自2018年以来没有进行更新。


我看到禁用服务并不足以停止服务。对我来说,我需要禁用snapd.socket。
sudo systemctl stop snapd.socket
sudo systemctl disable snapd.socket