Snap
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 软件仓库安装的应用程序一样,对您的系统具有相同的无限制访问权限。
- 运行不受信任的代码永远是不安全的,沙盒无法改变这一点。
安装
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 和其他发行版上可用