Где Ubuntu может записывать данные?

30

Приложения, упакованные в виде снимков в Ubuntu, устанавливаются (монтируются) под этим /snap/$SNAPPNAMEместоположением. Все в нем /snapмонтируется как файловая система только для чтения, поэтому приложения не могут записывать в это пространство ни в каталогах других приложений, ни в своих собственных.

Хотя существует home интерфейс, который можно указать привязками для чтения / записи домашнего каталога пользователя, он зарезервирован из соображений безопасности и требует ручного подключения (включения) пользователем.

Так где же приложение может в одно мгновение записать свою конфигурацию, данные и другие файлы? Существуют ли API для доступа к специальным локациям для записи?

Дэвид Планелла
источник

Ответы:

41

У меня проблемы с отправкой вам документации, что означает, что я либо еще не выпил свой кофе (правда), либо нам не хватает какой-то документации ( обновление : часть документации здесь )

Когда вы объявляете приложения в своем snapcraft.yaml, это приводит к тому, что двоичная оболочка генерируется после установки и помещается в нее /snap/bin/, названная в честь вашего пакета и имени приложения (обратите внимание, что если приложение является службой, эта оболочка вместо этого представляет собой файл systemd .service).

Эта оболочка содержит большую часть среды, в которой будет работать приложение. Двумя переменными среды, которые наиболее актуальны для этого вопроса, являются SNAP_DATAи SNAP_USER_DATA.

  • SNAP_DATAобщесистемная область записи (в /var/snap/). Это может быть использовано, например, для размещения журналов для сервисов.

  • SNAP_USER_DATAспецифичная для пользователя область записи в домашнем каталоге пользователя, запускающего приложение (в частности /home/<user>/snap/). Это может быть использовано для пользовательских файлов конфигурации и т. Д.

Оба эти каталога очень важны для функциональности обновления / отката, так как оба они имеют версии . То есть каждая версия данной оснастки имеет свою копию этих каталогов. Позвольте мне объяснить на примере.

Допустим, вы устанавливаете версию 1 оснастки «foo». Это создаст две директории:

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

Теперь скажите, что "foo" использует оба из них. Возможно, у него есть служба, в которой размещена база данных SNAP_DATA, и двоичный файл, в котором используются файлы конфигурации SNAP_USER_DATA.

Теперь выпущена версия 2 "foo", и она автоматически обновляется. Первое, что происходит, это то, что /var/snap/foo/1копируется /var/snap/foo/2и /home/<user>/snap/foo/1копируется в /home/<user>/snap/foo/2. Затем новая версия запускается. Он должен заметить, что он работает со старыми данными, и, возможно, у него есть некоторые миграции базы данных для запуска в базу данных SNAP_DATA. Это делает это, и все уходит.

Теперь скажите, что по какой-либо причине эти миграции завершаются неудачно, и это приложение необходимо откатить. Он начинает использовать старую версию приложения / snap / foo, где SNAP_DATAуказывало /var/snap/foo/1и SNAP_USER_DATAуказывало на /home/<user>/snap/foo/1. Это подхватывает старую версию в момент до запуска миграций, так как эти операции выполнялись с копией данных.

Короче говоря: не используйте homeинтерфейс для хранения данных, которые вы можете хранить SNAP_DATAили SNAP_USER_DATA, поскольку они являются неотъемлемой частью стратегии обновления / отката. Воспользуйтесь ими!

ОБНОВЛЕНИЕ для v2.0.10:

Также были введены два новых каталога данных:

  • 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
Обратите внимание, что Snap Run используется начиная с v2.15.
Кайл
2
Похоже, документ обновлен, здесь ссылка на страницу snapcraft.io/docs/reference/env
user.dz
2
Два года спустя - ты уже пил кофе? До сих пор нет документации о том, где приложения Snap могут записывать данные в (виртуальную или хостовую) файловую систему. Это не дает мне большого вдохновения, поскольку я пытаюсь понять основные очевидные детали снимков.
Дэн Ниссенбаум