Come posso condividere una directory tra un contenitore LXC e l'host?


15

Come posso condividere una cartella tra il sistema host (ubuntu 14.04) e un contenitore ubuntu lxc?

Ho provato a montare la cartella sull'host:

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

ma non riesco a vedere alcun file.

Lo stesso vale per:

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

Devo modificare le autorizzazioni per la cartella condivisa?

Risposte:


13

Secondo la documentazione LXC è possibile farlo tramite un contenitore privilegiato:

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

Si noti che questa è la documentazione LXD, non LXC. Se non hai installato LXD, il comando lxc non funzionerà.
Sam Bull,

@SamBull, questo è autoinflitto dal team LXC / LXD. LXC può essere usato per riferirsi a liblxc (la libreria sottostante) o al client LXD (nominato lxd) come usato in questa risposta o a LXC (il software e il "vecchio" set di strumenti con gli strumenti con il lxc-*nome) o al progetto (dove LXC è l'abbreviazione di LinuX Containers). È il motivo per cui ho posto questa domanda sul meta Unix.SE.
0xC0000022L

12

Ho trovato un articolo nella wiki di openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Ho seguito i passaggi e ora funziona.

Crea directory host:

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

Crea directory nel contenitore lxc:

mkdir /share

Modifica il file di configurazione lxc sull'host:

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

C'è un motivo dietro la definizione di quella voce di mount in sola lettura? È una buona pratica di sicurezza evitare un contenitore per riscrivere i dati in un filesystem condiviso ?.
jgomo3,

1
Ha funzionato per me. Si noti che il percorso relativo utilizzato per sharein lxc.mount.entryè critico.
HRJ

1
Non è necessario creare il punto di montaggio, se si aggiunge ', create = dir' dopo 'bind'. Ho anche rimosso la parte "ro" e sembra funzionare perfettamente.
Sam Bull,

4

Di seguito è riportato ciò che ho fatto per montare una delle mie directory host sul contenitore. Questo è più complicato di quanto sembri perché vorremmo ottenere

  • All'interno del contenitore dovremmo essere in grado di scrivere nella directory.
  • Al di fuori del contenitore dovremmo essere in grado di scrivere nei file e nelle directory creati all'interno del contenitore.

Dopo aver letto vari articoli online (il più utile è questo problema github ), ecco come lo risolvo. Il trucco è mappare l'UID e il GID dell'utente host all'UID e il GID dell'utente all'interno del contenitore.

Supponiamo che ho intenzione di montare /home/breakds/projectsnella stessa identica posizione nel contenitore. La directory esterna è di proprietà dell'utente breakds, di cui uid e gid sono 1000.

Ho quindi creato un utente nel contenitore chiamato debian, il cui uid e gid sono stati ugualmente 1000(perché è il primo utente non root). Creerò quindi un profilo (lxc) sull'host da

lxc profile edit breakds

E di seguito è riportato il contenuto del profilo (credo che sia in 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

Quindi, applicare questo profilo a quel contenitore in modo permanente:

$ lxc profile apply <my container> breakds

Questo dovrebbe fare il trucco.

NOTA : Prima di passare a questo profilo, assicurarsi che tutte le directory oi file il cui proprietario / gruppo sia debian debbano essere eliminati (e probabilmente ricreati dopo il passaggio). Questo perché dopo il mapping di uid e gid, la loro proprietà non sarà più valida. Inizialmente pensavo che, dal momento che sto solo mappando da 1000 a 1000, tutto dovrebbe andare bene, ma penso di aver perso qualcosa qui e sarebbe bello se qualcuno potesse consigliarti su come risolverlo senza l'hacking.


Ma puoi sempre chowndall'host.
iBug

1

Puoi anche farlo senza LXD modificando direttamente il file di configurazione LXC:

# 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

Devi anche assicurarti che l'account dell'utente del container abbia il permesso di mappare su uid / gid 1000 sull'host modificando / etc / subuid e / etc / subgid:

containeruser:165536:65536
containeruser:1000:1

quale sistema elabora / ha creato / etc / subuid? Openwrt non ce l'ha.
mcr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.