Создание пользовательского шаблона на основе существующего шаблона LXC после запуска экземпляра хотя бы один раз

Создание пользовательского шаблона на основе существующего шаблона LXC после запуска экземпляра хотя бы один раз

(Обратите внимание, чтоэтот вопроспримерно LXC 1.x, тогда какВот этотпримерно LXC 2.x/LXD)

Я поискал в Интернете ответ на этот вопрос, но не смог найти ни одного разумного и не хакерского ответа.

Я ищу подход к оформлению существующего шаблона так, как мне бы хотелось. В частности, я хочу настроить облачный образ Ubuntu upstream, внеся различные изменения в его корневую файловую систему и добавив/изменив конфигурацию.

Поэтому мой текущий подход заключается в том, lxc launch ubuntu:lts CONTAINERчтобы lxc exec CONTAINER -- ...запустить созданный мной скрипт (после помещения его в контейнер) и выполнить мои настройки.

То, что я получаю, используя этот подход, — это разумно настроенный контейнер. Увы, есть подвох. Контейнер на этом этапе был подготовлен cloud-initи является экземпляром контейнера, а не изображением/шаблоном.

Вот тут-то я и в растерянности. Мне нужно будет превратить мой контейнер обратно в изображение (это должно быть возможно с помощью lxc publish) и либо отменить изменения, внесенные в него, cloud-initлибо хотя бы cloud-initснова «взвести», чтобы он сработал в следующий раз, когда изображение будет использовано в качестве источника для lxc initили lxc launch. Или, может быть, есть способ полностью отключить его, cloud-initкогда я lxc launchиз исходного образа?

Есть ли авторитетный способ? Хотя я просмотрел все виды документации, включаяДокументация Markdown в репозитории LXDа также серию блогов Стефана Грабера (руководителя проекта LXD),особенно [5/12], я не смог найти подходящий подход. Возможно, я просто пропустил его (то есть, я буду рад прочитать больше документации, если вы знаете какую-то, описывающую то, что мне нужно).

Используемая версия LXC — 2.20 (т.е. я использую интерфейс LXD).

решение1

На связанномстраница [5/12]Стефана Грабера вы можете найти второй подход:

Создание образа вручную

Создать свой собственный имидж также довольно просто.

  1. Сгенерируйте файловую систему контейнера. Это полностью зависит от используемого вами дистрибутива. Для Ubuntu и Debian это будет сделано с помощью debootstrap.
  2. Настройте все необходимое для корректной работы дистрибутива в контейнере (если что-то необходимо).
  3. Создайте архив этой файловой системы контейнера, при необходимости сожмите его.
  4. Напишите новый файл metadata.yaml на основе описанного выше.
  5. Создайте еще один tarball, содержащий этот файл metadata.yaml.
  6. Импортируйте эти два tar-архива как образ LXD с помощью:

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

$ lxc image copy ubuntu:16.04/amd64 local: --alias ubuntu
$ mkdir export-directory
$ lxc image export ubuntu export-directory
$ cd export-directory
$ ls 
5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.squashfs
meta-5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.tar.xz

$ mkdir meta squashfs
$ tar -xf *.tar.xz -D meta
$ sudo unsquashfs -f -d squash/ *squashfs

Теперь вы можете настроить файлы или даже chroot в каталог squash. Затем вы можете tar-файлы обоих каталогов и импортировать настроенный образ с помощью:

lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image

решение2

Основной инструмент для создания lxdизображений lxcDistrobuilder

Современный способ настройки изображений —облако-init


Для настройки изображений LXD/LXC я написал:

Консольный интерфейс Python для Distrobuilder (который объединяет оба)

Меню Distrobuilder для LXD и LXC


Это следует зааналогичная методологияв Hashicorp Packer и создает шаблоны по слоям.

  1. Создайте baseизображение, которое переопределяет standardшаблон и включает ваши shellи другие настройки.
  2. Создайте customпереопределение изображения с помощью ваших веб-сервисов и т. д., которое переопределяет ваше baseизображение (т. е. используйте baseшаблон изображения в качестве SOURCEшаблона при созданиипользовательский шаблонс вашим пользовательским переопределением сервиса / конфигурацией cloud-init)

Я использую dbmenuдля сборки непривилегированных контейнеров LXD и добавил (и упаковываю) пример конфигурации для создания:

  • Образы Alpine Linux / Ubuntu baseс некоторыми настройками
  • Среда сборки Alpine Linux с alpine-sdk(& с cloud-initудалением при первой загрузке)
  • Контейнер Ubuntu, который устанавливает Gitlab при первой загрузке (через cloud-init)

Я также использую его dbmenuдля создания образа Ubuntu, подходящего для запуска rootlesspodman / docker внутри lxd(на момент написания статьи еще не добавлен вПримеры)


  • TheПРОЧТИ МЕНЯтеперь вполне завершен

  • LXD Ubuntu и новыйincusfork оба поддерживаются для создания образов

  • Смотритезависимостинеобходимо dbmenu. Воктябрь 2023 г.вам нужна последняя gitверсия distrobuilderдля создания последнего формата шаблона

  • Под капотом dbmenuиспользуется метод Майка Фараха yqдля объединения yamlшаблонов ( оба написаны на yqи , поэтому оба используют одну и ту же базовую библиотеку)distrobuilderGoyaml

  • Использование PyYamlmerge было проблематичным - он считывает и записывает yamlконфигурацию очень быстро с yaml.CSafeLoaderfor reading

  • dbmenuУстановка очень проста:

  • pipx install distrobuilder-menu(pypi - последний релиз)

  • pipx install git+https://github.com/itoffshore/distrobuilder-menu.git(последняя версия github dev/ релиз)

Связанный контент