Гид по технологиям

Как создать и установить snap-пакет с помощью Snapcraft

• 8 min read • Linux • Обновлено 01 Dec 2025
Как собрать snap с помощью Snapcraft на Linux
Как собрать snap с помощью Snapcraft на Linux

Логотип и интерфейс Snapcraft на рабочем столе Linux

Содержание

  • Что такое snap-пакет?
  • Почему стоит использовать snap?
  • Установка snapd на разных дистрибутивах
  • Установка Snapcraft
  • Создание проекта snap: пошагово
  • Аннотированный пример snapcraft.yaml
  • Сборка, тестирование и отладка
  • Выпуск и распространение
  • Безопасность и confinement
  • Альтернативы и когда snap не подходит
  • Чек-листы по ролям
  • Критерии приёмки
  • Часто задаваемые вопросы

Что такое snap-пакет?

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

Определение: confinement — режим изоляции snap-приложения от остальной системы. Существуют режимы strict, classic и devmode; они определяют, какие ресурсы ОС доступны пакету.

Почему стоит использовать snap-пакеты?

Преимущества:

  • Универсальность: один пакет работает на многих дистрибутивах, поддерживающих snapd.
  • Простота установки и обновления: установка — одна команда; обновления происходят автоматически.
  • Снижение конфликтов зависимостей: зависимости поставляются вместе с приложением.
  • Контроль версий и откат: snap поддерживает rollbacks и версии релизов.

Ограничения и когда snap не подходит:

  • Размер пакета может быть больше из‑за включённых библиотек.
  • Для приложений с жёсткими требованиями к интеграции с системой (например, ядро-модули) snap может быть неприменим.
  • Некоторые пользователи и дистрибутивы предпочитают нативные пакеты (.deb/.rpm).

Важно: snap не заменяет виртуализацию (Docker) — это формат пакета, ориентированный на распространение приложений по дистрибутивам.

Установка snapd в Linux

snapd — демон, который управляет установкой и запуском snap-пакетов. После установки snapd вы получите CLI-инструмент snap.

Ubuntu/Debian (рекомендуется): откройте терминал и выполните:

sudo apt update -y && sudo apt install snapd -y

Установка snapd в Ubuntu — вывод терминала

CentOS/RHEL: сначала включите репозиторий EPEL, затем установите snapd:

sudo dnf install epel-release -y && sudo dnf update -y
sudo dnf install snapd -y

Включение репозитория EPEL в CentOS — вывод терминала

Fedora:

sudo dnf install snapd

Arch Linux: snapd доступен в AUR; используйте AUR-хелпер (yay, paru) для установки.

После установки активируйте сокет systemd, чтобы snapd запускался автоматически:

sudo systemctl enable --now snapd.socket

Создайте символическую ссылку для поддержки классических снапов:

sudo ln -s /var/lib/snapd/snap /snap

Проверьте версию и статус службы:

snap --version
sudo systemctl status snapd

Статус службы snapd — вывод systemctl в Ubuntu

Совет: после установки и включения сокета иногда требуется выйти из сеанса и войти снова, чтобы корректно появился путь к /snap/bin.

Установка Snapcraft

Snapcraft — инструмент для сборки snap-пакетов. Canonical рекомендует устанавливать его как snap в classic режиме:

sudo snap install snapcraft --classic

Проверьте установку:

snapcraft --version

Почему classic? Snapcraft как инструмент сборки требует доступа к инструментам сборки на хост-системе; classic даёт более широкий набор разрешений во время разработки.

Также можно установить Snapcraft в контейнере или CI-окружении (см. раздел CI и автоматизация).

Создание snap-проекта: пошагово

В качестве примера создадим «hello world» snap, собираемый из исходников GNU Hello.

1. Структура проекта

Создайте рабочую директорию и инициализируйте проект:

mkdir -p ~/mysnaps/hello
cd ~/mysnaps/hello
snapcraft init

Команда snapcraft init создаст шаблон snapcraft.yaml.

Проверьте структуру:

tree -a

Структура проекта hello — вывод tree

2. Аннотированный snapcraft.yaml

Откройте файл в редакторе:

sudo nano snapcraft.yaml

Замените шаблон метаданными:

name: hello
base: core18
version: '2.10'
summary: GNU Hello, the "hello world" snap
description: |
  GNU hello prints a friendly greeting.
grade: devel
confinement: devmode

apps:
  hello:
    command: bin/hello

parts:
  gnu-hello:
    source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
    plugin: autotools

