Ubuntuでスナップとしてパッケージ化されたアプリケーションは、/snap/$SNAPPNAME
の場所にインストール(マウント)されます。 /snap
の下にあるものはすべて読み取り専用ファイルシステムとしてマウントされるため、アプリケーションは他のアプリのディレクトリにも独自のディレクトリにもそのスペースに書き込むことができません。
スナップがユーザーのホームディレクトリの読み取り/書き込みを指定できるhome
interface がありますが、セキュリティ上の理由から予約されており、ユーザーが手動で接続(有効)する必要があります。
では、スナップ内のアプリは、その構成、データ、およびその他のファイルをどこで書き込むことができますか?書き込み可能な特別な場所にアクセスするためのAPIはありますか?
ドキュメントの参照に問題があります。つまり、まだコーヒーを飲んでいない(true)か、ドキュメントが不足しています(update: ここにいくつかのドキュメント )
snapcraft.yaml
でアプリを宣言すると、インストール時にバイナリラッパーが生成され、パッケージとアプリ名にちなんだ/snap/bin/
に配置されます(アプリがサービスの場合、このラッパー代わりにsystemd .serviceファイルです)。
そのラッパーには、アプリケーションが実行される環境のほとんどが含まれています。この質問に最も関連する2つの環境変数は、SNAP_DATA
とSNAP_USER_DATA
です。
SNAP_DATA
はシステム全体の書き込み可能な領域です(/var/snap/
内)。これは、たとえばサービスのログをホストするために使用される場合があります。
SNAP_USER_DATA
は、アプリケーションを実行しているユーザーのホームディレクトリにあるユーザー固有の書き込み可能な領域です(具体的には/home/<user>/snap/
)。これは、ユーザー固有の構成ファイルなどに使用される場合があります。
これらのディレクトリは両方ともversionedであるため、アップグレード/ロールバック機能にとって非常に重要です。つまり、特定のスナップの各バージョンには、これらのディレクトリの独自のコピーがあります。例で説明しましょう。
「foo」スナップのバージョン1をインストールするとします。これにより、2つのディレクトリが作成されます。
/var/snap/foo/1
(SNAP_DATA
)/home/<user>/snap/foo/1
(SNAP_USER_DATA
)ここで、「foo」はこれらの両方を使用するとします。たぶん、SNAP_DATA
のデータベースをホストするサービスと、SNAP_USER_DATA
の設定ファイルを使用するバイナリがあるかもしれません。
「foo」のバージョン2がリリースされ、自動的に更新されます。最初に起こるのは、/var/snap/foo/1
が/var/snap/foo/2
にコピーされ、/home/<user>/snap/foo/1
が/home/<user>/snap/foo/2
にコピーされることです。次に、新しいバージョンが起動します。古いデータで実行されていることに気付くはずです。おそらく、SNAP_DATA
のデータベースに実行するためのデータベース移行がいくつかあります。それを行い、それは消え去ります。
何らかの理由でこれらの移行が失敗し、このアプリケーションをロールバックする必要があるとします。古いバージョンの/ snap/fooアプリケーションの使用を開始します。SNAP_DATA
は/var/snap/foo/1
を指し、SNAP_USER_DATA
は/home/<user>/snap/foo/1
を指していました。これらの操作はデータのコピーに対して実行されるため、移行が実行される前の時点で、古いバージョンでの処理が行われます。
長い話:home
インターフェイスを使用して、SNAP_DATA
またはSNAP_USER_DATA
に保存できるデータを保存しないでください。これらはアップグレード/ロールバック戦略の不可欠な部分です。それらを活用してください!
v2.0.10の更新:
2つの新しいデータディレクトリも導入されました。
SNAP_COMMON
はSNAP_DATA
と並んでいますが、具体的にはunversionedです。特定のスナップのすべてのリビジョンがこのディレクトリにアクセスするため、アップグレード/ロールバックなどでコピーされません。これは、特に大きなバージョン管理されていないファイル(たとえば、バージョン固有ではない生データ)に使用される場合があります。
SNAP_USER_COMMON
はSNAP_USER_DATA
と並んでいますが、ここでも具体的にunversionedです。ユーザーごとに非バージョン固有のデータを保存するために使用される場合があります。
v2.15の更新:
/snap/bin
内に配置されたファイルは、環境を定義するラッパーではなく、/usr/bin/snap
へのシンボリックリンクです。したがって、アプリケーションが実行される環境を決定する方法は、snap run --Shell <snap>.<app>
を使用することです。次に例を示します。
$ Sudo snap install hello-world
$ snap run --Shell hello-world
To run a command as administrator (user "root"), use "Sudo <command>".
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