跳转至内容

Snap

来自 ArchWiki

Snap 是一个软件部署和包管理系统。这些软件包被称为 “snaps”,而使用它们的工具是 “snapd”。它可以在多种 Linux 发行版上运行,因此允许与发行版无关的上游软件部署。Snap 的开发商 Canonical 管理着用于部署 snap 的 Snap Store 服务。

snapd 是一个用于管理 snap 包的 REST API 守护进程。用户可以通过使用 snap 客户端与其交互,该客户端包含在同一个安装包中。

Snaps 可以使用 AppArmor 进行限制,这在当前的默认内核中已启用。请查阅相关 wiki 页面以获取在您的系统中启用 AppArmor 的步骤。

警告
  • 如果您的系统中未启用 AppArmor,则所有 snap 将在 devel 模式下运行,这意味着它们对系统的访问权限将与从 Arch Linux 仓库安装的应用程序一样不受限制。
  • 运行不受信任的代码永远是不安全的,沙箱机制无法改变这一点。

安装

安装 snapdAUR 软件包。

提示 snapd/etc/profile.d/snapd.sh 中安装了一个脚本,用于导出通过 snapd 包安装的二进制文件路径和桌面条目。请重启一次以使此更改生效。

snapd 支持 AppArmor 安全模型(如果您的系统已启用),安装请参考 AppArmor#Installation

如果您正在使用 AppArmor,请 启用启动 apparmor.servicesnapd.apparmor.service

配置

为了在 snap 尝试使用时启动 snapd 守护进程,请 启用/启动 snapd.socket

用法

snap 工具用于管理 snaps。

查找

要查找要安装的 snap,您可以使用以下命令查询 Ubuntu Store:

$ snap find searchterm

安装

一旦找到了您要找的 snap,您可以使用以下命令安装:

# snap install snapname

这需要 root 权限。目前尚不支持按用户安装 snap。这将把 snap 下载到 /var/lib/snapd/snaps 并将其挂载到 /var/lib/snapd/snap/snapname 以使其在系统中可用。

它还将为每个 snap 创建挂载单元,并将它们作为符号链接添加到 /etc/systemd/system/multi-user.target.wants/ 中,以便在系统启动时所有 snap 均可用。完成后,您可以使用以下命令查看已安装的 snap 列表及其版本号、修订号和开发人员:

$ snap list

您也可以使用以下命令从本地硬盘侧载 snap:

# snap install --dangerous /path/to/snap

更新

要手动更新您的 snap,请使用:

# snap refresh

Snaps 将根据 snap refresh.timer 的设置自动刷新。

要查看下次/上次刷新时间,请使用:

# snap refresh --time

要设置不同的刷新时间(例如每天两次):

# snap set core refresh.timer=0:00~24:00/2

有关自定义刷新时间的详细信息,请参阅 系统选项文档页面

移除

可以通过执行以下命令移除 snap:

# snap remove snapname

技巧与提示

经典 snap (Classic snaps)

某些 snap(例如 Julia 和 Pycharm)使用经典限制 (classic confinement)。然而,经典限制需要 /snap 目录,这不符合 FHS 标准。snapd 软件包不自带此目录,但用户可以手动在 /var/lib/snapd/snap/snap 之间创建符号链接,以允许安装经典 snap:

# ln -s /var/lib/snapd/snap /snap

限制 (Confinement)

使用 AppArmor 时,snapd 将为 snap 生成与 Ubuntu 上相同的配置文件。 AppArmor 解析器足够智能,能够丢弃那些主线内核尚未支持的规则。

要验证基础限制是否正常工作,请安装 hello-world snap。然后运行以下命令:

$ hello-world.evil
Hello Evil World!
This example demonstrates the app confinement
You should see a permission denied error next
/snap/hello-world/27/bin/evil: 9: /snap/hello-world/27/bin/evil: cannot create /var/tmp/myevil.txt: Permission denied

拒绝访问是由 AppArmor 引起的,并且应该已被记录在日志中:

# dmesg
...
[  +0.000003] audit: type=1327 audit(1540469583.966:257): proctitle=2F62696E2F7368002F736E61702F68656C6C6F2D776F726C642F32372F62696E2F6576696C
[ +12.268939] audit: type=1400 audit(1540469596.236:258): apparmor="DENIED" operation="open" profile="snap.hello-world.evil" name="/var/tmp/myevil.txt" pid=10835 comm="evil" requested_mask="wc" denied_mask="wc" fsuid=1000 ouid=1000
[  +0.000006] audit: type=1300 audit(1540469596.236:258): arch=c000003e syscall=2 success=no exit=-13 a0=55d991ba6bc8 a1=241 a2=1b6 a3=55d991ba6be0 items=0 ppid=31349 pid=10835 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts2 ses=3 comm="evil" exe="/bin/dash" subj==snap.hello-world.evil (enforce)
...

