Linux - начинающим. Учимся работать со Snap

  • Автор:

snap-getting-started-000.pngSnap - это универсальный формат пакетов, созданный компанией Canonical первоначально для Ubuntu, но получивший широкое распространение и в других дистрибутивах. Главной особенностью snap-пакетов является их самодостаточность, они содержат как нужное приложение, так и все основные зависимости к нему, что ускоряет распространение приложений и снижает возможные конфликты с другим ПО. В этой статье мы опишем основные приемы работы со snap для системного администратора и некоторые неочевидные особенности этой системы управления пакетами.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

К сожалению, многие администраторы, как начинающие, так и опытные крайне негативно относятся к snap, доходя до того, что сразу же удаляют его из системы. При этом разумной аргументации этих действий ими не предоставляется. На наш взгляд - это непрофессиональный подход, хороший специалист не ставит искусственных ограничений для применяемых технологий и умеет играть от сильных сторон, нивелируя слабые.

Перед тем, как рассматривать работу со snap мы сделаем краткое отступление и рассмотрим причины, приведшие к появлению snap и аналогичных ему форматов, таких как flatpak или appimage. Традиционно софт в Linux распространяется по принципу конструктора, когда все зависимости приложения являются отдельными пакетами или библиотеками и распространяются отдельно. Таким образом, если библиотека нужна сразу нескольким приложениям, то нам достаточно скачать ее один раз и установить в систему. Если в библиотеке найдены ошибки, то достаточно быстро их исправить и выпустить обновление, авторам программ, которые используют эту библиотеку ничего дополнительно делать не надо.

Для централизованного управления ПО каждый дистрибутив имеет собственный репозиторий, который содержит базу пакетов, собранных именно для этой версии дистрибутива, проверенных на ошибки и является единым доверенным источником программ для системы. И вот здесь появляются первые сложности. Количество даже основных дистрибутивов весьма велико, потому как у каждого из них на поддержке находятся сразу несколько выпусков, с разным составом базовой системы. Поэтому разработчик ПО как правило не собирает бинарные пакеты, этим занимаются мейнтрейнеры дистрибутиовов, что вызывает определенные задержки между выходом нового релиза программы и ее появления в репозитории.

Но это еще не все. В промышленном применении используются дистрибутивы с долгосрочной поддержкой (LTS), которые гарантируют неизменность основной пакетной базы на протяжении всего срока поддержки, а следовательно, многие библиотеки к концу жизненного цикла успеют порядочно устареть. Это хорошо для промышленного ПО и серьезных бизнес-систем, которые получают стабильное и предсказуемое окружение на заранее определенный период времени. Но это плохо для пользовательского ПО, особенно связанного с такими быстро развивающимися областями как интернет, мессенджеры, мультимедиа.

Классическая ситуация, когда разработчик для внедрения каких-то новых возможностей использует новую версию библиотеки, которая входит в конфликт с библиотеками LTS-версий дистрибутивов. В этом случае ожидать появления новых версий программы в официальных репозиториях скорее всего не стоит. Установка из сторонних источников, включая сторонние репозитории, PPA и просто пакеты, всегда связана с риском и потенциальным нарушением стабильности системы.

Snap и альтернативные ему технологии позволяют самому разработчику один раз выпустить универсальный пакет, который будет одинаково подходить для всех поддерживаемых систем. Это сразу снимает вопросы по скорости доставки ПО - пользователь может всегда использовать последнюю версию пакета, снимает риски нарушения безопасности и стабильности системы - все snap-приложения запускаются внутри изолированной от системы песочницы.

Кроме того, snap позволяет решить еще одну неочевидную проблему - поддержание единообразия ПО на предприятии. Если у вас в эксплуатации находятся разные выпуски дистрибутивов, то версии предлагаемого ими софта будут отличаться, что создает определенные трудности в сопровождении и поддержке. Snap позволяет применять единые версии ПО вне зависимости от используемого дистрибутива.

Установка и базовое использование snap

Если вы используете одну из следующих систем, то ничего делать не надо, snap уже установлен и готов к работе:

  • Ubuntu и официальные разновидности от 18.04 и новее
  • Manjaro
  • KDE Neon
  • Solus 3 и новее
  • Zorin OS

