snapd service

Как работать со snap пакетами в linux

Для чего нужны 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 ошибок в приложениях.