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
chamadorpool
usando o driverzfs
na 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
mv
receba todos os dados do sistema de arquivos:root@node51 [~]# shopt -s extglob ; shopt -s dotglob
-
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]#
-
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 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}]'
-
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 -- 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.