Концепции и архитектура Flatpak#
Flatpak - это система сборки, распространения и запуска настольных приложений в изолированной среде (песочнице) на Linux. В отличие от классических пакетных менеджеров, Flatpak отделяет приложение от конкретного дистрибутива: одна и та же сборка может работать на разных версиях системы без перекомпиляции.
Технология основана на нескольких принципах:
Изоляция - каждое приложение работает в песочнице, ограниченной пространствами имён ядра Linux и фильтрами системных вызовов.
Декларативность - все разрешения и зависимости описываются в метаданных. Пользователь или администратор может переопределить разрешения после установки, но исходный набор всегда явно задекларирован.
Воспроизводимость - рантайм даёт фиксированный набор библиотек, благодаря чему приложение ведёт себя одинаково на любой системе.
Атомарность обновлений - обновление применяется целиком или не применяется вовсе, без состояния частично обновлённого приложения.
Терминология#
Рантайм (Runtime)#
Рантайм - это базовый набор разделяемых библиотек и ресурсов, на которые
опираются приложения: системные библиотеки (libc, libssl, zlib), фреймворки
(Qt, GTK) и вспомогательные утилиты. Рантайм монтируется в песочницу по пути
/usr и доступен только для чтения.
Одна версия рантайма может использоваться множеством приложений одновременно.
Обновление рантайма обновляет библиотечную базу всех зависящих от него
приложений. Рантаймы именуются в формате обратного DNS (например,
org.example.Platform), и каждая версия хранится в отдельной ветке.
SDK#
SDK (Software Development Kit) - расширенная версия рантайма с заголовочными файлами, компиляторами, инструментами сборки и отладки. SDK используется только на этапе сборки и не устанавливается на целевую систему. При инициализации сборки разработчик указывает оба идентификатора: рантайм для запуска и SDK для компиляции.
Приложение (Application)#
Приложение - конечный продукт, который устанавливается и запускается
пользователем. Его файлы монтируются в песочнице по пути /app. Без явно
предоставленных разрешений приложение не имеет прямого доступа к хостовой
файловой системе, устройствам и сети.
Каждое приложение идентифицируется строкой в формате обратного DNS
(org.example.MyApp): минимум две точки, латинские буквы, цифры, точки и
дефисы.
Ссылка (Ref)#
Ссылка - полный адрес объекта в репозитории Flatpak в формате
<тип>/<идентификатор>/<архитектура>/<ветка>. Примеры:
app/org.example.MyApp/x86_64/stable
runtime/org.example.Platform/x86_64/23.08
Тип принимает значения app (приложение) или runtime (рантайм или SDK).
Архитектура указывается в формате Flatpak: x86_64, aarch64, arm,
i386.
Ветка (Branch)#
Ветка определяет версионную линию рантайма или приложения. Для рантаймов ветка
обычно совпадает с мажорной версией (23.08, 24.08), для приложений часто
используется stable. Flatpak допускает параллельную установку нескольких
веток одного рантайма, поэтому приложения под разные версии рантайма работают
одновременно.
Песочница (Sandbox)#
Песочница - среда исполнения, ограничивающая доступ приложения к ресурсам хоста. В основе лежат механизмы ядра Linux:
Пространства имён изолируют файловую систему, сеть, идентификаторы процессов, пользователей и межпроцессное взаимодействие.
Seccomp ограничивает набор доступных процессу системных вызовов.
Bubblewrap создаёт песочницу с нужным набором пространств имён и монтирований.
Внутри песочницы приложение видит файловую систему, составленную из файлов
рантайма (/usr, только чтение), файлов приложения (/app, только чтение),
изменяемых данных (/var) и данных приложения на хосте
(~/.var/app/<id>).
Порталы (Portals)#
Порталы - механизм безопасного взаимодействия приложения с хостом через D-Bus. Вместо прямого доступа к файлам или устройствам приложение отправляет запрос порталу, а решение принимает пользователь через стандартный диалог. Примеры порталов: выбор файлов, открытие ссылок, печать, снимок экрана, уведомления.
OSTree#
OSTree - хранилище, лежащее в основе репозиториев Flatpak. По принципу работы оно похоже на Git, но применяется к бинарным файлам:
Каждая версия приложения или рантайма фиксируется как коммит - неизменяемый снимок файлового дерева.
Коммиты образуют историю, что позволяет откатиться к предыдущей версии.
Файлы хранятся с дедупликацией по контрольным суммам, экономя место.
Статические дельты - заранее рассчитанные разности между версиями, ускоряющие загрузку обновлений.
Репозиторий Flatpak - это OSTree-репозиторий с дополнительными метаданными (индекс summary, данные AppStream, GPG-подписи).
Расширения (Extensions)#
Расширения - механизм подключения дополнительных компонентов к рантайму или приложению. Расширение монтируется в определённый каталог внутри песочницы. Типичные применения: локализации, кодеки и медиабиблиотеки, темы оформления, плагины. Точка расширения определяется в метаданных и включает имя, каталог монтирования и условия загрузки.
Разрешения#
Разрешения определяют, к каким ресурсам хоста имеет доступ приложение. Они
фиксируются при сборке (в манифесте flatpak-builder - секция finish-args) и
записываются в метаданные пакета.
Сокеты#
Управляют доступом к графике, звуку и шинам:
x11- доступ к серверу X11.wayland- доступ к композитору Wayland.fallback-x11- X11 только при отсутствии Wayland.pulseaudio- доступ к звуковой подсистеме.cups- доступ к подсистеме печати.pcsc- доступ к устройствам смарт-карт.ssh-auth- доступ к агенту аутентификации SSH.session-bus- полный доступ к сессионной шине D-Bus.system-bus- полный доступ к системной шине D-Bus.
Устройства#
dri- доступ к видеоускорению (GPU).kvm- доступ к виртуализации.shm- доступ к разделяемой памяти.all- доступ ко всем устройствам.
Разделяемые ресурсы#
network- доступ к сети.ipc- межпроцессное взаимодействие (нужно для X11).
Файловые системы#
Управляют доступом к каталогам хоста:
home- домашний каталог пользователя.host- вся файловая система хоста.host-os- каталог/usrхоста (только чтение).host-etc- каталог/etcхоста (только чтение).xdg-desktop,xdg-documents,xdg-download,xdg-music,xdg-pictures,xdg-videos- стандартные пользовательские каталоги.Абсолютный путь - произвольный каталог.
К любому значению можно добавить суффикс :ro (только чтение), :rw
(чтение и запись) или :create (создать при отсутствии).
Персистентные каталоги#
Каталоги из списка persist создаются в ~/.var/app/<id>/ и монтируются в
домашний каталог приложения. Так приложение сохраняет конфигурацию между
запусками без доступа к реальному домашнему каталогу.
D-Bus#
Определяют, какими именами на шине D-Bus приложение может владеть (own) и к каким обращаться (talk). Отдельно задаются имена для сессионной и для системной шины.
Переменные окружения#
Позволяют задать или удалить переменные окружения внутри песочницы.
Сравнение с deb-пакетами#
Flatpak и deb - два разных подхода к распространению ПО.
Модель зависимостей. В deb зависимости разрешаются пакетным менеджером из общего пула дистрибутива; конфликт версий приводит к неразрешимым зависимостям. В Flatpak системные библиотеки даёт рантайм (одна копия на все приложения), а специфичные библиотеки включаются в сам пакет, поэтому разные приложения могут использовать разные версии одной библиотеки.
Изоляция. Пакет deb устанавливается глобально и имеет полный доступ к системе с правами пользователя. Приложение Flatpak работает в песочнице, и доступ определяется набором разрешений, заданным при сборке.
Обновления. Обновление deb заменяет файлы на диске и не атомарно. Обновление Flatpak создаёт новый коммит и переключает ссылку атомарно; при сбое старая версия остаётся работоспособной, а откат выполняется одной командой.
Кроссдистрибутивность. Пакет deb собирается под конкретную версию дистрибутива. Пакет Flatpak опирается на рантайм и работает на любой системе, где установлен совместимый рантайм и сам Flatpak.
Интеграция с системой. Пакет deb может ставить системные сервисы, правила udev,
модули ядра, конфигурацию в /etc. Приложение Flatpak интегрируется
ограниченно: экспортирует desktop-файлы, иконки, данные AppStream и сервисы
D-Bus; системные сервисы и модули ядра ему недоступны.
Архитектура файловой системы#
Структура каталогов в песочнице#
/
|-- app/ файлы приложения (только чтение)
| |-- bin/
| |-- lib/
| |-- share/
|-- usr/ файлы рантайма (только чтение)
| |-- bin/
| |-- lib/
| |-- share/
|-- etc/ конфигурация из рантайма (только чтение)
|-- var/ изменяемые данные
|-- run/ временные данные сессии
Каталоги /app и /usr доступны только для чтения во время исполнения.
Изменяемые данные приложения хранятся на хосте в ~/.var/app/<идентификатор>/.
Структура сборочного каталога#
На этапе сборки (до экспорта в репозиторий) приложение представлено каталогом:
build-dir/
|-- metadata метаданные: идентификатор, рантайм, разрешения
|-- files/ файлы приложения (станут /app в песочнице)
| |-- bin/
| |-- lib/
| |-- share/
|-- export/ файлы, экспортируемые на хост
| |-- share/
| |-- applications/ desktop-файлы
| |-- icons/ иконки
| |-- metainfo/ данные AppStream
|-- var/ начальное содержимое /var
Каталог export/ содержит файлы, которые становятся видимы хосту после
установки: записи в меню приложений, иконки, данные для каталога приложений.
Метаданные#
Файл metadata в сборочном каталоге имеет формат INI:
[Application]
name=org.example.MyApp
runtime=org.example.Platform/x86_64/stable
sdk=org.example.Sdk/x86_64/stable
command=myapp
[Context]
shared=network;ipc;
sockets=x11;wayland;pulseaudio;
devices=dri;
filesystems=xdg-download;
[Session Bus Policy]
org.freedesktop.Notifications=talk
Для рантаймов используется секция [Runtime] вместо [Application].
Репозитории Flatpak#
Репозиторий Flatpak - это OSTree-репозиторий с коммитами приложений и рантаймов. Он может быть локальным (каталог на диске) или удалённым (по HTTP, HTTPS или FTP).
Структура репозитория#
repo/
|-- config конфигурация OSTree-репозитория
|-- summary индекс всех доступных ссылок
|-- summary.sig GPG-подпись индекса
|-- refs/ ссылки на текущие коммиты
|-- objects/ объекты: файлы, каталоги, коммиты
|-- deltas/ статические дельты для обновлений
|-- appstream/ метаданные AppStream
Файл summary содержит список доступных ссылок с контрольными суммами и
используется клиентом для определения доступных обновлений. Его необходимо
пересоздавать при каждом изменении репозитория - командой
flatpak build-update-repo или при сборке через flatpak-builder --repo.
Подключение удалённого репозитория#
flatpak remote-add --if-not-exists <имя> <url-репозитория>
Если репозиторий подписан GPG-ключом, ключ импортируется при добавлении:
flatpak remote-add --gpg-import=<ключ.gpg> <имя> <url-репозитория>
Репозиторий также подключается через файл .flatpakrepo - текстовый файл в
формате INI с URL, названием, GPG-ключом и другими параметрами. Подробнее про
такие файлы - в блоке Отладка и подготовка репозиториев.
Установка и обновление приложений#
Установка:
flatpak install <имя-репозитория> <идентификатор-приложения>
Обновление всех установленных пакетов:
flatpak update
Откат к предыдущей версии:
flatpak update --commit=<хеш-коммита> <идентификатор-приложения>
Жизненный цикл Flatpak-пакета#
Процесс создания и распространения пакета состоит из этапов:
Сборка - приложение компилируется из исходного кода (через flatpak-builder или команды семейства flatpak build) либо формируется из существующих deb-пакетов (через Создание приложений (aft-app)).
Экспорт - собранное приложение экспортируется в локальный OSTree-репозиторий.
Тестирование - приложение устанавливается из локального репозитория и проверяется.
Публикация - репозиторий размещается на сервере или приложение упаковывается в одиночный бандл.
Установка - пользователь подключает репозиторий и устанавливает приложение стандартными средствами Flatpak.