Snap
Snap 是一个软件部署和包管理系统。软件包被称为 “snaps”,而使用它们的工具是 “snapd”,它可以在多种 Linux 发行版上工作,因此允许与发行版无关的上游软件部署。 Canonical,Snap 的开发者,管理着 Snap Store 服务,通过该服务部署 snaps。
snapd 是一个用于管理 snap 软件包的 REST API 守护进程。用户可以使用 snap 客户端与之交互,该客户端是同一软件包的一部分。
Snaps 可以使用 AppArmor 进行限制,AppArmor 现在已在默认内核中启用。请查阅相关的 wiki 页面,以查找在您的系统中启用 AppArmor 的步骤。
- 如果您的系统中未启用 AppArmor,则所有 snaps 将在 devel 模式下运行,这意味着它们将与从 Arch Linux 仓库安装的应用程序一样,对您的系统具有相同的无限制访问权限。
- 运行不受信任的代码永远是不安全的,沙盒无法改变这一点。
安装
snapd
在 /etc/profile.d/snapd.sh
中安装一个脚本,以导出使用 snapd 软件包安装的二进制文件和桌面条目的路径。重启一次以使此更改生效。如果您的系统上启用了 AppArmor 安全模型,snapd 支持它,要安装它,请按照 AppArmor#安装 进行操作。
如果您正在使用 AppArmor,启用 并 启动 apparmor.service
和 snapd.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 ...
错误:/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 Center 和 KDE Discover 都可以提供原生 snap 支持。对于 KDE Discover,请安装 discover-snapAUR 软件包。
可以通过 snap 安装 Snap Store
# snap install snap-store
支持
Arch Linux 相关的邮件列表和其他官方 Arch Linux 支持渠道不是请求关于 Arch Linux 上 snaps 帮助的合适场所。 寻求支持的合适场所是 Snapcraft 论坛。
参见
- 官方网站
- GitHub 仓库
- ArsTechnica 文章 (2016-06) 关于 Ubuntu snaps 将在 Arch 和其他发行版上可用