Пояснения к полям:

  • name — уникальное имя пакета в Snap Store (в разработке локально можно использовать любое).
  • base — базовая платформа (core18, core20, core22 и т.д.). База определяет, какие рантаймы и библиотеки доступны.
  • version — версия приложения.
  • grade — devel или stable (указывает уровень качества сборки).
  • confinement — режим: strict, classic, devmode. Для разработки обычно devmode.
  • apps — топ-уровневые приложения, которые предоставляет snap; command — исполняемый файл внутри снэпа.
  • parts — части сборки, описывающие, какие источники скачивать и как собирать.

Содержимое файла snapcraft.yaml в редакторе

Совет: используйте base, соответствующую целевому окружению (core20/core22), чтобы минимизировать несоответствия библиотек.

3. Сборка snap-пакета

Выполните команду сборки в каталоге проекта:

snapcraft

При необходимости snapcraft предложит установить multipass (инструмент для создания изолированного VM). Подтвердите установку.

Процесс может занять время — загрузка исходников, компиляция и упаковка.

Процесс сборки snapcraft — вывод в терминале

В результате в каталоге появится файл вида hello_2.10_amd64.snap

4. Тестирование локального снапа

Установите собранный пакет в режиме для разработки:

sudo snap install --devmode hello_2.10_amd64.snap

Запустите приложение:

hello
hello --version

Проверка версии приложения hello — вывод в терминале

Если что-то пошло не так, используйте отладочные флаги:

snapcraft --debug
snap run --strace hello
journalctl -u snapd --no-pager | tail -n 200

Отладка snapcraft — вывод командной строки

Важно: devmode отключает многие механизмы confinement и не предназначен для релизов. Перед публикацией протестируйте snap в strict (или classic, если требуется).

Аннотированный пример snapcraft.yaml (разбор по секциям)

Приведём краткий чек-лист для полей snapcraft.yaml и типичные плагины:

  • base: core20 / core22 — соответствие целевой платформе.
  • parts:
    • plugin: autotools, make, python, nil, nodejs, go, dump — выбирается в зависимости от строящейся системы.
    • source: git URL / tarball / local path.
    • build-packages / stage-packages: пакеты apt, которые нужны для сборки/распространения.
  • apps:
    • plugs: список интерфейсов (например, network, home, network-bind).
    • environment: переменные окружения.
    • daemon: simple / oneshot / fork — для фоновый служб.

Минимальный пример с plug и environment:

apps:
  myapp:
    command: bin/myapp
    plugs: [network, home]
    environment:
      GODEBUG: "x509ignoreCN=0"

Совет: для desktop приложений добавляйте .desktop файлы и соответствующий интерфейс ‘desktop’, ‘x11’ или ‘wayland’.

Выпуск и распространение

  1. Зарегистрируйтесь в Snap Store: https://snapcraft.io/
  2. Зарезервируйте уникальное имя snap (snapcraft register ).
  3. Свяжите локальную сборку с публикацией:
snapcraft login
snapcraft push hello_2.10_amd64.snap --release=stable

После публикации пользователи смогут установить вашу программу командой:

sudo snap install hello

План релизов: используйте каналы (edge, beta, candidate, stable) для поэтапного выхода и тестирования.

CI и автоматизация сборки

Рекомендации:

  • Собирайте snaps в чистом окружении (multipass или контейнеры) для воспроизводимости.
  • Настройте pipeline: checkout → test → build snap → sign/push в Snap Store.
  • Используйте secrets для учётных данных snapcraft (snapcraft login –with ).

Пример CI-шаблона (псевдо):

  • build:
    • setup multipass
    • snapcraft –use-lxd (или –destructive-mode)
    • run unit tests
    • snapcraft pack
    • snapcraft push –release=beta

Важно: автоматизированная публикация должна проходить на релизных шагах и иметь ручной контроль для stable-канала.

Безопасность и confinement

Режимы confinement:

  • strict — изоляция по умолчанию, доступ к ресурсам через интерфейсы.
  • classic — почти без ограничений, требует согласия со стороны Snap Store на публикацию.
  • devmode — для разработки и отладки, не используется для релиза.

Интерфейсы (plugs/slots) — механизм, через который snap получает доступ к ресурсам: network, removable-media, camera, audio, bluetooth и т.д.

Рекомендации по безопасности:

  • Минимизируйте права: не давайте лишние plugs, используйте strict, где возможно.
  • Для сервисов используйте daemon: simple и следите за журналами через systemd/snapd.
  • Документируйте требуемые plugs в release notes, чтобы пользователи понимали, почему нужны разрешения.

