LXC: Como montar uma pasta do host no contêiner?

24

Estou tentando montar uma pasta no host em um contêiner LXC.

O host possui uma pasta /mnt/ssd/solr_datacriada (atualmente está no sistema de arquivos raiz, mas mais tarde montarei uma unidade SSD lá, então estou me preparando para isso).

Quero que essa pasta seja montada como /datano contêiner.

Portanto, no arquivo fstab de contêineres, tenho o seguinte:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        ext4    defaults,noatime        0       0

Mas isso é impossível, recebo este erro ao iniciar o contêiner:

lxc-start: No such file or directory - failed to mount '/mnt/ssd/solr_data' on '/usr/lib/x86_64-linux-gnu/lxc//data'
lxc-start: failed to setup the mounts for 'Solr4StandAlone'
lxc-start: failed to setup the container
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn 'Solr4StandAlone'
David Parks
fonte

Respostas:

16

Para criar o diretório automaticamente no contêiner, você também pode adicionar a create=diropção no fstab:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind,create=dir

Editar: isso é específico para o LXC. Veja este tópico

Assim como já tínhamos "opcional", isso adiciona dois novos sinalizadores de montagem específicos do LXC:

  • create = dir (fará um mkdir_p no caminho)

  • create = file (fará um mkdir_p no nome do diretório + uma abertura no caminho)

Isso foi motivado por algumas das montagens de ligação necessárias para os contêineres sem privilégios.

Pequeno rapaz
fonte
1
A que versão mountisso se aplica? Não consegui encontrar a opção descrita no mount(8)Ubuntu 14.04, por exemplo.
0xC0000022L
Também não é o mais recentemount(8)
0xC0000022L
2
de fato ... parece que funciona apenas com lxc. Veja este tópico no lxc-devel ML
little-dude
14

Em /var/lib/lxc/Solr4StandAlone/configadicionar uma linha de leitura:

lxc.mount.entry = /mnt/ssd/solr_data  /var/lib/lxc/Solr4StandAlone/rootfs/data none bind 0 0

Então lxc-stoppare seu contêiner e lxc-startseu contêiner novamente.

Isso é tudo oque é necessário.

ref: link de referência

Mausy5043
fonte
2
Sua solução deve ser melhor revisada, pois funciona com a ferramenta de contêineres LXC sem privilégios. Os outros não funcionarão neste caso. E provavelmente o selinux / apport precisaria ser ajustado para permitir o método deles. +1 para sua solução!
Huygens
11

Eu tive que criar a /datapasta no contêiner local antes que a montagem funcionasse corretamente.

Eu também usei esta entrada fstab:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind     0       0
David Parks
fonte
bindopção de montagem é algo que estava faltando no OP. Eu acredito que é a correção mais importante (presente também em todas as outras respostas de trabalho).
imz - Ivan Zakharyaschev 16/08
9

A partir de 30/09/2015, uma alteração resultante de um patch de segurança interrompe a montagem em um caminho absoluto com lxc.mount.entry no arquivo de configuração.

Em vez disso, você pode usar um caminho relativo

 lxc.mount.entry = /mnt/ssd/solr_data data none bind 0 0

Veja: https://wiki.debian.org/LXC#Bind_mounts_inside_the_container

biscuitNinja
fonte
Além disso, funciona como uma resposta, será votado para que as pessoas vejam em breve. Obrigado por adicionar a ele!
22420 David
6

Como o LXC mudou ao longo do tempo, isso pode ser muito simples, mas me surpreendeu um pouco, por isso, quis contribuir. Eu também criei uma essência para isso, para que eu possa me lembrar de mim, mas simplesmente usar o dispositivo de configuração lxc fará o truque.

sudo lxc config device add Solr4StandAlone sdb disk source=/var/lib/lxc/Solr4StandAlone/rootfs/data path=mnt/ssd/solr_data

Nota É importante deixar a barra frontal fora do argumento path devido a uma alteração mencionada por @biscuitNinja

Montando Diretórios do Contêiner para o Host

ekydfejj
fonte
1

Se você estiver usando libvirtpara criar seu lxccontêiner, poderá tornar o diretório no host passthroughcomo mostrado aqui:

root@localhost:/# cat /etc/libvirt/lxc/my_container.xml
...
 <filesystem type='mount' accessmode='passthrough'>
    <source dir='<dir on host>'/>
    <target dir='<dir on container>'/>
 </filesystem>
....
Swanand Pashankar
fonte