среда, 7 февраля 2018 г.

Разбираемся с самодостаточными пакетами Flatpak, Snap и Appimage

Всем привет! Не секрет, что для многих пользователей, перешедших на Linux, особой проблемой является поиск необходимого софта. В винде это обычно решается походом на всякие Софтпорталы, торрент-трекеры, в редких случаях - на официальные сайты нужных программ. Конечно в Linux с этим всё гораздо проще и порядочнее. Есть система репозиториев, откуда софт можно установить несколькими разными способами, и где есть гарантии, что этот софт не содержит в себе чего-то вредоносного. Плюс - никакой рекламы. Однако концепция репозиториев хоть и является одной из лучших черт Линукса, она не всегда удобна. Нужной программы может не оказаться в репозитории вашего дистрибутива, или же она вообще официально собирается лишь под один конкретный. Ещё пару лет назад это было проблемой, но теперь ситуация изменилась в лучшую сторону, благодаря так называемым самодостаточным пакетам - Flatpak, Snap и Appimage. Пришло время рассмотреть их в деталях.


Что является самодостаточностью? Для начала стоит разобраться с самим понятием "пакет с программой". Пакет - это архив, в котором находится программа, а также некий управляющий файл, который размещает программу в нужном каталоге, устанавливает для неё зависимости (дополнительные пакеты, требующиеся для работы) и даёт указание пакетному менеджеру следить за программой, в результате чего если вы захотите удалить программу - пакетный менеджер удалит всё, что с ней связано. Пакеты в репозитории вашего дистрибутива собраны с учётом его особенностей, версий других пакетов в репозитории и так далее. Они создан чтобы работать конкретно в вашем дистрибутиве, и они НЕ обязаны работать в других. Хотя и есть способы их там установить. В случае с самодостаточными пакетами, программа собирается в нейтральном окружении, и таскает с собой все необходимые зависимости. Это идёт в ущерб размеру пакета и занимаемому месту на диске, но позволяет устанавливать и использовать программу в абсолютно любом дистрибутиве Linux, при чём его можно установить параллельно с этой же программой из репозитория и они никак не будут конфликтовать! Важно понимать, что эти самые самодостаточные пакеты не являются заменой штатному пакетному менеджеру и программам в репозиториях дистрибутива. Они лишь дополняют их.

На сегодняшний день существует несколько вариантов самодостаточных пакетов, отличающихся методом работы, установки и использования. Остановимся на тройке лидеров: Flatpak от компании Red Hat, Snap от компании Canonical и Appimage, развиваемый сообществом.

Flatpak


Изначально эта технология называлась xdg-app, её автором является Александер Ларссон - сотрудник компании Red Hat, принимающий активное участие в разработке GNOME. По своей сути Flatpak - ни что иное как контейнер, в котором программа целиком и полностью изолирована как от основной системы, так и от других таких же программ. Изоляция программы осуществляется с использованием штатных технологий ядра Linux, таких как cgroups, пространства имён и SElinux. Вывод графики осуществляется через Wayland, хотя есть и режим совместимости с Xorg (менее безопасен), а звук выводится через PulseAudio. Сам по себе контейнер с программой минималистичен, и содержит лишь специфичные библиотеки, необходимые для конкретной программы. Всё остальное, например библиотеки Qt, GTK и подобное, распространяется в виде рантаймов (runtime) - специальных архивов, которых может быть несколько в системе (например могут сосуществовать Qt 5.6 и Qt 5.9, или несколько разных версий GTK). Для распространения пакетов используется та же классическая система репозиториев, но немного иная. Готовый flatpak-пакет можно установить и вручную, но это не совсем удобно. Самым крупным репозиторием для Flatpak является Flathub - хранилище, куда разработчики приложений могут загружать свои flatpak-пакеты, что позволит им не только упростить тестирование своих приложений, но и быстрее доставить их пользователю. Отдельно существует репозиторий KDE Apps, в котором, как понятно из названия, находятся программы от проекта KDE. Да да. Именно оттуда вы можете легко установить, например, Dolphin, или браузер Falkon. Чтобы начать пользоваться Flatpak, его необходимо установить. В некоторых дистрибутивах (например Linux Mint 18.3) он уже установлен по умолчанию. Для Debian это будет так:

sudo apt install flatpak

Далее подключим репозитории Flathub и KDE Apps:

flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

flatpak remote-add --if-not-exists kdeapps --from https://distribute.kde.org/kdeapps.flatpakrepo

Обновление списка пакетов выполняется командой flatpak update. Для того чтобы посмотреть список доступных пакетов в конкретном репозитории (например Flathub) нужно ввести команду:

flatpak remote-ls flathub

