Backups com rsync
Autor: Tarcio Santos | Publicado: 2012-05-25T08:05:00-07:00




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
&nbsp;
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
&nbsp;
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
&nbsp;
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 --&gt; morpheus – tudo bem, local para remoto
neo --&gt; trinity – tudo bem, local para remoto
morpheus --&gt; neo – tudo bem, remoto para local
trinity --&gt; neo – tudo bem, remoto para local
morpheus --&gt; trinity – não vai funcionar, remoto para remoto
trinity --&gt; morpheus – não vai funcionar, remoto para remoto
&nbsp;
Para resolver a situação, você terá de alterar um pouco seu esquema:

morpheus --&gt; trinity – torna-se: morpheus --&gt; neo &amp; neo --&gt; trinity
trinity --&gt; morpheus – torna-se: trinity --&gt; neo &amp; neo --&gt; morpheus
&nbsp;
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
&nbsp;
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


&nbsp;
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
&nbsp;
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...
&nbsp;
É 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
&nbsp;
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&nbsp;
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&nbsp;
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&nbsp;
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&nbsp;
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&nbsp;
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&nbsp;
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.
&nbsp;
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.