Gdzie snap Ubuntu może zapisywać dane?

30

Aplikacje spakowane jako przystawki w Ubuntu są instalowane (montowane) pod tą /snap/$SNAPPNAMElokalizacją. Wszystko pod /snapjest zamontowane jako system plików tylko do odczytu, dlatego aplikacje nie mogą zapisywać w tym miejscu, ani w katalogach innych aplikacji, ani we własnych.

Chociaż istnieje home interfejs, który snaps może określić do odczytu / zapisu katalogu domowego użytkownika, jest on zarezerwowany ze względów bezpieczeństwa i musi być ręcznie podłączony (włączony) przez użytkownika.

Gdzie więc aplikacja w mgnieniu oka może zapisać swoją konfigurację, dane i inne pliki? Czy istnieją interfejsy API umożliwiające dostęp do specjalnych zapisywalnych lokalizacji?

David Planella
źródło

Odpowiedzi:

41

Mam problem z odsyłaniem cię do dokumentacji, co oznacza, że ​​albo jeszcze nie miałem kawy (prawda), albo brakuje dokumentacji ( aktualizacja : tutaj jest trochę dokumentacji )

Gdy deklarujesz aplikacje w swoim snapcraft.yaml, powoduje to generowanie binarnego opakowania podczas instalacji i umieszczanie go /snap/bin/, nazwanego na podstawie nazwy pakietu i aplikacji (zwróć uwagę, że jeśli aplikacja jest usługą, to opakowanie jest zamiast tego systemowym plikiem .service).

To opakowanie zawiera większość środowiska, w którym aplikacja będzie działać. Dwie zmienne środowiskowe, które są najbardziej istotne dla tego pytania, to SNAP_DATAi SNAP_USER_DATA.

  • SNAP_DATAjest ogólnosystemowym obszarem do zapisu (w /var/snap/). Może to służyć na przykład do przechowywania dzienników usług.

  • SNAP_USER_DATAjest specyficznym dla użytkownika obszarem do zapisu w katalogu osobistym użytkownika uruchamiającego aplikację (konkretnie /home/<user>/snap/). Może to być wykorzystane do specyficznych dla użytkownika plików konfiguracyjnych itp.

Oba te katalogi są bardzo ważne dla funkcji aktualizacji / przywracania, ponieważ oba są wersjonowane . Oznacza to, że każda wersja danej przystawki ma własną kopię tych katalogów. Pozwól mi wyjaśnić przykładem.

Załóżmy, że instalujesz wersję 1 przystawki „foo”. To utworzy dwa katalogi:

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

Teraz powiedz „foo” używa obu z nich. Może ma usługę, w której znajduje się baza danych SNAP_DATAi plik binarny, w którym są używane pliki konfiguracyjne SNAP_USER_DATA.

Teraz wersja 2 „foo” została wydana i jest automatycznie aktualizowana. Pierwszą rzeczą, która się dzieje, jest to, że /var/snap/foo/1jest kopiowane /var/snap/foo/2i /home/<user>/snap/foo/1kopiowane do /home/<user>/snap/foo/2. Następnie uruchamiana jest nowa wersja. Powinien zauważyć, że działa na starych danych i być może ma pewne migracje bazy danych do uruchomienia w bazie danych SNAP_DATA. Robi to i odchodzi.

Powiedzmy teraz, że migracje nie udają się z jakiegokolwiek powodu, a ta aplikacja musi zostać wycofana. Zaczyna używać starej wersji aplikacji / snap / foo, do której SNAP_DATAwskazywał /var/snap/foo/1i SNAP_USER_DATAwskazywał /home/<user>/snap/foo/1. To zbiera informacje na temat starej wersji w momencie przed uruchomieniem migracji, ponieważ te operacje były uruchamiane na kopii danych.

Krótko mówiąc: nie używaj homeinterfejsu do przechowywania danych, w których możesz przechowywać SNAP_DATAlub SNAP_USER_DATA, ponieważ są one integralną częścią strategii aktualizacji / wycofywania. Skorzystaj z nich!

AKTUALIZACJA dla wersji 2.0.10:

Wprowadzono również dwa nowe katalogi danych:

  • SNAP_COMMONsiedzi obok SNAP_DATA, ale jest szczególnie niewersjonowany . Każda wersja konkretnej przystawki ma dostęp do tego katalogu, więc nie jest kopiowana podczas aktualizacji / przywracania itp. Może to być wykorzystane w przypadku szczególnie dużych, niewersjonowanych plików (np. Surowe dane, które tak naprawdę nie są specyficzne dla wersji).

  • SNAP_USER_COMMONsiedzi obok SNAP_USER_DATA, ale ponownie jest szczególnie niewersjonowany . Może być używany do przechowywania danych niespecyficznych dla poszczególnych użytkowników.

AKTUALIZACJA dla wersji 2.15:

Pliki umieszczone w nim /snap/binnie są już opakowaniami definiującymi środowisko, ale dowiązaniami symbolicznymi do /usr/bin/snap. Tak więc sposobem określenia środowiska, w którym działa aplikacja, byłoby użycie snap run --shell <snap>.<app>na przykład:

$ 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
źródło
1
Czy SNAP_USER_COMMONdir nie jest tworzony automatycznie przez snapd? Skrypt uruchamiania /snap/bin/nie tworzy go, a ręczne tworzenie go wewnątrz przystawki kończy się niepowodzeniem (odmowa dostępu). Uruchamianie snap run apptworzy ten folder (ale polecenie kończy się niepowodzeniem z execv failed: No such file or directory... Nie mam pojęcia, jak użyć tego polecenia).
1
Tak, powinno być, ale tak nie jest (błąd, który został naprawiony w nadchodzącym wydaniu, gdzie snap runjest używany).
Kyle,
1
Należy pamiętać, że tryb Snap jest używany od wersji 2.15.
Kyle,
2
Wygląda na to, że dokument jest zaktualizowany, tutaj strona ref snapcraft.io/docs/reference/env
user.dz
2
Dwa lata później - piłeś już kawę? Nadal nie ma dokumentacji na temat tego, gdzie aplikacje Snap mogą zapisywać dane w systemie plików (wirtualnym lub hosta). Nie stanowi to dla mnie wielkiej inspiracji, ponieważ staram się zrozumieć podstawowe oczywiste szczegóły dotyczące snapów.
Dan Nissenbaum,