Crear una plantilla personalizada, basada en alguna plantilla LXC existente después de ejecutar la instancia al menos una vez

Crear una plantilla personalizada, basada en alguna plantilla LXC existente después de ejecutar la instancia al menos una vez

(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 CONTAINERy 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-inity 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-inito al menos "martillar" cloud-initnuevamente para que se active la próxima vez que la imagen se use como fuente para lxc inito lxc launch. Alternativamente, ¿tal vez haya una manera de deshabilitarlo completamente cloud-initcuando vengo lxc launchde 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.

  1. 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.
  2. Configure todo lo que sea necesario para que la distribución funcione correctamente en un contenedor (si es necesario).
  3. Haga un tarball de ese sistema de archivos contenedor y, opcionalmente, comprímalo.
  4. Escriba un nuevo archivo metadata.yaml basado en el descrito anteriormente.
  5. Cree otro tarball que contenga ese archivo metadata.yaml.
  6. 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/ lxcimá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)

Menú Distrobuilder para LXD y LXC


Sigue unmetodología similara Hashicorp Packer y crea plantillas en capas.

  1. Cree una baseimagen que anule una standardplantilla e incluya sus shellpersonalizaciones y otras personalizaciones
  2. Cree una customanulación de imagen con sus servicios web, etc. que anule su baseimagen (es decir, utilice la baseplantilla de imagen como SOURCEplantilla al generar unaplantilla personalizadacon su anulación de servicio personalizado/configuración de inicio de nube)

Lo uso dbmenupara construir contenedores LXD sin privilegios y he agregado (y paquete) una configuración de ejemplo para crear:

  • Imágenes de Alpine Linux/Ubuntu basecon algunas personalizaciones
  • Entorno de compilación de Alpine Linux con alpine-sdk(y cloud-initeliminado en el primer arranque)
  • Contenedor de Ubuntu que instala Gitlab en el primer arranque (a través de cloud-init)

También utilizo dbmenupara crear una imagen de Ubuntu adecuada para ejecutar rootlesspodman/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 nuevoincusLas bifurcaciones son compatibles para crear imágenes.

  • Ver eldependenciasnecesitado por dbmenu. Enoctubre de 2023necesita la última gitversión de distrobuilderpara crear el último formato de plantilla

  • Debajo del capó dbmenuse usa Mike Farah yqpara fusionar las yamlplantillas ( yqy distrobuilderambas están escritas, Gopor lo que ambas usan la misma yamlbiblioteca subyacente)

  • Usar PyYamlpara fusionar fue problemático: lee y escribe yamlla configuración muy rápido yaml.CSafeLoaderpara leer

  • dbmenuLa 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 reciente dev/lanzamiento)

información relacionada