Wo können Ubuntu-Snaps Daten schreiben?

30

In Ubuntu als Snaps gepackte Anwendungen werden unter dem /snap/$SNAPPNAMESpeicherort installiert (gemountet) . Alles darunter /snapist als schreibgeschütztes Dateisystem gemountet, daher können Anwendungen weder in die Verzeichnisse anderer Apps noch in ihre eigenen in diesen Bereich schreiben.

Zwar gibt es eine home Schnittstelle , über die Snaps das Basisverzeichnis des Benutzers lesen / schreiben können, diese ist jedoch aus Sicherheitsgründen reserviert und muss vom Benutzer manuell verbunden (aktiviert) werden.

Wo kann eine App in einem Snap ihre Konfiguration, Daten und andere Dateien schreiben? Gibt es APIs für den Zugriff auf bestimmte beschreibbare Speicherorte?

David Planella
quelle

Antworten:

41

Ich habe Probleme, Sie auf die Dokumentation zu verweisen. Dies bedeutet, dass ich entweder noch keinen Kaffee getrunken habe (true) oder dass wir eine Dokumentation vermissen ( Update : Dokumentation hier ).

Wenn Sie Apps in Ihrem deklarieren snapcraft.yaml, wird bei der Installation ein Binär-Wrapper generiert /snap/bin/, der nach Ihrem Paket- und App-Namen benannt wird.

Dieser Wrapper enthält den größten Teil der Umgebung, in der die Anwendung ausgeführt wird. Die beiden Umgebungsvariablen, die für diese Frage am relevantesten sind, sind SNAP_DATAund SNAP_USER_DATA.

  • SNAP_DATAist ein systemweiter beschreibbarer Bereich (in /var/snap/). Dies kann beispielsweise zum Hosten von Protokollen für Dienste verwendet werden.

  • SNAP_USER_DATAist ein benutzerspezifischer beschreibbarer Bereich im Basisverzeichnis des Benutzers, der die Anwendung ausführt (speziell /home/<user>/snap/). Dies kann für benutzerspezifische Konfigurationsdateien usw. verwendet werden.

Beide Verzeichnisse sind für die Upgrade- / Rollback-Funktionalität sehr wichtig, da beide versioniert sind . Das heißt, jede Version eines bestimmten Snaps verfügt über eine eigene Kopie dieser Verzeichnisse. Lassen Sie mich mit einem Beispiel erklären.

Angenommen, Sie installieren Version 1 des Snaps "foo". Dadurch werden zwei Verzeichnisse erstellt:

  • /var/snap/foo/1( SNAP_DATA)
  • /home/<user>/snap/foo/1( SNAP_USER_DATA)

Sagen wir jetzt, "foo" verwendet beide. Vielleicht hat es einen Dienst, der eine Datenbank in hostet SNAP_DATA, und eine Binärdatei, die Konfigurationsdateien in verwendet SNAP_USER_DATA.

Jetzt wird Version 2 von "foo" veröffentlicht und es wird automatisch aktualisiert. Das erste, was passiert, ist, dass /var/snap/foo/1in /var/snap/foo/2und /home/<user>/snap/foo/1in kopiert wird /home/<user>/snap/foo/2. Dann wird die neue Version gestartet. Es sollte bemerkt werden, dass es auf alten Daten ausgeführt wird und möglicherweise einige Datenbankmigrationen zur Datenbank in ausgeführt werden müssen SNAP_DATA. Es macht das und weg geht es.

Sagen wir nun, diese Migrationen schlagen aus irgendeinem Grund fehl und diese Anwendung muss zurückgesetzt werden. Es wird die alte Version der Anwendung / snap / foo verwendet, SNAP_DATAauf die /var/snap/foo/1und SNAP_USER_DATAauf die gezeigt wurde /home/<user>/snap/foo/1. Dies greift die alte Version zum Zeitpunkt vor der Ausführung der Migrationen auf, da diese Vorgänge mit einer Kopie der Daten ausgeführt wurden.

Kurz gesagt: Verwenden Sie die homeSchnittstelle nicht zum Speichern von Daten, die Sie in SNAP_DATAoder speichern können SNAP_USER_DATA, da diese ein wesentlicher Bestandteil der Upgrade- / Rollback-Strategie sind. Nutzen Sie sie!

UPDATE für v2.0.10:

Zwei neue Datenverzeichnisse wurden ebenfalls eingeführt:

  • SNAP_COMMONsitzt neben SNAP_DATA, ist aber spezifisch nicht versioniert . Jede Revision des spezifischen Snaps hat Zugriff auf dieses Verzeichnis, sodass es beim Upgrade / Rollback usw. nicht kopiert wird. Dies kann für besonders große, nicht versionierte Dateien (z. B. Rohdaten, die nicht wirklich versionsspezifisch sind) verwendet werden.

  • SNAP_USER_COMMONsitzt neben SNAP_USER_DATA, ist aber wieder spezifisch unversioniert . Es kann zum Speichern nicht versionsspezifischer Daten pro Benutzer verwendet werden.

UPDATE für v2.15:

Die darin platzierten Dateien /snap/binsind keine Wrapper mehr, die die Umgebung definieren, sondern Symlinks zu /usr/bin/snap. Die Möglichkeit, die Umgebung zu bestimmen, in der eine Anwendung ausgeführt wird snap run --shell <snap>.<app>, besteht beispielsweise darin, Folgendes zu verwenden :

$ 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
Kyle
quelle
1
Wird SNAP_USER_COMMONdir nicht automatisch von snapd erstellt? Das Startskript in erstellt /snap/bin/es nicht und das manuelle Erstellen innerhalb des Snaps schlägt fehl (Berechtigung verweigert). Beim Ausführen snap run appwird dieser Ordner erstellt (aber der Befehl schlägt fehl mit execv failed: No such file or directory... Ich habe keine Ahnung, wie dieser Befehl verwendet wird).
1
Ja, das sollte es sein, aber es ist nicht so (ein Fehler, der in der kommenden Version behoben wurde, in der er snap runverwendet wird).
Kyle
1
Beachten Sie, dass Snap Run ab Version 2.15 verwendet wird.
Kyle
2
Scheint das Dokument aktualisiert zu haben, hier die Ref-Seite snapcraft.io/docs/reference/env
user.dz
2
Zwei Jahre später - haben Sie schon Kaffee getrunken? Noch keine Dokumentation darüber, wo Snap-Anwendungen Daten in das (virtuelle oder Host-) Dateisystem schreiben können. Das ist keine große Inspiration für mich, da ich versuche, die grundlegenden offensichtlichen Details von Druckknöpfen zu verstehen.
Dan Nissenbaum