web-dev-qa-db-ja.com

Ubuntuスナップはどこでデータを書き込むことができますか?

Ubuntuでスナップとしてパッケージ化されたアプリケーションは、/snap/$SNAPPNAMEの場所にインストール(マウント)されます。 /snapの下にあるものはすべて読み取り専用ファイルシステムとしてマウントされるため、アプリケーションは他のアプリのディレクトリにも独自のディレクトリにもそのスペースに書き込むことができません。

スナップがユーザーのホームディレクトリの読み取り/書き込みを指定できるhomeinterface がありますが、セキュリティ上の理由から予約されており、ユーザーが手動で接続(有効)する必要があります。

では、スナップ内のアプリは、その構成、データ、およびその他のファイルをどこで書き込むことができますか?書き込み可能な特別な場所にアクセスするためのAPIはありますか?

29
David Planella

ドキュメントの参照に問題があります。つまり、まだコーヒーを飲んでいない(true)か、ドキュメントが不足しています(updateここにいくつかのドキュメント

snapcraft.yamlでアプリを宣言すると、インストール時にバイナリラッパーが生成され、パッケージとアプリ名にちなんだ/snap/bin/に配置されます(アプリがサービスの場合、このラッパー代わりにsystemd .serviceファイルです)。

そのラッパーには、アプリケーションが実行される環境のほとんどが含まれています。この質問に最も関連する2つの環境変数は、SNAP_DATASNAP_USER_DATAです。

  • SNAP_DATAはシステム全体の書き込み可能な領域です(/var/snap/内)。これは、たとえばサービスのログをホストするために使用される場合があります。

  • SNAP_USER_DATAは、アプリケーションを実行しているユーザーのホームディレクトリにあるユーザー固有の書き込み可能な領域です(具体的には/home/<user>/snap/)。これは、ユーザー固有の構成ファイルなどに使用される場合があります。

これらのディレクトリは両方ともversionedであるため、アップグレード/ロールバック機能にとって非常に重要です。つまり、特定のスナップの各バージョンには、これらのディレクトリの独自のコピーがあります。例で説明しましょう。

「foo」スナップのバージョン1をインストールするとします。これにより、2つのディレクトリが作成されます。

  • /var/snap/foo/1SNAP_DATA
  • /home/<user>/snap/foo/1SNAP_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_COMMONSNAP_DATAと並んでいますが、具体的にはunversionedです。特定のスナップのすべてのリビジョンがこのディレクトリにアクセスするため、アップグレード/ロールバックなどでコピーされません。これは、特に大きなバージョン管理されていないファイル(たとえば、バージョン固有ではない生データ)に使用される場合があります。

  • SNAP_USER_COMMONSNAP_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
41
Kyle