Для остальных дистрибутивов в большинстве случаев просто достаточно установить пакет snapd, но мы советуем все равно обратиться к инструкциям на официальной странице или к документации дистрибутива. Мы, традиционно будем рассматривать DEB-системы. Все указанные ниже команды выполняются из-под учетной записи суперпользователя (root) или через sudo.

Для установки snap выполните:

apt install snapd

После чего запустите службу и проверьте ее статус.

systemctl start snapd
systemctl status snapd

snap-getting-started-001.pngВ Debian также рекомендуется сразу установить базовый пакет core:

snap install core

Базовые пакеты core представляют собой набор основных системных библиотек, общих для всех приложений, что позволяет уменьшить размер snap-файлов за счет использования библиотек из базового пакета. Пакет core соответствует среде выполнения Ubuntu 16.04, если приложению нужен иной набор библиотек, то можно использовать пакеты core18, core20 и core22, каждый из которых соответствует определенному LTS-выпуску. Но вам особо не нужно об этом беспокоиться, так как данные пакеты будут автоматически установлены по зависимостям. Также существует ряд других общих пакетов, представляющие наборы общих библиотек для определенных сред и окружений, например, gnome-3-38-2004 или gtk-common-themes. Такой подход позволяет избежать ненужного дублирования. оставляя в snap-пакетах только действительно необходимые компоненты.

Хорошо, но откуда брать пакеты? Можно воспользоваться сайтом snapcraft.io, а можно просто выполнить поиск в консоли, синтаксис команд snap сильно напоминает синтаксис apt, поэтому долго привыкать не придется. Например, поищем Телеграм:

snap find telegream

Однако не будет ничего страшного, если вы по привычке наберете:

snap search telegream

Результат будет один и тот же. Искать можно не только по названию пакета, но и по части описания, если запрос содержит пробелы - его следует обернуть в кавычки.

snap-getting-started-002.pngОбратите внимание, что в snap находится практически последняя актуальная версия приложения, тогда как в репозитории самого последнего LTS-выпуска 22.04 только 3.6.1 от 16.03.22. Если вы активно используете данный мессенджер (как и любое другое приложение) то такое расхождение в версиях будет достаточно критичным и выступит сильным аргументом к использованию snap.

Как мы уже видели выше, для установки snap пакета нужно использовать команду install с именем пакета:

snap install telegram-desktop

Посмотреть на список установленных snap можно командой:

snap list

Здесь мы видим все установленные пакеты, в т.ч. и базовые наборы библиотек, которые были установлены по зависимостям, версию пакета и его издателя, доверенные издатели помечаются зеленой галочкой.

snap-getting-started-003.pngНо бояться недоверенных издателей не следует, если snap сделан плохо и не работает, то это будет касаться только этого пакета, на работу системы он влияния не окажет.

Для удаления пакета используйте:

snap remove telegram-desktop

Если вы не хотите ждать окончания процесса удаления и хотите сразу вернуться в консоль, оставив процесс работать в фоне, используйте:

snap remove telegram-desktop --no-wait

Чтобы полностью удалить пакет, вместе с пользовательскими настройками и данными выполните:

snap remove telegram-desktop --purge

Альтернативой удалению может служить отключение пакета, после чего он будет сохранен, но перестанет быть доступным:

snap disable telegram-desktop

Для включения выполните обратную команду:

snap enable telegram-desktop

Опытные пользователи могут заметить, что мы ничего не сказали про обновление snap-пакетов, так вот - это не нужно, обновление всех установленных пакетов выполняется полностью в автоматическом режиме.

Обновление и откат snap-пакетов

Как уже было сказано выше snap-пакеты обновляются полностью автоматически, в фоновом режиме. Данный подход не нов, он широко используется в мобильных системах, магазине Microsoft и позволяет прозрачно для пользователя доставлять ему свежие версии ПО и исправления. Но при этом администратор имеет возможность контролировать процесс обновления и управлять им.

Чтобы запустить обновление вручную выполните команду:

snap refresh

Чтобы обновить только отдельный пакет просто укажите его имя:

snap refresh telegram-desktop

Проверить периодичность обновления можно командой:

snap refresh --time

Там же вы увидите время последнего запуска и следующее планируемое время, по умолчанию значение таймера представлена 00:00~24:00/4, что обозначает один раз в 6 часов. Посмотреть планируемые к обновлению пакеты вы можете командой:

snap refresh --list

