Snap 应用程序未连接到互联网

Snap 应用程序未连接到互联网

我刚刚将我的桌面从 Ubuntu 22.04 升级到 24.04。现在 snap 商店中有许多应用程序。特别是 Firefox、Opera、Chromium 和 Thunderbird。当我启动这些应用程序时,它们都无法连接到互联网。我在 snap 系统之外安装了 chrome,它运行良好。我注意到 snap 应用程序是沙盒化的,所以我想这个沙盒以某种方式将自己与互联网隔离开来。有没有配置页面/应用程序可以检查这一点?这个问题非常严重,因为 Ubuntu 已决定将许多应用程序集成到 snap 系统中。当您使用 apt 安装新应用程序时,它们通常会推送 snap 而不是旧的 deb 包。

任何建议都值得感激......

ETA:我尝试​​使用不同的用户帐户和不同的桌面来运行 snap 应用程序,但同样的问题仍然存在。

ETAA:我查看了日志文件“syslog”并收到如下重复的消息:

内核:审计:类型=1400 审计(1714071244.649:4405):apparmor="DENIED" 操作="open" 类="file" 配置文件="snap.opera.opera" 名称="/etc/resolv-manual.conf" pid=44147 comm="ThreadPoolForeg" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0

尝试从 Opera(此处)和 Firefox 访问互联网时。文件 /etc/resolv-manual.conf 包含 DNS(域名服务器)的 IP 地址。因此,Snap 应用程序显然被安全应用程序 apparmor 阻止访问 DNS 服务器。看起来它由于某种原因配置不正确。

答案1

我从 eyoung100 之前给出的提示中找到了问题的解决方法。他提到人们在使用 tailscale 和 snap 时遇到了问题。我查看了他们报告的问题,并注意到当文件 /etc/resolv.conf 是指向另一个文件的符号链接时,就会出现此问题。snap 无法处理此符号链接,从而导致 DNS 解析失败。

我没有使用 tailscale,但 /etc/resolv.conf 符号链接到我系统上的 /etc/resolv-manual.conf,因为我想手动设置 DNS 服务器。使用实际的 /etc/resolv.conf 文件而不是 /etc/resolv-manual.conf 的问题在于 NetworkManager 会将此文件重置为其想要的文件,因此会覆盖它。

为了解决这个问题,我使用了 Redhat 中的这个过程来阻止 NetworkManager 覆盖 /etc/resolv.conf

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/manually-configuring-the-etc-resolv-conf-file_configuring-and-managing-networking

然后我将 /etc/resolv-manual.conf 移至 /etc/resolv.conf 从而删除了有问题的符号链接。

Snap 现在可以工作了!(我测试了 opera 和 chromium)

这是一个相当微妙的错误,非常感谢eyoung100的所有帮助。我希望他关于删除快照的出色回答能对其他人有所帮助。

答案2

问题

正如原帖所述,我可以放心地假设,任何需要 DNS 查询才能“访问”互联网任何地方的互联网应用程序都无法正常工作。我发表了一些评论,询问原因可能是什么,但在谷歌搜索后snap 包 firefox 无法连接互联网决定不去追查原因。所有结果的普遍共识是 Snap 及其机制存在一些问题。我曾考虑让其他人来解决这个问题,直到我意识到:虽然典范选择此作为战略设计决策,也许我们可以把它关掉。现在我介绍一下相当复杂的过程:

删除 Snap 包

  1. 首先,我们确保它已安装并进行健全性测试:snap --version
  2. 现在让我们收集一下作为核心一部分安装的 snap 包:snap list。把所有这些都写下来或>把它们写到一个文件中打印出来,因为我们很快就会删除它们。
  3. 要删除,请发出:snap remove然后输入步骤 2 中的输出中的包名称。
    • 要验证整个列表是否已被删除,请重新发出snap list。作为最终输出,您应该看到:snap list

尚未安装 snap。请尝试“snap install hello-world”。

删除 Snap Daemon

  1. 停止 SystemD 服务:sudo systemctl stop snapd
  2. 禁用服务:sudo systemctl disable snapd
  3. 掩盖服务:sudo systemctl mask snapd
    • 屏蔽服务会将其符号链接到dev/null。这实际上会将所有重新启动等调用都抛之脑后
  4. 卸载 snapd:apt remove snapd -y
  5. 在升级和安装期间将软件包保持在已删除状态:sudo apt-mark hold snapd

清除残留的垃圾

现在 Snapd 已被删除,我们可以清理配置文件等留下的混乱。

  1. 删除 Snap Cruft:
rm -rf ~/snap
sudo rm -rf /snap
sudo rm -rf /var/snap
sudo rm -rf /var/lib/snapd

关闭 APT 包装器

创建nosnap首选项文件。这将阻止 APT 引入 Snap 本身:

## Thank Linux Mint for this jewel.
## See: https://linuxmint-user-guide.readthedocs.io/en/latest/snap.html
sudo cat <<EOF | sudo tee /etc/apt/preferences.d/nosnap.pref
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF

上述首选项文件将 APT 安装的所有 snap 包版本合并起来,并将优先级降至 0 以下。这确保 APT 永远不会安装snapd

健全性测试

为了确保我们正确完成修改,让我们尝试安装仅作为 Snap 包提供的 Chromium:

sudo apt install chromium-browser
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
chromium-browser : PreDepends: snapd but it is not installable
E: Unable to correct problems, you have held broken packages.

怎么办??

好吧,我们需要一个或两个浏览器,以及我们删除的所有软件包。为了回答这个问题,我将链接到 Chromium 和 Firefox,但谷歌搜索install <package> not snap ubuntu应该可以找到所需的大量结果<package>

  1. 安装 Firefox 而不是 snap
  2. 如何在没有 snap 的情况下安装 Chromium?- 用 Buster 替换 Eoan

正如 DebugPoint 链接所建议的,请始终使用它--install-suggests来防止意外安装 snap 包。在大多数情况下,你应该会收到像上面的 Chromium 一样的警告,但谨慎总比后悔好。

笔记虽然不建议混合使用发行版,但现在这是我们唯一的选择,因为我们已经完全禁用了 Snap 打包机制。 看:不要制作一个 Frankendebian。 一般来说,绝不混合两个主要存储库。我预计,由于您只安装应用程序,因此不会创建 Frakendebian。


PS。由于 Snap 现已禁用,您可以自由调查导致此问题的 DNS 问题。找到问题后,我会向有问题的软件包维护者报告错误,按照他们的建议进行修复,然后撤消此修复。在某个时候,阻止 APT 使用 Snapd 的功能可能会被删除。作为起点,我会考虑在额外的 PC/笔记本电脑上全新安装 22.04,并像我评论的那样进行分阶段升级。您无法在当前安装上使用 VM,因为我们在安装 VM 之前修复了损坏的部分,这会使故障排除失败。

相关内容