Como compartilho um diretório entre um contêiner LXC e o host?

14

Como posso compartilhar uma pasta entre o sistema host (ubuntu 14.04) e um contêiner ubuntu lxc?

Eu tentei montar a pasta no host:

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

mas não consigo ver nenhum arquivo.

O mesmo vale para:

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

Preciso alterar as permissões da pasta de compartilhamento?

Máx.
fonte

Respostas:

12

Encontrei um artigo no wiki do openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Eu segui os passos e ele funciona agora.

Crie diretório de host:

mkdir /media/data/share && chmod 7777 /media/data/share

Crie o diretório no contêiner lxc:

mkdir /share

Edite o arquivo de configuração lxc no host:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0
Máx.
fonte
Existe uma razão para definir essa entrada de montagem como somente leitura? É uma boa prática de segurança evitar um contêiner para gravar dados em um sistema de arquivos compartilhado?
Jgomo3
1
Trabalhou para mim. Observe que o caminho relativo usado shareno lxc.mount.entryé crítico.
1/16
1
Você não precisa criar o ponto de montagem, se adicionar ', create = dir' após 'bind'. Também removi a parte 'ro', e parece estar funcionando muito bem.
Sam Bull
12

De acordo com a documentação do LXC, você pode fazer isso através de um contêiner privilegiado:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu
Jorge Castro
fonte
Observe que essa é a documentação do LXD, não o LXC. Se você não instalou o LXD, o comando lxc não funcionará.
Sam Bull
@ SamBull bem, isso é auto-infligido pela equipe LXC / LXD. O LXC pode ser usado para se referir ao liblxc (a biblioteca subjacente) ou ao cliente LXD (nomeado lxd) conforme usado nesta resposta ou ao LXC (o software e o conjunto de ferramentas "antigo" com as lxc-*ferramentas nomeadas)) ou ao projeto (onde o LXC é a abreviação de LinuX Containers). É a razão pela qual eu fiz essa pergunta na meta do Unix.SE.
0xC0000022L
4

Abaixo está o que eu fiz para montar um diretório do meu host no contêiner. Isso é mais complicado do que parece, porque gostaríamos de alcançar

  • Dentro do contêiner, devemos poder escrever no diretório
  • Fora do contêiner, poderemos gravar nos arquivos e diretórios criados dentro do contêiner.

Depois de ler vários artigos on-line (o mais útil é esse problema do github ), aqui está como eu resolvo isso. O truque é mapear o uid e o gid do usuário host para o uid e o gid do usuário dentro do contêiner.

Suponha que eu seja montado /home/breakds/projectsexatamente no mesmo local no contêiner. O diretório externo é de propriedade do usuário breakds, cujos uid e gid são 1000.

Criei um usuário no contêiner chamado debian, cujo uid e gid também eram 1000(porque é o primeiro usuário não root). Depois, criarei uma profie (lxc) no host

lxc profile edit breakds

E abaixo está o conteúdo do perfil (acredito que esteja no formato yaml):

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

Em seguida, aplique esse perfil permanentemente ao contêiner:

$ lxc profile apply <my container> breakds

Isso deve fazer o truque.

NOTA : Observe que, antes de mudar para este perfil, verifique se todos os diretórios ou arquivos cujo proprietário / grupo é debian devem ser excluídos (e provavelmente recriados após a troca). Isso ocorre porque após o mapeamento uid e gid, sua propriedade se tornará inválida. Inicialmente, pensei que, como estou apenas mapeando de 1000 a 1000, tudo deveria ficar bem, mas acho que perdi alguma coisa aqui e seria ótimo se alguém pudesse aconselhar sobre como resolver isso sem o hack.

BreakDS
fonte
Mas você sempre pode chownhospedar.
iBug 31/08/19
1

Você também pode fazer isso sem o LXD editando o arquivo de configuração do LXC diretamente:

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

Você também deve garantir que a conta do usuário do contêiner tenha permissão para mapear para o uid / gid 1000 no host editando / etc / subuid e / etc / subgid:

containeruser:165536:65536
containeruser:1000:1
apokluda
fonte
que sistema processa / criou / etc / subuid? Openwrt não tem isso.
mcr