Onde os snaps do Ubuntu podem gravar dados?

30

Aplicativos empacotados como snaps no Ubuntu são instalados (montados) sob o /snap/$SNAPPNAMElocal. Tudo abaixo /snapé montado como um sistema de arquivos somente leitura, portanto, os aplicativos não podem gravar nesse espaço, nem nos diretórios de outros aplicativos nem em seus próprios.

Embora exista uma home interface que os snapshots possam especificar para ler / gravar o diretório inicial do usuário, ela é reservada por razões de segurança e precisa ser conectada manualmente (ativada) pelo usuário.

Então, onde um aplicativo em um piscar de olhos pode gravar sua configuração, dados e outros arquivos? Existem APIs para acessar locais graváveis ​​especiais?

David Planella
fonte

Respostas:

41

Estou tendo problemas para encaminhá-lo para a documentação, o que significa que ainda não tomei meu café (verdadeiro) ou estamos perdendo alguma documentação ( atualização : alguma documentação aqui )

Quando você declara aplicativos no seu snapcraft.yaml, isso resulta em um invólucro binário sendo gerado na instalação e colocado no /snap/bin/nome do pacote e nome do aplicativo (observe que, se o aplicativo for um serviço, esse invólucro será um arquivo systemd .service).

Esse wrapper contém a maior parte do ambiente sob o qual o aplicativo será executado. As duas variáveis ​​de ambiente mais relevantes para esta questão são SNAP_DATAe SNAP_USER_DATA.

  • SNAP_DATAé uma área gravável em todo o sistema (pol /var/snap/). Isso pode ser usado para hospedar logs de serviços, por exemplo.

  • SNAP_USER_DATAé uma área gravável específica do usuário no diretório inicial do usuário que está executando o aplicativo (especificamente /home/<user>/snap/). Isso pode ser usado para arquivos de configuração específicos do usuário, etc.

Ambos os diretórios são muito importantes para a funcionalidade de atualização / reversão, pois os dois são versionados . Ou seja, cada versão de um determinado snap possui sua própria cópia desses diretórios. Deixe-me explicar com um exemplo.

Digamos que você instale a versão 1 do snap "foo". Isso criará dois diretórios:

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

Agora diga "foo" usa os dois. Talvez ele tenha um serviço que hospeda um banco de dados SNAP_DATAe um binário que usa arquivos de configuração SNAP_USER_DATA.

Agora a versão 2 do "foo" é lançada e atualizada automaticamente. A primeira coisa que acontece é que /var/snap/foo/1é copiado /var/snap/foo/2e /home/<user>/snap/foo/1copiado /home/<user>/snap/foo/2. Em seguida, a nova versão é acionada. Observe que está sendo executado em dados antigos e talvez tenha algumas migrações de banco de dados para executar no banco de dados SNAP_DATA. Faz isso, e vai embora.

Agora diga que essas migrações falham por qualquer motivo, e esse aplicativo precisa ser revertido. Ele começa a usar a versão antiga do aplicativo / snap / foo, onde SNAP_DATAestava apontando /var/snap/foo/1e SNAP_USER_DATAapontando /home/<user>/snap/foo/1. Isso acompanha a versão antiga no momento anterior à execução das migrações, pois essas operações foram executadas em uma cópia dos dados.

Para encurtar a história: não use a homeinterface para armazenar dados que você pode armazenar SNAP_DATAou SNAP_USER_DATA, pois eles são parte integrante da estratégia de atualização / reversão. Aproveite-os!

ATUALIZAÇÃO para v2.0.10:

Dois novos diretórios de dados também foram introduzidos:

  • SNAP_COMMONfica ao lado SNAP_DATA, mas é especificamente não versionado . Toda revisão do snap específico tem acesso a esse diretório, portanto ele não é copiado na atualização / reversão, etc. Isso pode ser usado para arquivos particularmente grandes e não versionados (por exemplo, dados brutos que não são realmente específicos da versão).

  • SNAP_USER_COMMONfica ao lado SNAP_USER_DATA, mas é novamente especificamente não versionado . Pode ser usado para armazenar dados não específicos da versão por usuário.

ATUALIZAÇÃO para v2.15:

Os arquivos colocados dentro /snap/binnão são mais wrappers que definem o ambiente, mas links simbólicos para /usr/bin/snap. Portanto, a maneira de determinar o ambiente em que um aplicativo é executado seria usar snap run --shell <snap>.<app>, por exemplo:

$ 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
fonte
1
O SNAP_USER_COMMONdir não está sendo criado automaticamente pelo snapd? O script do iniciador /snap/bin/não o cria e a criação manual dentro do snap falha (permissão negada). A execução snap run appcria essa pasta, no entanto (mas o comando falha com execv failed: No such file or directory... eu não tenho idéia de como usar esse comando).
1
Sim, deveria ser, mas não é (um bug corrigido na próxima versão em que snap runé usado).
Kyle
1
Observe que o snap run é usado na v2.15.
Kyle
2
Parece o doc atualizado, aqui a página ref snapcraft.io/docs/reference/env
user.dz
2
Dois anos depois - você já tomou café? Ainda não há documentação sobre onde os aplicativos Snap podem gravar dados no sistema de arquivos (virtual ou host). Isso não me oferece muita inspiração, pois tento entender os detalhes óbvios básicos sobre os snaps.
Dan Nissenbaum