Monter des partages Samba en autofs

Introduction

L’objectif est d’accéder à des partages Samba depuis un poste sous Ubuntu 12.04 (Precise). La fonction “se connecter à un serveur” de Nautilus utilise gvfs mais pose différents problèmes :

  • les montages n’apparaissent pas quand on lance mount
  • les montages sont dans un répertoire caché .gvfs dans le HOME de l’utilisateur
  • nfs n’est pas géré (même si on parle de cifs)
  • les signets Nautilus ne fonctionnement pas bien
  • problème de timeout quand le serveur n’est pas en marche (up)

Ce que l’on cherche à faire :

  • avoir les partages sous /net, puis le nom du serveur, puis le nom du partage. Exemple : /net/micro14/photo pour le partage photo de micro14
  • la liste des partages accessibles est renseigné manuellement (même s’il serait assez facile de la récupérer automatiquement)
  • les serveurs éteints (down) ne doivent pas générer un freeze de Nautilus trop important (1 ou 2 secondes maximum pas 10 ou 30)

Autofs

Autofs s’installe par la commande

apt-get install autofs

Les fichiers de config principal est /etc/auto.master. La syntaxe n’est pas toujours très claire. Dans mon cas, il contient deux lignes

/nfs    -hosts
/net    /etc/auto.smb

La première ligne sert pour les partages nfs. Elle fait la même chose que ce que l’on cherche à faire pour les partages cifs mais c’est beaucoup plus court puisque cette seule ligne suffit à faire apparaitre /nfs/micro14/home/photo par exemple si ce répertoire est partagé.

La deuxième ligne indique que autofs va gérer le répertoire /net puisque c’est là que l’on faire apparaitre les montages cifs. La ligne indique que pour le répertoire /net, on va appeler le script /etc/auto.smb.

Le script /etc/auto.smb

On trouve beaucoup de modèle de scripts sur Internet ou livrés avec les distributions. En général, l’objectif est de récupérer la liste des partages cifs en parsant la sortie de smbclient -L. Par contre, ces scripts posent problème (en tout cas chez moi) quand un serveur n’est plus disponible. C’est pourquoi je voulais un script qui teste que le serveur est up avant de générer les partages. Par contre, la liste des partages évoluant très peu, je préfère gérer des listes en dur par serveur, ce qui permet à autofs de générer les répertoires correspondants.

Le script doit générer en sortie un fichier de map dont on devine la syntaxe à partir de scripts existants (je n’ai pas trouvé de documentation très claire sur cette partie, ni sur autofs en général d’ailleurs).

#!/bin/zsh
host="$1"
opts="-fstype=cifs,file_mode=0644,dir_mode=0755, \
    uid=1000,gid=users,credentials=/root/.credit,iocharset=utf8 \\"
micro14=(audio public video)
micro11=(home video)

# Test le host
ping -c1 -W 1 $host > /dev/null

# Si OK, monte les partages de la listes
if [ $? -eq 0 ] ; then
    echo $opts
    for nom in ${(P)host} ; do
        echo "    /$nom ://$host/$nom \\"
    done
    echo
fi

Détaillons.

#!/bin/zsh
host="$1"

Ce script utilise zsh : c’est le meilleur shell, il marche à l’identique sur les BSD, il est relativement simple à configurer, il s’intègre bien avec git, hg... Le paramètre passé à ce script correspond au nom du répertoire qui suit /net, c’est-à-dire le nom du serveur (d’où la variable host).

opts="-fstype=cifs,file_mode=0644,dir_mode=0755, \
    uid=1000,gid=users,credentials=/root/.credit,iocharset=utf8 \\"
micro14=(audio public video)
micro11=(home video)

Comme on le voit, toutes les options du partages sont dans opts, en particulier le fichier servant pour l’identification pour le partage. Évidemment, en cas d’utilisation du poste par plusieurs utilisateurs, ce type de syntaxe présente un risque puisque n’importe quel utilisateur peut accéder aux partages de l’utilisateur présent dans le fichier /root/.credit.

micro11 et micro14 sont les listes (zsh) des partages des serveurs attendus.

# Test le host
ping -c1 -W1 $host > /dev/null

Cette ligne teste le serveur en pinguant une fois avec un timeout de 1s :

# Si OK, monte les partages de la liste
if [ $? -eq 0 ] ; then
    echo $opts
    for nom in ${(P)host} ; do
        echo "    /$nom ://$host/$nom \\"
    done
    echo
fi

Rien de particulier à signaler sauf l’utilisation du parameter expansion flag (P) dans ${(P)host} : on veut simplement récupérer la variable zsh qui liste les partages. Si host=micro14, alors ${(P)host} correspond à $micro14, soit la liste des partages (audio public video).