Ubuntu在哪里可以捕获写入数据?

在Ubuntu中打包为快照的应用程序安装(安装)在/snap/$SNAPPNAME位置下。 /snap下的所有内容都作为只读文件系统挂载,因此应用程序无法写入该空间,也无法写入其他应用程序的目录或自己的目录。

虽然有一个快照可以指定读取/写入用户主目录的home 接口 ,但出于安全原因,它是保留的,需要由用户手动连接(启用)。

那么快照中的应用程序在哪里可以编写其配置,数据和其他文件? 是否有API可以访问特殊的可写位置?

我在向您提供文档方面遇到了麻烦,这意味着我要么还没有咖啡(真的),要么我们遗漏了一些文档。

当您在snapcraft.yaml声明应用程序时,它会导致在安装时生成二进制包装并放入/snap/bin/ ,以您的包和应用程序名称命名(请注意,如果应用程序是服务,则此包装器将改为systemd .service文件)。

该包装器包含运行应用程序的大部分环境。 与此问题最相关的两个环境变量是SNAP_DATASNAP_USER_DATA

  • SNAP_DATA是系统范围的可写区域(在/var/snap/ )。 例如,这可能用于托管服务日志。

  • SNAP_USER_DATA是运行应用程序的用户的主目录中的用户特定可写区域(特别是/home//snap/ )。 这可能用于特定于用户的配置文件等。

这两个目录对升级/回滚function都非常重要,因为它们都是版本化的 。 也就是说,给定快照的每个版本都有自己的这些目录的副本。 让我举个例子来解释一下。

假设你安装了“foo”snap的版本1。 这将创建两个目录:

  • /var/snap/foo/1SNAP_DATA
  • /home//snap/foo/1SNAP_USER_DATA

现在说“foo”使用这两个。 也许它有一个托管SNAP_DATA数据库的SNAP_DATA ,以及一个使用SNAP_USER_DATA配置文件的二进制文件。

现在发布了“foo”的第2版,它会自动更新。 首先发生的是将/var/snap/foo/1复制到/var/snap/foo/2并将/home//snap/foo/1复制到/home//snap/foo/2 。 然后新版本被启动。 它应该注意到它在旧数据上运行,并且它可能有一些数据库迁移在SNAP_DATA运行到数据库。 它就是这么做的,而且它会消失。

现在说这些迁移因任何原因都失败了,这个应用程序需要回滚。 它开始使用旧版本的/ snap / foo应用程序,其中SNAP_DATA指向/var/snap/foo/1SNAP_USER_DATA指向/home//snap/foo/1 。 这会在迁移运行之前的旧版本上进行选择,因为这些操作是在数据副本上运行的。

简而言之:不要使用home接口来存储您可以存储在SNAP_DATASNAP_USER_DATA ,因为它们是升级/回滚策略中不可或缺的一部分。 利用它们!

更新v2.0.10:

还介绍了两个新的数据目录:

  • SNAP_COMMONSNAP_DATA ,但具体是无版本的 。 特定快照的每个修订版都可以访问此目录,因此在升级/回滚等时不会复制它。这可能用于特别大的无版本文件(例如,不是特定于版本的原始数据)。

  • SNAP_USER_COMMON位于SNAP_USER_COMMON旁边,但是再次专门无版本化 。 它可能用于存储每个用户的非特定于版本的数据。

v2.15的更新:

放置在/snap/bin中的文件不再是定义环境的包装器,而是符号链接到/usr/bin/snap 。 因此,确定运行应用程序的环境的方法是使用snap run --shell . ,例如:

 $ sudo snap install hello-world $ snap run --shell hello-world To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. $ env | grep SNAP SNAP_USER_COMMON=/home/kyrofa/snap/hello-world/common SNAP_REEXEC= SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl: SNAP_COMMON=/var/snap/hello-world/common SNAP_USER_DATA=/home/kyrofa/snap/hello-world/27 SNAP_DATA=/var/snap/hello-world/27 SNAP_REVISION=27 SNAP_NAME=hello-world SNAP_ARCH=amd64 SNAP_VERSION=6.3 SNAP=/snap/hello-world/27