2007-11-17

autofs

Tux O autofs é um serviço de montagem automática de sistemas de arquivo locais ou remotos que já vem habilitado por padrão em algumas distro GNU/Linux, como SuSE e Kurumin.

O Slackware possui autofs, mas não vem habilitado por padrão. Vou demonstrar como habilitar esse serviço.

Observação: todos os procedimentos devem ser executados como superusuário (root).

Inicialização


Os scripts de inicialização no Slackware ficam em /etc/rc.d/, mas não há um script pronto para o autofs.

Salve o seguinte código como /etc/rc.d/rc.autofs e torne o arquivo executável:
#!/bin/bash

DAEMON=/usr/sbin/automount
DELAY=5
localoptions=

getmounts() {
#
# Check for local maps to be loaded
#
#

if [[ -f /etc/auto.master ]]
then
sed -re 's/^#.*$//g; /^\s*$/d' /etc/auto.master | while read dir map options
do
if [[ ! -z "$dir" && ! -z "$map" && x`echo "$map" | cut -c1` != 'x-' ]]
then
map=`echo "/etc/$map" | sed -e 's:^/etc//:/:'`
options=`echo "$options" | sed -e 's/\(^\|[ \t]\)-/\1/g'`
if [[ -x $map ]]
then
echo "$DAEMON -t $DELAY $dir program $map $options $localoptions"
elif [[ -f $map ]]
then
echo "$DAEMON -t $DELAY $dir file $map $options $localoptions"
else
echo "$DAEMON -t $DELAY $dir `basename $map` $options $localoptions"
fi
fi
done
fi

#
# Check for YellowPage maps to be loaded
#
if [[ -e /usr/bin/ypcat && `ypcat -k auto.master 2>/dev/null | wc -l` > 0 ]]
then
ypcat -k auto.master | while read dir map options
do
if [[ ! -z "$dir" && ! -z "$map" && x`echo "$map" | cut -c1` != 'x-' ]]
then
map=`echo "$map" | sed -re '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 -re 's/--*t(imeout)*[ \t]*[0-9][0-9]*//g; s/^(\s*)-/\1/g'`
echo "$DAEMON $dir yp $map $options $localoptions"
fi
done
fi
}

#
# Status lister.
#
status_autofs() {
echo "Configured Mount Points:"
echo "------------------------"
getmounts
echo
echo "Active Mount Points:"
echo "--------------------"
mount | grep '^automount'
#ps ax | egrep "[0-9]:[0-9]{2} $DAEMON " | while read pid tt stat time command
#do
# echo $command
#done
echo
}

start_autofs() {
# 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_autofs() {
echo 'Stopping automounter: '
kill -TERM $(/sbin/pidof /usr/sbin/automount)
rm -f /var/lock/subsys/autofs
}

reload_autofs() {
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 | egrep "[0-9]:[0-9]{2} $DAEMON " | while read pid tt stat time command
do
echo "$command" >> $TMP2
if ! grep -q "^$command" $TMP1
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
}

case "$1" in
start)
start_autofs
;;
stop)
stop_autofs
;;
restart)
stop_autofs
sleep 2
start_autofs
;;
reload)
reload_autofs
;;
force_start)
stop_autofs &>/dev/null
sleep 2
start_autofs
;;
status)
status_autofs
;;
*)
echo "Usage: /etc/rc.d/rc.autofs {start|stop|restart|reload|status}"
exit 1
;;
esac


Execute então o seguinte comando:
echo '[ -x /etc/rc.d/rc.autofs ] && /etc/rc.d/rc.autofs force_start' >> /etc/rc.d/rc.local


Configurações


O principal arquivo de configuração do autofs é /etc/auto.master.

Cada linha do arquivo indica um diretório para os pontos de montagem. A primeira coluna é o nome do diretório – que não precisa existir no sistema de arquivos, pois será gerenciado dinamicamente pelo autofs – a segunda coluna é o caminho para o arquivo de configuração específico apra gerenciar as montagens nesse diretório e a terceira coluna são as opções.

Por exemplo:
/auto   /etc/auto.misc  --timeout=30


Vai criar o diretório /auto/ e usar o arquivo /etc/auto.misc para as configurações, com um timeout de trinta (30) segundos.

Digamos que queremos usar o diretório /auto/ para montar disquete, CD-ROM e USB, e queremos que o autofs gerencie o /home/ para montar os homedirs remotos via NFS. Usaremos /etc/auto.misc para o /auto/ e o /etc/auto.home para configurar o NFS:
/auto   /etc/auto.misc  --timeout=30
/home /etc/auto.home --timeout=30


Configuração dos pontos de montagem de recursos locais


Os pontos de montagem locais estarão em /auto/ e serão gerenciados pelo arquivo /etc/auto.misc.

Cada linha é um ponto de montagem. A primeira coluna é o nome do ponto de montagem dentro de /auto/, a segunda coluna são as opções e a terceira é o dispositivo a ser montado.

As opções são as mesmas do comando mount. A única exceção é a opção -fstype, para indicar o sistema de arquivo.

Por exemplo, pra montar o disquete em /auto/floppy/ identificando o sistema de arquivo automaticamente, de modo síncrono, com máscara 0000 e modo 0777:
floppy  -fstype=auto,rw,sync,umask=0,mode=0777  :/dev/fd0


Vamos ao arquivo completo: CDROM, disquete e USB (meu USB é reconhecido como /dev/sda):
cd      -fstype=iso9660,exec,ro                 :/dev/cdrom
floppy -fstype=auto,rw,sync,umask=0,mode=0777 :/dev/fd0
usb -fstype=auto,rw,sync,umask=0,mode=0777 :/dev/sda


Configurações dos pontos de montagem de recursos remotos


Ainda é possível montar diretório remotos via NFS, bastando informar o IP ou nome da máquina antes do nome do dispositivo.

Por exemplo:
remote  -fstype=nfs,rw,async,soft,timeo=60,rsize=8192,wsize=8192    192.168.0.2:/shared


Vai montar o diretório exportado /shared/ de 192.168.0.2 em /auto/remote/. A opção timeo tem prioridade sobre a opção timeout de /etc/auto.master, alterando seu valor apenas para o ponto de montagem em questão.

Para recursos remotos é aconselhável usar blocos maiores que 4KB. No exemplo o bloco é de 8KB.

Mas há uma configuração mais interessante. Digamos que a máquina 192.168.0.2 seja um servidor de usuários e está exportando os homedirs via NFS.

É possível montar somente um ou alguns homedirs de cada vez, não o /home/ todo. Por exemplo, se o usuário blackstar logou, pra que montar também o homedir do usuário slack? Podemos montar apenas o homedir do usuário logado.

E o melhor de tudo: o autofs faz isso automaticamente!

Para tanto o conteúdo de /etc/auto.home será:
*       -fstype=nfs,rw,async,soft,timeo=60,rsize=8192,wsize=8192    192.168.0.2:/home/&


O /home/& indica que não será montado o /home/ todo, mas apenas os subdiretórios solicitados. O campo * na primeira coluna indica que será usado o nome representado por &.

Assim, como /etc/auto.home está gerenciando o diretório /home/, quando o usuário blackstar se conectar, seu diretório será montado como /home/blackstar/, vindo de 192.168.0.2, mas não existirá o diretório /home/slack/ – a menos que o usuário slack conecte.

Iniciando o serviço


Basta agora iniciar o serviço:
/etc/rc.d/rc.autofs start


Se tudo correu bem, você poderá ver os pontos de montagem com o comando:
/etc/rc.d/rc.autofs status


Insira um disquete na unidade /dev/fd0 (A:) e acesse seu conteúdo sem precisar montá-lo:
ls /auto/floppy/


Só um conselho: retire do fstab os pontos de montagem usados pelo autofs. Pode até deixar o fstab gerenciar os mesmos recursos – eles apenas serão montados também nos pontos de montagem do fstab –, mas normalmente não faz muito sentido.

[]'s
Cacilhas La Batalema