Eu estava fazendo algo muito semelhante, movendo as VMs do KVM para LXC sem privilégios.
Eu estava usando contêineres de sistema para isso (para que eles possam ser iniciados automaticamente na inicialização), mas com UID / GIDs mapeados (namespaces de usuário).
- edite / etc / subuid, subgid (mapeei o uid / gids 10M-100M para fazer o root e use 100K por container)
- para o primeiro contêiner, use u / gids 10000000-10099999 em / var / lib / lxc / CTNAME / config
- monte o armazenamento do contêiner em / var / lib / lxc / CTNAME / rootfs (ou não faça nada se você não usar volume / conjunto de dados / o que for separado por contêiner)
- chown 10000000: 10000000 / var / lib / lxc / CTNAME / rootfs
- setfacl -m u: 10000000: x / var / lib / lxc (ou simplesmente chmod o + x / var / lib / lxc)
- lxc-usernsexec -m b: 0: 10000000: 100000 - / bin / bash
Agora você está no primeiro namespace de usuário do contêiner. Tudo é o mesmo, mas seu processo acha que é uid é 0, quando na verdade, no namespace host é uid 10000000. Verifique / proc / self / uid_map para ver se o seu uid está mapeado ou não. Você notará que não pode mais ler / root e parece ser de propriedade de nobody / nogroup.
Enquanto no namespace de usuário, eu rsync do host original.
Fora do namespace do usuário, você verá que os arquivos em / var / lib / lxc / CTNAME / rootfs agora são de propriedade não dos esperados (mesmos) uids da instalação de origem, mas 10000000 + remote_uid. É isso que você quer.
É isso. Quando você tiver seus dados sincronizados, remova tudo do arquivo / etc / fstab do contêiner para que ele não tente montar as coisas, e isso deve começar. Pode haver outras coisas para mudar, verifique o que o modelo LXC para a distro conteinerizada faz. Você pode definitivamente remover o kernel, grub, ntp e qualquer pacote de testes de hardware no container (você não precisa nem executá-lo, você pode chroot para o container a partir do namespace do usuário)
Se você não tiver uma VM remota em execução, também poderá montar o armazenamento da VM original no namespace do host e o rsync / SSH novamente no host local. O efeito será o mesmo.
Se você (como parece) simplesmente deseja alterar seu contêiner privilegiado para sem privilégio, é melhor adicionar o mapeamento uid / gid, adicionar um mapeamento como acima à sua configuração de contêiner e, em seguida, fazer algo como:
for i in 'seq 0 65535'; do
find /var/lib/lxc/CTNAME/rootfs -uid $i -exec chown $((10000000+i)) \{\} \;
find /var/lib/lxc/CTNAME/rootfs -gid $i -exec chgrp $((10000000+i)) \{\} \;
done
Isso deve ser tudo o que precisa ser feito, agora você deve ser capaz de executar o container sem privilégios. Este exemplo acima é extremamente ineficiente, o uidshift provavelmente fará um trabalho melhor nisso (mas ainda não o usei).
HTH.