Next Previous Contents

7. Automountage

7.1 Présentation

L'automonteur est un process qui monte et démonte les file systems automatiquement sans avoir à taper la commande mount, les filesystems concernés peuvent être locaux (cdrom, disquette, zip, jaz) ou distants (partage NFS, c'est à dire filesystem d'un poste linux distant). Si le filesystem en question est démonté et qu'un utilisateur essaie d'yn accèder, celui-ci sera automatiquement monté. D'un autre côté si le filesystem n'a pas été accédé depuis un certain temps, le daemon automonter le démontera automatiquement. L'automontage est intéressant quand les filesystems concernés ne sont pas forcément disponibles (zip non présent, serveur NFS distant éteint, ...), avec un montage NFS classique vous auriez une erreur, voire un blocage complet de la machine en recherche du filesystem à monter, l'automontage permet d'éviter ces blocages, car les filesystems ne sont montés que quand on les utilise.

L'automonteur doit être installé sur la machine cliente, celle où on souhaite monter et démonter des filesystems (locaux ou distants). Sur la machine serveur, qui partage ses filesystems, on se contentera de configurer correctement /etc/exports.

7.2 Installation

Pour installer l'automonteur, vous devez installer le package autofs-3.1.3-5mdk.i586.rpm se trouvant sur votre CD d'install. Ce dernier en plus d'installer l'exécutable /usr/sbin/automount, installe le fichier de lancement autofs sous /etc/rc.d/init.d. Voici le contenu de ce fichier :

 #! /bin/bash  
# 
#       $Id: rc.autofs,v 1.4 1998/11/03 21:05:18 hpa Exp $ 
# 
#       /etc/rc.d/init.d/autofs 
# 
#       rc file for automount using a Sun-style "master map". 
#       We first look for a local /etc/auto.master, then a YP 
#       map with that name 
# 
# chkconfig: - 72 08 
# description: automatically mounts filesystems when you use  \   
#   them, and unmounts them later when you are not using them. 
# processname: automount 
#   Note that there may be multiple processes names automount 
# config: /etc/auto.master 
#   Note that all other config files are automatically reloaded 
#   and may be different on different systems; we can ignore them 
#   here 
 
# Source function library. 
. /etc/rc.d/init.d/functions 
 
test -f /usr/sbin/automount || exit 0 
 
# 
#       We can add local options here 
#       e.g. localoptions='rsize=8192,wsize=8192' 
# 
localoptions='' 
 
# 
#       This function will build a list of automount commands to execute in 
#       order # to activate all the mount points. It is used to figure out 
#       the difference of automount points in case of a reload 
# 
function getmounts() 
{ 
# 
#       Check for local maps to be loaded 
# 
if [ -f /etc/auto.master ] ; then 
    cat /etc/auto.master | sed -e '/^#/d' -e '/^$/d'| ( 
        while read dir map options ;  do 
            if [ ! -z "$dir" -a ! -z "$map"  \   
                        -a x`echo "$map" | cut -c1` != 'x-' ] 
            then 
                # special: treat -t or --timeout (or any reasonable derivative) 
                # specially, since it can't be made a normal mount option. 
                if echo $options | grep -- '-t' >/dev/null 2>&1 ; then 
                    mountoptions="--timeout $(echo $options |  \   
                      sed 's/^.*-t \  (imeout\ )*[ \ t]*\ ([0-9][0-9]*\ ).*$/\ 2/g')" 
                fi 
                options=`echo "$options" | sed -e ' 
                  s/--*t \  (imeout\ )*[ \ t]*[0-9][0-9]*//g 
                  s/ \  (^\ |[ \ t]\ )-/\ 1/g'` 
                basecommand="/usr/sbin/automount $mountoptions $dir" 
                case $map in 
                    /*)  
                        if [ -x $map ]; then 
                            echo "$basecommand program $map $options $localoptions" 
                        elif [ -f $map ]; then 
                            echo "$basecommand file $map $options $localoptions" 
                        else 
                            echo "$basecommand `basename $map` $options $localoptions" 
                        fi 
                        ;; 
                    *) 
                        if [ -f /etc/$map ] ; then 
                            echo "$basecommand file /etc/$map $options $localoptions" 
                        else 
                            echo "$basecommand yp $map $options $localoptions" 
                        fi 
                        ;; 
                esac 
                unset basecommand 
            fi 
        done 
    ) 
else 
# 
#       Next to check for YellowPage maps to be loaded 
# 
  if [ -e /usr/bin/ypcat ] && [ `ypcat -k auto.master 2>/dev/null | wc -l` -gt 0 ] 
  then 
    ypcat -k auto.master | ( 
        while read dir map options 
        do 
            if [ ! -z "$dir" -a ! -z "$map"  \   
                        -a x`echo "$map" | cut -c1` != 'x-' ] 
            then 
                map=`echo "$map" | sed -e 's/^auto_/auto./'` 
                if echo $options | grep -- '-t' >/dev/null 2>&1 ; then 
                    mountoptions="--timeout $(echo $options |  \   
                      sed 's/^.*-t \  (imeout\ )*[ \ t]*\ ([0-9][0-9]*\ ).*$/\ 2/g')" 
                fi 
                options=`echo "$options" | sed -e ' 
                  s/--*t \  (imeout\ )*[ \ t]*[0-9][0-9]*//g 
                  s/ \  (^\ |[ \ t]\ )-/\ 1/g'` 
                echo "/usr/sbin/automount $mountoptions $dir yp $map $options $localoptions" 
            fi 
        done 
    ) 
  fi 
fi 
} 
 
# 
#       See how we were called. 
# 
case "$1" in 
  start) 
        # Check if the automounter is already running? 
        if [ ! -f /var/lock/subsys/autofs ]; then 
            echo 'Starting automounter: ' 
            getmounts | sh 
            touch /var/lock/subsys/autofs 
        fi 
        ;; 
  stop) 
        kill -TERM $(/sbin/pidof /usr/sbin/automount) 
        rm -f /var/lock/subsys/autofs 
        ;; 
  reload|restart) 
        if [ ! -f /var/lock/subsys/autofs ]; then 
                echo "Automounter not running" 
                exit 1 
        fi 
        echo "Checking for changes to /etc/auto.master ...." 
        TMP1=`mktemp /tmp/autofs.XXXXXX` || { echo "could not make temp file" >&2; exit 1; } 
        TMP2=`mktemp /tmp/autofs.XXXXXX` || { echo "could not make temp file" >&2; exit 1; } 
        getmounts >$TMP1 
        ps ax|grep "[0-9]:[0-9][0-9] /usr/sbin/automount " | ( 
            while read pid tt stat time command; do 
                echo "$command" >>$TMP2 
                if ! grep -q "^$command" $TMP2; then 
                        kill -USR2 $pid 
                        echo "Stop $command" 
                fi 
            done 
        ) 
        cat $TMP1 | ( while read x; do 
                if ! grep -q "^$x" $TMP2; then 
                        $x 
                        echo "Start $x" 
                fi 
        done ) 
        rm -f $TMP1 $TMP2 
        ;; 
  status) 
        echo "Configured Mount Points:" 
        getmounts 
        echo "" 
        echo "Active Mount Points:" 
        ps ax|grep "[0-9]:[0-9][0-9] /usr/sbin/automount " | ( 
                while read pid tt stat time command; do echo $command; done 
        ) 
        ;; 
  *) 
        echo "Usage: /etc/rc.d/init.d/autofs {start|stop|restart|reload|status}" 
        exit 1 
esac 
 
exit 0 
 

L'installation RPM m'a installé des liens un peu n'importe comment dans les répertoires /etc/rc.d/rcX.d, les voici:

./rc0.d/K08autofs  
./rc1.d/K08autofs 
./rc2.d/K08autofs 
./rc3.d/K08autofs 
./rc4.d/K08autofs 
./rc5.d/K08autofs 
./rc6.d/K08autofs  
 

Le problème est que, quelque soit l'état de marche, l'automounter n'est jamais lancé, on va modifier tout ça:

rm -f /etc/rc.d/rc3.d/K08autofs /etc/rc.d/init.d/rc4.d/K08autofs /etc/rc.d/init.d/rc5.d/K08autofs  
 

et on crée les liens suivants:

ln -s /etc/rc.d/init.d/autofs /etc/rc.d/rc3.d/S92autofs  
ln -s /etc/rc.d/init.d/autofs /etc/rc.d/rc4.d/S92autofs 
ln -s /etc/rc.d/init.d/autofs /etc/rc.d/rc5.d/S92autofs 
 

Attendez maintenant l'installation de la machine serveur NFS et la fin de la configuration des filesystem à monter pour lancer l'automonteur.

NOTE: Rappelez vous que j'ai une page qui explique comment marche le lancement automatique au boot des services de la machine.

7.3 Configuration de la machine serveur

Vous devez configurer la machine qui souhaite partager ses filesystems, la configuration est en tout point identique à celle d'un serveur NFS. Vous devez installer le package NFS server et configurer /etc/exports. Si l'on veut partager par exemple le répertoire /alphonse et /roger aux machines zoulou en lecture, écriture et le répertoire /roger en lecture seule à shuttle, et le /mnt/cdrom (le répertoire de montage du CD-ROM) à tout le monde, voici le contenu du dit-fichier.

/alphonse zoulou(rw)  
/roger shuttle(ro) 
/mnt/cdrom  
 

N'oubliez pas de taper en tant que root exportfs -a pour que le fichier soit pris en compte.

NOTE: C'est particulièrement intéressant de pouvoir exporter des répertoires comme /mnt/zip, /mnt/jaz si vous voulez partager votre lecteur zip ou jaz.

7.4 Configuration de l'automontage sur la machine cliente

Admettons que le serveur NFS se nomme obelix, sur la machine cliente, on voudra monter les filesystems nfs /alphonse, /roger et /mnt/cdrom dans /obelix. On souhaite donc avoir l'arborescence suivante sur la machine cliente après automontage:

                roger  
/obelix         alphonse 
                mnt        cdrom 
 

Pour cela on va créer un fichier /etc/auto.master contenant:

/obelix  /etc/auto.obelix --timeout 60   
 

/obelix est donc le point de montage des différents filesystems exportés par obelix, timeout (en secondes) est le temps au bout duquel les filesystems seront automatiquement démontés, s'ils sont non utilisés (non accédés).

On crée ensuite le fichier /etc/auto.obelix contenant:

roger           -fstype=nfs             obelix:/roger  
alphonse        -fstype=nfs             obelix:/alphonse 
cdrom           -fstype=nfs             obelix:/mnt/cdrom 
 

Ca y est, on peut lancer l'automonter sur la machine cliente, soit en rebootant, soit en lançant:

/etc/rc.d/init.d/autofs start   
 

7.5 Utilisation

A l'utilisation l'automontage est particulièrement déconcertant, allez dans le répertoire /obelix, et tapez ls, vous verrez qu'il est vide ! Les répertoires roger, alphonse et mnt/cdrom n'ont pas été montés. Et pour cause vous n'y avez pas encore accédé, vous devez taper explicitement cd /obelix/roger pour que le répertoire /roger se monte. Au bout de 60 secondes, d'inactivité, le répertoire sera automatiquement démonté et obelix paraîtra à nouveau vide.

Ceci impose de connaître au préalable les noms des filesystems exportés.


Next Previous Contents