(Tenga en cuenta queesta preguntase trata de LXC 1.x, mientras queÉstese trata de LXC 2.x/LXD)
Busqué en la web una respuesta a esta, pero no pude encontrar ninguna respuesta razonablemente no pirateada.
Lo que estoy buscando es un enfoque para diseñar una plantilla existente de la manera que me gustaría. En particular, lo que busco es personalizar la imagen de nube ascendente de Ubuntu realizando varios cambios en su FS raíz y agregando/cambiando la configuración.
Entonces, mi enfoque actual es ejecutar lxc launch ubuntu:lts CONTAINER
y luego lxc exec CONTAINER -- ...
ejecutar un script que escribí (después de insertarlo en el contenedor) para realizar mis personalizaciones.
Lo que obtengo con este enfoque es un contenedor razonablemente personalizado. Por desgracia, hay un problema. El contenedor en este punto ha sido preparado cloud-init
y es una instancia de contenedor, no una imagen/plantilla.
Entonces aquí es donde estoy perdido ahora. Lo que necesitaría es volver a convertir mi contenedor en una imagen (debería ser factible usando lxc publish
) y deshacer los cambios realizados en él cloud-init
o al menos "martillar" cloud-init
nuevamente para que se active la próxima vez que la imagen se use como fuente para lxc init
o lxc launch
. Alternativamente, ¿tal vez haya una manera de deshabilitarlo completamente cloud-init
cuando vengo lxc launch
de la imagen ascendente?
¿Existe una forma autorizada? Aunque revisé todo tipo de documentación, incluida laDocumentación de Markdown en el repositorio LXDasí como la serie de blogs de Stéphane Graber (líder del proyecto LXD),especialmente [5/12], no pude encontrar un enfoque adecuado. Quizás me lo perdí (es decir, estaré encantado de leer más documentación si conoce alguna que describa lo que necesito).
La versión de LXC utilizada es 2.20 (es decir, estoy usando la interfaz LXD).
Respuesta1
en el vinculadopágina [5/12]de Stéphane Graber, se puede encontrar un segundo enfoque:
Construyendo manualmente una imagen
Crear tu propia imagen también es bastante sencillo.
- Generar un sistema de archivos contenedor. Esto depende completamente de la distribución que estés utilizando. Para Ubuntu y Debian, sería mediante el uso de debootstrap.
- Configure todo lo que sea necesario para que la distribución funcione correctamente en un contenedor (si es necesario).
- Haga un tarball de ese sistema de archivos contenedor y, opcionalmente, comprímalo.
- Escriba un nuevo archivo metadata.yaml basado en el descrito anteriormente.
- Cree otro tarball que contenga ese archivo metadata.yaml.
- Importe esos dos archivos comprimidos como una imagen LXD con:
De esta manera, no es necesario iniciar el contenedor antes de publicar la imagen. Puedes comenzar con una imagen existente:
$ 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
Ahora puedes ajustar archivos o incluso hacer chroot en el directorio de squash. Luego puedes tar ambos directorios e importar la imagen ajustada con:
lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image
Respuesta2
La herramienta principal para construir lxd
/ lxc
imágenes esDistrobuilder
La forma moderna de configurar imágenes es coninicio de nube
Para personalizar imágenes LXD/LXC escribí:
Una interfaz de consola Python para Distrobuilder (que incorpora ambos)
Sigue unmetodología similara Hashicorp Packer y crea plantillas en capas.
- Cree una
base
imagen que anule unastandard
plantilla e incluya susshell
personalizaciones y otras personalizaciones - Cree una
custom
anulación de imagen con sus servicios web, etc. que anule subase
imagen (es decir, utilice labase
plantilla de imagen comoSOURCE
plantilla al generar unaplantilla personalizadacon su anulación de servicio personalizado/configuración de inicio de nube)
Lo uso dbmenu
para construir contenedores LXD sin privilegios y he agregado (y paquete) una configuración de ejemplo para crear:
- Imágenes de Alpine Linux/Ubuntu
base
con algunas personalizaciones - Entorno de compilación de Alpine Linux con
alpine-sdk
(ycloud-init
eliminado en el primer arranque) - Contenedor de Ubuntu que instala Gitlab en el primer arranque (a través de cloud-init)
También utilizo dbmenu
para crear una imagen de Ubuntu adecuada para ejecutar rootless
podman/docker dentro lxd
(en el momento de escribir este artículo aún no se ha agregado alejemplos)
ElLÉAMEya esta bastante completo
LXD de Ubuntu y lo nuevo
incus
Las bifurcaciones son compatibles para crear imágenes.Ver eldependenciasnecesitado por
dbmenu
. Enoctubre de 2023necesita la últimagit
versión dedistrobuilder
para crear el último formato de plantillaDebajo del capó
dbmenu
se usa Mike Farahyq
para fusionar lasyaml
plantillas (yq
ydistrobuilder
ambas están escritas,Go
por lo que ambas usan la mismayaml
biblioteca subyacente)Usar
PyYaml
para fusionar fue problemático: lee y escribeyaml
la configuración muy rápidoyaml.CSafeLoader
para leerdbmenu
La instalación es tan simple como:pipx install distrobuilder-menu
(pypi - última versión)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(github más recientedev
/lanzamiento)