Dove possono scattare i dati degli Ubuntu?


30

Le applicazioni impacchettate come snap in Ubuntu sono installate (montate) nella /snap/$SNAPPNAMEposizione. Tutto sotto /snapè montato come un file system di sola lettura, quindi le applicazioni non possono scrivere in quello spazio, né nelle directory di altre app né nelle proprie.

Mentre esiste home un'interfaccia che gli snap possono specificare per leggere / scrivere la home directory dell'utente, è riservata per motivi di sicurezza e deve essere connessa manualmente (abilitata) dall'utente.

Quindi, dove può un'app all'interno di uno snap scrivere la sua configurazione, i dati e altri file? Esistono API per accedere a posizioni speciali scrivibili?

Risposte:


41

Ho problemi a riferirti alla documentazione, il che significa che o non ho ancora avuto il mio caffè (vero) o che ci manca della documentazione ( aggiornamento : alcuni documenti qui )

Quando si dichiarano app nella propria app snapcraft.yaml, si genera un wrapper binario generato al momento dell'installazione e inserito in /snap/bin/, chiamato in base al nome del pacchetto e dell'app (si noti che se l'app è un servizio, questo wrapper è invece un file systemd .service).

Tale wrapper contiene la maggior parte dell'ambiente in cui verrà eseguita l'applicazione. Le due variabili d'ambiente che sono più rilevanti per questa domanda sono SNAP_DATAe SNAP_USER_DATA.

  • SNAP_DATAè un'area scrivibile a livello di sistema (in /var/snap/). Questo potrebbe essere usato per ospitare registri per servizi, ad esempio.

  • SNAP_USER_DATAè un'area scrivibile specifica dell'utente nella home directory dell'utente che esegue l'applicazione (in particolare /home/<user>/snap/). Questo potrebbe essere usato per file di configurazione specifici dell'utente, ecc.

Entrambe queste directory sono molto importanti per la funzionalità di aggiornamento / rollback, dal momento che entrambe sono versionate . Cioè, ogni versione di un determinato snap ha la sua copia di queste directory. Lasciami spiegare con un esempio.

Supponi di aver installato la versione 1 dello snap "pippo". Ciò creerà due directory:

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

Ora dì "foo" usa entrambi. Forse ha un servizio che ospita un database SNAP_DATAe un binario che usa i file di configurazione SNAP_USER_DATA.

Ora viene rilasciata la versione 2 di "pippo", che viene automaticamente aggiornata. La prima cosa che succede è che /var/snap/foo/1viene copiato /var/snap/foo/2e in cui /home/<user>/snap/foo/1viene copiato /home/<user>/snap/foo/2. Quindi viene attivata la nuova versione. Dovrebbe notare che è in esecuzione su vecchi dati e forse ha alcune migrazioni del database da eseguire sul database SNAP_DATA. Lo fa e se ne va.

Ora supponiamo che quelle migrazioni falliscano per qualsiasi motivo e che questa applicazione debba essere ripristinata. Inizia a utilizzare la vecchia versione dell'applicazione / snap / foo, dove SNAP_DATApuntava /var/snap/foo/1e SNAP_USER_DATApuntava /home/<user>/snap/foo/1. Questo raccoglie le cose sulla versione precedente nel punto precedente l'esecuzione delle migrazioni, dal momento che quelle operazioni venivano eseguite su una copia dei dati.

Per farla breve: non utilizzare l' homeinterfaccia per archiviare i dati in cui è possibile archiviare SNAP_DATAo SNAP_USER_DATA, poiché sono parte integrante della strategia di aggiornamento / rollback. Approfitta di loro!

AGGIORNAMENTO per v2.0.10:

Sono state inoltre introdotte due nuove directory di dati:

  • SNAP_COMMONsi trova a fianco SNAP_DATA, ma è specificamente non rivisto . Ogni revisione dello snap specifico ha accesso a questa directory, quindi non viene copiata al momento dell'aggiornamento / rollback, ecc. Potrebbe essere utilizzata per file particolarmente grandi e non controllati (ad es. Dati grezzi che non sono specifici della versione).

  • SNAP_USER_COMMONsi trova a fianco SNAP_USER_DATA, ma è di nuovo specificamente non visto . Potrebbe essere utilizzato per la memorizzazione di dati non specifici della versione per utente.

AGGIORNAMENTO per v2.15:

I file inseriti /snap/binnon sono più wrapper che definiscono l'ambiente, ma collegamenti simbolici a /usr/bin/snap. Quindi, il modo per determinare l'ambiente in cui viene eseguita un'applicazione sarebbe utilizzare snap run --shell <snap>.<app>, ad esempio:

$ 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 non viene creato automaticamente da snapd? Lo script di avvio in /snap/bin/non lo crea e la creazione manuale all'interno dello snap ha esito negativo (autorizzazione negata). L'esecuzione snap run appcrea però quella cartella (ma il comando fallisce con execv failed: No such file or directory... Non ho idea di come usare quel comando).

1
Sì, dovrebbe essere, ma non lo è (un bug corretto nella prossima versione in cui snap runviene utilizzato).
Kyle,

1
Si noti che lo snap run viene utilizzato dalla v2.15.
Kyle,

2
Guarda il documento aggiornato, qui la pagina di riferimento snapcraft.io/docs/reference/env
user.dz

2
Due anni dopo, hai già preso un caffè? Ancora nessuna documentazione su dove le applicazioni Snap possano scrivere dati nel file system (virtuale o host). Ciò non mi offre grande ispirazione mentre cerco di comprendere i dettagli ovvi di base sugli scatti.
Dan Nissenbaum,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.