Incluindo um Diretório de Host Compartilhado em um Contêiner LXC / LXD

19

Eu tenho experimentado o LXC / LXD no Ubuntu 14.04 e está tudo funcionando muito bem. Eu só preciso descobrir como fazer com que os diretórios compartilhados funcionem entre minha máquina host e um contêiner para que eu possa abandonar o Virtualbox de uma vez por todas.

Eu já vi esta página: https://wiki.gentoo.org/wiki/LXD

Que fornece instruções, mas continuo recebendo erros.

Alguém sabe de alguma instrução simples e clara para fazer isso funcionar? Qualquer ajuda muito apreciada.

user47227
fonte
2
Eu consegui montar um diretório do host usando: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Mas, olhando para o diretório no contêiner, o proprietário e o grupo dos arquivos estão configurados para 'ninguém' e 'nogroup' e a montagem é somente leitura.
user47227
Você poderia adicionar um pouco mais de detalhes? O que exatamente você fez, o que você queria alcançar e o que aconteceu? Você encontrou alguma mensagem de aviso ou erro? Reproduza-os na íntegra na sua pergunta. Você pode selecionar, copiar e colar o conteúdo do terminal e a maioria das mensagens de diálogo no Ubuntu. (veja Como faço para pedir uma boa pergunta? )
David Foerster
Supondo que você esteja usando um contêiner sem privilégios e que o mapeamento UID / GID seja o problema, consulte esta seção de um artigo sobre os mapeamentos de usuários com o LXD. No entanto, isso provavelmente foi adicionado ao modo LXD depois que você fez sua pergunta.
0xC0000022L 23/11
Não sei qual versão adicionou isso (estou na 2.18), mas se possível, você também pode usar o lxc filepara transferir arquivos entre host e contêiner, usando pushe pull.
código é o seguinte

Respostas:

21

As instruções em https://wiki.gentoo.org/wiki/LXD mencionadas estão corretas, mas podem precisar de mais explicações.

No host, você primeiro verifica a propriedade do diretório em que os dados do contêiner estão armazenados. Corre

sudo ls -l /var/lib/lxd/containers

e verifique o proprietário do contêiner com o qual você deseja compartilhar o diretório. No meu caso, o uide gidambos eram 100000.

Em seguida, use-os para alterar a propriedade do diretório que você deseja compartilhar:

sudo chown 100000:100000 /tmp/share_on_host

Compartilhe o diretório com o contêiner da maneira que você indicou em seu comentário:

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

Agora, no contêiner, você verá que o diretório /tmp/share_on_guest(eu não aconselho a montar seu diretório /tmpporque é usado pelo sistema para outras coisas e tem permissões especiais) pertence ao root. A partir daqui, você pode usar chownno contêiner para alterar a propriedade para o apropriado uide gidpara o usuário no contêiner.

Como observação lateral, depois de alterar a propriedade do contêiner para, por exemplo, um usuário com uid33 anos, você verá no host que uidagora existe 100033, o que faz total sentido.

ph0t0nix
fonte
Não tenho certeza se é apenas minha configuração, mas com o LXD v3.0.3 LTS (Ubuntu 18.04 LTS), não encontrei nada além de links simbólicos nos /var/lib/lxd/containersquais foi apontado /var/lib/lxd/storage-pools/lxd/containers(neste caso, o último lxdbit é o nome do meu pool de armazenamento ZFS). Todos os contêineres pareciam ter o mesmo 165536 uid / gid durante a execução e pertencentes a root:rootquando desligados.
deoren 17/03
11
Sei que essa é uma pergunta antiga + resposta, mas no Ubuntu 18.04, não precisei mexer em nenhuma permissão. Basta adicionar a pasta lxc confige ela funcionou como um encanto!
Apache
4

Aqui está uma resposta atualizada para esta pergunta.

Monte a pasta host /var/wwwcomo /var/testno contêiner.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test
Convidado8354542556745
fonte
Bem-vindo ao Ask Ubuntu! Eu recomendo editar esta resposta para expandi-la com detalhes específicos sobre como fazer isso. (Veja também Como faço para escrever uma boa resposta? Para o conselho geral sobre que tipos de respostas são consideradas mais valiosas sobre AskUbuntu.)
David Foerster
3

