Snap

出自 ArchWiki

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

snapd 是一个用于管理 snap 软件包的 REST API 守护程序。 用户可以使用 snap 客户端与其交互,snap 客户端是同一软件包的一部分。

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

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

安装

安装 snapdAUR 软件包。

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

如果您的系统上启用了 AppArmor 安全模型,则 snapd 支持该模型,要安装它,请按照 AppArmor#安装 进行操作。

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

配置

要在 snap 尝试使用 snapd 守护程序时启动它,启用/启动 snapd.socket

使用

snap 工具用于管理 snaps。

查找

要查找要安装的 snaps,您可以使用以下命令查询 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/,以使所有 snaps 在系统启动时可用。 完成后,您应该在已安装的 snaps 列表中找到它,以及它的版本号、修订号和开发者,使用以下命令:

$ snap list

您还可以使用以下命令从本地硬盘驱动器侧载 snaps:

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

更新

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

# snap refresh

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

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

# snap refresh --time

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

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

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

移除

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

# snap remove snapname

技巧与提示

经典 snaps

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

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

限制

当使用 AppArmor 时,snapd 将为 snaps 生成与 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#隐藏不需要的目录 以隐藏 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

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

最后,重启您的会话。

错误:无法挂载 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 软件包 安装 到您的系统,您可能需要重启 Arch Linux,然后才能 安装 Snap 软件包

错误:/user.slice/user-1000.slice/session-1.scope 不是 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 安装 Snap Store

# snap install snap-store

支持

Arch Linux 相关的邮件列表和其他官方 Arch Linux 支持渠道不是请求关于 Arch Linux 上 snaps 帮助的合适场所。 寻求支持的合适场所是 Snapcraft 论坛

参见