LXC: ¿Cómo monte una carpeta desde el host al contenedor?

24

Estoy tratando de montar una carpeta en el host en un contenedor LXC.

El host tiene una carpeta /mnt/ssd/solr_datacreada (esto está actualmente en el sistema de archivos raíz, pero luego montaré una unidad SSD allí, así que me estoy preparando para eso).

Quiero que la carpeta se monte como /dataen el contenedor.

Entonces, en el archivo fstab de contenedores, tengo lo siguiente:

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

Pero eso no es posible, me sale este error al iniciar el contenedor:

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
fuente

Respuestas:

16

Para crear el directorio automáticamente en el contenedor, también puede agregar la create=diropción en el fstab:

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

Editar: esto es específico de LXC. Ver este hilo

Al igual que ya teníamos "opcional", esto agrega dos nuevos indicadores de montaje específicos de LXC:

  • create = dir (hará un mkdir_p en la ruta)

  • create = file (hará un mkdir_p en el nombre del directorio + un fopen en la ruta)

Esto fue motivado por algunos de los montajes de unión necesarios para los contenedores no privilegiados.

pequeño amigo
fuente
1
¿A qué versión de mountesto se aplica? No pude encontrar la opción descrita en mount(8)Ubuntu 14.04, por ejemplo.
0xC0000022L
Tampoco en el últimomount(8)
0xC0000022L
2
de hecho ... parece que funciona solo con lxc. Ver este hilo en lxc-devel ML
little-dude
14

En /var/lib/lxc/Solr4StandAlone/configagregar una lectura de línea:

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

Luego lxc-stopdetenga su contenedor y lxc-startsu contenedor nuevamente.

Eso es todo lo que se necesita.

ref: enlace de referencia

Mausy5043
fuente
2
Su solución debería obtener una mejor revisión, ya que funciona con la herramienta de contenedores LXC sin privilegios. Los otros no funcionarán en este caso. Y probablemente selinux / apport necesitaría ser ajustado para permitir su método. ¡+1 para tu solución!
Huygens
11

Tuve que crear la /datacarpeta en el contenedor local antes de que el montaje funcionara correctamente.

También usé esta entrada fstab:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind     0       0
David Parks
fuente
bindLa opción de montaje es algo que faltaba en el OP. Creo que es la corrección más importante (presente también en todas las otras respuestas de trabajo).
imz - Ivan Zakharyaschev
9

A partir del 30/09/2015, un cambio resultante de un parche de seguridad rompe el montaje en una ruta absoluta con lxc.mount.entry en el archivo de configuración.

En su lugar, puede usar una ruta relativa

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

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

biscuitNinja
fuente
Gran adición, funciona como una respuesta, se votará para que la gente lo vea pronto. ¡Gracias por agregarlo!
David Parks
6

Como LXC ha cambiado con el tiempo, esto puede ser muy simple, pero me dejó perplejo por un tiempo, por lo que quería contribuir. También creé una esencia para esto, así puedo recordarme a mí mismo, pero simplemente usar el dispositivo de configuración lxc hará el truco.

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

Nota Es importante dejar la barra diagonal fuera del argumento de ruta debido a un cambio mencionado por @biscuitNinja

Montaje de directorios del contenedor al host

ekydfejj
fuente
1

Si está utilizando libvirtpara crear su lxccontenedor, puede hacer que el directorio en el host sea passthroughcomo se muestra aquí:

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
fuente