Концепции и архитектура 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-пакета#

Процесс создания и распространения пакета состоит из этапов:

  1. Сборка - приложение компилируется из исходного кода (через flatpak-builder или команды семейства flatpak build) либо формируется из существующих deb-пакетов (через Создание приложений (aft-app)).

  2. Экспорт - собранное приложение экспортируется в локальный OSTree-репозиторий.

  3. Тестирование - приложение устанавливается из локального репозитория и проверяется.

  4. Публикация - репозиторий размещается на сервере или приложение упаковывается в одиночный бандл.

  5. Установка - пользователь подключает репозиторий и устанавливает приложение стандартными средствами Flatpak.