И опять у нас статья по заявкам читателей моего блога. В комментариях попросили рассказать подробнее про snap и flatpak. До этого я постарался подробно и понятно разобрать appimage.
Как многие знают, большая проблема совместимость установочных пакетов с конкретной системой.
Во-первых у нас существует несколько ветвей самого Linux и его пакетной базы: на базе Дебинан, на базе РедХат, на базе АрчЛинукс - как самые популярные. А так же куча независимых со своей пакетной базой, ли вообще собираемые из исходников.
Во-вторых установочный пакет, будь то deb или rpm содержит только бинарник самой программы, но не библиотеки необходимые для работы программы. Здесь не будет у каждой программы одной и той же dll, как у винды но в каждой папке программы. Если 10 приложений используют 1 библиотеку, то она будет установлена 1 раз, а не 10 раз, как у мелкомягких.
Для примера установочные пакеты программ для винды содержат, как правило, все что нужно для работы программы, но не всегда. Бывает что скрипт-установщик(инсталятор) понимает что нет, скажем какого либо .net вызывает исталятор библиотеки, скачивает и устанавливает.
Но не всегда.
Почему так реализованы установочные пакеты в Линукс? Для уменьшения размера и из соображений, что если у вас есть эта библиотека, то зачем ее качать?
Все это называется зависимостями, они могут быть разрешенными, когда библиотека установилась или есть в системе, не разрешенными.
Если вы устанавливаете приложение из официального репозитория вашей системы, то зависимости все удовлетворятся. Пакетный менеджер системы, скажем apt, увидит на что ссылается программа и если в системе нет нужных библиотек, то скачает их. Такое имеет место и с некоторыми сторонними программами, где разработчик позаботился указать что нужно докачивать из официального репозитория.
Но, часто бывает так, что вы скачали какую то программу, а зависимости к ней взять не понятно где, особенно если это старые библиотеки, которые давно убрали из репозитория. И как быть?
Да, можно в терминале запустить установщик, смотреть на ошибки, устанавливать нужные библиотеки, разыскивая их на сторонних сайтах, и опять запускать установку, и так по кругу. Да, для красноглазиков это вариант и понимание системы изнутри. Но для обычного пользователя это боль и страдание и проще пользоваться виндой.
Потому эту проблему решили решить - создать форматы пакетов, близкие по сути к пакетам виндовс.
Snap
Система упаковки и развертывания программного обеспечения, разработанная компанией Canonical, которые эту технологию агрессивно продвигают, что создатели Linux Mint даже отключили поддержку по умолчанию. Снапы содержат в себе все необходимое для работы приложения практически в любом дистрибутиве.
Как бы снапы напоминают appImage, только постоянно смонтированные в системе. Это тоже сжатый образ системы с программой использующую формат SquashFS. Запуск снапа происходит в "песочнице" - изолированном контейнере, который имеет очень ограниченный доступ к самой хост системе. Но пользователь может разрешить разные доступы - доступ к микрофону, принтеру, камере и тд. Значит так же и зловредный код, который могли засунуть в снап может получить доступ к системе.
В формате снап могут быть и приложения командной строки и пользовательские графические приложения. Но не могут содержать элементы ядра и базовых компонентов системы.
Как я сказал выше - снап это сжатый образ системы, который монтируется в папку snap в вашем домашнем каталоге. А вот так это выглядит в системе:
Мы можем в режиме суперпользователя открыть любой снап как архив и увидеть что там внутри.
Особенно наглядно это на Гимпе(который я специально установил для статьи):
Знакомые папки, не правда ли? Мы примерно тоже самое имеем в корне нашей системы. В галерее вы можете увидеть и исполняемые бинарные файлы, и библиотеки.
Таким образом snap это не коем образом не скрипт для установки и не архив с бинарником.
Да, снапы будут работать только на системах с ситемой инициализации systemd.
Flatpak
"Конкурент" snap. Это так же система управления и развертывания пакетов.
Запуск происходит так же в изолированной песочнице. Но есть отличия от snap:
Зависимости могут находится как в каждом контейнере приложения, а могут быть общие в окружении для нескольких приложений.
Можно использовать для работы как репозиторий разработчика Flathub, так и сторонние репозитории.
Разрабатывался формат именно для приложений с графическим интерфейсом. На многих дистрибутивах поддержка формата стоит по умолчанию и менеджер приложений вам может найти пакет как в формате, скажем deb, так и в формате flatpak.
Для ЛинуксМинт старше 18.3 настройка не требуется, поддержка уже включена.
Подробнее о поддержке я писал тут
Но, как я писал выше - флетпак децентрализован, ни чего не мешает создать свой репозиторий и распространять через него приложения, что несет угрозу системе.
Флетпак создает файловую структуру системы, библиотеки и метаданные, необходимые для выполнения программы. Обычно по адресу /var/lib/flatpak
Бинарные файлы и все необходимое для работы лежит не архивом, как у snap, а в развернутом виде:
Среда выполнения находится по адресу /var/lib/flatpak/runtime
Для примера откроем одну из них:
Опять похоже на корень нашей системы.
Сами приложения монтируются в /var/lib/flatpak/app и запускаются в среде выполнения, при том разные приложения могут использовать одну среду.
Песочница имеет доступ только к ресурсам, строго необходимым ей для работы, причем только с минимально допустимыми привилегиями. Но файлы ярлыков находятся вне песочницы, иначе ярлык программы не сможет попасть в системное меню.
Когда вы запускаете приложение Flatpak, оно запускает подсистему выполнения (образ системы в песочнице), там запускается сама программа, а так же необходимые системные ресурсы для выполнения.
Я не хочу грузить вас сложными техническими вопросами - как работает песочница, если вам интересно, то можете почитать заумный текст на эту тему https://github.com/flatpak/flatpak/wiki/Sandbox
Думаю я достаточно раскрыл тему Flatpak и Snap, для общего развития точно хватит.
Какие недостатки есть?
Кроме некоторой небезопасности, основной недостаток это замусоривание системы.
Когда вы удаляете приложение Флетапак, то среда выполнения остается и занимает место на диске, а среда выполнения это все же образ системы с библиотеками, интерпретаторами языков типо питона и тд. Так же данные не удаляются. Но это решается следующим командами:
flatpak remove --unused
Это мы удаляем ненужные среды выполенения
flatpak remove --delete-data
а это удаляем ненужные данные удаленных приложений.
У снапов другая проблема, на мой взгляд это косяк разработчиков. Когда вы обновили приложение, старая версия остается, и ни куда не девается, просто не активна.
Потому копируем в терминал команду:
snap list --all
И смотрим все, старые версии можем удалить вручную, а можем открыть текстовый редактор и написать туда скрипт:
#!/bin/bash # Removes old revisions of snaps # CLOSE ALL SNAPS BEFORE RUNNING THIS set -eu
LANG=C snap list --all | awk '/disabled/{print $1, $3}' |
while read snapname revision; do snap remove "$snapname" --revision="$revision"
done
Так же вы можете указать максимальное значение образов для одной и той же программы:
sudo snap set system refresh.retain=2
И очистить кэш
sudo rm /var/lib/snapd/cache/*
Ну на этом, думаю хватит:) И так весьма объемная статья.