Como criar um contêiner linux que herda o sistema de arquivos raiz de hosts, possivelmente com zfs?

3

O que

Espero que a pergunta no título faça sentido. Eu estou querendo criar uma baixa sobrecarga (portanto, nenhuma máquina virtual) cópia do sistema operacional do host, com ele em execução em um contêiner Linux.

Estou pensando em usar o zfs de alguma forma para criar um instantâneo dos hosts rootfs e, em seguida, alimentar isso no lxc de alguma forma. Dessa forma, quaisquer alterações no contêiner são restritas ao contêiner por meio da funcionalidade de cópia na gravação do ZFS, e quaisquer alterações futuras nos hosts rootfs não se propagam para o contêiner.

Há algum problema em potencial que eu precise levar em conta, como diretórios recursivos que causam estragos ou qualquer outra coisa?

Por que

O raciocínio para isso é para que eu possa rapidamente usar o host como um modelo e brincar com, por exemplo, a instalação de novas ferramentas de construção que poluem o rootfs sem se preocupar com o efeito do host e sem precisar gastar muito espaço em disco copiando os hosts rootfs. Além disso, passei uma quantidade razoável de tempo configurando o host da maneira que eu gosto e não quero ter que passar alguns dias novamente criando um modelo do processo (embora eu deva, escrever tudo é uma boa idéia , automatizar é ainda melhor). Como isso seria em um contêiner do Linux, posso ter várias instâncias em execução ao mesmo tempo.

    
por hak8or 25.06.2018 / 04:21

1 resposta

3

Eu desenhei um procedimento manual que pode realizar isso.

Pré-requisitos

Esses procedimentos fazem as seguintes suposições:

  • Seu shell é /bin/bash .
  • Você é raiz.
  • Você implantou o sistema operacional no pool do ZFS rpool e também deseja o contêiner LXD no mesmo pool do ZFS ( rpool ).
  • Seu host rootfs está instalado no conjunto de dados rpool/ROOT/os ZFS.
  • Você tirou um instantâneo do seu host rootfs e o chamou rpool/ROOT/os@20180516T091126CDT .
  • Você está executando o pacote Snappy do LXD.
  • Você tem um lxc storage chamado rpool usando o driver zfs na origem rpool/lxd .
  • Você deseja criar um contêiner sem privilégios denominado demo .

Você terá que ajustar o procedimento para cada desvio dos requisitos acima.

Instruções

  1. Crie um contêiner LXC usando uma imagem semelhante ao seu sistema operacional host:

    root@node51 [~]# lxc launch images:ubuntu/18.04 demo -s rpool
    Creating demo
    Starting demo
    
  2. Pare o contêiner:

    root@node51 [~]# lxc stop demo
    
  3. Monte o volume de armazenamento do LXC para que possamos buscar alguns metadados:

    root@node51 [~]# zfs mount rpool/lxd/containers/demo
    
  4. Copie os metadados em algum lugar (como /tmp/demo/ ):

    root@node51 [~]# rsync -avHXShPs --exclude rootfs/ /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ /tmp/demo/
    sending incremental file list
    created directory /tmp/demo
    ./
    backup.yaml
              2.05K 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=4/6)
    metadata.yaml
                529 100%  516.60kB/s    0:00:00 (xfr#2, to-chk=3/6)
    templates/
    templates/hostname.tpl
                 21 100%   20.51kB/s    0:00:00 (xfr#3, to-chk=1/6)
    templates/hosts.tpl
                140 100%  136.72kB/s    0:00:00 (xfr#4, to-chk=0/6)
    
    sent 3.12K bytes  received 135 bytes  6.50K bytes/sec
    total size is 2.74K  speedup is 0.84
    
  5. Exclua o conjunto de dados do ZFS que o LXC criou:

    root@node51 [~]# zfs destroy rpool/lxd/containers/demo
    
  6. Clone o conjunto de dados do ZFS com o mesmo nome que o LXC esperaria:

    root@node51 [~]# zfs clone rpool/ROOT/os@20180516T091126CDT rpool/lxd/containers/demo
    
  7. Defina o ponto de montagem para o ponto de montagem original:

    root@node51 [~]# zfs set mountpoint=/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo rpool/lxd/containers/demo
    
  8. Crie um diretório rootfs para os novos dados do contêiner:

    root@node51 [~]# mkdir -v /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/
    mkdir: created directory '/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/'
    
  9. Estenda a funcionalidade globbing do seu shell para garantir que o próximo mv receba todos os dados do sistema de arquivos:

    root@node51 [~]# shopt -s extglob ; shopt -s dotglob
    
  10. Encurte um pouco os comandos programados em cd no conjunto de dados do contêiner:

    root@node51 [~]# cd /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/
    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]#
    
  11. Mova todos os dados do contêiner para a pasta rootfs/ :

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv !(rootfs) rootfs/
    
  12. Crie algumas pastas que são necessárias para o contêiner inicializar:

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mkdir rootfs/{dev,sys,proc}
    
  13. Mova os metadados dos quais foi feito backup anteriormente para o conjunto de dados do contêiner:

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv /tmp/demo/* .
    
  14. Remova o diretório temporário vazio do backup de metadados:

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# rm -rfv /tmp/demo
    removed directory '/tmp/demo'
    
  15. Retorne ao seu diretório anterior para que você possa desmontar o conjunto de dados do contêiner:

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# cd -
    /root
    
  16. Desmonte o conjunto de dados do contêiner para que o LXC possa aceitá-lo:

    root@node51 [~]# zfs umount rpool/lxd/containers/demo
    
  17. Para informar ao LXC para converter os arquivos do contêiner para unprivileged no próximo início, execute

    lxc config edit demo
    

    e altere a linha que lê

    volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
    

    para

    volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1,"Nsid":0,"Maprange":1000000000}]'
    
  18. Inicie o contêiner.
    Isso levará um tempo, pois todos os arquivos no rootfs do contêiner estão sendo convertidos em sem privilégios. Não há indicador de progresso.

    root@node51 [~]# lxc start demo
    
  19. Digite o container:

    root@node51 [~]# lxc exec demo -- bash
    

    A partir daqui, você pode configurar a rede, a seqüência de inicialização do seu systemd e / ou outras coisas necessárias para ativar e desativar esse clone do contêiner LXC do seu host.

por 25.06.2018 / 05:32