Snap (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Snap
. Дата последней синхронизации: 9 октября 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Flatpak
AppArmor
Snap
— это система развёртывания программного обеспечения и управления пакетами. Пакеты называются «snaps», а инструмент для их использования — «snapd», который работает в различных дистрибутивах Linux и, следовательно, позволяет развёртывать программное обеспечение, не зависящее от дистрибутива. Изначально система Snap была разработана и создана компанией Canonical.
snapd
— это REST API демон для управления snap-пакетами. Пользователи могут взаимодействовать с ним с помощью клиента
snap
, входящего в состав этого же пакета.
Snap-пакеты могут быть ограничены с помощью
AppArmor
, который по умолчанию доступен в
официальных ядрах
. Шаги по включению AppArmor в системе описаны в соответствующих вики-статьях.
Установка
Установите
пакет
snapd
AUR
.
Совет
snapd
устанавливает скрипт в
/etc/profile.d/
для экспорта путей в исполняемым файлам, входящим в snap-пакеты. Для того чтобы эти изменения вступили в силу потребуется перезагрузка.
Если вы используете AppArmor,
запустите
и
включите
службы
apparmor.service
и
snapd.apparmor.service
.
Примечание
Если AppArmor не включен в вашей системе, то все snap-пакеты будут работать в режиме
devel
, то есть они будут иметь такой же неограниченный доступ к вашей системе, как и приложения, установленные из репозиториев Arch Linux.
Настройка
Чтобы демон
snapd
автоматически запускался, когда
snap
обращается к нему,
запустите
и/или
включите
юнит
snapd.socket
.
Использование
Для управления пакетами используется утилита
snap
.
Поиск
Для поиска пакетов, доступных для установки используйте команду
find
:
$ snap find
критерий_поиска
Установка пакетов
Установить snap-пакет можно с помощью команды:
# snap install
имя_пакета
Установка требует root привилегий. Установка с правами пользователя на данный момент невозможна. При установке snap загружается в
/var/lib/snapd/snaps
и монтируется в
/var/lib/snapd/snap/
имя_пакета
.
Кроме того, создаются также юнит-файлы для каждого snap-пакета и добавляются в
/etc/systemd/system/multi-user.target.wants/
, для того чтобы snap-пакеты монтировались при каждом запуске системы.
Вы можете просмотреть список установленных пакетов командой:
$ snap list
Вы также можете устанавливать snap-пакеты локально, с жесткого диска:
# snap install --dangerous
/путь/к/пакету/snap
Обновление пакетов
Для того чтобы обновить snap-пакеты выполните:
# snap refresh
Пакеты обновляются автоматически в соответствии с настройкой
refresh.timer
.
Посмотреть время последнего/следующего обновления можно с помощью команды:
# snap refresh --time
Изменение времени обновления, например, дважды в день:
# snap set core refresh.timer=0:00~24:00/2
Подробнее в документации:
system options documentation page
.
Удаление пакетов
Для того чтобы удалить пакет выполните:
# snap remove
snapname
Советы и рекомендации
Классические snap-пакеты
Некоторые пакеты (например, Julia и Pycharm) используют классический уровень ограничения (classic confinement). Однако он требует наличия каталога
/snap
, который не соответствует FHS. Пакет snapd не поставляет этот каталог, но на его месте можно создать символическую ссылку на
/var/lib/snapd/snap
, чтобы установка классических snap-пакетов стала возможна:
# ln -s /var/lib/snapd/snap /snap
Ограничение доступа
При использовании
AppArmor
snapd
сгенерирует такие же профили для snap-пакетов, что и на Ubuntu. Парсер AppArmor достаточно умён, чтобы отбросить правила, которые ещё не поддерживаются основным ядром.
Чтобы проверить, что базовое ограничение доступа работает, установите snap-пакет
hello-world
. Затем выполните следующее:
$ hello-world.evil
Hello Evil World!
This example demonstrates the app confinement
You should see a permission denied error next
/snap/hello-world/27/bin/evil: 9: /snap/hello-world/27/bin/evil: cannot create /var/tmp/myevil.txt: Permission denied
AppArmor должен отказать в доступе и записать событие в журнал:
# dmesg
...
[  +0.000003] audit: type=1327 audit(1540469583.966:257): proctitle=2F62696E2F7368002F736E61702F68656C6C6F2D776F726C642F32372F62696E2F6576696C
[ +12.268939] audit: type=1400 audit(1540469596.236:258): apparmor="DENIED" operation="open" profile="snap.hello-world.evil" name="/var/tmp/myevil.txt" pid=10835 comm="evil" requested_mask="wc" denied_mask="wc" fsuid=1000 ouid=1000
[  +0.000006] audit: type=1300 audit(1540469596.236:258): arch=c000003e syscall=2 success=no exit=-13 a0=55d991ba6bc8 a1=241 a2=1b6 a3=55d991ba6be0 items=0 ppid=31349 pid=10835 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts2 ses=3 comm="evil" exe="/bin/dash" subj==snap.hello-world.evil (enforce)
...
Если отказа не видно, проверьте, что профили загружены:
# aa-status | grep snap.hello-world
snap.hello-world.env
   snap.hello-world.evil
   snap.hello-world.hello-world
   snap.hello-world.sh
Также можно проверить, какие функции песочницы доступны в системе согласно snapd:
$ snap debug sandbox-features
apparmor:             kernel:caps kernel:domain kernel:file kernel:mount kernel:namespaces kernel:network_v8 kernel:policy kernel:ptrace kernel:query kernel:rlimit kernel:signal parser:unsafe policy:default support-level:partial
confinement-options:  devmode
dbus:                 mediated-bus-access
kmod:                 mediated-modprobe
mount:                freezer-cgroup-v1 layouts mount-namespace per-snap-persistency per-snap-profiles per-snap-updates per-snap-user-profiles stale-base-invalidation
seccomp:              bpf-argument-filtering kernel:allow kernel:errno kernel:kill_process kernel:kill_thread kernel:log kernel:trace kernel:trap
Решение проблем
Нечитабельный текст
Если вместо нормальных символов отображаются квадратики, попробуйте очистить кэш шрифтов:
# rm -f /var/cache/fontconfig/*
$ rm -f ~/.cache/fontconfig/*
# fc-cache -r -v
Snapctl также хранит внутренние кэши для каждого snap-пакета отдельно, которые
тоже нужно очищать
.
Сначала найдите их с помощью команды:
$ find ~/snap/ -wholename '*/.cache/fontconfig'
... /home/darth_vader/snap/mailspring/common/.cache/fontconfig
... /home/darth_vader/snap/authy/common/.cache/fontconfig
... /home/darth_vader/snap/icedrive/common/.cache/fontconfig
... /home/darth_vader/snap/discord/common/.cache/fontconfig
... /home/darth_vader/snap/bitwarden/common/.cache/fontconfig
Затем либо удалите их по отдельности, либо используйте
этот простой цикл
.
Наконец, перезапустите сеанс.
Error: cannot mount squashfs
Snap-пакеты используют файловую систему
SquashFS
. Если случается подобная ошибка:
error: system does not fully support snapd: cannot mount squashfs image using "squashfs"
проверьте, загружен ли модуль ядра SquashFS:
$ lsmod
Module                  Size  Used by
squashfs               xxxxx  x
...
Совет
Если snapd был установлен только что — возможно, нужно перезагрузиться перед установкой snap-пакетов.
Помощь
Почтовая рассылка Arch Linux и другие официальные каналы поддержки Arch Linux не являются подходящим местом для запроса помощи по snap-пакетам на Arch Linux. Подходящим местом для запроса поддержки является
Snapcraft forum
.
Смотрите также
Официальный сайт
Репозиторий на GitHub
Статья на Ars Technica
(2016-06) о том, что "Ubuntu snaps" становятся доступными для Arch и других дистрибутивов