Você pode atribuir dispositivos adicionais ao contêiner e podem ser pastas acessíveis pelo host.

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

Observe que <device>é apenas um nome arbitrário que você atribui, que será usado como um ID para o gerenciamento subsequente do dispositivo.

Por exemplo, para montar a pasta do host "./host" como "/ mnt / host" no contêiner ...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

Ainda existe um problema : se você deseja que essa pasta seja gravável pelo host e pelo contêiner, a propriedade e as permissões precisam ser configuradas de acordo. Isso é complicado pelo modo padrão do LXD, que virtualiza os intervalos numéricos para valores de usuário e grupo id. Porém, existe uma solução fácil : ignore essa virtualização configurando o contêiner para executar com privilégios equivalentes a host ...

lxc config set <container> security.privileged true

As implicações completas de segurança de host dessa abordagem não estão claras para mim no momento, mas parecem estar um pouco "contidas" pela virtualização. O risco prático depende de como e por que você usará o contêiner. Veja as notas técnicas em https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers

Observe também que essa abordagem provavelmente funcionará melhor se você normalmente operar no contêiner como um usuário não raiz, como se você se conectar com ...

lxc exec zesty -- su --login ubuntu
nobar
fonte
Há um problema com o logon não raiz: o envé diferente, em particular http_proxy. Um exemplo solução alternativa: sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
Nobar
Em relação a isso http_proxy, acho que a solução mais fácil é provavelmente ativar o IPV4, conforme discutido aqui .
nobar 23/09/17
... seguido por sudo dhclientno contêiner - ou mude manualpara dhcpin 50-cloud-init.cfg. Dicas
legais
11
Essa é uma ideia claramente ruim . A recomendação de mudar para contêineres privilegiados subverte um dos avanços que o LXD trouxe. Embora o LXC 1.x também oferecesse a possibilidade de usar contêineres sem privilégios (e sim, mesmo como root), era um pouco mais complicado resolver os detalhes. Com o LXD, isso agora é coisa do passado. Além disso, o que há de tão complicado em definir ACLs em alguma pasta para permitir ao UID do host o acesso necessário ou para usar o método descrito aqui ? Sim, mapear UIDs / GIDs não é o único caminho!
0xC0000022L
1

Com base na excelente resposta de ph0t0nix , proponho a seguinte abordagem passo a passo para o meu servidor Ubuntu 18.04:

  1. No host, determine o UID do proprietário do rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. No contêiner, determine o UID do ubuntu (ou seja, usuário no contêiner):

    id -u ubuntu    1000
  3. Crie uma pasta compartilhada no host e adicione-a ao contêiner:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Ajuste no UID do host da pasta compartilhada (UID = host UID + convidado UID):

    sudo chown 101000:101000 /home/share_on_host
  5. Convidado (usuário ubuntu) agora tem acesso à pasta compartilhada e pode ajustar dentro do contêiner o acesso à pasta compartilhada usando chmod.

joerg
fonte
0

Agora tenho uma solução segura e funcional para esse problema, usando perfis LXD para lidar com o mapeamento entre UID e GID no contêiner e no host.

Uma essência muito útil pode ser encontrada aqui:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8

user47227
fonte
5
Observe que tornar as coisas graváveis ​​no mundo geralmente é uma má ideia do ponto de vista da segurança. Você provavelmente deve usar as ACLs POSIX no caminho do host, concedendo acesso ao usuário do contêiner adicionando uma ACL específica para esse uid e, em seguida, para qualquer outro usuário do host que também precise de acesso de gravação.
stgraber
11
@stgraber, embora eu concorde com o que você disse, não tenho idéia de como configurar isso. Alguns links seriam úteis.
S3v3n
Por favor, não recomende as 0777permissões aka "por favor, hackear meu sistema e destruir meus dados" sem motivo aparente! Quase nunca há uma razão para isso, porque isso pode ser evitado com modificações mais sensatas, como alterar a propriedade (do grupo). -1
David Foerster
Entendo o seu ponto de vista, mas só o usei como solução temporária em uma única máquina de desenvolvimento de usuário, na ausência de outra maneira de fazê-la funcionar. Desde então, descobri que usar perfis é a maneira de lidar com isso, veja minha resposta editada acima!
user47227
11
O que há de tão difícil em usar ACLs ou o método descrito aqui ?
0xC0000022L