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

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

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

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

29
задан 17 October 2017 в 09:22

1 ответ

Я испытываю затруднения при обращении Вас к документации, что означает I или не имели моего кофе, еще (верного), или мы пропускаем некоторую документацию (обновление: некоторая документация здесь)

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

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

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

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

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

Скажите установку версии 1 снимка "нечто". Это создаст два каталога:

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

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

Теперь версия 2 "нечто" выпущена, и это автоматически обновляется. Первая вещь, которая происходит, является этим /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, но является снова конкретно неимеющим версию. Это могло бы использоваться для хранения non-version-specific данные на пользователя.

ОБНОВЛЕНИЕ для 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
41
ответ дан 17 October 2017 в 19:22
  • 1
    Только укрепить этот ответ: gnu.org/software/bash/manual/html_node/… . " порядок расширений: расширение фигурной скобки; расширение тильды, параметр и переменное расширение, арифметическое расширение и замена команды (выполненный слева направо вид); разделение слова; и расширение " имени файла; Здесь фигурные скобки никогда не расширяются потому что it' s слишком поздно после того, как переменное расширение уже произошло. – takatakatek 20 September 2017 в 00:43

Другие вопросы по тегам:

Похожие вопросы: