Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Monter automatiquement NFS sur des instances Linux

By Sayle MatthewsJul 20, 20208 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

1 fl0wtntavgxuf3yqbi5owg

Il y a quelques semaines, je suis tombé sur ce que je pensais être un cas d'usage très particulier en migrant vers Kubernetes une bonne partie des VM de mon home lab : monter automatiquement un volume NFS sur une machine Linux ou un conteneur Docker.

L'idée était de déplacer le stockage d'InfluxDB, MySQL et Grafana vers mon NAS, plutôt que sur le système de fichiers local de la machine hôte. J'utilise pas mal NFS sur mon réseau pour partager des fichiers entre plusieurs appareils, pour sa simplicité et sa large compatibilité.

Une fois la configuration en place, je me suis rendu compte que ce cas d'usage n'était finalement pas si particulier, vu l'omniprésence de NFS. On peut s'en servir dans un environnement cloud pour monter un partage NFS on-premise et en récupérer les données, donner à des processus l'accès à un partage NFS en lecture ou en écriture, monter les répertoires personnels des utilisateurs depuis NFS, et bien d'autres scénarios.

Le problème — et la clé pour faire fonctionner le montage automatique

Je me suis d'abord tourné vers la solution que je connaissais le mieux, fstab, que j'utilise par intermittence depuis quelques décennies. Mais je me suis vite aperçu qu'il ne montait pas le volume NFS assez vite pour que les daemons de base de données le détectent, ce qui posait de sérieux problèmes.

C'est là que j'ai découvert un paquet Linux appelé autofs. Le mettre en route a demandé pas mal de tâtonnements : beaucoup de guides en ligne sont obsolètes ou passent à côté de détails essentiels. Ce guide va droit au but pour vous éviter d'y perdre une demi-journée — le temps étant une denrée rare dans notre métier.

Au fond, autofs n'est qu'un daemon qui monte et démonte automatiquement les partages à la volée, en arrière-plan. Contrairement à fstab, il agit à la demande, ce qui lui permet d'opérer pendant le démarrage sans se soucier de l'ordre de lancement des autres daemons.


Prérequis

Pour simplifier, je pars du principe que vous avez déjà un serveur NFS en place sur votre NAS ou votre machine Linux, ou que vous utilisez un service comme Filestore de Google Cloud en guise de NAS.

Veillez à disposer du chemin complet de chaque partage NFS à ajouter. Ils ne sont pas toujours ceux qu'on imagine, alors vérifiez-les bien : sur les NAS Synology, par exemple, le numéro de volume est ajouté en préfixe, comme dans /volume1/share_path.

Je vais m'appuyer sur les commandes propres aux distributions dérivées de Debian — donc compatibles avec Debian, Ubuntu, Kali, etc. — et indiquer dans chaque section l'équivalent pour les distributions dérivées de Red Hat, afin que ceux qui tournent sous RHEL ou CentOS n'aient pas à faire la traduction eux-mêmes.

À noter que ce guide ne traite pas des bonnes pratiques de sécurité NFS : le sujet est trop vaste et alourdirait considérablement la longueur de l'article, je l'écarte donc volontairement. C'est TRÈS important, ne vous y trompez pas, mais ce n'est pas couvert ici. Je vous recommande de vous documenter sur la question pour intégrer ces pratiques à votre installation, de la manière la mieux adaptée à votre organisation. Pour aller plus loin, je vous suggère de commencer par cet excellent article de Red Hat qui en présente les bases ici.


