sexta-feira, 20 de novembro de 2009

Script de Backup

Como havia comentando o post passado estava com problema na execução de um script (ver post rsync). A solução foi surpreendente e conforme vai passando os anos, fico mais impressionado com o mundo *NIX.

bom o problema ja discuti no post anterior, agora vou postar o script rodando perfeitamente em meu sistema, gostaria de chamar a atenção para o comando "rev", achei muito legal, e foi esse comando que resolveu meu problema. 

sem mais delongas, aqui vai o script.

#!/bin/bash
#************************************************

#Script Criado com o proposito de backupear remotamente o servidor Shiva atraves
# do comando rsync.
#------------------------------------------------ # Criacao.........Amilcar de Jesus Moreti
# Data Criacao....05 de Agosto de 2009
# Versao..........1
# Release.........1
# E-Mail..........ajmoreti@yahoo.com.br
# MSN.............acmoreti@msn.com
# Skype...........ajmoreti
#------------------------------------------------*
# LOCAL
#------------------------------------------------*
dirBkp="/backupsrv"
dumpFile="/dumpFiles"
dateBkp=`date +%A`
#------------------------------------------------*
# BACKUP SERVERS
#------------------------------------------------*
nomServer="shiva deva vishnu mozart"
dirshiva="/etc /home /lean /ordensProd /otimizador /pcp /qualidade /sgq /srf"
dirdeva="/etc /usr/local/bin /totvs/apo/logix /totvs/bin/appserver /root/.odbc.ini"
dirvishnu="/etc /usr/informix /usr/local/bin"
dirmozart="/etc /coml /home /usr/local/bin /srv"
dirisis=""
dirosiris=""
for nServer in ${nomServer}
do
        dirServer="$dirBkp/$nServer"
        if [ ! -d $dirServer ]
        then
                mkdir $dirServer
        fi

        listExclude="/usr/local/bin/${nServer}ListExclRsync"
        for sDir in $(eval echo \$dir${nServer})
        do
                rsync -C \
                -D \
                --recursive \
                --update \
                --links \
                --perms \
                --acls \
                --xattrs \
                --dirs \
                --owner \
                --group \
                --times \
                --verbose \
                --progress \
                --partial \
                --numeric-ids \
                --specials \
                --exclude-from=$listExclude \
                $nServer:$sDir $dirServer
dumpDir="$dumpFile/$nServer"
                if [ ! -d $dumpDir ]
                then
                        mkdir $dumpDir
                fi

                if [ ! -d $dateBkp ]
                then
                        mkdir $dumpDir/$dateBkp
                else
                        rm $dumpDir/$dateBkp/*.tar.gz
                fi
                newVar=`echo $sDir | rev | awk -F/ '{print $1}' | rev`
                tar -zcvf $dumpDir/$dateBkp/$newVar.tar.gz /$dirServer/$newVar --atime-preserve -p --remove-files
        done
done

Rsync

Saudações a todos!!!

Hoje deveria continuar a falar sobre o LVM, porem vou continuar outro dia, o meu grande problema no momento é com backup, é que venho desenvolvendo um script para criar backup de um servidor de arquivos em shell, porem me deparei com um problema na hora de targear esses arquivos.
Esse backup estou fazendo com o rsync porem percebi que ele nao salva o nome em path absoluto e sim relativo, exemplo: 

/usr/local/bin ele grava como bin.
declarei uma variavel tipo array dirBkp="/usr/local/bin /totvs/bin/appserver /totvs/apo/logix"

for i in ${dirBkp}
do
echo $i
done

/usr/local/bin
/totvs/bin/appserver
/totvs/apo/logix

tar -zcvf /backupsrv/$dirBkp.tar.gz

deu para perceber o problema né, o codido do script entenderia o seguinte:

/backupsrv/totvs/apo/logix/.tar.gz

e isso causa um erro, bom o que vou garimpar agora é uma solução para esse problema, ou atraves do comando rsync ou atraves de qualquer outra solução.

vou começar pelo rsync.

Name
rsync  - rapido, versatil à distancia (e local), ferramenta de copia de arquivos
Sinopse

Local:  rsync [OPÇÃO...]  SRC.... [DEST]

Acesso via remote shell:
pull:    rsync [OPÇÃO...]   [USER@]HOST::SRC...[DEST]
push: rsync [OPÇÃO...] SRC... [USER@]HOST:[DEST]

Acesso via rsync daemon: 

pull: rsync [OPÇÃO...]  [USER@]HOST::SRC... [DEST]
        rsync [OPÇÃO...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

push: rsync [OPÇÃO] SRC... [USER@]HOST::DEST
          rsync [OPÇÃO] SRC... rsync://[USER@]HOST[PORT:]/DEST

Usos, com apenas um arg SRC e sem arg DEST ira listar os arquivos de origem, em vez de copar.

Descrição 
Rsync é um rapido e extraordinariamente versatil ferramenta de copia de arquivos. Ele pode  copiar localmente, para / de outro host atraves de qualquer shell remoto, ou para / de um daemon rsync remoto. Ele oferece  um grande numero de opções que controla cada aspecto de seu comportamento e permite a especificação muito flexivel do conjunto de arquivos a serem copiados. É famoso por seu delta algoritmo de transferencia, o que reduz a quantidade de dados enviados pela rede atraves do envio so das diferenças entre os arquivos de origem e os arquivos existentes no destino. Rsync é amplamente utilizado para backups e espelhamentos e como um comando de copia melhorada para uso diario.

Rsync encontra arquivos que precisam ser transferidos usandouma verificação rapida "algoritmo" (por padrão) que procura por arquivos que foram alterados no tamanho ou no tempo da ultima modificação. Quaisquer mudanças em outros atributos preservada (tal como solicitado por opções) são feitas no arquivo de destino diretamente, quando a rapida verificação indica que os dados do arquivo não precisa ser atualizado.

Alguns dos recursos adicionais do rsync são:

  • suporte para ligações de copia, dispositivos, proprietarios, grupos e permissões
  • excluir e excluir-de opções semelhantes para o GNU tar
  • CVS excluir um modo de ignorar os mesmos arquivos que o CVS ignoraria
  • pode usar qualquer shell remoto, incluindo ssh ou rsh
  • não requer previlegios de super-usuario
  • pipelining de transferencia de arquivos para minimizar os custos de latencia 
  • apoio anonimo ou atenticado pelo rsync (ideal para espelhamento)
Geral

Rsync copia arquivos de ou para uma maquina remota ou localmente no host atual (ele nao suporta copiar arquivos entre dois hosts remotos).
Ha duas maneiras diferentes para o rsync manter contato com  um sistema remoto: usando um programa shell remoto como o transporte (como o ssh ou rsh) ou contatando um daemon rsync diretamente via TCP. O transporte do shell remoto é utilizado sempre que o caminho de origem ou de destino contem um dois-pontos simples (:) depois de uma especificação de acolhimento. Comunicar-se com um daemon rsync diretamente acontece quando a origem ou o caminho de destino contem um duplo dois-pontos (::) depois de um separador de especificação de acolhimento ou quando um rsync://URL é especificada.
Como um caso especial, se um argumento de uma unica fonte é especificado sem um destino, os arquivos serão listados em um formato de saida similar a "ls -l"

Se nem a origem ou o caminho de destino especificar uma maquina remota, a copia ocorre localmente (ver também a lista de opção)
Rsync refere-se ao lado do local como o "cliente" e o lado remoto como "servidor". Não confunda "servidor" com um daemon rsync - daemon é sempre um servidor, mas um servidor pode ser um deamon ou um processo remoto shell gerado.

Uso
Voce usa o rsync da mesma forma que voce usa o RCP. Voce deve especificar uma origem e um destino, uma das quais pode ser remota.

talvez a melhor maneira de explicar a sintaxe esta com alguns exemplos:

rsync -t *.c foo:src/

isto seria transferir todos os arquivos que correspondem ao padrao *.c do diretorio atual para o diretorio src na maquina foo. Se algum dos arquivos ja existentes no sistema remoto, o protocolo de atualização rsync remoto é utilizado para atualizar o arquivo, enviando apenas as diferenças. 

rsync -avz foo:src/bar data/tmp

Tal transferencia recursivamente todos os arquivos do diretorio src/bar na maquina foo para o diretorio data/tmp na maquina local.


até mais, depois continuo o artigo.

quinta-feira, 12 de novembro de 2009

Gerenciamento Avancado de discos com LVM

Depois de umas boas ferias de volta ao trabalho :-D , e nesse artigo quero falar sobre LVM

O Assunto e bastante extenso, mas vale a pena tratar esse assunto, levando em consideração que hoje o LVM é um assunto muito difundindo, mas que as vezes por falta de informação acaba deixando de ser usada.

O LVM (Logical Volume Manager) é um "Gerenciador de Volumes Logicos", muito flexivel, e sua implementação no Linux segue os mesmos padrões do HP-UX, então esse artigo servira tambem para o HP-UX.

O que muda no HP-UX, é que para saber quais são os discos que vamos utilizar, utiliza-se o comando:

# ioscan -fC disk

Quando começamos a instalação de um novo servidor, geralmente ja temos em mente qual  sera a sua aplicação, a partir dai, definimos os file systems, o tamanho deles, discos, etc.

Como nem tudo é perfeito, no meio do percurso o servidor pode precisar de mais discos, ou mais partições, ou ainda aumentar as partições, enfim, sao varias as possibilidades que podem ocorrer com um servidor depois de instalado, mas como fazer isso da melhor maneira possivel e sem traumas?

A resposta esta no LVM, utilizo o LVM desde quando começei a trabalhar com HP-UX, e gostei muito da flexibilidade da ferramenta, hoje em Linux os servidores que instalo, utilizo 100% LVM.

Entendendo os conceitos do LVM:

O LVM e um sistema gerenciador de discos que permite o particionamento dos discos atraves do tratamento de grupo de volumes, volumes logicos e volumes fisicos.

O administrador do sistema deve entender os conceitos de: partições fisicas, volumes fisicos, particoes logicas, volumes logicos, grupos de volumes e como eles se relacionam uns com os outros.

Partições Fisicas (PX - Physical Extent)
É a menor unidade de alocação de espaço em disco. São segmentos do mesmo tamanho em um determinado volume fisico. O tamanho da partição fisica é determinada em bytes e pode estar na faixa de 1 a 256 mbytes, sendo que o default é 4 mbytes e o nº maximo de particoes fisicas em um disco é 65.535.
Volume Fisico (PV - Physical Volume)
É um disco fixo fisicamente acoplado ao computador com um identificador unico.
/dev/sda   e   /dev/sdb

dependendo da tarefa que vai executar com LVM, o sistema utilizara o arquivo especial bloco ou caractere.

Partições Logicas (LX - Logical Extent)
São alocadas sobre as partições fisicas.
Uma partição logica corresponde a uma, duas ou tres partições fisicas dependendo do espelhamento que se tenha escolhido.

Volume Logico (LV - Logical Volume)
São grupos de informações localizadas em volumes fisicos ( uma coleção de partições logicas). Um volume Logico representa uma file system.
Os dados em um volume logico parecem ser continuos (para o usuario), mas podem estar de forma não continua no volume fisico. Isso permite a um file system paginar espaços, realocar espaços e permite tambem a interligação de multivolumes fisicos.

Volume logicos podem ser alterados, extendidos, listados, criado e removidos. O tamanho de um volume logico é determinado pelo numero das partições logicas (PX).

Os nomes dos volumes logicos são identificados pelos nomes dos arquivos especiais:

/dev/vgnn/[r]volx

Por default, x inicia com valor 1 e é incrementado na ordem em que os volumes são criados dentro de cada grupo de volumes, não impedindo que o administrador escolha um nome para o volume logico.

Grupo de Volume (VG - Volume Group)
É uma coleção de 1 à 32 volumes fisicos de tamanho e tipo variado e com um nome (vgnn).
Quando se adiciona um volume fisico a um grupo de volumes, o volume fisico é particionado em unidades continuas de mesmo tamanho (partições fisicas). Essas partições fisicas herdam o tamanho das partições fisicas ja definidas no grupo.

Após a instalação, do sistema HP-UX  e Linux com LVM  o sistema fica com um grupo de volume "/dev/vg00", podendo-se então criar os volumes logicos para distribuir o espaço em disco. Qualquer outro volume fisico que for conectado ao sistema pode ser adicionado ao grupo de volumes root, ou em um outro grupo de volumes. Neste caso o novo nome sera vgnn, onde nn sera um numero sequencial a partir de 1.

O diretorio "/dev" contem o diretorio do grupo de volume com os respectivos arquivos especiais que representam os volumes logicos do grupo. Contem tambem o arquivo especial "group" o qual fornece, à estrutura de dados LVM, informações sobre o grupo de volume.

O numero maximo de volumes logicos (file system) para um grupo de volumes é de 255, mas o limite, na verdade, é determinado pelo tamanho dos volume fisico atribuido ao grupo de volume.

Gerenciando Volumes Logicos

O gerenciador de volume logico é  um nivel de software entre a aplicação e o hardware, que controla os recursos do disco fixo, pelo mapeamento dos dados entre o armazenamento fisico e o logico. Os 2 aspectos do gerenciador de volume logico sao:
  • Armazenamento fisico (Physical Storage)
    Especifica onde os dados residem.
  • Armazenamento logico (Logical Storage)
    Controla quais dados serão apresentados para  o usuario e como eles serao apresentados. O armazenamento dos dados podem estar continuos, expandidos; podem estar interligados a multiplos discos; e serem replicados (copiados, reproduzidos). Essas caracteristicas suprem o usuario de incrivel disponibilidade dos dados e gerenciamento flexivel dos subsistemas do disco fixo.
O armazenamento logico (Logical Storage) é mapeado para o armazenamento fisico quando o gerenciador de volumes logicos faz referencia a dados representados na partição logica. O volume logico pode interligar Volumes alocados sobre partições fisicas dentro do volume group. Uma partição logica é feita em cima de 1, 2 ou particações fisicas (dependendo do numero de copias)

Os volumes fisicos disponiveis (disco fixo) conectados ao sistema podem ser agrupados em um ou mais volumes group. O usuario ve cada volume group como um set de um ou mais volumes logicos. O HP-UX usa volumes logicos separados, com propositos especificos como; swap, sistema de arquivos, dados de boot ou armazenamento de dump.

Volumes fisicos são dividos em unidade de tamanho igual, chamadas partições fisicas (PX). Existem de uma a tres partições fisicas por partições logicas, dependendo do nº de copias. As partições fisicas são agrupadas dentro das partições logicas que compreendem o volume logico.

Realocação de blocos ruins (Bad Block)
A substituição de blocos de disco dentro de um grupo de volume é configuravel. Esse tipo de realocação não é suportada por todos os discos.
Quando o LVM detecta um erro de leitura corrigivel (soft error) ele pode regravar os dados corrigindo esse erro, de outra forma ele aplicara o tratamento de erro não corrigivel (Hard error).

Quando ocorre um "Hard error" o LVM realoca o bloco usando um pool de blocos de dados que é mantido para esse proposito, direcionando o I/O para esse bloco. Se esta sendo utilizado espelhamento o LVM le os blocos de uma outra copia e entao regrava o bloco realocado. Esse procedimento é completamente transparente para a aplicação. Se não estiver sendo utilizado o espelhamento o LVM retornara um codigo de erro.

Para configurações com controladora de disco inteligente, antes de ocorrer a realocação de software, o drive de disco fisico tenta realocar e regravar o bloco defeituoso. Se obtiver sucesso o drive de disco não mais apresentara o bloco defeituoso e o LVM remove essa indicação ou defeito de sua tabela.

até mais, depois retorno falando de root disk, grupo de volumes root e muito mais.

abraços.