snap-getting-started-004.pngСледующий актуальный вопрос: что делать, если что-то пошло не так? В этом случае вы всегда можете откатиться на предыдущую версию пакета, для этого используйте:

snap revert telegram-desktop

Приложение будет откачено на предыдущую версию и больше не будет автоматически обновляться на ту версию с которой сделали откат, обновление произойдет только после того, как издатель опубликует в snap новую версию.

Посмотреть список доступных версий можно командой:

snap list --all 

или для отдельного пакета:

snap list --all telegram-desktop

По умолчанию хранится две версии пакета: установленная и предыдущая.

snap-getting-started-005.pngТеперь о том, какими параметрами мы можем управлять. В первую очередь расписанием, например, мы хотим обновлять пакеты в понедельник с 10 до 12 часов утра:

snap set system refresh.timer=mon,10:00~12:00

Для указания расписания следует использовать формат Timer string format.

При необходимости мы можем приостановить обновление пакетов на срок не более 90 дней. Допустим мы хотим отложить обновления до 22 декабря 2022 года. Сначала получим строку даты в нужном формате:

date --date="2022-12-22" +%Y-%m-%dT%H:%M:%S%:z

Затем подставим полученное значение в команду:

snap set system refresh.hold=2022-12-22T00:00:00+03:00

Еще одна полезная опция позволяет запретить обновление на лимитных подключениях, если NetworkManager видит, что вы подключены к тарифицируемому соединению, то обновление производиться не будет:

snap set system refresh.metered=hold

Также мы можем увеличить количество хранимых версий пакета, что позволит выполнить многократный откат:

snap set system refresh.retain=3

Как видим, snap предоставляет удобные инструменты по управлению обновлением пактов и предоставляет возможность быстрого отката, но это еще не все.

Каналы snap-пакетов

Каналы - важная часть концепции snap, позволяя выбирать различные ветви развития продукта и обновляться в их рамках. Каждый канал состоит из трех частей:

  • Tracks - выпуски (треки) - позволяют разработчикам публиковать несколько выпусков своего продукта под одним именем
  • Risk-levels - уровни риска - предоставляют несколько вариантов выбора между стабильностью и новыми функциями
  • Branches - ветви - необязательная часть канала, предназначены для временных выпусков, исправляющих ошибки.

Чаще всего мы будем оперировать именно выпусками и уровнями риска. С выпусками все просто, это могут быть, скажем, обычная ветка и вариант с долгосрочной поддержкой, а вот уровни риска разберем немного подробнее. Существуют четыре уровня риска:

  • stable - стабильные выпуски, рекомендуемые к применению в производственных средах.
  • candidate - выпуски, готовые к переходу в стабильное состояние, но требующие дополнительного тестирования
  • beta - бета версии продукта для тестирования вне производственных сред
  • edge - выпуски в процессе разработки, представляют собой постоянный поток изменений без обеспечения качества кода

Для того, чтобы проверить какие каналы есть у интересующего вас пакета выполните:

snap info firefox

И в самом внизу вывода изучите блок channels.

snap-getting-started-006.pngКак можем увидеть, доступны два выпуска: latest и esr, каждый со своими уровнями риска. В поле tracking указан текущий канал - latest/stable, а в поле installed - установленная версия, если, конечно, пакет установлен.

Допустим, мы хотим переключиться на стабильную версию esr - нет ничего проще:

snap switch --channel=esr/stable firefox

Затем просто обновите пакет:

snap refresh firefox

Также можно совместить все в одну команду:

snap refresh --channel=esr/stable firefox

Если вы хотите переключить уровни риска в пределах одного выпуска, то просто укажите:

snap refresh --channel=candidate firefox

Также ключ --channel можно использовать и при установке пакета, чтобы сразу указать необходимый выпуск, например:

snap install --channel=esr/stable firefox

Таким образом можно быстро, просто и, главное, безопасно переключаться между выпусками в любом направлении. С традиционным пакетным менеджером такая задача практически нерешаема или несет с собой запредельные уровни риска.

Мгновенные снимки данных

Любой пакет - это не только сама программа, но и пользовательские данные: профили, настройки, аккаунты. Все это требуется время от времени сохранять и snap снова предоставляет удобные инструменты для этого. Чтобы сделать моментальный снимок пользовательских данных всех установленных пакетов выполните:

snap save

Для отдельного пакета дополнительно укажите его имя, можно указать сразу несколько пакетов, если вы хотите объединить их состояние в один снимок:

