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 leHOME
de l’utilisateurnfs 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 micro14la 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)
.