Montando, monitorando e gerando logs dos compartilhamento NFS automaticamente

O script z-montar monta, monitora e gera logs dos compartilhamentos NFS automaticamente. Deve estar configurado nos clientes. Como todo monitoramento do sistema, pode ser configurado para iniciar imediatamente após o carregamento do sistema ou através de agendamento no cron (ou ambos, se preferir).

[ Hits: 13.106 ]

Por: Luiz Alberto em 05/06/2011


Introdução



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:
   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Lendo as permissões dos arquivos Linux

OpenSSH - Debian Lenny - CentOS 5.5 - Slackware 13.1

Virtualização dos sistemas operacionais: CentOS, Debian, Slackware e Ubuntu

Leitura recomendada

Simples e rápido: matando todos os processos de um usuário

Introdução ao Shell Script (parte 2)

Shell Script para WEB

Explorando a entrada de dados com READ em Bash Shell

Algoritmos em Shell Script

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts