¿Cómo comparto un directorio entre un contenedor LXC y el host?


15

¿Cómo puedo compartir una carpeta entre el sistema host (ubuntu 14.04) y un contenedor ubuntu lxc?

Intenté montar la carpeta en el host:

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

pero no puedo ver ningún archivo.

Lo mismo va para:

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

¿Necesito cambiar los permisos para la carpeta compartida?

Respuestas:


13

De acuerdo con la documentación de LXC , puede hacerlo a través de un contenedor privilegiado:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu

Tenga en cuenta que esa es la documentación de LXD, no LXC. Si no ha instalado LXD, entonces el comando lxc no funcionará.
Sam Bull

@SamBull bueno, esto es autoinfligido por el equipo LXC / LXD. LXC se puede utilizar para referirse a liblxc (la biblioteca subyacente) o al cliente LXD (denominadolxd ) como se usa en esta respuesta o a LXC (el software y el conjunto de herramientas "antiguo" con las herramientas con lxc-*nombre) o al proyecto (donde LXC es la abreviatura de LinuX Containers). Es la razón por la que hice esta pregunta en el meta de Unix.SE.
0xC0000022L

12

Encontré un artículo en el wiki de openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Seguí los pasos y funciona ahora.

Crear directorio de host:

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

Crear directorio en el contenedor lxc:

mkdir /share

Edite el archivo de configuración lxc en el host:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0

¿Hay alguna razón detrás de definir esa entrada de montaje como de solo lectura? ¿Es una buena práctica de seguridad evitar que un contenedor escriba datos en un sistema de archivos compartido?
jgomo3

1
Trabajó para mi. Tenga en cuenta que la ruta relativa utilizada shareen el lxc.mount.entryes crítica.
HRJ

1
No necesita crear el punto de montaje, si agrega ', create = dir' después de 'bind'. También he eliminado la parte 'ro', y parece estar funcionando bien.
Sam Bull

4

A continuación se muestra lo que hice para montar uno de mi directorio de host en el contenedor. Esto es más complicado de lo que parece porque nos gustaría lograr

  • Dentro del contenedor deberíamos poder escribir en el directorio.
  • Fuera del contenedor, deberíamos poder escribir en los archivos y directorios creados dentro del contenedor.

Después de leer varios artículos en línea (el más útil es este problema de github ), así es como resuelvo esto. El truco consiste en asignar el uid y gid del usuario host al uid y gid del usuario dentro del contenedor.

Supongamos que voy a montar /home/breakds/projectsexactamente en la misma ubicación en el contenedor. El directorio externo es propiedad del usuario breakds, cuyo uid y gid son1000 .

Luego creé un usuario en el contenedor llamado debian, cuyo uid y gid también eran 1000(porque es el primer usuario no root). Luego crearé un perfil (lxc) en el host por

lxc profile edit breakds

Y a continuación se muestra el contenido del perfil (creo que está en 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

Luego, aplique este perfil a ese contenedor permanentemente:

$ lxc profile apply <my container> breakds

Esto debería funcionar.

NOTA : Tenga en cuenta que antes de cambiar a este perfil, asegúrese de que todas las direcciones o archivos cuyo propietario / grupo es debian deben eliminarse (y probablemente volver a crearse después del cambio). Esto se debe a que después de la asignación de UID y GID, su propiedad dejará de ser válida. Originalmente pensé que ya que solo estoy asignando 1000 a 1000 todo debería estar bien, pero creo que me perdí algo aquí y sería genial si alguien puede aconsejar sobre cómo resolver esto sin el truco.


Pero siempre puedes chowndesde el host.
iBug

1

También puede hacer esto sin LXD editando el archivo de configuración LXC directamente:

# 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

También debe asegurarse de que la cuenta del usuario del contenedor tenga permiso para asignar a uid / gid 1000 en el host editando / etc / subuid y / etc / subgid:

containeruser:165536:65536
containeruser:1000:1

¿Qué sistema procesa / creó / etc / subuid? Openwrt no tiene eso.
mcr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.