Ubuntu在哪里可以捕获写入数据?
在Ubuntu中打包为快照的应用程序安装(安装)在/snap/$SNAPPNAME
位置下。 /snap
下的所有内容都作为只读文件系统挂载,因此应用程序无法写入该空间,也无法写入其他应用程序的目录或自己的目录。
虽然有一个快照可以指定读取/写入用户主目录的home
接口 ,但出于安全原因,它是保留的,需要由用户手动连接(启用)。
那么快照中的应用程序在哪里可以编写其配置,数据和其他文件? 是否有API可以访问特殊的可写位置?
我在向您提供文档方面遇到了麻烦,这意味着我要么还没有咖啡(真的),要么我们遗漏了一些文档。
当您在snapcraft.yaml
声明应用程序时,它会导致在安装时生成二进制包装并放入/snap/bin/
,以您的包和应用程序名称命名(请注意,如果应用程序是服务,则此包装器将改为systemd .service文件)。
该包装器包含运行应用程序的大部分环境。 与此问题最相关的两个环境变量是SNAP_DATA
和SNAP_USER_DATA
。
-
SNAP_DATA
是系统范围的可写区域(在/var/snap/
)。 例如,这可能用于托管服务日志。 -
SNAP_USER_DATA
是运行应用程序的用户的主目录中的用户特定可写区域(特别是/home/
)。 这可能用于特定于用户的配置文件等。/snap/
这两个目录对升级/回滚function都非常重要,因为它们都是版本化的 。 也就是说,给定快照的每个版本都有自己的这些目录的副本。 让我举个例子来解释一下。
假设你安装了“foo”snap的版本1。 这将创建两个目录:
-
/var/snap/foo/1
(SNAP_DATA
) -
/home/
(/snap/foo/1 SNAP_USER_DATA
)
现在说“foo”使用这两个。 也许它有一个托管SNAP_DATA
数据库的SNAP_DATA
,以及一个使用SNAP_USER_DATA
配置文件的二进制文件。
现在发布了“foo”的第2版,它会自动更新。 首先发生的是将/var/snap/foo/1
复制到/var/snap/foo/2
并将/home/
复制到/home/
。 然后新版本被启动。 它应该注意到它在旧数据上运行,并且它可能有一些数据库迁移在SNAP_DATA
运行到数据库。 它就是这么做的,而且它会消失。
现在说这些迁移因任何原因都失败了,这个应用程序需要回滚。 它开始使用旧版本的/ snap / foo应用程序,其中SNAP_DATA
指向/var/snap/foo/1
, SNAP_USER_DATA
指向/home/
。 这会在迁移运行之前的旧版本上进行选择,因为这些操作是在数据副本上运行的。
简而言之:不要使用home
接口来存储您可以存储在SNAP_DATA
或SNAP_USER_DATA
,因为它们是升级/回滚策略中不可或缺的一部分。 利用它们!
更新v2.0.10:
还介绍了两个新的数据目录:
-
SNAP_COMMON
与SNAP_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