Более подробно о доступных командах можно узнать из вывода flatpak --help. Но главное - как установить программу? В указанной выше команде из списка выберите то, что нужно, и установите командой (на примере GIMP):

flatpak install flathub org.gimp.GIMP

Установится свежая версия графического редактора GIMP. Но согласитесь - не самая удобная операция установки? Не беда. Поддержка Flatpak уже есть во многих графических менеджерах приложений. В том же Linux Mint 18.3 пакеты из Flathub доступны прямо в менеджере приложений.



Если вы хотите установить скачанный отдельно flatpak-пакет, например, с LibreOffice, то команда для установки будет такой:

flatpak install --bundle /путь/к/пакету/LibreOffice.flatpak

А теперь о плюсах и минусах:

Плюсы:

  • Полная изоляция от основной системы и других приложений;
  • Поддержка современных технологий в Linux (например Wayland);
  • Децентрализованность (можно в том числе создать свой репозиторий с Flatpak);
  • Доступен в подавляющем большинстве дистрибутивов Linux;
  • Разрабатывается Red Hat совместно с сообществом.
  • Имеет возможности для распространения игр, в том числе виндовых со вшитым Wine.


Минусы:

  • Рантаймы. Их размер достигает почти 300 мегабайт, и сохраняются они на корневом разделе. Поэтому рекомендуется выделить достаточно места под программы во Flatpak;
  • Поддержка в графических менеджерах приложений есть только в свежих версиях оных, поэтому на некоторых дистрибутвах придётся использовать терминал для работы с Flatpak;
  • Плохо интегрируется с рабочим столом и штатным оформлением;
  • Не самый удобный интерфейс командной строки;
  • Ориентирован только на десктоп.


Snap


Snap - разработка Canonical, компании, разрабатывающей дистрибутив Ubuntu. Изначально эта технология именовалась Click, и предназначалась для мобильной редакции Ubuntu, дабы заменить классические deb-пакеты. После того как Canonical представила технологию Snappy Ubuntu Core, монолитный базовый образ системы, обновляющийся атомарно (целиком), технология click-пакетов получила развитие в виде Snap. По своей сути это также контейнер с программой и необходимыми зависимостями, однако в отличии от Flatpak, Snap для изоляции использует Apparmor, и более тесно работает с основной системой, включая работу графики через Xorg. Базовое окружение строится на компонентах ubuntu-core, который устанавливается при первой установке любого snap-пакета. Скачанный snap-пакет при помощи systemd монтируется в каталог /snap, как образ диска, и уже оттуда происходит запуск программы. Пакеты в формате Snap распространяются через централизованный каталог Snap Store, хотя Canonical заявляла, что любой желающий может создать хранилище для snap-пакетов. Также в отличии от Flatpak, Snap ориентирован и на распространение проприетарных программ, в том числе платных.

Snap-пакет имеет значительно больший размер, чем пакет в формате Flatpak, так как таскает всё необходимое в себе. При этом если скачанной программе требуются те же самые компоненты, которые уже есть в скачанном snap-пакете с другой программой - качаться заново они не будут. Для установки пакетов из Snap Store, без использования sudo, требуется регистрация аккаунта Ubuntu, и при первой попытке установить программу с помощью snap install - будет выдан запрос на логин и пароль. Можно залогиниться сразу:

sudo apt install snapd
sudo snap login вашлогин

Далее можно ставить программы:

snap install имяпрограммы

Для поиска используется команда find:

snap find 

Чтобы посмотреть список установленных snap-пакетов, введите:

snap list

Чтобы обновить программу, установленную из Snap, наберите команду:

snap refresh имяпрограммы

и для удаления:

snap remove имяпрограммы

Программа может быть установлена из нескольких каналов: stable, candidate, beta и edge, в порядке убывания стабильности и повышения свежести. Для этого нужно добавить соответствующий ключ в команду установки пакета:

snap install --edge gimp

Если же вы скачали Snap-пакет с сайта разработчика, то для его установки не потребуется аккаунт Ubuntu, только режим разработчика:

snap install --devmode /путь/к/пакету/

Помимо этого имеются ещё две интересные команды: snap buy, с помощью которой можно купить платное приложение в пакете snap, и snap revert, с помощью которой можно откатить пакет к предыдущей версии. Последняя команда очень полезна при появлении серьёзных багов в новой версии программы. Это важное отличие от Flatpak, хотя технология OStree, на которой тот построен, позволяет более гибко откатывать изменения, подобно Git. Но в настоящее время этот интерфейс для Flatpak в разработке, а в Snap доступен уже сейчас. Более подробно о командах можно узнать из man-страницы snapd:

man snap

Это что касается интерфейса командной строки. Многие графические менеджеры пакетов, включая таковые в GNOME и свежих версиях KDE, поддерживают Snap из коробки, достаточно лишь ввести название интересующей программы в строку поиска и установить как обычно.



