Что такое flatpack linux

Содержание
  1. Flatpak
  2. Содержание
  3. Установка flatpak [ править ]
  4. Добавление репозиториев [ править ]
  5. Удаление репозитория [ править ]
  6. Список подключенных репозиториев [ править ]
  7. Поиск пакетов [ править ]
  8. Установка приложений [ править ]
  9. Список установленных приложений [ править ]
  10. Запуск-удаление-обновление приложений [ править ]
  11. Удаление неиспользуемых пакетов [ править ]
  12. Просмотр и определение разрешений [ править ]
  13. Управление flatpak из GUI [ править ]
  14. Известные проблемы [ править ]
  15. Не найдено удаленных репозиториев [ править ]
  16. Неправильное имя файла [ править ]
  17. Не удается смонтировать fuse fs [ править ]
  18. Discover падает при добавлении новой программы [ править ]
  19. Нет соединения с интернетом [ править ]
  20. Не добавляет ярлыки в меню приложений [ править ]
  21. 🐧 Как установить и использовать Flatpak на Linux
  22. Введение в Flatpak
  23. snap & flatpack — трагедия общин
  24. Библиотеки
  25. Copypaste & vendoring VS dynamic linking
  26. Социальный контракт и власть мейнтейнеров
  27. Власть и борьба за неё
  28. Трагедия общин
  29. Свобода или рабство?
  30. Политика
  31. И что дальше?

Flatpak

Flatpak — это система для создания, распространения и запуска изолированных настольных приложений в Linux. Приложения можно устанавливать независимо от хост-системы, в которой они используются, и они в некоторой степени изолированы от хост-системы (изолированы) во время выполнения. Это позволяет пользоваться установленными приложениями вне зависимости от обновления хост-системы.

Содержание

Установка flatpak [ править ]

# apt-get install flatpak

Для установки приложений при помощи flatpak из-под непривилегированного пользователя следует добавить пользователя в группу fuse:

# gpasswd -a USER fuse

USER — имя Вашего пользователя

Добавление репозиториев [ править ]

$ flatpak remote-add name_repository url

name_repository — название удаленного репозитория

url — url адрес репозитория

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

Удаление репозитория [ править ]

$ flatpak remote-delete name_repository

name_repository — название удаляемого репозитория.

Список подключенных репозиториев [ править ]

Поиск пакетов [ править ]

Перед поиском следует выполнить обновление данных в репозитории:

Для поиска пакета:

$ flatpak search name_package

name_package — название Вашего пакета.

Получение списка пакетов в репозитории:

$ flatpak remote-ls name_repository

name_repository — название репозитория

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

$ flatpak install name_repository name_package

$ flatpak install flathub firefox

Файлы размещаются по адресу:

Список установленных приложений [ править ]

Запуск-удаление-обновление приложений [ править ]

$ flatpak run appname

где appname, имя приложения вида org.unknown_horizons.UnknownHorizons (см. flathub.org)

$ flatpak update name_package

$ flatpak uninstall name_package

Удаление неиспользуемых пакетов [ править ]

$ flatpak uninstall —unused

Просмотр и определение разрешений [ править ]

Flatpak использует стандартный набор правил песочницы, которые определяют ресурсы и пути файловой системы для приложений. Чтобы просмотреть разрешения конкретного приложения необходимо узнать его ID:

$ flatpak list | grep name_package

Затем посмотреть разрешения:

$ flatpak info —show-permissions application_id

Список доступных параметров для разрешений Вы можете найти в документации flatpak.

Изменить разрешения можно командой:

# flatpak override permission_option application_id

# flatpak override —device=dri org.mozilla.firefox

Сбросить разрешения до стандартных:

# flatpak override —reset application_id

Управление flatpak из GUI [ править ]

Для установки, обновления и удаления ПО из графического интерфейса используется Центр программ Discover. В настройках Discover → Добавить репозиторий flathub.

Можно использовать web-интерфейс. Выбрать приложение скачать для него ярлык и запустить, Discover автоматически перехватит управление, добавит новый репозиторий и начнет установку.

Известные проблемы [ править ]

Для установки приложений при помощи flatpak из-под непривилегированного пользователя следует добавить пользователя в группу fuse:

# gpasswd -a USER fuse

Не найдено удаленных репозиториев [ править ]

Нет доступного репозитория их следует добавить.

Для второго случая:

Неправильное имя файла [ править ]

Неправильное название файла ярлыка. Например: io.brackets.Brackets.flatpakref

Убрать из имени .flatpakref

