(Обратите внимание, чтоэтот вопроспримерно 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]Стефана Грабера вы можете найти второй подход:
Создание образа вручную
Создать свой собственный имидж также довольно просто.
- Сгенерируйте файловую систему контейнера. Это полностью зависит от используемого вами дистрибутива. Для Ubuntu и Debian это будет сделано с помощью debootstrap.
- Настройте все необходимое для корректной работы дистрибутива в контейнере (если что-то необходимо).
- Создайте архив этой файловой системы контейнера, при необходимости сожмите его.
- Напишите новый файл metadata.yaml на основе описанного выше.
- Создайте еще один tarball, содержащий этот файл metadata.yaml.
- Импортируйте эти два 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
изображений lxc
–Distrobuilder
Современный способ настройки изображений —облако-init
Для настройки изображений LXD/LXC я написал:
Консольный интерфейс Python для Distrobuilder (который объединяет оба)
Это следует зааналогичная методологияв Hashicorp Packer и создает шаблоны по слоям.
- Создайте
base
изображение, которое переопределяетstandard
шаблон и включает вашиshell
и другие настройки. - Создайте
custom
переопределение изображения с помощью ваших веб-сервисов и т. д., которое переопределяет вашеbase
изображение (т. е. используйтеbase
шаблон изображения в качествеSOURCE
шаблона при созданиипользовательский шаблонс вашим пользовательским переопределением сервиса / конфигурацией cloud-init)
Я использую dbmenu
для сборки непривилегированных контейнеров LXD и добавил (и упаковываю) пример конфигурации для создания:
- Образы Alpine Linux / Ubuntu
base
с некоторыми настройками - Среда сборки Alpine Linux с
alpine-sdk
(& сcloud-init
удалением при первой загрузке) - Контейнер Ubuntu, который устанавливает Gitlab при первой загрузке (через cloud-init)
Я также использую его dbmenu
для создания образа Ubuntu, подходящего для запуска rootless
podman / docker внутри lxd
(на момент написания статьи еще не добавлен вПримеры)
TheПРОЧТИ МЕНЯтеперь вполне завершен
LXD Ubuntu и новый
incus
fork оба поддерживаются для создания образовСмотритезависимостинеобходимо
dbmenu
. Воктябрь 2023 г.вам нужна последняяgit
версияdistrobuilder
для создания последнего формата шаблонаПод капотом
dbmenu
используется метод Майка Фарахаyq
для объединенияyaml
шаблонов ( оба написаны наyq
и , поэтому оба используют одну и ту же базовую библиотеку)distrobuilder
Go
yaml
Использование
PyYaml
merge было проблематичным - он считывает и записываетyaml
конфигурацию очень быстро сyaml.CSafeLoader
for readingdbmenu
Установка очень проста:pipx install distrobuilder-menu
(pypi - последний релиз)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(последняя версия githubdev
/ релиз)