Давайте поговорим о Snap(py), FlatPak и AppImage!
Начну с последнего. На первый взгляд неплохо, одно приложение - один файл, ничего устанавливать не надо. Скачал, сделал
и можно запускать. Но кто гарантирует*, что оно запустится? В отличии от первых двух тут нет никаких зависимостей, никто не знает, будет ли на целевой системе нужная библиотека. И вообще это просто спецификация (да, есть эталонная реализация), в которой так и написано, что надо нацеливаться на наиболее старые версии дистрибутивов и всё носить с собой. Вопросы безопасности в AppImage никак не решаются и оставлены на усмотрения пользователя и применение стороннего ПО (Firejail). С одной стороны пользователь сам должен понимать, что он скачивает и что запускает. С другой - AppImage позиционируется именно как простой для пользователя, неискушённого терминалом, способ скачать ПО и сразу его запустить. Создатель AppImage (ник probonopd) явно
фанатеет от macOS и их подхода установки программ с помощью перетаскивания бандла (директория с расширением ".app") из архива в «/Applications». Кстати, что забавно, у пользователей macOS это вызывает
большие трудности и они знают 1000 и 1 способ как сделать это неправильно. Проблема с безопасностью не только в, что от пользователя требуются дополнительные знания, но и в том, что применение стороннего решения
не всегда работает гладко. И это при том, что именно Firejail рекомендуется на главной странице AppImage. Существуют так же и другие небольшие трудности, вроде интеграции с рабочим столом или автоматических обновлений, но это решается установкой дополнительного демона. Хотя при этом концепция становится уже не такой красивой, как изначальное «перетащил, запустил».
Snap. В основном я им и пользуюсь, т.к. стоит Ubuntu 20.04 и это способ установки ПО по умолчанию в приложении Software**. В отличии от предыдущего варианта, тут есть зависимости и разработчик ПО имеет гарантию (наверное), что его ПО будет работать, если они удовлетворены. Есть также изоляция приложений. Но она несколько странная и достаточно слабая. У некоторых приложений можно изменить список прав (да и вообще посмотреть), у других - нельзя. Нет доступного и ясного объяснения, что при этих изменениях происходит под капотом. Ввели новые термины, вроде «Interface», «Plug», «Slot». Но что оно делает внутри? Монтирует разные директории и файлы устройств, меняет профили AppArmor или что? Я пока точного описания не нашёл. Нет нормальной интеграции этого всего с Software. С виду описание разных приложений может ничем и не отличаться, но если посмотреть с помощью
snap run --shell soft-name
изнутри snap-контейнера, то права доступа к файлам и каталогам различаются, и одно приложение получает «Permission denied» там, где у другого всё хорошо. Понятно, что всю это информацию можно получить с использованием консольных команд, но я за прозрачные и изучаемые системы. Даже Android при установке приложения выводит больше информации о требуемых правах доступа и позволяет их менять при первом использовании. Кажется, относительно недавно snap сделал шаг в правильном направлении и
интегрировал xdg-portals, которые изначально появились во FlatPak. Это такой способ получения доступа к, например, файлам, когда пользователь видит обычный для него диалог открытия/сохранения файла и выбирает файл, но при этом диалог является отдельным демоном вне контейнера и по результатам выбора управляет доступом для приложения внутри. И это правильный шаг. Но я пока не видел snap приложений, которые это используют. И раз уж приложения запускаяются в некой песочнице, что мешало её сделать более полноценной, ближе к тем же LXC? Чтобы изнутри приложение не просто было ограничено в доступе к определённым файлам, а не видело их в принципе, так же, как и другие процессы. Кроме этого мне очень не нравится, как snap-приложения запускаются. Очень медленно! Хотя их образы всегда смонтированы. Из-за этого вывод информации консольными утилитами (mount, df, ...) сильно захламлён и читать его неудобно. Кстати, зачем? Для интеграции с рабочим столом разве не было бы достаточно копирования .desktop-файлов и подобного наружу? А ещё интересно, как у snap-а с установкой приложений извне магазина от Canonical и просто из скачанного файла? Похоже, что никак. Software по двойному клику на .snap открывается, но сообщает, что установить не в состоянии.
И, наконец, FlatPak. С ним я пока сталкивался недостаточно много, а внутрь заглядывал ещё меньше. На первый взгляд изоляция устроена более полноценно и работают те самые порталы. Хотя, пишут,
всё это обман и не работает нормально. По пока неизвестной мне причине запуск приложений из FlatPak происходит быстрее, чем Snap (пробую на одной и той же Ubuntu 20.04). И, насколько я понимаю, магазинов (или их аналогов) тут может быть сколько угодно.
Написал я всё это с целью узнать впечатления других пользователей о данных технологиях, получить более точные и правильные описания процессов, скрытых от глаз, поговорить о достоинствах и недостатках. Может быть есть другие альтернативы, о которых я не знаю?
Интересно, насколько вообще нужно было создавать тот же Snap (или FlatPak) с нуля? Можно ли было использовать apt+dpkg? И тут и там есть пакеты, есть зависимости, действия, которые нужно выполнять при установке и удалении. Можно же было сделать отдельную директорию с отдельной базой для «толстых» пакетов, а управлять ими с помощью существующих средств?
А может быть всё это пути не в том направлении и будущее за NixOS/GUIX и подобными системами с более продвинутыми пакетными менеджерами?
* - предвижу ответ «На GNU/Linux тебе никто ничего не гарантирует, неосилятор!»
** - Как раньше было хорошо с уникальными необычными именами. А теперь «Software», «Files», «Text Editor», «Viewer». Даже в macOS названия и то более разнообразные.