Не удается смонтировать fuse fs [ править ]

Добавить пользователя в группу fuse

# gpasswd -a $USER fuse

Discover падает при добавлении новой программы [ править ]

Could not unmount revokefs-fuse filesystem

Failed to execute child process fusermount (Permission denied)

При этом Discover крашится. Нет прав на монтирование файловой системы.

# control fusermount wheelonly

Нет соединения с интернетом [ править ]

Discover сообщает об ошибке соединения с интернетом. Следует установить пакет plasma5-discover-packagekit.

# plasma5-discover-packagekit Перезапустить сеанс

Не добавляет ярлыки в меню приложений [ править ]

Note that the directories

are not in the search path set by the XDG_DATA_DIRS environment variable, so applications installed by Flatpak may not appear on your desktop until the

session is restarted.

Не добавляет ярлыки программ в меню приложений. Сделать файл flatpak.sh исполняемым.

# chmod +x /etc/profile.d/flatpak.sh

Перезапустить сеанс. Это действие в DE kde вызывает вылет при загрузке.

Источник

🐧 Как установить и использовать Flatpak на Linux

Введение в Flatpak

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

Несмотря на то, что существует множество конвертеров пакетов, все они имеют ограниченную функциональность и проблемы совместимости.

Чтобы решить эту проблему, Canonical представила формат пакетов приложений Snap.

Снапсы изначально разрабатывались для операционной системы Ubuntu, но теперь они приняты в основных дистрибутивах Linux, включая Arch, Gentoo, Fedora, openSUSE и т. д.

Snap – это единый двоичный пакет, объединенный со всеми необходимыми библиотеками и зависимостями. Вы можете установить его в любом дистрибутиве Linux, независимо от его версии и архитектуры. Не нужно разрабатывать отдельное приложение для каждого дистрибутива!

Подобно Snap, есть еще один инструмент форматирования пакетов приложений, называемый Flatpak.

Первоначально он разработан Red Hat.

Flatpak – это система для создания, установки и запуска приложений и сред выполнения в различных дистрибутивах Linux.

Читайте также:  Анимация для запуска windows

Теперь вы можете создать одно приложение Flatpak и установить его в разных версиях Linux.

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

Еще одна примечательная особенность – мы можем установить несколько версий одного и того же приложения одновременно в системе Linux.

Например, можно установить проигрыватель VLC версий 2.1, 2.2 и 2.3 в той же системе.

Если вы разработчик, вы можете тестировать разные версии приложения одновременно.

Источник

snap & flatpack — трагедия общин

Лонгрид варнинг: вас предупредили, много букв.

Уже давно ведётся разработка формата дистрибуции приложений, которые были «свободны» от общесистемных зависимостей. Ubuntu очень, очень активно продвигает свой snap, gnome — flatpack. Оба обещают рай и свободу от rpm/deb. Давайте же подумаем про проблему, которую они хотят решить, и цену, которую они просят за решение этой проблемы.

Библиотеки

Никто в современном мире не может написать приложение, не используя чужого кода. Причин несколько:

  • Многие библиотеки настолько серьёзны, что написать их функционал с нуля — это Грандиозная Задача. Примеры — поддержка unicode, рендеринга шрифтов, математики.
  • Другие библиотеки предлагают довольно скромный набор функций, но написанных так хорошо, что написать хотя бы так хорошо же, почти невозможно. Стандартные библиотеки языков программирования, различные реализации libc, etc.
  • Стоимость работы по взаимодействию с чужим кодом (чему посвящён этот раздел) чаще всего оказывается ниже, чем цена сопровождения своего кода. Плотность «багов на строк кода» с большой вероятностью будет сравнима, а «свои баги» надо самому же и ловить. Чужие (популярные) библиотеки имеют вероятность быть отлажены и исправлены чужими же руками.

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

Пример для осознания масштаба драмы: допустим, ваше приложение принимает на вход две строки как опциональные аргументы и выводит их вместе, после нормализации. Если вы пишете индустриальное приложение (приложение, которое похоже на «настоящее»), то:

  • Вам надо парсер командной строки
  • Который должен принимать юникод
  • И, возможно, давать пользователю подсказку, что он опечатался в имени аргумента
  • Что требует фонетического сравнения
  • И, возможно, регулярных выражений
  • В общем случае вам придётся поддерживать не только юникод, но и другие локали, что требует библиотеки поддержки локалей и ВСЁ то, что люди придумали в контексте локалей.
  • Конкатенация строк с нормализацией — ещё одно применение отдельной библиотеки юникода, сами вы такое не реализуете.
  • Вывод на экран (справки по командной строке, вашего результата) с большой вероятностью потребует поддержки ncurses — библиотеки, поддерживающей разные терминалы (можно обойтись текстовым режимом, но приложения часто используют цветовые возможности).
  • Тесты подразумевают использование тестового фреймворка, возможно, библиотеки для моков.

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

