Lxd snap ubuntu что это
Snap и deb противопоставляют друг другу, хотя deb - это по большей части архив аля zip. Snap пакет хоть и сжат с помощью squashfs, но содержимое никто никуда не распаковывает, а банально монтируют, передавая в руки системы мандатного доступа AppArmor. LXD так же является изоляцией, используя LXC в качестве низкоуровневого инструмента. И тут не могло не быть технических проблем, чтобы одна "изоляция" работала внутри другой. Стефан Грабер (Stéphane Graber) в своей новой статье, но не в рамках цикла статей про LXD, рассказывает о реализованной возможности поставить snap пакет внутри LXD контейнера.
Введение
Команды проектов LXD и AppArmor работали над решением поддержки профилей AppArmor внутри LXD контейнеров. С последними ядрами в Ubuntu, наконец-то, появилась возможность поставить программу в snap пакете внутри LXD. Пакеты snap, как многим стало известно, новый путь дистрибьюции ПО напрямую из апстрима с целым рядом функций безопасности, обёрнутые вокруг пакетов так, что они не смогут помешать работе друг друга или причинить вред системе.
Требования
Есть много различных кусочков мозаики, которые вместе заставляют заработать вместе эти две технологии - snap и LXD. Начальная работа была проделана, когда хостовой операционной системой и гостевой внутри контейнера была Ubuntu 16.10. Но всё нужное проталкивается через обновления и в Ubuntu 16.04 LTS.
Самый простой путь увидеть совместную работу технологий:
- Ubuntu 16.10 в качестве хостовой операционной системы.
- Ядро Linux 4.8.0 или новее.
- LXD 2.4.1 или новее.
- Контейнер с Ubuntu 16.10 с установленным squashfuse.
Установка snap пакета nextcloud
Вначале создадим нужный контейнер по имени nextcloud с нужной системой Ubuntu 16.10 и пакетом squashfuse.
lxc launch ubuntu:16.10 nextcloud
lxc exec nextcloud -- apt update
lxc exec nextcloud -- apt dist-upgrade -y
lxc exec nextcloud -- apt install squashfuse -y
Теперь внутри контейнера nextcloud можно поставить одноимённый snap пакет nextcloud.
lxc exec nextcloud -- snap install nextcloud
Теперь можно узнать IP адрес, чтобы браузером зайти и увидеть веб интерфейс.
lxc list nextcloud
Установка snap пакета LXD внутри LXD контейнера
Сначала нам нужен новый контейнер (в примере имя дано lxd) с Ubuntu 16.10 внутри и контейнер должен быть с поддержкой вложенности.
lxc launch ubuntu:16.10 lxd -c security.nesting=true
lxc exec lxd -- apt update
lxc exec lxd -- apt dist-upgrade -y
lxc exec lxd -- apt install squashfuse -y
Внутри контейнера будет предустановлен пакет lxd и его нужно удалить - lxc exec lxd -- apt remove --purge lxd lxd-client -y
Теперь нам нужно установить самую топовую версию lxd через канал edge - lxc exec lxd -- snap install lxd --edge
Заходим внутрь контейнера lxc exec lxd bash
Внутри контейнера инициализируем и настраиваем "внутренний" lxd.
root@lxd:
Теперь у нас есть LXD последней версии внутри LXD контейнера хоста и там внутри запущен ArchLinux. Помните, что LXD поставлен через snap технологию и использует канал edge, что подразумевает частое обновление новых версий, возможно несколько раз в день.
Вывод
Здорово что пакеты snap можно нормально использовать внутри контейнера LXD. На производстве теперь можно поднять сотни различных контейнеров, связать сетью как нужно, настроить лимиты на ресурсы с помощью LXD и начать ставить софт прямиком от их апстрима через технологию snap.
Нельзя со 100% уверенностью сказать, что всё работает идеально. Некоторые вещи, благодаря которым всё и работает, появились в ядре относительно недавно - монтирование FUSE в непривилегированном режиме (unprivileged FUSE filesystem mounts) и работа профиля AppArmor в непривилегированном режиме (unprivileged AppArmor profile stacking and namespacing). Возможно есть шероховатости, которые нужно устранить, чтобы snap работал идентично snap, установленному непосредственно в хосте.
Если вы заметите расхождение в работе "snap внутри LXD" или "snap напрямую в хосте", то гляньте вывод dmesg на предмет строк DENIED, которые показывают что AppArmor запрещает что-то для данного snap.
Контейнеры против виртуализации.
Относительно недавно в Ubuntu появился новый инструмент — снапы (от англ. snap), но что это такое и как их использовать знают далеко не все пользователи.
Введение в снапы
Представим вполне реальную ситуацию. Пользователь устанавливает самую новую версию Ubuntu, пусть это будет версия 16.04 — именно в ней и появились впервые снапы по умолчанию. По определенным причинам пользователь отключает обновления. Такая ситуация не надумана. Мы все знаем, что после обновления системы Ubuntu, к сожалению, не всегда работает корректно и даже не всегда загружается.
Пользователя все устраивает и он спокойно себе использует дистрибутив некоторое время. Через несколько лет пользователь хочет установить новую версию приложения, например, браузера и обнаруживает, что он не может этого сделать.
Почему? Да потому что его дистрибутив устарел. для установки приложения нужны новые версии библиотек, а для их установки нужно обновить уже установленные пакеты. Иногда процесс настолько масштабный, что приходится обновлять дистрибутив. А ведь мы знаем, что пользователь не хочет этого делать по ряду причин, да и это опасно: система может быть разрушена нарушения связей между программами и библиотеками.
Вторая ситуация. Пусть у пользователя самая новая версия дистрибутива (на данный момент — это 18.10) — чтобы никто не упрекнул нас в надуманности ситуации. Мы знаем, что у традиционных пакетов есть зависимости и конфликты. Иногда нельзя установить то или иное приложение, поскольку его библиотеки конфликтуют с библиотеками уже установленными в системе.
Обе проблемы настолько обширны, что разработчики Ubuntu изобрели снапы. Все мы знакомы с понятием пакета. Пакет содержит саму программу, а также различные вспомогательные файлы — документацию, ресурсы (картинки, например), файлы локализации, сценарии Но пакет не содержит всего, что нужно для работы этой программы в системе. Например, если программе для работы нужна библиотека GL, то просто в пакете «прописывается» зависимость — нужно установить пакет для работы этого пакета. При установке программы менеджер пакетов (apt) производит разрешение зависимостей — устанавливает все необходимые для работы этой программы пакеты.
С одной стороны, такой подход позволяет экономить место на диске. Ведь одну и ту же библиотеку не нужно устанавливать несколько раз. С другой стороны, это порождает уже описанные ранее проблемы.
Снап — это решение всей головной боли, как пользователя, так и разработчика приложения. Снап можно считать таким пакетом, в котором содержится не только программа, но и все необходимые для ее работы библиотеки. Получается, что все, что нужно для работы программы содержится в снапе.
Snap (или Snappy) — это система развертывания программ и управления пакетами, созданная Canonical. Эти пакеты чаще называют «снепами». Для работы с ними используется утилита «snapd», встроенная в ряд дистрибутивов Linux и позволяющая дистрибутивно-независимо развертывать программы на более высоком уровне.
Snap-пакеты полностью самодостаточны и работают на всех дистрибутивах Linux, позволяя безопасно распространять новые приложения и утилиты для систем облачных вычислений, серверов, десктопа и интернета вещей (Internet of Things). То есть snap-пакеты используются так же, как и команда apt-get , но другим способом.
Snapd — это REST API демон, служащий для управления snap-пакетами. Пользователи взаимодействуют с ним с помощью клиента snap, который входит в тот же пакет. Вы можете установить любое приложение на Linux-десктоп, сервер, облако или устройство.
Вам понадобится
GNU/Linux дистрибутив u и некоторые базовые знания о работе в командной строке. В данном руководстве вы узнаете, как настроить и использовать snap-команды.
Установка системы Snap
Если у вас установлена Ubuntu 16.04 LTS (Xenial Xerus) или более поздние версии, включая Ubuntu 18.04 LTS (Bionic Beaver), то вам ничего не надо делать. Snap установлен по умолчанию и готов к работе. Соответственно, если у вас установлена более ранняя версия или системы Snap нет по каким-то другим причинам, то сначала установите ее, а затем приступайте к работе.
Установку можно осуществить с помощью следующих команд:
Работа с системой Snap
snapd настроен и готов к использованию!
Поиск snap-приложений/пакетов
Чтобы найти доступные snap-приложения или пакеты выполните следующую команду:
Установка snap-приложений
Вы можете установить любые приложения/пакеты, доступные в формате snap, выполнив следующую команду:
Также можно указать конкретный канал, из которого вы хотите установить приложение. Канал — это snap-концепция, которая позволяет переключаться между разными каналами snap-приложений.
Запуск установленных snap-пакетов
Установленные snap-пакеты доступны в формате bin/snap и, как правило, добавлены в $PATH . Это позволяет сделать снепы доступными через ввод команды. Snap-приложение можно запустить, выполнив следующую команду:
Также его можно запустить через команду:
Просмотр списка установленных приложений
Чтобы увидеть все установленные snap-пакеты, выполните следующую команду:
Обновление установленных snap-приложений/пакетов
Снепы обновляются автоматически, но вы можете также обновить их вручную с помощью следующей команды:
Чтобы посмотреть, какие обновления snap-пакетов готовы к установке, выполните следующую команду:
Возврат к более ранней версии snap-приложений/пакетов
Если по какой-то причине вам не понравилось последнее обновление snap-пакета, вы можете вернуться к предыдущей версии с помощью следующей команды:
Такая команда вернет необходимую версию snap-пакета и данные, соответствующие ПО. Если предыдущая версия snap-пакета получена из другого канала, она все равно установится, и канал останется прежним.
Удаление snap-приложений/пакетов
Если вы хотите избавиться от снепов, удалите snap-пакет с помощью следующей команды:
Эта команда удалит приложение, все ее зависимости во время выполнения и связанные пользовательские данные. Если снеп запущен, команда сначала закроет его и затем удалит.
Включение и выключение snap-приложений/пакетов
Если вы хотите временно остановить работу снепа, просто отключите его и снова включите тогда, когда потребуется.
Список запущенных служб
Используйте snap services , чтобы просмотреть все установленные и запущенные снепы.
Перезапуск, запуск и приостановление snap-служб
Службы можно перезапустить с помощью команды snap restart <snap name> .
Все службы, необходимые для работы снепов, будут перезагружены по умолчанию:
Чтобы запустить ранее остановленную службу, используйте следующую команду:
Чтобы остановить запущенную службу, используйте следующую команду:
Конфигурации snap set и get
Некоторые снепы, например, работающие в фоновом режиме, выставляют параметры конфигурации, которые можно изменить.
Команды для просмотра и изменения этих параметров конфигураций — snap get и snap set .
Выставленные параметры конфигурации можно посмотреть с помощью установленного снепа. Введите команду snap get <package> :
Чтобы изменить параметры конфигурации, задайте команду «snap set»:
Скачивание и установка snap-приложений offline
Установить snap-приложения можно и без подключения к интернету. Для этого необходимо скачать файлы snap-приложений/пакетов, задав следующую команду:
Эта команда загрузит .assert и .snap файл. Скопируйте их на другую Linux/Ubuntu систему, которая не имеет подключения к интернету. Затем установите загруженный файл с помощью следующей команды:
Заключение
Хотя данная система все еще разрабатывается, и доступно не так много snap-приложений/пакетов, тем не менее, она является одной из лучших систем управления ПО. Snap становится все популярнее, особенно благодаря таким настойчивым методам Canonical.
Но сперва поговорим что же такое LXC и в чем разница от обычных виртуальных машин (KVM) у данного способа. Виртуализация KVM позволяет загружать полные операционные системы разных виды, даже не-Linux-системы. Тем не менее, сложная установка иногда необходимо. Виртуальные машины являются ресурсоемкими, поэтому вы можете запускать только ограниченное количество из них на главной машине. LXC или Linux Containers — это легкие и портативные операционные системы на базе ОС, которые совместно используют ядро базовой операционной системы, но в то же время действуют как изолированные среды с собственной файловой системой, процессами и стеком TCP/IP. Поскольку нет накладных расходов на виртуализацию, они работают намного лучше, чем виртуальные машины. Для себя же я решил использовать виртуализацию LXC, т.к. она менее ресурсопрожорливая.
Вот статья о сравнении двух технологий с диаграммами производительности.
Установка LXC (LXD) на Ubuntu/Debian
Войдите на сервер, используя учетную запись пользователя с доступом sudo .
В свежей Ubuntu версии, по умолчанию, уже встроен lxd. У кого не так то устанавливаем командой:
Затем добавьте пользователя в группу lxd, чтобы он мог выполнять задачи по управлению контейнерами:
Чтобы включить поддержку ZFS в LXD, обновите индекс пакетов и установите пакет zfsutils-linux:
Выбор файловой системы для Storage Pool
Во время инициализации LXD задаёт несколько вопросов, среди которых будет определение типа файловой системы для дефолтного Storage Pool. По умолчанию для него выбирается файловая система BTRFS. Поменять на другую ФС после создания будет невозможно. Для выбора ФС предлагается таблица сравнения возможностей:
Feature | Directory | Btrfs | LVM | ZFS | CEPH |
---|---|---|---|---|---|
Optimized image storage | no | yes | yes | yes | yes |
Optimized instance creation | no | yes | yes | yes | yes |
Optimized snapshot creation | no | yes | yes | yes | yes |
Optimized image transfer | no | yes | no | yes | yes |
Optimized instance transfer | no | yes | no | yes | yes |
Copy on write | no | yes | yes | yes | yes |
Block based | no | no | yes | no | yes |
Instant cloning | no | yes | yes | yes | yes |
Storage driver usable inside a container | yes | yes | no | no | no |
Restore from older snapshots (not latest) | yes | yes | yes | no | yes |
Storage quotas | yes(*) | yes | yes | yes | no |
процесс инициализации Storage Pool
После того как вы решили какое backend хранилище использовать, начинайте процесс инициализации. Делается это командой:
Утилита будет задавать вопросы, на которые вам нужно будет ответить. Первым вопросом утилита спросит: Хотите ли вы использовать кластеризацию LXD?
Вы хотите настроить новый пул хранения данных?
Имя нового пула
какой тип хранилища использовать?
Создать новый пул BTRFS?
Хотите ли вы использовать существующее блочное устройство?
Размер в ГБ нового устройства loop
Вы хотите подключиться к серверу MAAS?
Хотите ли вы создать новый мост локальной сети?
Тут я отвечаю нет, так как у меня настроен сетевой мост и DHCP сервер. Буду использовать его. Но приведу пример по настройке моста:
Хотите ли вы настроить LXD для использования существующего моста или хост-интерфейса?
Имя существующего моста или интерфейса хоста:
Хотите ли вы, чтобы LXD был доступен по сети?
Я отвечаю да, тем самым открывая доступ к контейнерам из локальной сети.
Адрес для привязки LXD к интерфейсу
Пароль доверия для новых клиентов:
Тут придумайте какой нибудь пароль
Повторите Ваш пароль
Хотите ли вы, чтобы устаревшие кэшированные изображения обновлялись автоматически?
Хотите ли вы, чтобы была напечатана предварительная запись YAML «lxd init»?
Список Storage Pool
Следующая команда выводит на экран список всех Storage Pool в LXC хранилище. Но данная команда у вас ничего не покажет, так как мы еще не настроили контейнер ( привожу просто как пример):
Для просмотра списка всех Storage Volume в выбранном Storage Pool служит команда lxc storage volume list :
Увеличение размера Storage Pool
После создания Storage Pool, при необходимости, его можно расширить. Для Storage Pool основанном на файловой системе BTRFS выполните следующие команды:
Выбор Storage Pool при создании контейнера
Удаление Storage Pool
Если выдает ошибку «Error: Storage pool «default» has profiles using it: default«, то делаем так:
Удаление bridge LXD
После удаление Storadge Pool необходимо удалить созданный сетевой мост следующей командой:
Работа с контейнерами LXC
Список контейнеров LXC
После того как Вы прошли все стадии настройки нового пула, вам потребуется скачать сам контейнер. Для просмотра доступных контейнеров с Ubuntu необходимо набрать следующую команду:
Я для установки выбрал Ubuntu Server 20.04 LTS.
Установка контейнера LXC на хост машину
Устанавливаем наш контейнер следующей командой:
- f— это сокращенное название контейнера (Ubuntu 20.04 focal)
- webserver — это имя нашего контейнера.
После загрузки посмотрим список наших контейнеров установленных в системе:
Как видим контейнер запустился с именем webserver и IP-адресом 10.5.5.44
Так как наш контейнер lxd называется webserver, то на него необходимо установить какой либо WEB-сервер.
Установка NGINX в LXC (LXD) контейнер
Подключитесь к контейнеру webserver и настройте в нем веб-сервер.
Чтобы подключиться к контейнеру как root, используйте следующую команду:
Чтобы подключиться к контейнеру от другого пользователя используйте вот такую команду:
Команда sudo --login --user use1 предоставляет оболочку входа для предварительно сконфигурированной учетной записи user1 внутри контейнера.
В контейнере командная строка выглядит так:
Установите Nginx в этом контейнере. Для этого обновим индекс пакетов экземпляра Ubuntu внутри контейнера, добавим свежий репозиторий для nginx и установим сам WEB-сервер Nginx:
Затем отредактируйте веб-страницу по умолчанию для этого сайта и добавьте текст, который поможет вам понять, что этот сайт размещен в контейнере webserver. Откройте файл index.nginx-debian.html:
Измените его следующим образом:
Сохраните файл и выйдите из редактора. Выйдите из контейнера и вернитесь на главный сервер:
С помощью curl проверьте, работает ли веб-сервер в контейнере. Вам понадобятся IP-адреса веб-контейнеров, которые были найдены ранее с помощью команды lxd list .
Веб-сервер работает, но получить доступ к нему только через внутренний IP-адрес. Направьте внешние запросы в этот контейнер, чтобы другие пользователи могли получить доступ к веб-сайту.
Остановка и удаление контейнера
В дальнейшем вы можете захотеть остановить контейнер и заменить его.
Чтобы остановить контейнер, используйте:
Чтобы проверить состояние контейнера, введите:
Удалить контейнер можно с помощью этой команды:
Взятие файла из контейнера
Получить файл из контейнера можно командой
или прочесть в выводом на стандартный output
Помещение файла внутрь контейнера
Создание снимка контейнера
Просто создать снимок можно так:
Проверить снимок
Восстановление из снимка
Восстановить состояние контейнера на момент снимка
Копирование контейнеров из снимков LXC
Команда для копирования выглядит следующим образом:
После данного действия остается запустить новый контейнер
Используйте команду lxc help , чтобы просмотреть дополнительные параметры.
Для управления хранилищем в LXD служит команда lxc storage справку по которой можно получить указав ключ — lxc storage --help
Удалить снимок контейнера LXD
Дополнительно
Про CPU
Чтобы ограничить контейнер любыми 2 процессорами:
Данная команда сработает на лету, чтобы в этом убедится посмотрим применилось ли наше ограничение
На определенных ядрах процессора, скажем, на втором и четвертом команда примет вид:
Более сложные закрепление с помощью диапазонов:
Чтобы ограничить процессорное время контейнера до 10% от общего числа, набираем вот такую команду:
Про память
Что бы ограничить выделяемую контейнеру память, необходимо набрать следующую команду:
Смотрим инфо про память:
Для отключения файла подкачки swap
Если вы хотите монтировать директорий с привилегиями пользователя хост машины, то на эту тему написана статья вот ссылка
Если есть вопросы, то пишем в комментариях.
Также можете вступить в Телеграм канал, ВК или подписаться на Twitter. Ссылки в шапки страницы.
Заранее всем спасибо.
Читайте также: