• Linux

Proxmox : Monter un dossier de l'hôte dans un conteneur LXC sans casser les snapshots

Aujourd'hui, on va voir comment accéder à un dossier se trouvant sur un nœud Proxmox Virtual Environnement depuis un conteneur LXC qui tourne sur ce même nœud. On va pour cela voir la manière « classique » de faire les choses... et comment la contourner en passant directement par les bind mount de LXC afin de conserver la possibilité de faire des snapshot du conteneur. 😅

Pour quoi faire ?

Il y a plusieurs raisons pour lesquelles on voudrait accéder à un dossier se trouvant sur le nœud PVE depuis un container.

La première raison, c'est de mettre en place un dossier partagé entre plusieurs conteneurs tournant sur le même serveur Proxmox. Dans mon cas, j'ai un gros stockage de fichier (~20 To) qui doit pouvoir être accéder par deux conteneurs : l'un fournissant un partage de fichier Samba pour gérer les données et l'autre faisant tourner une interface Web permettant un accès plus pratique à une partie des données (photos et vidéos).

Une autre raison peut être d'accéder à un partage de fichier NFS depuis un conteneur non-privilégié. Dans ce cas, on va monter le partage de fichier sur le nœud PVE puis configurer un bind mount pour permettre au conteneur d'y accéder. Vous retrouverez plus d'infos à ce sujet sur ce poste du forum de Proxmox :

Note

NOTE : De manière générale, je vous déconseille d'essayer de jouer avec des montages NFS ou FUSE à l'intérieur des containers LXC de Proxmox. C'est théoriquement possible dans un conteneur privilégié avec certaines options activées... mais la dernière fois que j'ai essayé, j'ai juste réussi à freezer tout le nœud ! 😅

Comment on fait un bind mount d'un dossier (méthode « tradi ») ?

Alors déjà, pas la peine de chercher dans l'interface Web de Proxmox, on ne peut pas le faire depuis là... Il va falloir passer par la console.

Pour monter un dossier dans un conteneur LXC, vous avez deux choix. Soit via la commande suivante :

pct set <CT_ID> -mp<N> <DOSSIER_PVE>,mp=<DOSSIER_CT>

Soit en éditant le fichier de configuration du container (/etc/pve/lxc/<CT_ID>.conf) et y ajoutant la ligne suivante :

mp<N>: <DOSSIER_PVE>,mp=/<DOSSIER_CT>

Où :

  • <CT_ID> est l'ID du container,
  • <N> est l'ID du point de montage (mettez simplement 0 pour le premier que vous définissez, puis 1 pour le suivant, etc.),
  • <DOSSIER_PVE> est le dossier à partager sur le nœud Proxmox,
  • et <DOSSIER_CT> est le point de montage dans le conteneur LXC (un dossier vide et qui doit exister au préalable).

Exemple de commande :

pct set 3001 -mp0 /my-data-zpool/shared-folder,mp=/mnt

Configuration correspondante si vous avez choisi d'éditer le fichier du conteneur (/etc/pve/lxc/3001.conf) :

mp0: /my-data-zpool/shared-folder,mp=/mnt

À noter qu'il faudra redémarrer le conteneur dans le cas de l'édition du fichier.

Voilà. Ça, c'était la manière normale et documentée de faire les choses, que vous pourrez retrouver sur le Wiki de Proxmox :

L'avantage de cette méthode, c'est que le point de montage est visible dans l'interface Web de PVE et que vous pouvez l'utiliser pour gérer les mappings d'ID et tout... Par contre, vous ne pourrez plus prendre de snapshot du container tant que ce point de montage sera actif :

*« The current guest configuration does not support taking new snapshots »*

« The current guest configuration does not support taking new snapshots »

Ce n'est pas un bug, mais une fonctionnalité. Quand vous voulez prendre une snapshot, Proxmox vérifie s'il est capable de prendre une snapshot de l'ensemble des volumes montés sur le conteneur. S'il ne peut pas — comme c'est le cas pour le bind mount — et bah il désactive tout simplement la fonctionnalité !

Un ticket est ouvert depuis 10 ans demandant de permettre l'exclusion d'un point de montage du système de snapshot... Mais pour le moment cette fonctionnalité n'a toujours pas été implémentée :

Bind mount d'un dossier, méthode alternative

Heureusement, il est possible de contourner cette limitation en tapant plus bas niveau. Proxmox nous expose en effets directement les options de LXC, on peut donc passer par là pour monter notre dossier en fufu, bypassant ainsi les checks de Proxmox ! 😁

Pour cela, il faudra aller éditer le fichier de notre conteneur (vim /etc/pve/lxc/<CT_ID>.conf) et y ajouter la ligne suivante :

lxc.mount.entry: <DOSSIER_PVE> <DOSSIER_CT_SANS_RACINE> none bind,rw 0 0

Où :

  • <DOSSIER_PVE> est le dossier à partager sur le nœud Proxmox,
  • et <DOSSIER_CT_SANS_RACINE> est le point de montage dans le conteneur LXC, ⚠️ SANS LE "/" INITIAL ⚠️.

Ça nous donne donc par exemple :

lxc.mount.entry: /my-data-zpool/shared-folder mnt none bind,rw 0 0

Il ne vous reste plus qu'à redémarrer le conteneur pour appliquer les changements.

Notez qu'il y a toutefois quelques points importants à savoir :

  • Le point de montage ne sera pas visible dans l'interface Web de Proxmox.

  • Le dossier que vous avez monté sera exclu des snapshots, donc son contenu ne sera pas restauré en même temps que la snapshot.

  • Le dossier monté est également exclu des sauvegardes.

    Si vous faites un backup du conteneur vers un serveur PBS (Proxmox Backup Server) ou autre, vous aurez une sauvegarde de tout, sauf du contenu de ce dossier. Pensez donc à sauvegarder les données séparément, en utilisant par exemple BorgBackup. 😉

  • Ici le dossier est monté en lecture et écriture, mais vous pouvez également le monter en lecture seule en remplaçant l'option rw par ro.

Zee end

Et voilà, vous savez à présent comment monter un dossier dans un conteneur LXC tout en conservant la fonctionnalité de snapshot de Proxmox ! 😁

À bientôt ! o/


L'illustration de l'article est un travail dérivé d'une image d'appareil photo Polaroid provenant d'Openclipart.