Как вы думаете, сколько библиотек нужно, чтобы гарантированно отработать curl http(s)://. Много. Вы будете использовать одну, но зависимости ваших зависимостей — это ваши зависимости.

Copypaste & vendoring VS dynamic linking

При том, что использование библиотек неизбежно, само использование может различаться по реализации. Обратите внимание, у нас появилось два важных слова «использование» и «реализация использования». Что значит «использование»? В самом грубом виде — возможность вызвать код библиотеки, когда это нужно. А вот реализации этого:

  • Мы можем скопировать код, который делает нужные нам операции. В виде куска кода (copy&paste), как отдельный модуль в языке программирования (объектный файл для компилируемых языков), либо как отдельный модуль (для интерпретируемых языков). Где-то тут же рядом идёт и «скопировать исходный файл библиотеки к себе в каталог с приложением». Какие проблемы это создаёт? Главная, основная проблема — мы теряем (навсегда) связь с оригиналом. Даже если автор оригинальной библиотеки исправит ошибку, мы не будем об этом знать. Более того, если мы просто скопировали код, то следующий человек, работающей над программой, даже не сможет узнать, что этот код «чужой». Фактически, мы срезали путь в вопросе «написать с нуля» и взяли чужое. Однако, мы срезали лишь кусочек, потому что если в этом коде будут ошибки (а они там не будут, они там есть), то их исправление потребует от исправляющего пойти и разобраться в сути проблемы до самого низа. Даже если разбирательство потребует чтения нескольких сотен тысяч строк исходного кода и сотен RFC (а так же комментариев о том, что реализации отличаются от RFC), другого пути у нас нет. Ключевой ошибкой в этом месте является то, что мы потеряли информацию о том, что это код чужой. Наличие комментариев в файле может помочь, но потребует деятельного и глубокого участия человека, потому что если мы напишем в комментарии «взято из libfoobar, src/lib/foo.c версии 364a51577f3782dbf8e5d2482ab941980357c492″, то кому-то надо будет посмотреть, где libfoobar находится, какая там версия и что поменялось с предыдущей версии». Чтобы упростить этот процесс, нам нужна машиночитаемая метаинформация.
  • Если мы сопровождаем «чужой код» метаинформацией и используем программы для управления этим кодом (вместо копипаста), то это называется вендоринг, т.е. контролируемое включение чужого кода в свой код. Технически вендоринг может происходить на этапе исходного текста, линковки объектов в исполняемый файл, импорта модулей (в интерпретаторах) из состава приложения, или, даже, динамической линковки с «своей» версией библиотеки (об этом чуть позже).
  • Наконец, мы можем осуществлять динамическую линковку на этапе запуска приложения. Для компилируемых языков это обычные so’шки, для интерпретируемых — наличие модуля в общесистемном импорте. Если его могут импортировать несколько приложений, то это общая библиотека. Если приложение «принесло свой модуль», то библиотека «своя», даже если её интерфейс подразумевает «общую библиотеку». Например, если приложение использует «свою» версию so’шки, вне зависимости от того, отличается ли она от общей, или нет, то это вендоринг. А если импортируется системная, то это общая библиотека (shared library).
Читайте также:  Elm327 identifier для windows

В чём же различие между этими методами? Я кратко приведу аргументы, они кратно обсуждались в множестве статей. Каждый из этих аргументов остаётся валидным несмотря на наличие соседних контраргументов:

  • Экономию памяти (оперативной и на диске) для so’шек, уменьшение размеров установленной системы. Чем больше приложений использует одну и ту же so’шку, тем большая экономия памяти. Соответственно, обратно, чем больше «своих» библиотек приносит приложение, тем оно «жирнее».
  • Спор о том, кто следит за уязвимостями — система (предоставляя обновления библиотеки) или автор приложения (вовремя обновляя его).
  • Разрешение конфликта зависимостей (вендоринг решает эту проблему так как общие библиотеки требуют внимания и аккуратности от всех участников процесса, иногда создавая непреодолимые трудности), тот самый легендарный dll hell.
  • Новые версии библиотек — либо они появляются по пожеланию авторов приложения, либо по решению авторов дистрибутива. В одном случае автор может принести нужную ему новую фичу, в другом случае, дистрибутив может принести улучшение существующего приложения за счёт поддержки чего-то нового в библиотеке (например, hidpi экраны начали правильно работать во всех приложениях, динамически линкующихся с библиотеками qt/gtk).

Все эти вопросы многократно разбирались ранее. Вместо этого я хочу сфокусироваться на социальных аспектах водораздела «всё своё» и «всё общее».

Социальный контракт и власть мейнтейнеров

Общие библиотеки — это кооперация, власть и ответственность. Люди, определяющие какие общие библиотеки доступны в операционной системе диктуют производителям ПО, какие общие библиотеки они могут использовать. Многое ПО может использовать разные библиотеки, и указание на то, какую точно версию нужно использовать остаётся на усмотрение линкера (для компилируемых языков) или обработчика файла зависимостей (pip, bundler, etc). Если все приложения в дистрибутиве собраны с одинаковыми требованиями, то наступает благодать: если в какой-то библиотеке есть ошибка, мейнтейнер этой библиотеки обновляет версию, и исправление автоматически применяется ко всем приложениям. Даже если приложение релизится раз в два года, фикс в условном openssl будет применён в течение недели. Если в конкретной ОС принято решение об отказе от старого протокола, каких-то модификациях (например, интерфейса пользователя), то эти изменения так же применятся для всех. Look&feel в общем стиле, который (быть может) может быть изменён пользователем один раз и для всех. Это ли не благодать?

Власть и борьба за неё

… Эта благодать требует, чтобы все приложения могли работать с выбранной версией библиотеки. А что, если какое-то приложение хочет очень-очень новую функцию из библиотеки, а все остальные приложения не хотят его использовать, потому что это, допустим, не LTS-релиз библиотеки, т.е. она не достаточно стабильна? А ведь дистрибутив может отказываться переходить на новые версии «из принципа», ибо мы обещали пользователям только багфиксы, а новые версии — только в следующей версии ОС, которая (вроде бы), выйдет через пол-года. И это вызывает сопротивление со стороны авторов приложения. Да кто вы такие, чтобы мне рассказывать с какими версиями мне работать? Я автор, я так вижу. Мне нужна libfoobar 3.14-pre2 или новее, а не ваша древняя унылая libfoobar 3.10.

… В этот момент автор просто пишет в требованиях к приложению libfoobar>=3.14-pre2 . Мейнтейнер берёт и патчит требование, плюс удаляет код, который от этой библиотеки зависел. Может быть. Или просто отказывается принимать новую версию с такой зависимостью, пока эта зависимость (libfoobar 3.16) не окажется в новой версии дистрибутива.

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

То же самое происходит в ситуации, когда есть несколько дистрибутивов, некоторые новее, некоторые старее. Поддерживать более старые дистрибутивы, тестировать с разными библиотеками — это сложно. Так что вариант «отгрузить со своими библиотеками» возникает почти сразу же.

Трагедия общин

Это создаёт предпосылки для возникновения трагедии общин:

  • Каждому производителю (автору ПО) хочется отгружать так, как ему нужно. Подстраиваться под чужие правила (версии) — это трата усилий и времени, тем паче, что в мире много разных дистрибутивов
  • Пользователи хотят новые версии.
Читайте также:  Принтер hp 3030 драйвер windows

При этом, чем больше приложений идут со своими библиотеками, тем меньше польза от системных библиотек. Помните про «благодать»? Чем менее она «всеобщая», тем меньше она благодать. Если общая библиотека используется 5 разными приложениями из 995 других, то польза этой библиотеки — 0.5%. Обидно, да. Причём, это задевает всех пользователей, даже тех, кто, в принципе, не имеет острой потребности в новой фиче — но если приложение доступно только в вендоринговом виде, то у пользователя нет вариантов.

Получается, у нас есть глобальный экстремум: все приложения используют только общие библиотеки (максимум общей благодати, неудобства у авторов отдельных приложений) или «каждый сам по себе» (толстенный дистрибутив, с кучей приложений у которых могут быть незамеченные, но широко используемые уязвимости, жрущий кучу памяти, но автором каждого приложения удобно).

Вот именно тут мы и приходим к спору rpm/deb VS snap/flatpack

Свобода или рабство?

Ubuntu очень, очень сильно ратует за snap’ы. GNOME уверен, что будущее за flatpack’ами. Каждый из них — это фреймворк для глубоко индивидуалистических приложений. Всякие electron’ы, у которых с собой не только подкапотный браузер, но и подкапотная операционная система. Свой libc, свой libssl, свои регэкспы, свои ncurses, etc. Общим выступает только ядро, т.е. по сути это то же контейнеризированное приложение, но для десктопа. Дай каждому своё ядро, и получится appliance в форме виртуалки. Допишите метаданные — и получится контейнер Docker’а.

Индивидуализм приложений (авторов приложений) понятен, но кто тогда выступает за общее благо? Локальное крупное улучшение компенсируется незначительным общим ухудшением дистрибутива помноженным на число приложений. Если все делают себе локальные улучшения, то сумма ухудшений становится больше выгоды от суммы улучшений.

Казалось бы, в этом месте создатели дистрибутивов должны выступать в качестве хранителей общего интереса. Однако.

Политика

Ubuntu зависит от Debian куда больше, чем хотелось бы Canonical (компания, выпускающая Ubuntu). Ценность Ubuntu — не в усилиях мейнтейнеров Ubuntu, а в огромном репозитории ПО, идущем из Debian в форме, когда все приложения хорошо работают друг с другом усилиями тысяч мейнтейнеров отдельных пакетов, являющихся «владельцами» дистрибутива Debian. Canonical добавляет поверх этого свои усилия по полировке результата — и за это любима некоторыми. Добавим чуть-чуть маркетинга и фиксированный lifecycle, который по нраву энтерпрайзу, и получается отличный продукт.

… Который зависит от воли тысяч добровольцев где-то там.

Что совершенно не устраивает почти любую коммерческую компанию. Как разорвать эту зависимость? Правильно, сделав свой комплект приложений. Чем больше своих приложений, тем меньше «взбрыки» в апстриме будут задевать компанию. Достаточно вспомнить историю, когда голосование в Дебиан по поводу systemd похоронило upstart, разрабатывавшийся Canonical.

Но мейнтейнить несколько десятков тысяч приложений, некоторые из которых — свой космос (erlang, go, perl, python, R, julia, etc), а некоторые — монстры в соответствующей предметной области (браузеры, emacs, tex, pacemaker, etc) — это неподъёмная работа. Не зря это тысячи мейнтейнеров.

… И тут есть идея. А, пусть, авторы приложений сами мейнтейнят приложения. Выдадим каждому по песочнице, пусть копаются. Авторы получают свободу, Canonical — приложения, которые не зависят от Debian и которые хоть кто-то мейнтейнит бесплатно. Пользователи получают.

… приложения, которые жирные, тяжёлые, у которых обновления нерегулярные и которые с лёгкостью могут держать уязвимости неисправленными годами… Зато некоторые из них shiny new.

И что дальше?

Представьте себе мир, в котором все всё везут с собой… Знаете как это выглядит? Посмотрите на chefsdk. Он отгружает с собой внутри свою postgresql (со своими зависимостями), свой rabbitmq (который зависит от своего erlang’а), плюс chef-server тоже на erlang’е, так что у него тоже свой erlang. Внезапно, у нас внутри одного приложения два erlang’а и несколько десятков копий одних и тех же библиотек, чуть-чуть различающихся по версии. Это не финальный вариант, т.к. внутри между компонентами всё-таки есть общие библиотеки. Если мы их распилим дальше, то получится несколько десятков копий openssl и libc на одно приложение. Даже не в финальном виде это выглядит как 600Мб на одно приложение.

… Что, конечно, кратно больше, чем среднее приложение на electron.… И в 12 раз больше, чем целый mariadb сервер (целая СУБД!), или krita или gimp (огромные приложения для работы с графикой).

А если каждый будет такой? У меня на компьютере установлено 2000 пакетов (не считая -dev и lib)… 2000*300 = 600Гб (За средний размер получившегося я взял половину от chefsdk, т.к. не все настолько ужасны по зависимостям). Сейчас они занимают около 7Гб (включая ресурсы, вроде документации, текстур редакторов, шаблонов CAD-программ и т.д.).

Если это превратится в 600Гб, то не трагедия ли это общин в чистом виде? В каждом взятом моменте мы наблюдаем локальную оптимизацию (и решение чьего-то неудобства), но вместе, сумма этих локальных оптимизаций снижает общую оптимальность системы. На мой взгляд, больше, чем локальный выигрыш каждого из участников.

Я понимаю, зачем Canonical пушит snap. Я это понимаю, и не одобряю.

Источник

Оцените статью