Альтернативы и когда snap не подходит

Основные альтернативы:

  • Flatpak — ориентирован на desktop-приложения, хорошо интегрирован с порталом Freedesktop.
  • AppImage — переносимый единичный бинарный файл, не требует установки daemons.
  • .deb/.rpm — нативные пакеты, лучше подходят для глубокого интегрирования с дистрибутивом.

Когда выбирать другое решение:

  • Нужна минимизация размера дистрибутива и поддержка нативных репозиториев → .deb/.rpm.
  • Хочется простого переносимого бинарника без демонов → AppImage.
  • Desktop‑ориентированное приложение с интеграцией в окружение рабочего стола → Flatpak.

Чек-листы по ролям

Разработчик:

  • Инициализировал snapcraft.yaml
  • Собрал локально и протестировал в devmode
  • Добавил unit/интеграционные тесты
  • Протестировал strict confinement перед релизом

Пакетный/релиз‑менеджер:

  • Зарегистрировал имя в Snap Store
  • Настроил CI/CD для сборки snap
  • Настроил каналы edge/beta/candidate/stable
  • Подготовил release notes и changelog

Системный администратор:

  • Установил snapd и настроил обновления
  • Проверил политику автоматических обновлений
  • Ограничил доступ к snapcraft login tokens на CI

Критерии приёмки

  • Snap успешно устанавливается и запускается на целевом дистрибутиве (Ubuntu 20.04/22.04/другие в зависимости от base).
  • Все заявленные приложения (apps) доступны и запускаются без дополнительных действий.
  • Для strict confinement все необходимые interfaces (plugs/slots) работают корректно.
  • Автоматические обновления не приводят к нарушению данных или конфигурации.

Отладка и распространённые ошибки

  1. Проблема: snapcraft требует multipass, но установка не проходит.
    • Проверьте, включена ли виртуализация (VT-x) и достаточен ли объём диска.
  2. Проблема: приложение работает локально, но не в snap.
    • Проверьте missing library — используйте ldd и проверьте окружение в контейнере.
  3. Проблема: snap не запускается в strict из-за отказа в доступе.
    • Добавьте необходимые plugs и протестируйте service logs (journalctl, snap logs).

Полезные команды для отладки:

snap logs 
snap run --strace 
journalctl -u snapd
snap connections 

Модель принятия решений: когда использовать snap?

flowchart TD
  A[Нужна кросс-дистрибутивная доставка?] -->|Да| B[Snap или Flatpak]
  A -->|Нет| C[Использовать нативные пакеты]
  B --> D{Desktop или сервер?}
  D -->|Desktop| E[Flatpak или Snap]
  D -->|Сервер| F[Snap]
  E --> G[Если нужна интеграция с порталом — Flatpak]
  F --> H[Если нужны rollbacks и централизованное обновление — Snap]

Примеры сценариев использования

  • Dev tools и CLI-приложения: snap удобен для распространения последних версий с возможностью отката.
  • Desktop приложения: snap подходит, но Flatpak часто даёт лучшую интеграцию с рабочим столом.
  • Сервисы и агенты: snap упрощает доставку и обновление, особенно в гетерогенных средах.

Локальные советы и совместимость с дистрибутивами

  • Ubuntu — наилучшая поддержка snap по умолчанию.
  • Debian — snapd доступен, но требуются дополнительные шаги у некоторых старых версий.
  • Fedora — поддерживается, но предпочтение у пользователей может быть другим.
  • CentOS/RHEL — через EPEL и dnf.

Особенности для русскоязычных администраторов:

  • В корпоративной среде уточните политику автоматических обновлений и возможность блокировки каналов.
  • При использовании прокси/сетевых фильтров разблокируйте доступ к api.snapcraft.io и dl.snapcraft.net.

Резюме

Snapcraft позволяет создать переносимый snap-пакет, который легко установить на различных дистрибутивах Linux. Порядок действий: установить snapd → установить snapcraft → инициализировать проект → настроить snapcraft.yaml → собрать snap → протестировать → опубликовать. В статье приведены шаблоны, чек-листы, советы по безопасности, отладке и CI.

Ключевые ссылки и дополнительные чтения:

Изображения: скриншоты и примеры вывода команд.

Автор и права: все скриншоты использованы с разрешения. Изображение обложки предоставлено Freepik. Все примеры команд — рабочие и проверены на типичных системах Linux.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро