sexta-feira, 25 de maio de 2012

Backups com rsync

rsync é uma ferramenta para você fazer backups e sincronizar seus arquivos. (Ele pode ser rodado em várias versões do *nix ).
Uma das limitações do rsync é que ele NÃO pode copiar de um sistema remoto para outro sistema remoto. Se você for fazer isso, então terá de copiar um dos sistemas remotos para o sistema local e depois copiar deste para o outro sistema remoto.
Com o sidux, você pode escolher como iniciar o processo: ou fazendo você mesmo ou via um pacote .deb no Debian sid:

A seguir um pouco do que o rsync pode fazer por você, seguido de alguns exemplos para seus scripts.
O rsync é um programa de back-up rápido e fácil de usar, inclusive para diretórios e arquivos. Isto é alcançado por uma rotina inteligente que verifica que arquivos sofreram alterações; daí, somente esses arquivos são copiados. O rsync usa um utilitário de compressão, o que acelera o processo de cópia (quando configurado com a opção -z). Isso se explica facilmente:
O rsync detecta arquivos e pastas que precisam ser copiados porque algum de seus atributos mudou (por exemplo, data/hora da última modificação ou tamanho do arquivo). Esse processo de seleção é feito muito rapidamente.
Quando o rsync acaba de montar a lista que vai ser usada, a cópia desses arquivos é mais rápida em virtude da rotina de compressão usada no processo. O rsync faz a compressão antes de enviar e descomprime na outra ponta “on the fly”.
O rsync pode copiar arquivos de:

* sistema local para sistema local
* sistema local para sistema remoto
* sistema remoto para sistema local

Ele usa tanto o cliente padrão ssh quanto um daemon rsync rodando no sistema fonte e no sistema de destino. As páginas de manual do rsync dizem que, se você pode usar o ssh no seu sistema, então o rsync também será capaz de usar o ssh.
Uma das limitações do rsync é que ele NÃO pode copiar de um sistema remoto para outro sistema remoto. Se você for fazer isso, então terá de copiar um dos sistemas remotos para o sistema local e depois copiar deste para o outro sistema remoto.
Para dar um exemplo dessa lógica, imaginemos os três sistemas seguintes:

neo – o sistema local
morpheus – um sistema remoto
trinity – outro sistema remoto
 
Você deseja usar o rsync para copiar ou sincronizar umas com as outras, as pastas /home/[user]/Data de todos os sistemas. Cada sistema possui um "dono" específico, portanto cada sistema pode ser usado como "fonte" para os outros dois. Você vai rodar o comando rsync apenas no sistema local, que é o neo:

o usuário principal do neo é cuddles
o usuário principal de morpheus é tartie
o usuário principal de trinity é taylar
 
Então, o que você deseja é copiar ou sincronizar o seguinte:

a área /home/cuddles/Data de neo para morpheus e trinity
a área /home/tartie/Data de morpheus para neo e trinity
a área /home/taylar/Data de trinity para neo e morpheus
 
Como vimos, o rsync NÃO copia de sistema remoto para sistema remoto, o que, no nosso exemplo, vai acontecer entre trinity e morpheus (tanto a fonte quanto o destino são sistemas remotos, conforme nosso esquema acima). Resumindo:

neo --> morpheus – tudo bem, local para remoto
neo --> trinity – tudo bem, local para remoto
morpheus --> neo – tudo bem, remoto para local
trinity --> neo – tudo bem, remoto para local
morpheus --> trinity – não vai funcionar, remoto para remoto
trinity --> morpheus – não vai funcionar, remoto para remoto
 
Para resolver a situação, você terá de alterar um pouco seu esquema:

morpheus --> trinity – torna-se: morpheus --> neo & neo --> trinity
trinity --> morpheus – torna-se: trinity --> neo & neo --> morpheus
 
Este é um passo extra, mas como esses arquivos iriam para neo de qualquer forma, é só uma questão de alterar a fonte. Isso assegura que nossos back-ups serão confiáveis, pois nada ficará de fora.
Ao rascunhar seu processo de cópia, não se esqueça de levar em conta essa limitação do rsync.
Como usar hostnames com hostnames com rsync
Conforme descrito acima, usar neo, morpheus ou trinity na tradução de um endereço IP físico, é uma maneira limpa e fácil de tornar as coisas mais legíveis. Ser capaz de usar aqueles hostnames é muito fácil.
Você vai precisar de editar o arquivo /etc/hosts e adicionar os hostnames e os endereços IP a eles relacionados. Aqui está uma pequena parte das linhas de cima do arquivo /etc/hosts, mostrando as traduções:

192.168.1.15  neo
192.168.1.16  morpheus
192.168.1.17  trinity
 
A primeira linha traduz o endereço IP 192.168.1.15 para o nome “neo”, o segundo endereço, 192.168.1.16, para o nome “morpheus” e a última linha, o endereço 192.168.1.17 para o nome “trinity”. Após adicionar as linhas acima e salvar o arquivo, você estará apto a usar o "nome" ao invés do endereço IP, o que não o impede de usar os endereços IP, se quiser. O que faz esse método brilhar é quando um sistema tem seu endereço IP mudado. Por exemplo, digamos que neo muda seu endereço IP de 192.168.1.15 para 192.168.1.25:
Se todos seus scripts usam endereço IP, você precisa localizá-los e mudá-los para o novo endereço. Se, por outro lado, seus scripts usam o "nome", tudo que você tem a fazer é mudar o arquivo /etc/hosts para refletir a mudança. Isso pode ser uma mão na roda quando você tiver muitos scripts para conexões remotas com os outros sistemas, ou vice-versa. O método por “nome” também faz com que seus scripts sejam mais fáceis de ler e seguir porque, ao invés de números, eles usam nomes reconhecíveis associados aos IPs.

rsync e as duas maneiras de usá-lo

 

Uma maneira é “push” (empurrar) os arquivos para um destino e a outra maneira é “pull” (puxar) os arquivos da fonte. Ambas têm suas vantagens e desvantagens. Vamos dar uma olhada em cada uma delas (nesta explanação, vamos assumir que um dos sistemas é local e o outro, remoto. Assim fica mais fácil você entender a terminologia).
“push” - As fontes para os arquivos e pastas estão no sistema local e o destino é o sistema remoto. O rsync roda no sistema local e "empurra" seus arquivos para o destino.
Vantagens:

* Você pode ter mais de um sistema fazendo cópias de si mesmo para o sistema de destino.
* O processo de back-up é distribuído por todos os sistemas de computadores, ao invés de ter apenas um carregando o piano.
* Se um sistema for mais rápido que os outros, ele pode terminar mais cedo e passar a fazer outras coisas.
Desvantagens:
* Se você usa um script agendado no cron, você terá de atualizar e fazer mudanças nos crontabs de cada sistema, bem como atualizar múltiplas versões de seu script.
* Seu back-up não tem como saber se a partição do sistema de destino está montada ou não, portanto você corre o risco de estar copiando para nada na outra ponta.
“pull” - Os arquivos e pastas a copiar estão no sistema remoto e o destino é o sistema local. O rsync é executado no sistema local e "puxa" os arquivos do sistema fonte.
Vantagens:
* Um sistema é convertido para ser o servidor, controlando todos os back-ups para todos os outros sistemas: back-ups centralizados.
* Se você usa um script, ele fica em apenas um sistema, tornando fáceis os processos de atualizar e modificar. Sem falar que você precisa ter o controle de um único arquivo crontab para agendar o script.
* Seu script pode checar e, se necessário, montar a partição de destino.
Sintaxe do rsync, conforme suas páginas de manual: [SRC=Source=Fonte]
       rsync [OPÇÃO]... SRC [SRC]... DEST

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

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

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

       rsync [OPÇÃO]... SRC

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

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

       rsync [OPÇÃO]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
Exemplo de comandos rsync:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups
/morpheus/home

Vamos dar uma olhada em algumas partes do comando:

a fonte caminho/arquivo é: morpheus:/home/tartie
e o destino é: /media/sda7/SysBackups/morpheus/home
 
Tudo que estiver em /home/tartie... será copiado para /media/sda7/SysBackups/morpheus/home, que ganhará mais uma pasta:

/media/sda7/SysBackups/morpheus/home/tartie...
 
É preciso deixar claro que o único motivo para /tartie ficar na /home é que isso foi estabelecido no sistema de DESTINO e NÃO por causa da FONTE. A "fonte" somente seleciona de onde os arquivos vêm, não para onde vão. O "destino" é que diz ao rsync onde colocar os arquivos vindos da "fonte". Veja o seguinte exemplo:

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo
 
No comando acima, apenas a pasta /files e seu conteúdo serão copiados para a pasta de destino /neo - e não isto: /media/sda7/SysBackups/neo/home/user/data/files
Lembre-se de levar isso em consideração ao criar comando de back-up no rsync.
Explicação das opções:
-a - usada no modo de arquivamento. Explicação nas páginas de manual: “em termos gerais,
 uma maneira de fazer back-up recursivamente e preservar 'quase' tudo”. Mencionam ainda que
a opção não preserva hardlinks devido à complexidade do processo. 
A opção -a é descrita como sendo equivalente ao seguinte: -rlptgoD, que significa:
  -r = recursivo – processa subpastas e arquivos encontrados dentro da "fonte"
  -l = links – quando links simbólicos são encontrados, recria-os no "destino"
  -p = permissões – diz ao rsynk que as permissões do destino serão iguais às da fonte
  -t = times (hora) – diz ao rsynk que a hora a ser aposta nos arquivos do destino será a mesma 
da hora da fonte
  -q = quiet (discreto) – diz ao rsynk que a saída seja mínima
  -o = owner (dono) – diz ao rsync que, se estiver rodando como root, os donos dos arquivos 
copiados
para o destino deverão ser os mesmos da fonte.
-D = equivalente a usar estes dois comandos: --devices --specials
 --devices (dispositivos) = faz com que o rsync transfira arquivos de caractere e blocos de 
dispositivos
para o sistema remoto recriar esses dispositivos. Infelizmente, se você não incluir
também --super no mesmo comando, o efeito será nulo
 --specials (especiais) = faz com que o rsync transfira arquivos especiais, como os sockets e 
fifos
-g - usada para preservar o "grupo" dos arquivos fonte no destino
-E - usada para preservar "executável" dos arquivos fontes no destino
-v - usada para aumentar a quantidade de informações mostradas. Quando tiver certeza de
estar copiando o que você quer, o “v” pode ser removido
-z - usada para comprimir os dados a ser copiados;com essa opção o processo de cópia
toma muito menos tempo, porque o arquivo a ser transferido é menor do que seu tamanho real
--delete-after (apagar depois)= apaga arquivos/pastas no destino que não estiverem mais na 
fonte DEPOIS
da transferência, não ANTES. Este “after ('depois')” é usado em caso de problemas ou de um
travamento e o “delete ('apagar')” é usado para remover os arquivos do destino que não mais
existem no sistema fonte, não apagados em nosso destino, ocupando espaço desnecessariamente
--exclude (excluir)= é usado um padrão para excluir arquivos e/ou pastas do back-up. No
exemplo, --exclude=“*~” excluirá do back-up TODO e QUALQUER arquivo ou pasta cujos nomes 
terminam
com o caractere “~”. Apenas um padrão pode ser usado com a opção
--exclude, portanto se você precisar de mais de um, você terá de entrar com linhas adicionais
na linha de comando.
 
Outras opções úteis:

-c – adiciona outro nível de checagem entre a fonte e o destino após o back-up,
o que acaba por tornar todo o processo mais lento. Como o rsync já faz essa comparação
durante o processamento, essa opção não foi incluída por ser meramente uma forma de redundância 
--super – segundo descrição de suas páginas de manual, com essa opção o sistema de destino
tentará atividades de superusuário, isto é, o root.
--dry-run – simula uma transferência. É como usar a opção -s com o
apt-get install ou apt-get dist-upgrade.
O restante de nossos comandos são os arquivos/pasta da fonte e nossa pasta de destino.
Exemplos:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups
/morpheus/home

Este comando vai copiar todos os arquivos e pastas dentro de /home/tartie no sistema traduzido com o nome "morpheus”, e colocá-los em /media/sda7/SysBackups/morpheus/home – sem incluir a árvore de diretórios da pasta tartie.

rsync -agEvz --delete-after --exclude=”*~” /home/tartie neo:/media/sda7/SysBackups/morpheus
/home

Este comando é o contrário do exemplo anterior. Ele vai "puxar" a pasta /home/tartie, com seu conteúdo e suas subpastas para o sistema chamado neo na mesma pasta – lembre-se que um sistema é considerado remoto quando tem “:” (dois pontos) na frente de seu caminho.

rsync -agEvz --delete-after --exclude=”*~” /home/cuddles /media/sda7/SysBackups/neo/home

Este comando faz uma cópia de local para local. Perceba que não há ":" (dois pontos) nem na fonte nem no destino. O comando vai copiar localmente /home/cuddles para o mesmo sistema e pasta /media/sda7/SysBackups/neo/home.
Vejamos como é um 'exclude' múltiplo:

rsync -agEvz --delete-after --exclude=”*~” --exclude=”*.c” --exclude=”*.o” "/*" /media/sda7
/SysBackups/neo

O comando acima faz um back-up de TUDO no diretório raiz (/) do sistema local, com todos os seus arquivos e pastas e coloca-os no local de destino /media/sda7/SysBackups/neo – só que, agora, ele vai excluir todo arquivo e toda pasta que terminar em “~”, “.c”, ou “.o”
Abaixo damos exemplo de um comando que deve ser evitado, pois resulta em erro. O exemplo é de um comando de sistema remoto para sistema remoto:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie trinity:/home

Como já mencionamos antes, trata-se de uma limitação do rsync.
Um último exemplo: vejamos como fica o rsync de um sistema remoto para um local, se substituirmos nossos "nomes" pelos seus respectivos endereços IP.
O primeiro comando é com o método de "nome" e o segundo é o mesmo comando, desta vez com o endereço IP:

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups
/morpheus/home
rsync -agEvz --delete-after --exclude=”*~” 192.168.1.16:/home/tartie /media/sda7/SysBackups
/morpheus/home

