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


30

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

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

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

回答:


41

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

でアプリを宣言snapcraft.yamlすると、インストール時にバイナリラッパーが生成され/snap/bin/、パッケージとアプリ名に基づいて名前が付けられます(アプリがサービスの場合、このラッパーはsystemd .serviceファイルになります)。

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

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

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

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

「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。それを行い、それは消え去ります。

何らかの理由でこれらの移行が失敗し、このアプリケーションをロールバックする必要があるとしましょう。これは、/スナップ/ fooのアプリケーション、旧バージョンの使用を開始するSNAP_DATAに指していたの/var/snap/foo/1SNAP_USER_DATA指しました/home/<user>/snap/foo/1。これらの操作はデータのコピーに対して実行されたため、これにより、移行が実行される前の時点で古いバージョンの処理が行われます。

簡単に言えば、homeインターフェイスを使用して、SNAP_DATAまたはSNAP_USER_DATAに保存できるデータを保存しないでください。これらはアップグレード/ロールバック戦略の不可欠な部分です。それらを活用してください!

v2.0.10の更新:

2つの新しいデータディレクトリも導入されました。

  • SNAP_COMMONは一緒SNAP_DATAに座っていますが、特にバージョン管理されていません。特定のスナップのすべてのリビジョンがこのディレクトリにアクセスするため、アップグレード/ロールバックなどでコピーされません。これは、特に大きなバージョン管理されていないファイル(実際にはバージョン固有ではない生データなど)に使用される場合があります。

  • SNAP_USER_COMMONは一緒SNAP_USER_DATAに座っていますが、明確にバージョン管理されていません。ユーザーごとに非バージョン固有のデータを保存するために使用される場合があります。

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

1
SNAP_USER_COMMONdir はsnapdによって自動的に作成されていませんか?のランチャースクリプトで/snap/bin/は作成されず、スナップショット内で手動で作成すると失敗します(許可は拒否されます)。実行snap run appすると、そのフォルダーが作成されます(ただし、コマンドは失敗しexecv failed: No such file or directoryます...そのコマンドの使用方法がわかりません)。

1
はい、そうであるはずですが、そうではありません(snap run使用される次のリリースで修正されるバグ)。
カイル

1
スナップランはv2.15以降で使用されることに注意してください。
カイル

2
更新されたドキュメントのようです。ここでは、参照ページsnapcraft.io/docs/reference/env
user.dz

2
2年後-あなたはまだコーヒーを飲んだことがありますか?Snapアプリケーションが(仮想またはホスト)ファイルシステムのどこにデータを書き込むことができるかについてのドキュメントはまだありません。スナップについての基本的な明白な詳細を理解しようとするので、それは私に大きなインスピレーションを提供しません。
ダンニッセンバウム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.