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
rpoole também deseja o contêiner LXD no mesmo pool do ZFS (rpool). - Seu host rootfs está instalado no conjunto de dados
rpool/ROOT/osZFS. - 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 storagechamadorpoolusando o driverzfsna origemrpool/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
-
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 -
Pare o contêiner:
root@node51 [~]# lxc stop demo -
Monte o volume de armazenamento do LXC para que possamos buscar alguns metadados:
root@node51 [~]# zfs mount rpool/lxd/containers/demo -
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 -
Exclua o conjunto de dados do ZFS que o LXC criou:
root@node51 [~]# zfs destroy rpool/lxd/containers/demo -
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 -
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 -
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/' -
Estenda a funcionalidade globbing do seu shell para garantir que o próximo
mvreceba todos os dados do sistema de arquivos:root@node51 [~]# shopt -s extglob ; shopt -s dotglob -
Encurte um pouco os comandos programados em
cdno 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]# -
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/ -
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} -
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/* . -
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' -
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 -
Desmonte o conjunto de dados do contêiner para que o LXC possa aceitá-lo:
root@node51 [~]# zfs umount rpool/lxd/containers/demo -
Para informar ao LXC para converter os arquivos do contêiner para unprivileged no próximo início, execute
lxc config edit demoe 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}]' -
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 -
Digite o container:
root@node51 [~]# lxc exec demo -- bashA 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.