Jump to content

# Snap (Русский)

5 languages

- Deutsch
- English
- Español
- 日本語
- Polski

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Snap. Дата последней синхронизации: 9 октября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Flatpak
- AppArmor

Snap — это система развёртывания программного обеспечения и управления пакетами. Пакеты называются «snaps», а инструмент для их использования — «snapd», который работает в различных дистрибутивах Linux и, следовательно, позволяет развёртывать программное обеспечение, не зависящее от дистрибутива. Изначально система Snap была разработана и создана компанией Canonical.

snapd — это REST API демон для управления snap-пакетами. Пользователи могут взаимодействовать с ним с помощью клиента snap, входящего в состав этого же пакета.

Snap-пакеты могут быть ограничены с помощью AppArmor, который по умолчанию доступен в официальных ядрах. Шаги по включению AppArmor в системе описаны в соответствующих вики-статьях.

## Установка

Установите пакет snapdAUR.

Совет: `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-пакеты

Некоторые пакеты (например, Skype и 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 и других дистрибутивов

Category:

- Development (Русский)