Плюсы:

  • Лучше адаптирован для Ubuntu и производных;
  • Более плотная интеграция с рабочим столом;
  • Ориентирован в том числе и на проприетарное коммерческое ПО;
  • Простой синтаксис команд;
  • Поддержка отката пакета к предыдущей версии;
  • Не требует внешних рантаймов (за исключением ubuntu-core);
  • Ориентирован не только на десктоп, но и на сервера, мобильные платформы и IoT (интернет вещей).


Минусы:

  • Централизован, требует регистрации аккаунта Ubuntu для установки без прав администратора;
  • Не полностью изолируется от системы и других программ;
  • Вследствие использования прямого доступа к Xorg - создаётся потенциальная угроза захвата ввода (особенно опасно при запуске вредоносного пакета);
  • Меньше распространён в сторонних дистрибутивах, чем Flatpak;
  • Разработка ведётся Canonical, влияние сообщества минимально.

Appimage


Данный формат пакетов был впервые представлен в далёком 2004 году под именем klik. Представлял он из себя ссылку, по которой загружался "рецепт", который в свою очередь брал пакеты из Debian Stable и перепаковывал их в особый формат .cmg, который не зависел от конкретного дистрибутива. Однако klik не использовал файловую систему в пространстве пользователя (FUSE), потому одновременно можно было запустить лишь 8 таких пакетов, что связано с ограничениями ядра. Впоследствии, эта технология была переименована в PortableLinuxApps, а затем - в Appimage, также существенно изменившись внутренне. Пакет в формате Appimage, говоря простым языком - это самый обычный образ диска, который при запуске монтируется поверх FUSE, а благодаря скрипту внутри - запускается исполняемый файл программы. Все необходимые для работы программы компоненты находятся внутри пакета Appimage, кроме тех, которые поставляются штатно с дистрибутивом. Пользователю достаточно скачать программу в формате Appimage, дать ей права на исполнение (в Свойствах, вкладка Права, поставить галочку на "Разрешить выполнение как программы") и запустить двойным кликом. Некоторые программы при запуске предлагают создать ярлык в меню приложений. Appimage взяли на вооружение очень многие разработчики свободного ПО, например Krita, Kdenlive, Darktable и множество других. И хотя существует централизованное хранилище для пакетов Appimage - разработчики не совсем поощряют его использование. По их мнению, сам разработчик программы должен запаковать её в Appimage (ибо кто как не он знает все её особенности?) и затем распространять её у себя на сайте. Крупным достоинством Appimage является отсутствие внешних рантаймов, что позволяет таскать приложения на флешке и запускать на компьютерах с любыми дистрибутивами Linux. Поэтому с этой точки зрения - Appimage самый самодостаточный формат. Однако есть у него как большие достоинства, так и большие недостатки:

Плюсы:

  • Не требует установки, достаточно дать права на выполнение и запустить программу двойным кликом;
  • Не требует никаких дополнительных рантаймов и прочих комплектов библиотек, всё необходимое уже включено в пакет;
  • Высокая надёжность вследствие простоты структуры пакета;
  • Разрабатывается сообществом и не зависит от корпораций;


Минусы:

  • Полное отсутствие изоляции. В настоящее время имеется экспериментальная песочница для Appimage, также возможна изоляция при помощи Firejail, однако пока программы в Appimage имеют прямой доступ ко всему что есть в системе;
  • Отсутствие нормального централизованного хранилища: Appimage предполагает что разработчик программы должен сам сделать такой пакет и распространять его на своём сайте;
  • Как следствие предыдущего пункта - только ручное обновление, путём скачивания новой версии пакета. Ведётся разработка метода автоматического обновления;
  • Большинство пакетов не поддерживают Wayland;
  • Не слишком качественная интеграция с рабочим столом: программы на Qt не используют системный стиль в KDE, а приложения на GTK+ в редких случаях могут иметь проблемы с темой оформления.

Ну вот как-то так. Пока что наибольшее распространение получил Appimage, но Flatpak и Snap развиваются не менее активно. Flatpak, на мой взгляд, выглядит более перспективным, его поддержка уже добавлена в новые версии KDE Discover, да и сами приложения KDE уже во всю пакуются в Flatpak. Snap на месте не стоит, но всё же его ориентация на Ubuntu не даст ему добиться по-настоящему широкой поддержки и популярности. Хотя время покажет. Обе эти технологии ещё слишком молоды. Но хотелось бы верить, что они облегчат жизнь разработчикам профессионального коммерческого софта, и те станут поставлять версии своих программ и на Linux. На этом у меня всё. Ваше мнение по поводу этих пакетов оставляйте в комментариях. До встречи!