LXC: Comment monter un dossier de l'hôte vers le conteneur?

24

J'essaie de monter un dossier sur l'hôte dans un conteneur LXC.

L'hôte a /mnt/ssd/solr_datacréé un dossier (il se trouve actuellement sur le système de fichiers racine, mais plus tard, j'y monterai un lecteur SSD, donc je me prépare pour cela).

Je veux que ce dossier se monte comme /datadans le conteneur.

Donc, dans le fichier fstab des conteneurs, j'ai les éléments suivants:

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

Mais c'est non, j'obtiens cette erreur en démarrant le conteneur:

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
la source

Réponses:

16

Pour créer le répertoire automatiquement dans le conteneur, vous pouvez également ajouter l' create=diroption dans le fstab:

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

Edit: ceci est spécifique à LXC. Voir ce fil

Tout comme nous avions déjà "facultatif", cela ajoute deux nouveaux drapeaux de montage spécifiques à LXC:

  • create = dir (fera un mkdir_p sur le chemin)

  • create = file (fera un mkdir_p sur le dirname + un fopen sur le chemin)

Cela était motivé par certains des fixations nécessaires pour les conteneurs non privilégiés.

petit mec
la source
1
À quelle version mountcela s'applique-t-il? Je n'ai pas pu trouver l'option décrite dans mount(8)Ubuntu 14.04, par exemple.
0xC0000022L
Aussi pas dans la dernièremount(8)
0xC0000022L
2
en effet ... on dirait que cela fonctionne uniquement avec lxc. Voir ce fil sur lxc-devel ML
little-dude
14

En /var/lib/lxc/Solr4StandAlone/configajoutant une ligne de lecture:

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

lxc-stopArrêtez ensuite votre conteneur et lxc-startvotre conteneur à nouveau.

C'est tout ce qui est nécessaire.

ref: lien de référence

Mausy5043
la source
2
Votre solution devrait être mieux examinée car elle fonctionne avec l'outil de conteneurs LXC non privilégiés. Les autres ne fonctionneront pas dans ce cas. Et probablement selinux / alloc devrait être modifié pour permettre leur méthode. +1 pour votre solution!
Huygens
11

J'ai dû créer le /datadossier dans le conteneur local avant que le montage ne fonctionne correctement.

J'ai également utilisé cette entrée fstab:

/mnt/ssd/solr_data      /var/lib/lxc/Solr4StandAlone/rootfs/data        none   bind     0       0
David Parks
la source
bindL'option de montage est quelque chose qui manquait dans l'OP. Je pense que c'est la correction la plus importante (présente également dans toutes les autres réponses de travail).
imz - Ivan Zakharyaschev
9

Depuis le 30/09/2015, une modification résultant d'un correctif de sécurité rompt le montage sur un chemin absolu avec lxc.mount.entry dans le fichier de configuration.

Au lieu de cela, vous pouvez utiliser un chemin relatif

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

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

biscuitNinja
la source
Excellent ajout, cela fonctionne comme une réponse, il sera voté afin que les gens le voient bientôt. Merci de l'avoir ajouté!
David Parks
6

Comme LXC a changé au fil du temps, cela peut être très simple, mais cela m'a un peu embarrassé, donc je voulais contribuer. J'ai également créé un résumé pour que je puisse me souvenir de moi, mais simplement utiliser le périphérique de configuration lxc fera l'affaire.

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

Remarque Il est important de laisser la barre oblique avant de l'argument chemin en raison d'un changement mentionné par @biscuitNinja

Montage de répertoires du conteneur vers l'hôte

ekydfejj
la source
1

Si vous utilisez libvirtpour créer votre lxcconteneur, vous pouvez créer le répertoire sur l'hôte passthroughcomme indiqué ici:

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
la source