Antes de iniciar, um esclarecimento:
As idéias do presente artigo foram usadas para eliminar um evento local (provavelmente associado a estrutura da rede). Em outros ambientes, com estrutura semelhante (sistemas operacionais e programas idênticos) não ocorram os eventos abaixo descritos. Antes, nunca me deparei com um evento dessa natureza envolvendo o compartilhamento
NFS. Enfatizo que essa solução (baseada em "
Shell Script") foi usada para solucionar um evento isolado. Porém, afirmo que sempre que posso, sempre que se apresenta uma oportunidade, me aproveito das funcionalidades que o "Shell Scrip" proporciona.
Já me deparei com outros eventos onde o uso de "Shell Script" orientou a decisão. Vou comentar mais uma situação. Num laboratório, um dos equipamentos começou a apresentar um comportamento anômalo. A máquina liga sozinha. De tempos em tempos. Aparentemente sem critério.
Fiz o script para investigar a frequência do evento.
#!/bin/bash
who | grep user
a=$(echo $?)
if [ "$a" -ne 0 ]
then
echo O computador ligou indevidamente em $(date). >> /root/ligou.log
shutdown -h now
else
echo Em $(date) o computador está em uso. >> data.log
fi
O evento ainda persiste. Agendei (o script acima) no
Cron com a frequência de execução (de 5 em 5 minutos). Se o equipamento ligar e o usuário "user" não logar, a consequência é "shutdown -h now". Mais tarde os logs do script mostraram que o evento não merece ser considerado.
Feito os esclarecimentos.
Outro dia tive que desligar os equipamentos devido a manutenção da rede elétrica no laboratório.
Quando liguei os equipamentos os compartilhamentos NFS não foram efetivados.
As máquinas clientes-nfs subiram antes dos server's. Mais tarde repeti (várias vezes) o procedimento de desligamento e/ou suspensão dos servidores NFS e o evento se repetiu.
Para eliminar o evento, programei um “Shell Script” para montar, monitorar e gerar logs do compartilhamento NFS. Tudo automáticamente.
Para ilustrar, abaixo está (somente) o esquema do compartilhamento NFS entre o cliente 192.168.0.5 e os server's:
/etc/exports em server1
/var/local/compartilhamento1 192.168.0.5(rw,async,no_root_squash)
/etc/exports em server2
/home/upload 192.168.0.5(rw,async,no_root_squash)
/etc/fstab em cliente-nfs
192.168.0.30:/var/local/compartilhamento1 /mnt/compartilhamento1 nfs users,exec 0 0
192.168.0.41:/home/upload /mnt/compartilhamento2 nfs users,exec 0 0
O “Shell Script” z-montar
Durante a leitura ficará claro a escolha do nome z-montar.
Características: monta, monitora e gera logs dos compartilhamentos NFS da seguinte forma:
1) se o servidor está disponível:
...1a) então verifica se há compartilhamentos (NFS) quebrados (#termo criado em analogia aos links quebrados);
...1b) senão verifica se os compartilhamentos estão montados;
......1b1) então executa a montagem dos compartilhamentos;
......1b2) senão prossegue.
#/bin/bash
#server1 ip 192.168.0.30
ping -c 3 192.168.0.30
a=$(echo "$?")
if [ "$a" -ne 0 ]
then
echo "**********************************************************************"
echo "**********************************************************************"
echo "O server1 está desligado em $(date)." >> /root/log_cron_nfs
echo "**********************************************************************"
echo "**********************************************************************"
echo "Desmontando um posível compartilhamento quebrado em $(date)."
echo "**********************************************************************"
umount -f -l /mnt/compartilhamento1 > /dev/null
echo "**********************************************************************"
echo "**********************************************************************"
else
echo "**********************************************************************"
echo "**********************************************************************"
echo "O server1 está ligado"
echo "**********************************************************************"
echo "Verificando se o compartilhamento está montado"
echo "**********************************************************************"
mount | grep '^192.168.0.30'
c=$(echo "$?")
if [ "$c" -ne 0 ]
then
echo "**********************************************************************"
echo "**********************************************************************"
echo "Não há compartilhamento montado"
echo "**********************************************************************"
mount -t nfs -o soft 192.168.0.30:/var/local/compartilhamento1 /mnt/compartilhamento1
else
echo "**********************************************************************"
echo "Compartilhamento oki"
echo "**********************************************************************"
fi
fi
# server2 ip 192.168.0.41
ping -c 3 192.168.0.41
b=$(echo "$?")
if [ "$b" -ne 0 ]
then
echo "**********************************************************************"
echo "**********************************************************************"
echo "O server2 está desligado em $(date)." >> /root/log_cron_nfs
echo "**********************************************************************"
echo "Desmontando um posível compartilhamento quebrado"
echo "**********************************************************************"
umount -f -l /mnt/compartilhamento2 > /dev/null
echo "**********************************************************************"
echo "**********************************************************************"
else
echo "**********************************************************************"
echo "O server2 está ligado"
echo "**********************************************************************"
echo "Verificando se o compartilhamento está montado"
echo "**********************************************************************"
mount | grep '^192.168.0.41'
d=$(echo "$?")
if [ "$d" -ne 0 ]
then
echo "**********************************************************************"
echo "Não há compartilhamento montado"
echo "**********************************************************************"
mount -t nfs -o soft 192.168.0.41:/home/upload /mnt/compartilhamento2
else
echo "**********************************************************************"
echo "Compartilhamento ok"
echo "**********************************************************************"
fi
fi
Comentando o script z-montar
Com o comando "ping -c 3 ip", comando ping para enviar somente 3 pacotes verifica se os server's (server1 e server2) estão na disponíveis na rede.
Na sequencia armazena na (variável "a") a saída do comando $(echo $?). Ou seja, se o comando $(echo $?) foi executado com sucesso a (variável "a") recebe zero. Caso contrário a (variável "a") recebe valor diferente de zero.
O (teste "$a" -ne 0) do if é avaliado positivo quando o valor da (variável "a") é diferente de zero (-ne = not equal to) significando que o servidor está indisponível (ping sem sucesso, retorno do comando $(echo “$?”) diferente de zero).
Desta forma é executado o comando:
echo "O server server1 está desligado em $(date)." >> /root/log_cron_nfs
A saída do comando echo "O server server1 está desligado em $(date)." é redirecionada (>>) para o arquivo de log (/root/log_cron) cuja função é identificar com o comando $(date) quando os servers caíram e quanto tempo o serviço ficou fora de produção.
Na sequência é executado o comando:
umount -f -l /mnt/compartilhamento1 > /dev/null
para desmontar um possível compartilhamento (NFS) quebrado.
Constatei o travamento. Acessei os pontos de montagem antes de desligar os servidores NFS). Para desmontar os compartilhamentos só usando o comando umount com os parâmetros -f e -l. Trata-se de um parâmetro do comando umount que habilita o lazy unmount. O redirecionamento para /dev/null manda as mensagens [de erro] para o buraco negro do
Linux.
Depois acrescentei a opção soft na montagem dos clientes para garantir que os compartilhamentos não travem.
"/etc/fstab" em cliente-nfs (ip 192.168.0.5):
192.168.0.30:/var/local/compartilhamento1 /mnt/compartilhamento1 nfs users,exec,soft 0 0
192.168.0.41:/home/upload /mnt/compartilhamento2 nfs users,exec,soft 0 0
Fonte:
O (teste "$a" -ne 0) do if é avaliado negativo quando a (variável"a") recebe valor igual a zero [lembre-se (-ne = not equal to)] significando que o servidor está disponível (ping com sucesso).
Desta forma, prosegue, verificando se os compartilhamentos estão montados com o comando:
mount | grep '^192.168.0.30'
A saída do mount é canalizada pelo tubo (|) ao grep, que por sua vez filtra as linhas onde há ocorrência do ip 192.168.0.30 no início da linha (^).
Na sequência armazena na (variável "c") a saída do comando $(echo $?). Ou seja, se o comando foi executado com sucesso a (variável "c") recebe zero. O retorno sem sucesso atribui a (variável "c") valor diferente de zero.
O (teste "$c" -ne 0) do (segundo) if é avaliado positivo quando o valor da (variável "c") é diferente de zero (-ne = not equal to) significando que o compartilhamento não está montado (ou seja, não há ocorrência do ip 192.168.0.30 na saída do comando “mount | grep '^192.168.0.30'”).
Continuando, é executado o comando: mount -t nfs -o soft 192.168.0.30:/var/local/compartilhamento1 /mnt/compartilhamento1.
O (teste "$c" -ne 0) do (segundo) if é avaliado negativo quando o valor da (variável "c") é igual a zero (-ne = not equal to) significando que o compartilhamento está montado (há ocorrência do ip 192.168.0.30 na saída do comando “mount | grep '^192.168.0.30'”).
Assim o script é concluído para o primeiro ponto de montagem associado ao server1 e continua (no padrão acima explicado) a execução para o server2.
Observações:
A execução do comando “echo $?” apresenta o valor 0 (zero) se o comando anterior foi executado com êxito. Se não ocorreu exito na execução do comando anterior é apresentado valor diferente de zero na execução co comando “eho $?”.
O símbolo $( ) em $( echo “$?” ) prioriza a execução do echo antes de atribuí-lo à variável.
Os procedimentos usados nos testes foram:
Removi as entradas do /etc/fstab (na máquina cliente-nfs que responde pelo ip 192.168.0.5) referente aos pontos de montagens dos compartilhamentos NFS;
Desativei na máquina server1 e server2 o servidor NFS (Se preferir desligue os servidores).
Abri um terminal no cliente-nfs e digitei tail -f /root/log_cron_nfs para verificar as mensagens enquanto o servidores NFS estavam inacessíveis.
Salvei o script com o nome z-montar (com as devidas permissões) em "/etc/init.d" em "/etc/rc2.d" há um link "S99rc.local", o último a ser executado até então.
Para garantir o o scritp z-montar vai ser o último a ser executado na inicialização executei o comando:
# ln -s /etc/init.d/z-montar /etc/rc2.d/S99z-montar
Agendei o
crontab com a entrada:
*/1 * * * * root /etc/init.d/z-montar
Mais observações:
Pode-se optar por deixar o controle do script somente através do cron, (sem colocá-lo na inicialização);
Verificar com o pessoal rede se o tráfego gerado decorrente da execução do script é nocivo;
Se for considerado nocivo:
A frequência do ping pode ser alterada para 1 (aqui usei 3);
A frequência com que o cron executa o scritp pode ser alterada, nos testes usei execução de 1 em 1 minuto.
Se nada disso for suficiente não dá prá implementar. (he he he).
É isso.
Opa!!! Só mais um detalhe.
Exigiu-se mais trabalho para comentar o script do que para escrever o script.
Fui.
Fontes
Shell Script:
Servidor NFS: