Для чего нужны snap пакеты
Snaps — это пакеты приложений для настольных компьютеров, облака и Интернета вещей, которые просты в установке, безопасны, кроссплатформенны и не требуют зависимостей. Snap можно найти и установить в Snap Store, в репозиториях для Linux. Snap был разработан компанией Canonical.
Snap – это пакет приложения и его зависимостей, который работает без изменений во всех дистрибутивах Linux.
Snapd – это фоновая служба, которая автоматически управляет и обслуживает ваши снимки.
Snap Store предоставляет место для загрузки снимков, а также для пользователей, которые могут просматривать и устанавливать необходимое программное обеспечение.
Snapcraft — это команда и платформа, используемая для создания и публикации снимков.
Чтобы начать использовать данное приложение необходимо установить службу Snapd в linux.
В Ubuntu:
user@server:~$ apt install snapd
В Almalinux:
user@server:~$ dnf install snapd
После установки, проверяем состояние службы snapd
user@server:~$ systemctl status snapd.service
○ snapd.service - Snap Daemon
Loaded: loaded (/usr/lib/systemd/system/snapd.service; disabled; preset: disabled)
Active: inactive (dead)
TriggeredBy: ○ snapd.socket
Из вывода понятно, что snapd не запущена (inactive) и не разрешен запуск при старте ОС. Исправляем:
user@server:~$ systemctl enable --now snapd.service
Проверяем:
user@server:~$ systemctl status snapd.service
snapd.service - Snap Daemon
Loaded: loaded (/usr/lib/systemd/system/snapd.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-05-07 14:57:21 MSK; 1s ago
TriggeredBy: ● snapd.socket
Main PID: 3977 (snapd)
Tasks: 8 (limit: 4682)
Memory: 12.1M
CPU: 90ms
CGroup: /system.slice/snapd.service
└─3977 /usr/libexec/snapd/snapd
Теперь snapd запущен и им можно пользоваться.
Подобно менеджерам пакетов (apt, yum, dnf), snap имеет похожие команды. Например, вы ищете новые пакеты для установки, используя команду find:
user@server:~$ snap find aws
Когда нужный пакет найден, вы устанавливаете его, используя:
user@server:~$ snap install aws-cli
Удаление пакета с помощью команды remove.
user@server:~$ snap remove aws-cli
Более подробно о командах snap можно посмотреть в man страницах, либо ввести команду snap в терминале без параметров
user@server:~$ snap
The snap command lets you install, configure, refresh and remove snaps.
Snaps are packages that work across many different Linux distributions,
enabling secure delivery and operation of the latest apps and utilities.
Usage: snap <command> [<options>...]
Commonly used commands can be classified as follows:
Basics: find, info, install, remove, list
...more: refresh, revert, switch, disable, enable, create-cohort
History: changes, tasks, abort, watch
Daemons: services, start, stop, restart, logs
Permissions: connections, interface, connect, disconnect
Configuration: get, set, unset, wait
App Aliases: alias, aliases, unalias, prefer
Account: login, logout, whoami
Snapshots: saved, save, check-snapshot, restore, forget
Device: model, remodel, reboot, recovery
Quota Groups: set-quota, remove-quota, quotas, quota
Validation Sets: validate
... Other: warnings, okay, known, ack, version
Development: validate
For more information about a command, run 'snap help <command>'.
For a short summary of all commands, run 'snap help --all'.
Понимание структуры Snap
Файлы конфигурации обычно находятся в /etc/ , состояние процессов смотрим через systemctl , а журналы попадают в /var/log/ .
Snap на самом деле представляет собой не что иное, как один сжатый файл с расширения .snap, содержащий всю файловую систему, необходимую для запуска пакета. Эти файлы на самом деле никогда не распаковываются и не устанавливаются, а монтируются динамически во время выполнения и предоставляются пользователю как виртуальная среда.
Это означает, что ресурсы, используемые программой, могут фактически не существовать в хост-системе. Так, например, snap пакет Nextcloud создает для своего бэкенда собственные версии Apache и MySQL. Так что, если, скажем, вы хотите настроить новый виртуальный хост в /etc/apache2/sites-available/ или создать нового пользователя MySQL традиционным способом, то этого не удастся сделать.
Преимущества этого подхода значительны: установка и настройка, как правило, проходят намного проще, и у вас гораздо меньше шансов столкнуться с проблемами зависимостей и конфликтами. Но это также означает, что вы получаете меньший доступ к возможностям кастомизации программного обеспечения.
Итак, где же находятся установленные snap пакеты? Посмотрим на файловую систему хоста:
user@server:~$ find / -name "snap*" -type d
/home/user/snap
/run/snapd
/usr/share/doc/snapd
/usr/share/snapd
/usr/lib/snapd
/etc/systemd/system/snapd.mounts.target.wants
/tmp/snap-private-tmp
/tmp/snap-private-tmp/snap.nextcloud
/tmp/snap-private-tmp/snap.lxd
/sys/devices/virtual/misc/snapshot
/sys/fs/cgroup/system.slice/snap.nextcloud.mysql.service
/sys/fs/cgroup/system.slice/snap-nextcloud-40887.mount
/sys/fs/cgroup/system.slice/snap.nextcloud.nextcloud-cron.service
/sys/fs/cgroup/system.slice/snap-core18-2812.mount
/sys/fs/cgroup/system.slice/snap-lxd-27948.mount
/sys/fs/cgroup/system.slice/snap-snapd-21465.mount
/sys/fs/cgroup/system.slice/snap.nextcloud.apache.service
/sys/fs/cgroup/system.slice/snapd.service
/sys/fs/cgroup/system.slice/snap.nextcloud.php-fpm.service
/sys/fs/cgroup/system.slice/snap-core18-2823.mount
/sys/fs/cgroup/system.slice/snap-snapd-21184.mount
/sys/fs/cgroup/system.slice/snapd.socket
/sys/fs/cgroup/system.slice/snap.nextcloud.renew-certs.service
/sys/fs/cgroup/system.slice/snap.nextcloud.redis-server.service
/sys/fs/cgroup/system.slice/snap-core20-2182.mount
/sys/fs/cgroup/system.slice/snap-core20-2264.mount
/sys/fs/cgroup/system.slice/snap-nextcloud-41512.mount
/sys/fs/cgroup/system.slice/snap-lxd-28373.mount
/snap
/snap/core18/2812/snap
/snap/core18/2812/usr/lib/snapd
/snap/core18/2812/usr/share/snappy
/snap/core18/2812/var/cache/snapd
/snap/core18/2812/var/lib/snapd
/snap/core18/2812/var/snap
/snap/core18/2823/snap
/snap/core18/2823/usr/lib/snapd
/snap/core18/2823/usr/share/snappy
/snap/core18/2823/var/cache/snapd
/snap/core18/2823/var/lib/snapd
/snap/core18/2823/var/snap
/snap/lxd/27948/snap
/snap/lxd/28373/snap
/snap/snapd
/snap/snapd/21465/snap
/snap/snapd/21465/usr/lib/snapd
/snap/snapd/21465/usr/share/doc/snapd
/snap/snapd/21465/usr/share/snapd
/snap/snapd/21465/var/cache/snapd
/snap/snapd/21465/var/lib/snapd
/snap/snapd/21465/var/lib/snapd/apparmor/snap-confine
/snap/snapd/21465/var/lib/snapd/snaps
/snap/snapd/21465/var/snap
/snap/snapd/21184/snap
/snap/snapd/21184/usr/lib/snapd
/snap/snapd/21184/usr/share/doc/snapd
/snap/snapd/21184/usr/share/snapd
/snap/snapd/21184/var/cache/snapd
/snap/snapd/21184/var/lib/snapd
/snap/snapd/21184/var/lib/snapd/apparmor/snap-confine
/snap/snapd/21184/var/lib/snapd/snaps
/snap/snapd/21184/var/snap
/snap/nextcloud/40887/snap
/snap/nextcloud/41512/snap
/snap/core20/2264/snap
/snap/core20/2264/usr/lib/snapd
/snap/core20/2264/usr/share/doc/subiquitycore/examples/snaps
/snap/core20/2264/usr/share/snappy
/snap/core20/2264/var/cache/snapd
/snap/core20/2264/var/lib/snapd
/snap/core20/2264/var/lib/snapd/apparmor/snap-confine
/snap/core20/2264/var/lib/snapd/snaps
/snap/core20/2264/var/snap
/snap/core20/2182/snap
/snap/core20/2182/usr/lib/snapd
/snap/core20/2182/usr/share/doc/subiquitycore/examples/snaps
/snap/core20/2182/usr/share/snappy
/snap/core20/2182/var/cache/snapd
/snap/core20/2182/var/lib/snapd
/snap/core20/2182/var/lib/snapd/apparmor/snap-confine
/snap/core20/2182/var/lib/snapd/snaps
/snap/core20/2182/var/snap
/var/cache/snapd
/var/snap
/var/snap/snapd
/var/lib/snapd
/var/lib/snapd/assertions/asserts-v0/snap-revision
/var/lib/snapd/assertions/asserts-v0/snap-declaration
/var/lib/snapd/seed/snaps
/var/lib/snapd/snapshots
/var/lib/snapd/apparmor/snap-confine
/var/lib/snapd/apparmor/snap-confine.internal
/var/lib/snapd/snaps
Вот основные каталоги, которые были созданы в процессе установки:
/snap/
/var/snap/
/var/lib/snapd/
/home/username/snap/
Так много? Зачем? Фактически файлы .snap хранятся в каталоге /var/lib/snapd/snaps/ . При запуске эти файлы будут смонтированы в корневом каталоге /snap/ . Заглянув туда – в подкаталог /snap/core – вы увидите что-то похожее на обычную файловую систему Linux. На самом деле активные пакеты используют виртуальную файловую систему.
user@server:~$ ls /snap/core*/current
/snap/core18/current:
bin dev home lib64 meta opt root sbin srv sys usr writable
boot etc lib media mnt proc run snap stdout tmp var
/snap/core20/current:
bin etc lib libx32 mnt root snap tmp writable
boot home lib32 media opt run srv usr
dev host lib64 meta proc sbin sys var
А вот подкаталог, содержащий файлы конфигурации (только для чтения), используемые оснасткой Nextcloud. Конечно, если вы установили Nextcloud ( snap install nextcloud ).
user@server:~$ ls /snap/nextcloud/current/conf/
dhparams.pem httpd.conf mime.types ssl.conf
Хорошо. А как насчет /var/snap/ ? Файлы внутри /var/snap/ содержат различные формы пользовательских данных и файлов журналов – данные, которые генерируются и используются приложениями во время операций. В этом примере показаны каталоги для данных, используемых snapd и nextcloud.
user@server:~$ ls /var/snap
core18 core20 lxd nextcloud snapd
В каталоге ~/snap , который существует в домашнем каталоге пользователя (по крайней мере в некоторых файловых системах Linux), содержатся каталоги с некоторыми именами, которые вы уже видели в /var/snap. Что в них?
user@server:~$ ls ~/snap
lxd nextcloud
Эти каталоги предназначены для хранения версионных данных, связанных с настройками, используемыми вашей учетной записью пользователя.
Инструменты администрирования Snap
Мы рассмотрели как найти различные данные snap пакета: файлы конфигурации (внутри /var/snap/ ), виртуальные файловые системы ( /snap/ ) и пользовательские настройки ( ~/snap ), а также сами файлы .snap ( /var/lib/snapd/).
Разберём интструменты администрирования snap пакетов. Но сначала нужно узнать о службах Snap. Некоторые более сложные приложения требуют многоуровневых программных стеков. Например, Nextcloud создает и управляет собственными версиями Apache, MySQL, PHP и Redis. Каждый из этих «уровней» в упрощенном виде называется сервисом.
Если какие-либо пакеты, установленные на вашем компьютере, имеют свои собственные службы, вы сможете увидеть их (вместе с их статусом) с помощью этой команды snapd:
user@server:~$ snap services
Service Startup Current Notes
lxd.activate enabled inactive -
lxd.daemon enabled inactive socket-activated
lxd.user-daemon enabled inactive socket-activated
nextcloud.apache enabled active -
nextcloud.logrotate enabled inactive timer-activated
nextcloud.mysql enabled active -
nextcloud.nextcloud-cron enabled active -
nextcloud.nextcloud-fixer enabled inactive -
nextcloud.php-fpm enabled active -
nextcloud.redis-server enabled active -
nextcloud.renew-certs enabled active -
Вы также можете контролировать и управлять этими службами. Например, следующая команда остановит службу Apache Nextcloud и гарантирует, что она не запустится при перезагрузке системы (помните, что это отключит Nextcloud):
user@server:~$ snap stop --disable nextcloud.apache
Вы также можете использовать systemctl для управления процессами службы Snap:
user@server:~$ systemctl status snap.nextcloud.apache
Если ваш snap включает хотя бы один сервис, вы можете просмотреть его журналы с помощью snapd:
user@server:~$ snap logs nextcloud
Вы также можете указать конкретный сервис:
user@server:~$ snap logs nextcloud.mysql
Для некоторых snap пакетов (например, Nextcloud) snapd предоставляет полезные настройки, доступные из командной строки. Вы можете отобразить доступные настройки с помощью snap get :
user@server:~$ snap get nextcloud
Key Value
http {...}
mode production
nextcloud {...}
php {...}
ports {...}
private {...}
Повторим команду, добавив название определенного параметра.
user@server:~$ snap get nextcloud ports
Key Value
ports.http 80
ports.https 443
user@server:~$ snap get nextcloud http
Key Value
http.compression true
http.notify-push-reverse-proxy false
user@server:~$ snap get nextcloud php
Key Value
php.memory-limit 512M
Эти примеры показывают нам, что Nextcloud в настоящее время прослушивает только порты 80 (HTTP) и 443 (HTTPS), включено сжатие пакетов, ограничение использования памяти в php.
Вы можете изменить настройку с помощью команды set . В этом случае Nextcloud будет прослушивать небезопасные HTTP-запросы на порту 8080 вместо 80.
user@server:~$ snap set nextcloud ports.http=8080
Snapd также предлагает некоторые общесистемные настройки конфигурации, которые описаны здесь .
Всё это поможет вам начать работу с snap пакетами и провести debug ошибок в приложениях.