La marche à suivre

  1. Installez le paquet autofs en exécutant la commande correspondant à votre distribution :

    Ubuntu : `sudo apt -y install nfs-common autofs

    Red Hat : sudo yum -y install nfs-common autofs`

  2. Ouvrez le fichier /etc/auto.master dans votre éditeur favori.

  3. Descendez en fin de fichier et ajoutez une ligne du type ci-dessous pour chaque montage à créer, en remplaçant le mot share dans auto.share par le nom de votre choix :

    `/- /etc/auto.share -nosuid,noowners

    `(Si vous le souhaitez, ajoutez davantage d'espaces pour la lisibilité ; Medium n'autorise qu'un seul espace dans un bloc de code au sein d'une liste numérotée.)

  4. Créez ensuite chacun des fichiers référencés à l'étape précédente. Ils se trouveront tous dans /etc, au format auto.[share_name]. Pour chaque ligne auto.share ajoutée plus haut, ouvrez le fichier correspondant dans votre éditeur favori pour le créer. Insérez-y la ligne suivante en renseignant le nom de votre partage (personnellement, je préfère tout regrouper dans /mnt, mais à vous de voir), le nom du serveur et le chemin du partage :

    `/mnt/[share_name] -fstyle=nfs,user,nolock,nosuid,rw [server_name]:[share_path]

    `(Là encore, n'hésitez pas à ajouter des espaces pour la lisibilité. Et si vous voulez un montage en lecture seule plutôt qu'en lecture-écriture, remplacez rw par ro.)

  5. Une fois cela fait, redémarrez le service autofs avec la commande suivante :

    Ubuntu : sudo service autofs restart

    Red Hat : sudo systemctl restart autofs

  6. Vérifiez ensuite que le service a bien démarré et qu'aucune erreur de syntaxe, de réseau ou autre n'est survenue. Lancez la commande suivante pour consulter le statut :

    Ubuntu : sudo service autofs status

    Red Hat : sudo systemctl status autofs

  7. La sortie doit indiquer que le service est en cours d'exécution et que tout va bien. Dans le cas contraire, elle affichera les dernières lignes des logs pour vous aider à diagnostiquer le problème. J'ai aussi ajouté en fin d'article une section avec quelques étapes de débogage de base.

  8. Vous pouvez maintenant utiliser la commande cd pour vous rendre dans les répertoires définis dans les fichiers ci-dessus et accéder aux partages. Inutile de créer ces répertoires vous-même : le daemon autofs s'en charge automatiquement.

  9. Dernière vérification possible : la commande mount, qui liste tous les montages de l'instance. Pour repérer rapidement ceux créés par autofs, lancez mount | grep autofs.

  10. À partir de là, les montages se chargeront automatiquement et se rattacheront au besoin.

  11. À ce stade, je recommande vivement de vous pencher sur la sécurité NFS, de sécuriser vos montages et de retenir la méthode la mieux adaptée à votre usage.


Déboguer les problèmes courants

En apprenant à utiliser autofs, je me suis heurté à quelques difficultés que je souhaite passer en revue, ainsi que la façon dont je les ai résolues.

La première : le daemon générait toutes sortes d'erreurs de connexion à NFS. Il s'est avéré que Synology ajoute le numéro de volume en préfixe du nom de partage, ce que j'ignorais à l'époque. Je l'ai diagnostiqué en essayant de monter manuellement le partage NFS dans un dossier de mon répertoire personnel avec la commande suivante : mkdir tmp_mnt && sudo mount -v -r -o user,nolock,nosuid [server_name]:[share_path] tmp_mnt, qui monte le partage dans un répertoire local. Vous obtenez soit un succès, soit une erreur indiquant ce qui cloche. Pour démonter, exécutez sudo umount tmp_mnt.

Autre erreur rencontrée : le serveur n'était pas joignable par son hostname. Le souci venait en réalité d'un problème de DNS interne qui ne résolvait pas le hostname. Je l'ai diagnostiqué en parvenant à atteindre le partage par son adresse IP, puis en lançant nslookup hostname pour constater qu'il n'arrivait pas à faire le lien entre adresse IP et hostname. Notez qu'il vous faudra peut-être installer les paquets bind-utils (pour Red Hat sudo yum -y install bind-utils) ou dnsutils (pour Debian sudo apt install -y dnsutils).

Le dernier problème est propre à Kubernetes. Je n'arrivais à accéder à aucun service externe, partages NFS compris, situé hors du cluster, depuis un pod du cluster. La cause : le hostname ne pouvait pas être résolu via le DNS, car le cluster ne connaissait pas mon serveur DNS interne, situé en dehors. La théorie sous-jacente déborde largement du cadre de ce guide ; je me contente donc de fournir une solution et un lien pour aller plus loin.

  1. Modifiez le configmap CoreDNS avec la commande kubectl edit configmap coredns -n kube-system.
  2. Un éditeur de texte s'ouvre avec le fichier yaml de CoreDNS ; à l'intérieur, une section nommée Corefile contient un bloc yaml qui débute par .:53.
  3. Identifiez votre domaine interne. Il dépend de la configuration de votre serveur DNS interne ; si vous n'en avez pas, utilisez simplement local.
  4. Identifiez l'adresse IP de votre serveur DNS. À défaut, ce sera très probablement celle de votre routeur.
  5. Ajoutez le bloc de code suivant — en y insérant vos propres informations — en dessous, sur une nouvelle ligne (avec des espaces, surtout pas de tabulations !), enregistrez et quittez l'éditeur :

[domain_name]:53 { errors cache 30 forward . [dns_server] }

Pour comprendre pourquoi cela fonctionne, c'est ici.