Criando um modelo personalizado, com base em algum modelo LXC existente depois de executar a instância pelo menos uma vez

1

(Por favor note que esta questão é sobre o LXC 1.x, enquanto este em> é sobre o LXC 2.x / LXD)

Pesquisei na Web uma resposta para esta, mas não consegui responder com uma resposta razoavelmente não hacky.

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

Portanto, minha abordagem atual é lxc launch ubuntu:lts CONTAINER e, em seguida, uso lxc exec CONTAINER -- ... para executar um script que eu criei (após enviá-lo para o contêiner) para executar minhas personalizações.

O que eu uso com essa abordagem é um contêiner razoavelmente personalizado. Infelizmente, há um problema. O contêiner neste momento foi preparado por cloud-init e é uma instância de contêiner, não uma imagem / modelo.

Então é aí que estou perdido agora. O que eu preciso é transformar meu contêiner de volta em uma imagem (deve ser factível usando lxc publish ) e desfazer as alterações feitas por cloud-init ou pelo menos "galo" cloud-init novamente para acionar a próxima hora em que a imagem é usada como origem para lxc init ou lxc launch . Alternativamente, talvez haja uma maneira de desabilitar completamente o cloud-init quando eu lxc launch da imagem upstream?

Existe uma maneira autoritativa? Mesmo que eu tenha analisado todos os tipos de documentação, incluindo a documentação do Markdown no repositório LXD , bem 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 (isto é, ficarei feliz em ler mais documentação se você souber de alguma coisa que descreva o que eu preciso).

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

    
por 0xC0000022L 27.11.2017 / 16:59

1 resposta

0

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

Manually building an image

Building your own image is also pretty simple.

  1. Generate a container filesystem. This entirely depends on the distribution you’re using. For Ubuntu and Debian, it would be by using debootstrap.
  2. Configure anything that’s needed for the distribution to work properly in a container (if anything is needed).
  3. Make a tarball of that container filesystem, optionally compress it.
  4. Write a new metadata.yaml file based on the one described above.
  5. Create another tarball containing that metadata.yaml file.
  6. Import those two tarballs as a LXD image with:

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é chroot no diretório de 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
    
por 27.11.2017 / 18:11

Tags