Criação de um modelo personalizado, baseado em algum modelo LXC existente após executar a instância pelo menos uma vez

Criação de um modelo personalizado, baseado em algum modelo LXC existente após executar a instância pelo menos uma vez

(Por favor, note queessa questãoé sobre LXC 1.x, enquantoEsteé sobre LXC 2.x/LXD)

Eu vasculhei a web em busca de uma resposta para essa pergunta, mas não consegui encontrar nenhuma resposta razoavelmente não hackeada.

O que estou procurando é uma abordagem para moldar um modelo existente da maneira que eu gostaria. Em particular, o que procuro é personalizar a imagem de nuvem upstream do Ubuntu, fazendo várias alterações em seu FS raiz e adicionando/alterando configuração.

lxc launch ubuntu:lts CONTAINERPortanto , minha abordagem atual é lxc exec CONTAINER -- ...executar um script de minha autoria (depois de colocá-lo no contêiner) para executar minhas personalizações.

O que obtenho com essa abordagem é um contêiner razoavelmente personalizado. Infelizmente, há um problema. O contêiner neste ponto foi preparado cloud-inite é uma instância de contêiner, não uma imagem/modelo.

Então é aqui que estou perdido agora. O que eu precisaria é transformar meu contêiner novamente em uma imagem (deve ser possível usando lxc publish) e desfazer as alterações feitas nele cloud-initou pelo menos "cock" cloud-initnovamente para que seja acionado na próxima vez que a imagem for usada como fonte para lxc initou lxc launch. Alternativamente, talvez haja uma maneira de desativar completamente cloud-initquando eu lxc launchsair da imagem upstream?

Existe uma maneira autorizada? Embora eu tenha examinado todos os tipos de documentação, incluindo oDocumentação Markdown no repositório LXDbem como a série de blogs de Stéphane Graber (líder do projeto LXD),especialmente [5/12], não consegui encontrar uma abordagem adequada. Talvez eu tenha perdido (ou seja, ficarei feliz em ler mais documentação se você souber alguma que descreva o que preciso).

A versão LXC usada é 2.20 (ou seja, estou usando o frontend LXD).

Responder1

No linkpágina [5/12]por Stéphane Graber, você pode encontrar uma segunda abordagem:

Construindo manualmente uma imagem

Construir sua própria imagem também é bastante simples.

  1. Gere um sistema de arquivos contêiner. Isso depende inteiramente da distribuição que você está usando. Para Ubuntu e Debian, seria usando debootstrap.
  2. Configure tudo o que for necessário para que a distribuição funcione corretamente em um contêiner (se algo for necessário).
  3. Faça um tarball desse sistema de arquivos contêiner e, opcionalmente, compacte-o.
  4. Escreva um novo arquivo metadata.yaml baseado no descrito acima.
  5. Crie outro tarball contendo esse arquivo metadata.yaml.
  6. Importe esses dois tarballs como uma imagem LXD com:

Dessa forma, você não precisa iniciar o contêiner antes de publicar a imagem. Você pode começar com uma imagem 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

Agora você pode ajustar arquivos ou até mesmo fazer chroot no diretório squash. Então você pode tar os dois diretórios e importar a imagem ajustada com:

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

Responder2

A principal ferramenta para construção lxd/ lxcimagens éConstrutor de distribuição

A forma moderna de configurar imagens é comnuvem-init


Para personalizar imagens LXD/LXC, escrevi:

Uma interface de console python para o Distrobuilder (que incorpora ambos)

Menu Distrobuilder para LXD e LXC


Segue ummetodologia semelhantepara Hashicorp Packer e cria modelos em camadas.

  1. Crie uma baseimagem que substitua um standardmodelo e inclua suas shelle outras personalizações
  2. Crie uma customsubstituição de imagem com seus serviços da web, etc., que substitua sua baseimagem (ou seja, use o basemodelo de imagem como SOURCEmodelo ao gerar ummodelo personalizadocom sua configuração de substituição de serviço personalizada/cloud-init)

Eu uso dbmenupara construir contêineres LXD sem privilégios e adicionei (e pacote) um exemplo de configuração para criar:

  • Imagens Alpine Linux / Ubuntu basecom algumas personalizações
  • Ambiente de compilação Alpine Linux com alpine-sdk(e cloud-initsendo removido na primeira inicialização)
  • Contêiner Ubuntu que instala o Gitlab na primeira inicialização (via cloud-init)

Eu também uso dbmenupara criar uma imagem do Ubuntu adequada para executar rootlesspodman / docker dentro lxd(no momento da escrita ainda não adicionado aoexemplos)


  • OLeia-meestá bem completo agora

  • LXD do Ubuntu e o novoincusfork são suportados para construção de imagens

  • Veja odependênciasnecessário por dbmenu. EmOutubro de 2023você precisa da gitversão mais recente distrobuilderpara criar o formato de modelo mais recente

  • Nos bastidores dbmenuestá o uso de Mike Farah yqpara mesclar os yamlmodelos ( yq& distrobuildersão ambos escritos, Goentão ambos usam a mesma yamlbiblioteca subjacente)

  • Usar PyYamlpara mesclar foi problemático - ele lê e grava yamla configuração muito rapidamente yaml.CSafeLoaderpara leitura

  • dbmenua instalação é tão simples quanto:

  • pipx install distrobuilder-menu(pypi - versão mais recente)

  • pipx install git+https://github.com/itoffshore/distrobuilder-menu.git(github mais recente dev/lançamento)

informação relacionada