Comment partager un répertoire entre un conteneur LXC et l'hôte?

15

Comment partager un dossier entre le système hôte (ubuntu 14.04) et un conteneur ubuntu lxc?

J'ai essayé de monter le dossier sur l'hôte:

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

mais je ne vois aucun fichier.

C'est la même chose pour:

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

Dois-je modifier les autorisations du dossier de partage?

Max
la source

Réponses:

13

Selon la documentation LXC, vous pouvez le faire via un conteneur privilégié:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu
Jorge Castro
la source
Notez que c'est la documentation LXD, pas LXC. Si vous n'avez pas installé LXD, la commande lxc ne fonctionnera pas.
Sam Bull
@SamBull bien, c'est auto-infligé par l'équipe LXC / LXD. LXC peut être utilisé pour faire référence à liblxc (la bibliothèque sous-jacente) ou au client LXD (nommé lxd) tel qu'utilisé dans cette réponse ou à LXC (le logiciel et le "vieux" jeu d'outils avec les lxc-*outils nommés) ou au projet (où LXC est l'abréviation de LinuX Containers). C'est la raison pour laquelle j'ai posé cette question sur la méta Unix.SE.
0xC0000022L
12

J'ai trouvé un article sur le wiki openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

J'ai suivi les étapes et cela fonctionne maintenant.

Créer un répertoire hôte:

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

Créez un répertoire dans le conteneur lxc:

mkdir /share

Editez le fichier de configuration lxc sur l'hôte:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0
Max
la source
Y a-t-il une raison pour définir cette entrée de montage en lecture seule? Est-ce une bonne pratique de sécurité pour éviter qu'un conteneur écrive des données dans un système de fichiers partagé?.
jgomo3
1
A travaillé pour moi. Notez que le chemin relatif utilisé pour sharedans lxc.mount.entryest critique.
HRJ
1
Vous n'avez pas besoin de créer le point de montage, si vous ajoutez ', create = dir' après 'bind'. J'ai également supprimé la partie «ro», et cela semble très bien fonctionner.
Sam Bull
4

Vous trouverez ci-dessous ce que j'ai fait pour monter un de mon répertoire hôte dans le conteneur. C'est plus compliqué qu'il n'y paraît car nous aimerions réaliser

  • À l'intérieur du conteneur, nous devrions pouvoir écrire dans le répertoire.
  • En dehors du conteneur, nous devrions pouvoir écrire dans les fichiers et répertoires créés à l'intérieur du conteneur.

Après avoir lu divers articles en ligne (le plus utile est ce numéro de github ), voici comment résoudre ce problème. L'astuce consiste à mapper l'uid et le gid de l'utilisateur hôte sur l'uid et le gid de l'utilisateur à l'intérieur du conteneur.

Supposons que je vais monter /home/breakds/projectsexactement au même endroit dans le conteneur. Le répertoire extérieur appartient à l'utilisateur breakds, dont l'uid et le gid sont 1000.

J'ai ensuite créé un utilisateur dans le conteneur appelé debian, dont l'uid et le gid se trouvaient être 1000également (car c'est le premier utilisateur non root). Je vais ensuite créer un (lxc) profie sur l'hôte en

lxc profile edit breakds

Et ci-dessous est le contenu du profil (je crois qu'il est au format 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

Ensuite, appliquez ce profil à ce conteneur de manière permanente:

$ lxc profile apply <my container> breakds

Cela devrait faire l'affaire.

REMARQUE : veuillez noter qu'avant de passer à ce profil, assurez-vous que tous les répertoires ou fichiers dont le propriétaire / groupe est debian doivent être supprimés (et probablement recréés après le changement). En effet, après le mappage uid et gid, leur propriété deviendra invalide. Au départ, je pensais que je ne fais que mapper 1000 à 1000, tout devrait bien se passer, mais je pense que j'ai raté quelque chose ici et ce serait génial si quelqu'un pouvait me conseiller sur la façon de résoudre ce problème sans le piratage.

BreakDS
la source
Mais vous pouvez toujours chownde l'hôte.
iBug
1

Vous pouvez également le faire sans LXD en modifiant directement le fichier de configuration 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

Vous devez également vous assurer que le compte de l'utilisateur du conteneur est autorisé à mapper vers uid / gid 1000 sur l'hôte en modifiant / etc / subuid et / etc / subgid:

containeruser:165536:65536
containeruser:1000:1
apokluda
la source
quel système traite / créé / etc / subuid? Openwrt n'a pas cela.
mcr