Сравнение самодостаточных пакетов

В данной статье мы попытаемся в полной мере оценить достоинства и недостатки самых распространённых форматов самодостаточных пакетов Flatpak, Snap.

Введение

Самодостаточные пакеты набирают всё большую популярность ибо не зависят от конкретного дистрибутива. Ранее мы уже вскользь затрагивали эту тему, но сейчас решили разобраться в этом подробнее.

TL;DR

В виде таблицы:

Критерий Flatpak Snap
Формат на диске OSTree Образы в формате squashfs
Изоляция Пространства имён Linux AppArmor
Управление Библиотека или утилита Привилегированный сервис snapd
Источники Репозитории OSTree Проприетарный Snap Store
Среда выполнения Собирается из исходных кодов На основе пакетов Ubuntu
Польз. установка Поддерживается Не поддерживается

Репозитории

Flatpak

Способен работать с любым количеством подключённых OSTree-репозиториев. Данные репозитории не требуют наличия какого-либо специализированного ПО на сервере, т.к. представляют собой совокупность обычных статических файлов, которые могут раздаваться любым веб-сервером, либо при помощи CDN.

В то же время, это накладывает некоторые ограничения. Например нет возможности проводить аутентификацию клиентов по учётным данным для распространения проприетарных приложений с платной подпиской.

Самым крупным публичным репозиторием является Flathub. Он содержит большую часть существующих флатпаков. Однако данный репозиторий часто критикуется за несерьёзное отношение к безопасности (большинство приложений имеют огромное количество установленных разрешений, не требующихся для работы, поэтому практически не отличаются от обычных пакетов любого дистрибутива), а также отсутствие массовых пересборок при выходе новых версий рантаймов, из-за чего их количество в системе пользователей многократно множится.

Snap

Привязан к единственному репозиторию и магазину приложений — Snap Store, поддерживаемому компанией Canonical. Исходный код эталонной реализации закрыт, поэтому развёртывание собственного репозитория в настоящее время не представляется возможным.

Использование Магазина требует обязательной аутентификации посредством учётной записи Canonical. Это позволяет легко распространять платные проприетарные приложения с подпиской, но посягает на приватность пользователей особенно в дистрибутивах, отличных от Ubuntu.

Общее

Оба формата позволяют создавать и распространять сборки приложений в виде самодостаточных файлов, которые могут устанавливаться без доступа к соответствующим репозиториям. Для Snap этот файл представляет собой непосредственно образ с приложением, а для Flatpak — срез репозитория OSTree.

Формат пакетов

Flatpak

Использует OSTree — Git-подобное хранилище для двоичных файлов. Загрузка выполняется из удалённого репозитория, а извлечение посредством жёстких ссылок.

Таким образом, флатпаки работают напрямую с файловой системой без использования каких-либо прослоек.

Snap

Snap использует образы в формате squashfs (специальный неизменяемый формат сжатой файловой системы). Образ подключается к хостовой системе в качестве loopback устройства, после чего монтируется находящаяся внутри образа файловая система.

Подобный механизм создаёт определённые накладные расходы, хотя для современных ЭВМ они совсем не слишком значительны и зачастую ими можно пренебречь.

Установка приложений

Flatpak

За все операции отвечает либо само приложение flatpak, либо библиотека libflatpak при использовании внешних графических оболочек (Gnome Software, Discover и т.д.).

Приложение выполняется либо с правами текущего пользователя, либо запрашивает повышение прав посредством Polkit при необходимости глобальной установки.

Snap

Большинство операций выполняет работающий с привилегиями суперпользователя системный сервис snapd. Он устанавливает, обновляет и удаляет приложения, взаимодействует с Магазином, а также управляет профилями AppArmor.

Среда выполнения

Flatpak

Файловая система песочницы состоит из следующих составных частей:

  1. корень — tmpfs, невидимый из хостовой ОС;
  2. среда выполнения (runtime) — монтируется как /usr внутри пространства имён;
  3. приложение — монтируется как /app внутри пространства имён.

Среда выполнения, а также её SDK (software development kit) — это отдельный набор динамических библиотек, которые могут быть использованы приложениями.

Существует несколько популярных и широко используемых при создании флатпаков SDK:

  • Freedesktop.org (содержит базовый набор библиотек, используемых большинством приложений с графическим интерфейсом пользователя);
  • KDE (содержит фреймворки Qt и KDE);
  • Gnome (содержит фреймворк GTK, а также модули, необходимые для Gnome-приложений).

Возможна также и сборка своих собственных SDK, но в этом случае потребуется их распространять вместе с приложением в репозитории, либо составе бандла.

Snap

Поддерживаются Core Snap. По функциональности они практически полностью идентичны рантаймам, но представляют собой минимальное окружение дистрибутива Ubuntu.

Core snap монтируется в качестве корневой файловой системы внутри песочницы, а само приложение доступно по тому же пути, что и на хосте.

Технически возможно создание не связанных с Ubuntu core snap’ов, однако на момент публикации данной статьи таковые не применялись.

Изоляция приложений

Flatpak

Для изоляции используются пространства имён ядра Linux, поэтому приложение имеет доступ лишь к своим собственным процессам, файлам и прочим объектам ядра. Для фильтрации системных вызовов применяется Seccomp.

Управление песочницами осуществляется посредством bubblewrap, а для работы с процессами внутри опционально может применяться systemd.

В дистрибутивах, на которых создание пространства имён запрещено для пользователя, для исполняемого файла bwrap применяется SUID-бит.

В случае использования таких глобальных разрешений, как —filesystem=host, —filesystem=home или —talk-name=org.freedesktop.Flatpak, фактически приложение не имеет изоляции, что позволяет ему общаться с хостом и даёт возможность покинуть собственную песочницу.

Snap

Для изоляции от основной системы применяется система мандатного ограничения доступа AppArmor. Профили AppArmor генерируются автоматически и загружаются для каждого Snap приложения при помощи системного сервиса snapd.

В системах без поддержки AppArmor, все снапы работают без какой-либо изоляции вообще.

Более того, система изоляция полагается на ряд специфичных системных вызовов ядра Linux, которые присутствуют лишь в Ubuntu и реализуются при помощи downstream-патчей, не принятых в ядро Linux, поэтому полная изоляция в настоящее время не функционирует в отличных от Ubuntu дистрибутивов, использующих систему мандатного доступа AppArmor.

Снапы с активным classic confinement также не изолированы.

Межпроцессное взаимодействие

Общее

Обе системы могут применять xdg-dbus-proxy для взаимодействия при помощи D-Bus — особый фильтрующий прокси, который пропускает лишь разрешённые вызовы.

Для предоставления доступа к файлам, принтерам и прочим объектам хостовой системы может использоваться xdg-desktop-portal.

Литература и благодарности

Редакция выражает большую благодарность участнику чата Russian Fedora Filippe LeMarchand за написание данной статьи.

При написании использовалась литература из следующих источников: