Своя среда выполнения или расширение#
Приложение работает поверх среды выполнения. Если готовые среды Astra не подходят, есть два пути: собрать свою среду инструментом aft-runtime или дополнить готовую расширением через aft-extension. Пути решают разные задачи, и выбирают между ними по тому, кому нужны недостающие файлы.
Что выбрать#
Своя среда нужна, когда набор библиотек отличается принципиально: другая линия дистрибутива, другой набор графических библиотек, свой закрытый состав ПО для изолированного контура. Среда собирается из репозиториев дистрибутива и становится общей основой для всех приложений на ней. Обновление среды обновляет основу сразу всем приложениям, но и требует их проверки.
Расширение нужно, когда к готовой среде не хватает конкретного набора файлов: тулчейн для SDK, кодеки, языковые пакеты, драйверы. Расширение монтируется в объявленную хостом точку и живёт своим циклом обновления, не затрагивая ни среду, ни приложения.
Правило простое. Если недостающее нужно всем приложениям на этой основе - это среда. Если оно нужно части приложений или только при сборке - это расширение.
Своя среда выполнения#
Среда собирается из репозиториев дистрибутива и описывается манифестом
aft-runtime. Пакеты делятся на два списка: runtime попадает в саму среду,
sdk добавляется только в SDK-вариант:
version: "1.0"
metadata:
id: ru.example.Platform
name: "Example Platform"
version: "1.0"
branch: "1.0"
arch: amd64
source:
type: debootstrap
debootstrap:
distribution: 1.8_x86-64
mirror: https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-main/
components: [main, contrib, non-free]
variant: minbase
packages:
runtime:
- libgtk-3-0
- libssl3
sdk:
- build-essential
- cmake
environment:
LANG: ru_RU.UTF-8
build:
sdk: true
sbom: true
clean-docs: true
export:
repository: ./repo
Сборка среды меняет систему и требует прав администратора:
sudo aft-runtime build platform.yaml
Флаг build.sdk собирает SDK-вариант рядом со средой: идентификатор
получается из идентификатора среды, а пакеты берутся из обоих списков. Приложения
собираются на SDK, а работают на среде.
Точки расширения#
Среда объявляет точки, в которые потом можно смонтировать расширения. Точка
описывается в секции extensions манифеста среды:
extensions:
- name: ru.example.Platform.Extension
version: "1.0"
directory: lib/extension
subdirectories: true
add-ld-path: lib
no-autodownload: true
Поле directory задаёт каталог монтирования относительно /usr. Каталог
должен существовать в самой среде, иначе смонтировать в него не получится.
Поле subdirectories разрешает нескольким расширениям встать в подкаталоги
одной точки, каждое в свой. Поле no-autodownload оставляет установку
расширения на усмотрение пользователя, без него расширение приезжает вместе со
средой.
Расширение попадает в точку по совпадению начала имени: ref
ru.example.Platform.Extension.codecs встаёт в точку
ru.example.Platform.Extension. Имя точки не обязано начинаться с
идентификатора среды, поэтому одно расширение может обслуживать несколько сред,
если все они объявляют точку с одинаковым именем.
Расширение к готовой среде#
Расширение собирается из тех же источников, что и приложение, но раскладывается
не в /app, а в каталог точки. Обязательны идентификатор и расширяемый хост:
version: "1.0"
metadata:
id: ru.example.Platform.Extension.codecs
name: "Кодеки"
version: "1.0"
branch: "1.0"
arch: amd64
extends:
ref: runtime/ru.example.Platform/x86_64/1.0
directory: lib/extension/codecs
buildRuntime:
id: ru.example.Platform
version: "1.0"
sdk: ru.example.Sdk
source:
type: repository
repository:
package: gstreamer1.0-libav
export:
repository: ./repo
Секция buildRuntime задаёт среду, относительно которой собрано расширение.
По её составу отсекается всё, что в среде уже есть: расширение не дублирует
библиотеки хоста. Пакет, который нужен в расширении несмотря на присутствие в
среде, перечисляется в dependencies.force.
Ветка расширения должна совпадать со значением version или входить в
versions точки расширения хоста. Иначе flatpak не смонтирует расширение, и
никакой ошибки при этом не будет: точка просто останется пустой.
Пути внутри расширения не переписываются. Содержимое монтируется в каталог
точки, а не в /app, поэтому пакет должен быть пригоден к монтированию как
есть либо переразложен правилами layout.