如果您没有看到拒绝访问的记录,请验证配置文件是否已加载:

# aa-status | grep snap.hello-world
   snap.hello-world.env
   snap.hello-world.evil
   snap.hello-world.hello-world
   snap.hello-world.sh

此外,您可以根据 snapd 检查系统中可用的沙箱特性:

$ snap debug sandbox-features
apparmor:             kernel:caps kernel:domain kernel:file kernel:mount kernel:namespaces kernel:network_v8 kernel:policy kernel:ptrace kernel:query kernel:rlimit kernel:signal parser:unsafe policy:default support-level:partial
confinement-options:  devmode
dbus:                 mediated-bus-access
kmod:                 mediated-modprobe
mount:                freezer-cgroup-v1 layouts mount-namespace per-snap-persistency per-snap-profiles per-snap-updates per-snap-user-profiles stale-base-invalidation
seccomp:              bpf-argument-filtering kernel:allow kernel:errno kernel:kill_process kernel:kill_thread kernel:log kernel:trace kernel:trap

隐藏 snap 文件夹

请参阅 XDG Base Directory#Hiding unwanted directories 以隐藏 snap 文件夹。

Sudo

由于 sudo 默认启用了 secure_path/var/lib/snapd/snap/bin 目录不再存在于 sudo 启动进程的默认 $PATH 环境变量中。诸如 sudo lxc list 之类的命令将会失败,因为 shell 进程无法再找到 lxc 符号链接。

这可以通过将以下片段添加到 /etc/sudoers.d/90_snap 来针对每个用户解决:

# Add snap binaries installation dir to PATH
Defaults:<your-user-name> secure_path="/usr/local/sbin:/usr/local/bin:/usr/bin:/var/lib/snapd/snap/bin"

其中 <your-user-name> 必须替换为所需的 $USER

故障排除

文本无法阅读

如果您看到的是方块而不是可读字符,您需要清理字体缓存:

# rm -f /var/cache/fontconfig/*
$ rm -f ~/.cache/fontconfig/*
# fc-cache -r -v

Snapctl 还为每个单独的 snap 存储内部缓存,这些缓存需要 单独清理。首先,通过运行以下命令找到它们:

$ find ~/snap/ -wholename '*/.cache/fontconfig'
... /home/darth_vader/snap/mailspring/common/.cache/fontconfig
... /home/darth_vader/snap/authy/common/.cache/fontconfig
... /home/darth_vader/snap/icedrive/common/.cache/fontconfig
... /home/darth_vader/snap/discord/common/.cache/fontconfig
... /home/darth_vader/snap/bitwarden/common/.cache/fontconfig

然后单独删除它们,或者使用 这个简单的循环脚本

最后,重启您的会话。

错误:cannot mount squashfs

Snap 包使用 SquashFS 文件系统。如果出现类似以下错误:

error: system does not fully support snapd: cannot mount squashfs image using "squashfs"

您可以使用以下命令验证 SquashFS 内核模块是否已加载:

$ lsmod
Module                  Size  Used by
squashfs               xxxxx  x
...
提示 如果您最近在系统中 安装 了 snapd 软件包,您可能需要在 安装 Snap 包 之前重启 Arch Linux。

错误:/user.slice/user-1000.slice/session-1.scope is not a snap cgroup

您需要像这样设置您的 DBUS_SESSION_BUS_ADDRESS 环境变量:

export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus"

为了使此更改永久生效并在您的 GUI 会话中可用,请考虑将此行添加到您的 ~/.xprofile 文件中。

有关此问题的更多信息和完整讨论,请 在此阅读

图形化管理

本文或本章节的准确性存在争议。

原因: gnome-software 的 snap 插件默认未构建(在 Talk:Snap#Snap support in Gnome Software 3.38 中讨论)

Gnome Software Center 和 KDE Discover 都可以提供原生的 snap 支持。对于 KDE Discover,请安装 discover-snapAUR 软件包。

Snap Store 可以通过 snap 安装:

# snap install snap-store

支持

与 Arch Linux 相关的邮件列表和其他官方 Arch Linux 支持渠道不是请求在 Arch Linux 上使用 snap 获得帮助的合适场所。请求支持的合适场所是 Snapcraft 论坛

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.