07 июля 2016 г. в 14:20
Snap vs Flatpak

В последнее время в мире GNU/Linux довольно много шума вокруг самодостаточных кроссдистрибутивных пакетов для графических приложений, таких как Snap от Canonical и Flatpak, разрабатываемый участниками Gnome, RedHat и сообществом разработчиков.

Идея создания универсальных не привязанных к конкретному дистрибутиву приложений не нова, ещё в начале 2000-х была начата разработка Autopackage (в 2010 проект был объединён с Listaller), в 2004 вышла первая версия klik (в 2011 году сменил название на PortableLinuxApps, а в 2013 – AppImage).

Немного с другой идеей, не самодостаточными пакетами, но не привязанными к конкретному дистрибутиву и даже операционной системе был также создан примерно (не нашел точной даты) в 2004 году проект 0install (о нём я уже писал заметку).

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

Но уже в 2007 году стартовал проект Listaller, в котором была добавлена песочница для приложений, в 2014 продолжил развитие под названием Limba. А уже в 2015 году был представлен проект xdg-app, в 2016 году переименованный в flatpak. В этом же году Canonical представила SnapLimba прекратила своё существование в пользу Flatpak.

Я старался здесь перечислить все проекты, в которых была попытка создать универсальный формат, но уверен, какие-то из них потерял, но даже без этого список «универсальных» форматов довольно внушительный.

Думаю, многим всё же нужна такая система, функционирующая не вместо существующих репозиториев дистрибутивов, а совместно с ними, поэтому и было так много попыток создать универсальный формат, но теперь, когда им заинтересовались такие крупные игроки как RedHat и Canonical, я надеюсь, получится что-то интересное.

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

Конечно, всё дальше — моё имхо, сформированое за пару дней использования обоих инструментов и гугления^W дакдачинья на эту тему, но по сути flatpak и snap не особо отличаются:

  • Песочница для приложений
  • Развертывание приложений не сталкиваясь с файловой ОС
  • Поставка зависимостей в комплекте

Но главные различия кроются в реализации:

В flatpak песочница реализована использованием возможностями контейнеризации ядра Linux, таких как user namespaces и cgroups, у snap используется MAC kernel security module. Честно говоря, я не знаю, что это означает, но ок.

Для настройки прав приложения snap использует Apparmor, flatpak — SELinux.

В flatpak каждое приложене привязано к какому-то рунтайму, чтобы в своём комплекте поставлять только минимум необходимых библиотек, а остальные использовать из заранее подготовленного рунтайма. На данный момент я нашел рунтаймы от Gnome и freedesktop.org, но должен появиться рунтайм и от проекта KDE. В проекте от Canonical же существует только один рунтайм — ubuntu-core.

Snap имеет централизованный магазин приложений, по типу AppStore, в то же время как Flatpak ориентирован на децентрализованную структуру, каждый может запустить свой репозиторий. Замечу, что один из разработчиков Snap представил рабочий прототип решения для распространения Snap пакетов в обход централизованного каталога-магазина, но по-моему реализация выглядит жутко костыльной и сделана только для того, чтобы в случае чего была возможность заявить, что у них тоже можно создавать альтернативные каталоги, но не для практического использования. С другой стороны, из-за децентрализованного характера Flatpak для установки Libreoffice, из которого я сейчас пишу заметку, мне потребовалось написать 6 команд, не считая самой установки Flatpak и запуска приложения. Надеюсь, это временное решение и в будущем установка будет упрощена до максимума. Например, в том же 0install довольно простая установка приложений, где необходимо просто скопировать адрес страницы с приложением в установщик.

Зная историю ubuntu-one, Unity, Mir, и прочих разработок Canonical, ясно, что компания намерена создать свою закрытую экосистему, а если разработки и выходят за границы ubuntu, то они либо имеют закрытый исходный код, либо установка на других дистрибутивах значительно затруднена необходимостью установить огромное количество патчей от ubuntu на сторонние библиотеки. Да, snap уже был портирован на различные дистрибутивы, и я без особых проблем с ним работал на своей Debian системе, однако мне не кажется, что Canonical собирается разрешить использование рунтаймтов, отличных от ubuntu-core, или откроют исходный код сервера, ведь они движутся в другом направлении.

Таким образом, Flatpak и Snap решают одну проблему, но разными путями: Snap пытается идёт путём Ubuntu/Canonical, в то же время как Flatpak пытается предоставить средство для всех в мире GNU/Linux и, может быть, за его пределами.

Если вы автор какого-то приложения и хотите, чтобы его опробовали многие пользователи snap, то сейчас, пока пакетов в каталоге довольно мало, можно выложить свою программу в каталог, но в долговременной перспективе если и выбирать между snap и flatpak, я однозначно выбираю flatpak.

P.S. Спасибо комментатору на reddit за ценную информацию о различиях в этих двух проектах.