Como dissemos anteriormente, você não é obrigado a usar o método de "nomes", mas, no primeiro exemplo, você pode ler o que está sendo feito de maneira muito mais fácil que no segundo.
Agora você já deve ser capaz de montar um comando simples, seja a partir dos exemplos dados, seja fazendo misturas e combinações dos comandos mostrados, até conseguir o que você precisa.

Copiando arquivos com o robocopy

O robocopy pode ser utilizado de várias maneiras para copiar arquivos entre computadores, ou mesmo entre dispositivos de armazenamento.

 Para copiar o conteúdo de uma pasta para outro local basta utilizar o comando:

robocopy origem destino

Se quiser incluir as subpastas deve-se acrescentar a opção /s:
robocopy origem destino /s

Pode ser utilizado para se fazer mirror de uma pasta, ou seja, ter dentro dela o mesmo conteúdo de uma outra pasta. Para isso, utiliza-se a opção /mir

robocopy origem destino /mir

O robocopy pode também copiar apenas determinados tipos de arquivos.
Caso se queira copiar apenas os arquivos de música para um mp3 player, por exemplo:

robocopy origem destino /s  *.mp3 

Lembrando que o ele só vai copiar os arquivos novos e os modificados, os arquivos que já existem na pasta de destino não serião copiados novamente.
Porém, pode-se também fazer o robocopy não copiar arquivos com determinados critérios.
Por exemplo, não copiar os arquivos extras (arquivos que não existem no destino):

robocopy origem destino /s /xx *.mp3 

Não copiar os arquivos mais novos e mais antigos (arquivos que foram modificado na origem ou destino):

robocopy origem destino /s /xn /xc /xo *.mp3 

Não copiar os arquivos maiores que 5MB (5242880 bytes), nem os menores que 5KB (5120 bytes):

robocopy origem destino /s /max:5242880 /min:5120 *.mp3 

É possível também excluir da lista de arquivos a serem copiados determinadas pasta ou arquivos. Por exemplo, não copiar a pasta variados nem o arquivo audio1.mp3

robocopy origem destino /s /xd variados xf audio1.mp3 *.mp3 

Uma das grandes vantagens do robocopy é a capacidade de continuar a transferência de um arquivo incompleto, para tanto basta adicionar a opção /Z. Porém em alguns casos não é possível usar o modo reiniciável, por isso há também um outro modo de cópia, o de backup (opção /B). É recomendavel é usar a opção /ZB para que o robocopy tente utilizar o modo reiniciável e, caso o acesso ao arquivo seja negado, usar o modo backup.
Apenar o robocopy não possuir uma opção de sincronização de mão-dupla (copiar modificações em ambos os sentidos), pode-se utiliza-lo para esse propósito. Basta executar dois comandos de cópia, utilizando as opções a seguir:

robocopy pasta1 pasta2 /xc /xo *.*
robocopy pasta2 pasta1 /xc /xo *.* 

Porém deve se levar em consideração que neste caso o robocopy não copia arquivos que mudaram de tamanho mas não tiveram suas data de modificação atualizada.
Para facilitar o uso o robocopy ainda permite que a opções sejam salvas para que possam ser utilizadas posteriormente. Para salvar as opções de cópia utiliza-se a opção /save: seguido do nome do arquivo. Para utilizar as opções salvar utiliza-se a opção /job: seguido do nome do arquivo. Ex:

robocopy pasta1 pasta2 /xc /xo /save:copia1 *.* 
robocopy pasta2 pasta1 /job:copia1

Ao salvar as opções de cópia ele também salva o caminho das pastas que foram utilizadas. Portanto, se vc precisa usar o mesmo comando de cópia muitas vezes utlizando as mesmas opções e as mesmas pastas, basta salva-las e utilizar /nosd e /nodd para dizer ao programa que deve ser utilizado as pasta que foram salvas no arquivo. Ex:
robocopy pasta1 pasta2 /xc /xo /save:copia1 *.* 
robocopy /nosd /nodd /job:copia1



Exemplo que utilizo para copiar arquivos pela rede.

ROBOCOPY \\SERVIDOR\Dados E:\Dados /MIR /MT:10 /Z /R:2 /W:2 /COPYALL

MIR = Espelho o que está no servidor A no B (Se houver algum arquivo no destino que não exista na origem ele será apagado)
MT:10 = copia 10 arquivos em paralelos ao invés de um
/z = recomeçar de onde parar o processo de cópia se houver problemas
R:2 = Se houver falha na cópia de algum arquivo duas tentativas serão realizadas
W:2 = com intervalos de 2 segundos.
COPYALL = Copia todos os atributos dos arquivos data/hora/, permissões e etc