Де Ubuntu оснащення може записувати дані?


30

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

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

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

Відповіді:


41

У мене виникають проблеми з посиланням на вас з документацією, а це означає, що я ще не випив кави (правда), або ми пропустили якусь документацію ( оновлення : деяка документація тут )

Коли ви декларуєте додатки у своїх програмах snapcraft.yaml, це призводить до того, що при встановленні та розміщенні в ньому створюється двійкова обгортка /snap/bin/, названа за назвою вашого пакета та додатка (зауважте, що якщо додаток є послугою, ця обгортка замість цього має системний файл .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_COMMONстворюється dir автоматично створено snapd? Сценарій запуску /snap/bin/не створює його, а його створення вручну всередині оснастки не вдається (дозвіл відмовлено). При запуску snap run appстворюється ця папка (але команда не вдається execv failed: No such file or directory... Я не маю уявлення, як використовувати цю команду).

1
Так, так і має бути, але це не так (помилка, яка виправлена ​​у наступному випуску, де snap runвона використовується).
Кайл

1
Зауважте, що запуск запуску використовується з версії 15.15.
Кайл

2
Здається, оновлення документа оновлено тут, перегляньте сторінку snapcraft.io/docs/reference/env
user.dz

2
Через два роки - ви ще кавали? Досі немає документації про те, куди програми Snap можуть записувати дані у (віртуальну або хост) файлову систему. Це не дає мені великого натхнення, коли я намагаюся зрозуміти основні очевидні деталі щодо знімків.
Дан Ніссенбаум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.