snap save telegram-desktop

Посмотреть имеющиеся снимки можно командой:

snap saved

snap-getting-started-007.pngДля восстановления снимка следует указать его номер:

snap restore 2

Это удобно, так как позволяет быстро восстановить как состояние отдельного пакета, так и всей системы.

Также снимки можно использовать для переноса настроек пакета между системами, скажем вы купили новый ноутбук и хотите перенести на него все профили с настольного ПК. Делаем снимок, а затем экспортируем его, указав номер и имя файла выгрузки:

snap export-snapshot 3 my-snapshot.data

Для импорта просто укажите необходимый файл:

snap import-snapshot my-snapshot.data

Чтобы удалить снимок выполните:

snap forget 3

Снимки можно делать автоматически, для этого выполните команду:

set system snapshots.automatic.retention=48h

Что обеспечит автоматическое создание снимков раз в двое суток, промежуток времени между снимками не должен быть менее 24 часов.

Чтобы отключить автоматическое создание снимков используйте:

set system snapshots.automatic.retention=no

Все снимки хранятся 31 день, после чего автоматически удаляются.

Управление интерфейсами

Каждый snap-пакет запускается и работает в изолированном окружении, для взаимодействия с объектами за пределами контейнера используются интерфейсы, которые разрешают или запрещают соединения с определенными ресурсами. Это может быть оборудование, звук, сеть, домашняя директория пользователя и т.д. В большинстве случаев пользователю не требуется настраивать интерфейсы, все привязки происходят автоматически. Но администраторам нужно иметь представление и базовые навыки работы с ними.

Давайте посмотрим соединения пакета, для примера возьмем firefox:

snap connections firefoх

А теперь внимательно рассмотрим скриншот ниже, на котором мы видим три основных колонки:

  • Interface - интерфейс - это соединение с каким-либо ресурсом или службой
  • Plug - коннектор (штекер) - это подключение со стороны пакета, который хочет получить доступ к ресурсу, должен быть подключен к слоту (гнезду) службы
  • Slot - слот (гнездо) - подключение со стороны ресурса или службы, к которому должен быть подключен коннектор, предоставляется службой snapd или базовыми пакетами core

snap-getting-started-008.pngТаким образом интерфейс - это соединение между коннектором и слотом, которое может быть как установлено, так и разорвано. Зная имя интерфейса, мы всегда можем узнать как он используются, какие пакеты имеют коннекторы и кто предоставляет слот:

snap interface camera

В выводе команды мы увидим, что коннекторы к интерфейсу имеют пакеты firefox и telegram-desktop, а слот предоставляет служба snapd.

snap-getting-started-009.pngТеперь допустим. что мы не хотим чтобы браузер имел доступ к камере, все что нам нужно - это просто отключить интерфейс:

snap disconnect firefox:camera :camera

Команда предписывает отключить коннектор firefox:camera от слота :camera, имена слотов и коннекторов указываем точно также как в выводе команды connections. Отключенный вручную интерфейс автоматически назад не подключается.

Иногда бывает задача отключить интерфейс временно, до обновления пакета. Например, он некорректно работает с камерой, но откатывать его по каким-либо причинам вы не хотите. Тогда используйте дополнительный ключ --forget, который отключит интерфейс только до обновления:

snap disconnect firefox:camera :camera --forget

Еще раз проверим соединения, как видим в слоте камеры стоит прочерк, значит коннектор отключен и пакет не имеет доступа к этому интерфейсу.

snap-getting-started-010.pngДля включения интерфейса воспользуйтесь командой:

snap connect firefox:camera :camera

Данный механизм дает администратору простой, удобный и, снова повторимся, безопасный способ управления разрешениями приложений. Вам не нужно вникать в дебри назначения прав и ограничений, достаточно просто соединить или разъединить интерфейс.

Заключение

В данной статье мы рассмотрели базовые принципы работы со snap, при этом многие моменты остались за кадром, так как формат статьи не позволяет сильно углубляться в вопрос. Но приведенных данных вполне достаточно, чтобы начать уверенно использовать данную технологию. При этом лично вы можете использовать или не использовать snap в своей деятельности, но как специалист должны иметь базовый набор знаний и основных навыков для работы со snap-пакетами. Кроме того, имея собственный опыт, вы сможете аргументировать свою позицию по отношению использования snap в том или ином сценарии.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments