09.01  
Inicio arrow Resumo do Site arrow Fazendo backup com zfs send / zfs receive via ssh
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histórico da Lista
PC-BSD: Artigos
PC-BSD: Notícias
Galeria de Imagens
Contador Usuários FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS
-
DOC-BR (FUG BR)
Introdução
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usuário

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


Fazendo backup com zfs send / zfs receive via ssh PDF Imprimir E-mail
Por Fernando Buzon Macedo   
10/11/2008
ZFSFiz um pequeno script pra otimizar o processo de backup e manutenção de snapshots em sistema de arquivos zfs, espero que seja útil.

O script começa com alguns macros que informam:

dias="10" (Snapshots com mais de 10 dias no caso serão removidos)
tmp="/tmp" (Não quis chamar o 'zfs list' toda hora pq demora, preferi usar arquivo temporario.)
logdir="/var/log/snap" (arquivo onde serão salvos os logs)

nomepool="prefeitura" (esse é o nome do pool que eu vou trabalhar no servidor de produção)

Também tem essa opção de backup, caso esteja como 'enable' ele vai incrementar os snapshots gerados em um servidor de backup via ssh, só que vc deve usar o acesso ssh entre o servidor de produção e o que receberá o backup com chaves, percebam que eu não uso senha. Caso não esteja enable o script servirá apenas pra gerar novos snapshots e destruir os antigos.

backup="enable"
bkphost="192.168.0.2"

bkppool="backup" (Nome do pool no servidor backup, ja deve estar criado!)      
sshport="2222"         
sshuser="root" 
        

Obs.: O script na verdade é meio burrão, vou explicar... rs

Caso ja tenha snapshots no seu pool e só agora vai passar a utilizar um servidor de backup, o script vai ver que vc ja tem snapshots criados no seu servidor de produção e ja vai pensar que esses snapshots também existam no servidor de backup, sendo assim vai tentar incrementa-los e não vai conseguir, vc, pra não ter trabalho, teria que destruir todos os snapshots do servidor de produção pra que ambos trabalhem em sincronia.

Sarrafo né? mas é assim... rs

 

Segue o script:

Grande abraço a todos!

 

Inicio--------------------------------------------------------------------------------------------------------------------------------------------

#!/bin/sh                                    

dias="10"
tmp="/tmp"
logdir="/var/log/snap"

nomepool="prefeitura"

backup="enable"
bkphost="192.168.0.2"
bkppool="backup"       
sshport="2222"         
sshuser="root"         


#######################################################################################
hoje=`date | awk '{print $3"-"$2}'`                                                    
epoch=`date +%s`                                                                       

hora=`date | awk '{print $4}'`
echo "Inicio $hoje ( $hora )" > $logdir/$hoje.log
echo "" >> $logdir/$hoje.log                     

zfs list -t filesystem > $tmp/zfslist
zfs list -t snapshot > $tmp/snapshotlist

qtd_lista=`cat -n $tmp/zfslist | sed -n '/ /h; $ {x;p;}' | awk '{print $1}'`

b='2'
while [ $b -le $qtd_lista ]; do

pool=`sed "$b,$b!d" $tmp/zfslist | awk '{print $1}'`

#################
if test "$pool" != ""; then

  teste=`grep $pool@ $tmp/snapshotlist`
  if test "$teste" != ""; then        

    seg=`expr $dias '*' 60 '*' 60 '*' 24`
    comp=`expr $epoch - $seg`           

    total=`grep $pool@ $tmp/snapshotlist | cat -n | sed -n '/ /h; $ {x;p;}' | awk '{print $1}'`

    a='1'
    while [ $a -le $total ]; do

      ep_snap=`grep $pool@ $tmp/snapshotlist | sed "$a,$a!d" | awk '{print $1}' | awk -F '@' '{print $2}' | awk -F '_' '{print $2}'`

      if test "$ep_snap" -lt "$comp"; then
        snap=`grep $pool $tmp/snapshotlist | sed "$a,$a!d" | awk '{print $1}'`
        zfs destroy $snap > /dev/null                                        
        echo "Destruido snapshot local $snap" >> $logdir/$hoje.log           
        if test "$backup" = "enable"; then                                   
          destsnap=`echo $snap | sed "s/$nomepool\//$bkppool\//g"`           
          echo "Destruindo snapshot remoto $destsnap em $bkphost (mais de $dias)" >> $logdir/$hoje.log
          ssh -p $sshport $sshuser@$bkphost zfs destroy $destsnap                                    
        fi                                                                                           
      fi                                                                                             

      a=`expr $a + 1`
    done

    a=`expr $a - 1`

    zfs snapshot $pool@"$hoje"_$epoch > /dev/null
    echo "Criado snapshot $pool@\"$hoje\"_$epoch" >> $logdir/$hoje.log

    if test "$backup" = "enable"; then
      if test "$pool" != "$nomepool"; then
        ultimosnap=`grep $pool $tmp/snapshotlist | sed "$a,$a!d" | awk '{print $1}' | awk -F '@' '{print $2}'`
        npool=`grep $pool@ $tmp/snapshotlist | sed "$a,$a!d" | awk '{print $1}' | awk -F '@' '{print $1}' | sed "s/$nomepool\///"`
        echo "Incrementando backup $pool@$ultimosnap com $pool@\"$hoje\"_$epoch em $bkphost $bkppool/$npool" >> $logdir/$hoje.log
        zfs send -i $ultimosnap $pool@"$hoje"_$epoch | ssh -p $sshport $sshuser@$bkphost zfs recv -F $bkppool/$npool >> $logdir/$hoje.log
      fi
    fi

  else

    zfs snapshot $pool@"$hoje"_$epoch > /dev/null
    echo "Criado snapshot $pool@\"$hoje\"_$epoch" >> $logdir/$hoje.log

    if test "$backup" = "enable"; then
      if test "$pool" != "$nomepool"; then
        npool=`echo $pool | sed "s/$nomepool\///"`
        echo "Enviando 1o. backup de $pool@\"$hoje\"_$epoch para $bkphost $bkppool/$npool" >> $logdir/$hoje.log
        zfs send $pool@"$hoje"_$epoch | ssh -p $sshport $sshuser@$bkphost zfs recv $bkppool/$npool
      fi
    fi

  fi

else
  echo "Cade os pools?"
  echo "Cade os pools?" > $logdir/$hoje.log
fi

#################

b=`expr $b + 1`
done

hora=`date | awk '{print $4}'`
echo "" >> $logdir/$hoje.log
echo "Fim $hoje ( $hora )" >> $logdir/$hoje.log

fim---------------------------------------------------------------------------------------------------------------------------------------------- 

 

"O PUNK NUNCA MORRE!"

Comentários
Por Renato em 10/11/2008 17:58:08
Cara você não poderia postar algo sobre a implementação do zfs. 
 
Como você esta usando o zfs raidz ou pool ? 
 
Pf mada umas dicas ai para o pessoal que ta aprendendo ou querendo aprender + sobre o zfs
Por punk em 11/11/2008 11:20:25
Então Renato, me desculpe pela falta de informação, minha intenção nem foi falar do zfs em si. 
Até pensei em escrever alguma coisa pra te ajudar, mas acho que vc vai aproveitar mais dando uma lida na documentação da própria sun, está em português: 
 
http://docs.sun.com/app/docs/doc/820-0447/zfsover-1?l=es&a=view 
 
O ZFS ainda está em desenvolvimento no FreeBSD e por isso nem todos os recursos que vc vai encontrar na documentação da sun são aplicáveis no FreeBSD, mas o básico é o básico e com uma lida nessa documentação vc ja vai entender como funciona. 
 
O andamento do desenvolvimento do ZFS no FreeBSD vc pode acompanhar nesse link: 
 
http://wiki.freebsd.org/ZFS 
 
Particularmente o que me faz mais falta e estou ansioso pra que concluam logo é o suporte a acls. 
 
E também tem mais esse link que fala sobre uns \"ajustes\" que vc pode fazer no FreeBSD para que o ZFS trabalhe melhor: 
 
http://wiki.freebsd.org/ZFSTuningGuide 
 
Eu uso zfs e por enquanto ta filézinho, vou continuar usando! 
Faça uns testes e tire suas próprias conclusões, se precisar de alguma ajuda me da um toque, o que tiver no meu alcance e conhecimento é um prazer ajudar. 
 
abs.
Por Renato em 11/11/2008 17:25:18
Valeu Muito obrigado pela ateção e pelos links. 
Eu não tinha achado em português ainda, já vi alguns sites falando sobre o zfs e algumas implementações mas são bem pobres em teoria e eu não sou fã de ir implementado coisas sem saber de todos os detalhes para não cair em armadilhas 
futuras. 
 
Obrigado e um grande abraço


Comente!*
Nome:
E-mail
Homepage
Título:
Comentário:

Código:* Code

Última Atualização ( 21/11/2008 )
 
< Anterior   Próximo >
FUG-BR - Espalhando BSD
Dicas Rápidas:
O portsclean(1) é uma ferramenta que limpa todo o diretório work/ do ports(7). Além de liberar espaço em disco ele é capaz de remover arquivos antigos que não possuem referência no /usr/ports/distfiles.

#portsclean -C
Limpa o diretorio work/

#portsclean -D

Limpa o diretorio distfiles/

#portsclean -i
Modo interativo, pergunta se você quer remover o arquivo

Recomendado
#portsclean -CDi
 






Wallpapers
Online:
Nós temos 25 visitantes e 1 membro online
  • rafael valim


Devil Store - Sua loja BSD
FreeBSD Brasil LTDA

FUG-BR: Desde 1999, espalhando BSD pelo Brasil.