Comando rsync para backup e sincronismo de arquivos no Linux

rsync é uma ferramenta de cópia e sincronização de arquivos e diretórios muito versátil e simples de utilizar. Com o rsync é possível copiar arquivos localmente (no mesmo sistema de arquivos), ou para um outro host na rede utilizando qualquer shell remoto, ou ainda por meio de um daemon remoto do rsync.

O rsync utiliza um algoritmo de transferência de dados que permite enviar apenas as diferenças entre os arquivos enviados e os existentes no destino, desta forma diminuindo a quantidade de dados enviados, e aumentando a performance da transferência. Por isso, é largamente utilizado como ferramenta de backup de dados, assim como comando de cópia normal do dia-a-dia.

O rsync também possui suporte à cópia de links, dispositivos, proprietários, grupos e permissões, além de não necessitar de privilégios de superusuário (root) para realizar seu trabalho.

Para que os dados sejam transferidos com segurança, o rsync assume que um servidor SSH esteja em execução ao menos em um dos hosts onde ocorrerá a transferência de arquivos.

Instalação do rsync

Caso o rsync não esteja instalado nos hosts, instale-o com os comandos a seguir:

Sistemas baseados em Red Hat:

# yum install rsync

Sistemas baseados em Debian:

# apt-get install rsync

Instalando a partir de código-fonte

Caso queria utilizar a versão mais recente do rsync (quando este tutorial foi criado, versão 3.1.2), baixe-a com o comando a seguir:

wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz

Após baixar o pacote, descompacte-o com:

tar -xvzf rsync-3.1.2.tar.gz

Entre no diretório criado:

cd rsync-1.2

Execute o script configure:

./configure

(caso o script configure retorne o erro “no acceptable cc found in $path“, instale o pacote build-essential com apt-get install build-essential, pois um compilador C adequado não foi encontrado no sistema).

Após executar o script configure, execute o comando make:

make

E então, execute make-install:

make-install

Sintaxe básica do rsync

O utilitário rsync pode ser utilizado de várias formas diferentes, como podemos ver nas sintaxes listada a seguir:

rsync [opções] origem destino (local)
rsync [opções] origem usuário@host:destino (modo PUSH, via shell remoto)
rsync [opções] usuário@host:origem destino (modo PULL, via shell remoto)

Opções do rsyn

-a
Modo archive (arquivamento). Copia os arquivos e diretórios recursivamente (como -r) e preserva links simbólicos, permissões de arquivos, propriedades de usuário e grupo (ownership) e timestamps.

-h
Números são representados em formato legível por humanos

-r
Copia dados recursivamente, sem preservar timestamps e permissões ao transferir os dados

-z
Comprimir os dados dos arquivos antes de enviá-los

–progress
Mostrar o progresso da cópia de arquivos ao transferir os dados

-e
Especificar o shell remoto a ser usado (rsh, ssh)

-c, –checksum
Calcula os checksums dos arquivos para verificar se eles são iguais ao transferi-los. Utilizada para verificar a integridade dos dados copiados.

–exclude
Permite especificar arquivos ou diretórios que não devem ser copiados para o destino

–include
Permite especificar arquivos ou diretórios que devem ser copiados para o destino

–delete
Exclui um arquivo ou diretório no destino caso ele não exista na origem

–max-size=TAMk|M|G
Permite especificar o tamanho TAM máximo dos arquivos transferidos. Por exemplo, –max-size=50k significa que somente serão copiados arquivos com no máximo 50kB.

–bwlimit=LIMITE
Permite especificar um LIMITE de largura de banda em kbps ao transferir dados de uma máquina para outra, de modo a não impactar a performance da rede.

-b, –backup
Não sobrescreve arquivos que já existam no destino da transferência, mas os renomeia adicionando um sufixo ~ aos seus nomes, antes de executar a transferência de novos arquivos.

-u, –update
Não sobrescreve nenhum arquivo no destino da transferência que possua uma data posterior (mais recente) à data do arquivo correspondente, na origem.

–remove-source-files
Exclui (apaga) os arquivos no diretório de origem após o término da transferência de dados.

-n
Modo “dry run” – executa uma tentativa de copiar dados sem realmente copiar qualquer arquivo.

-v
Modo verboso, que mostra detalhes sobre a transferência de arquivos.

Exemplos de uso do comando

1 – Copiar ou sincronizar arquivos em uma máquina localmente. Vamos copiar o arquivo de nome /etc/passwd para o diretório /Backup, comprimindo dados:

$ sudo rsync -zvh /etc/passwd /Backup/

Se o diretório de destino não existir, será criado pelo próprio rsync. A compressão de dados, na verdade, não é necessária quando copiamos arquivos dentro de um mesmo sistema de arquivos, por conta da performance da transferência dos dados.

2 – Copiar ou sincronizar um diretório na máquina local. Vamos copiar o diretório /home/fabio completo para o diretório /Backup/, preservando os atributos e permissões dos arquivos:

$ sudo rsync -avh /home/fabio /Backup/

Se for acrescentada uma barra ao diretório de origem (/home/fabio/), seu conteúdo será copiado para o destino sem no entanto criar o diretório de nome fabio.

Veja o resultado da cópia executando o comando tree:

$ tree /Backup

3 – Copiar ou sincronizar arquivos e diretórios para ou de um servidor na rede. Vamos copiar/sincronizar um diretório da máquina local, como o meu home (/home/fabio) para um servidor na rede, que possui um diretório /home/fabio/Backup e cujo IP é 192.168.1.104. O usuário no host remoto é fabio:

$ rsync -avz /home/fabio [email protected]:/home/fabio/Backup/

Note que será pedida a senha do usuário no servidor remoto, no caso o fabio.

Se você precisar efetuar o login remoto como usuário root, deve habilitar essa opção no arquivo de configuração do ssh no servidor, que é o /etc/ssh/sshd_config. Abra esse arquivo com seu editor de textos favorito, com privilégios de administrador, e altere a seguinte linha:

De:

PermitRootLogin without-password

Para:

PermitRootLogin yes

Salve e saia do arquivo, e então reinicie o serviço do ssh:

# service ssh restart

Agora você poderá efetuar a cópia via rsync sobre ssh usando a conta de root.

4 – Vamos fazer o contrário agora. Iremos copiar/sincronizar o diretório remoto /home/fabio/Backup no servidor 192.168.1.104 para a máquina local, no diretório /home/fabio/Documentos:

rsync -avzh [email protected]:/home/fabio/Backup /home/fabio/Documentos/

Também será pedida a senha do usuário remoto (fabio no exemplo).

5 – Vamos efetuar a cópia de todos os arquivos e diretórios cujos nomes comecem com a letra ‘h’ do diretório local /etc para o diretório remoto /home/fabio/Backup no servidor 192.168.1.108, excluindo (não copiando) todo os demais arquivos e diretórios de /etc/:

rsync -avz --include 'h*' --exclude '*' /etc/ [email protected]:~/Backup

–exclude ‘*’  indica que vamos excluir da cópia todos os arquivos e diretórios, exceto os indicados pelo parâmetro –include.

6 -Vamos fazer o backup do diretório /home/fabio/ para o diretório /home/fabio/Backup no servidor de rede, cujo IP é 192.168.1.104. Como esse backup já foi realizado anteriormente, se algum arquivo no diretório local tiver sido excluído, ao realizar a transferência dos arquivos tal arquivo também será excluído na pasta do servidor, automaticamente (sincronismo).

rsync -av --delete /home/fabio/ [email protected]:/home/fabio/Backup

7 -Idem anterior, porém copiando apenas os arquivos que tenham 10kB ou menos de tamanho. Não serão copiados diretórios, e vamos assumir que o diretório corrente é o diretório de origem dos arquivos.

rsync -hv --max-size='10K' ./* /home/fabio/meubackup

8 – Efetuar backup do diretório /etc local no diretório /home/fabio/Backup do srvidor remoto, mostrando o progresso da cópia dos arquivos:

rsync -avh --progress /etc/ [email protected]:/home/fabio/Backup

9 – Vamos copiar o conteúdo do diretório da rede /home/fabio/Backup para o diretório local /home/fabio/Documentos, apagando os arquivos na origem (remota) após a transferência dos dados:

rsync -avh --remove-source-files [email protected]:/home/fabio/Backup/ /home/fabio/Documentos/

10 – Vamos copiar de volta para o servidor o conteúdo do diretório local /home/fabio/Documentos, porém sem no entanto executar a transferência dos arquivos e diretórios pra valer. Usaremos a opção de dry run (-n) para que o rsync teste essa transferência e retorne o resultado que ocorreria se ela fosse realmente executada:

rsync -avhn /home/fabio/Documentos [email protected]:/home/fabio/Backup/

Omitindo a opção -n, a cópia dos arquivos será efetivada:

rsync -avh /home/fabio/Documentos [email protected]:/home/fabio/Backup/

Bônus: 11 – Verificando as diferenças entre origem e destino

Vamos executar novamente o sincronismo de arquivos e diretórios do diretório local para o remoto, como no exemplo #9, porém visualizando as diferenças existentes entre os arquivos na origem e no destino dos dados (opção -i):

rsync -avhi /home/fabio/Documentos [email protected]:/home/fabio/Backup/

Na saída serão mostrados diversos caracteres em uma coluna à esquerda dos nomes de arquivos e diretórios. O significado desses caracteres é o seguinte:

< indica que um arquivo está sendo transferido para o host remoto (enviado).

> indica que um arquivo está sendo transferido para o host local (recebido).

f indica que se trata de um arquivo.

d indica que se trata de um diretório

c indica que está ocorrendo a criação ou alteração de um item, como a criação de um diretório

s ocorreu alteração no tamanho.

h indica que se trata de um hard link para outro item

. indica que o item não será atualizado

L indica um symlink

D indica um dispositivo

S indica arquivo especial, como um socket nomeado ou um fifo.

t existe alteração no timestamp.

o proprietário alterado

g grupo alterado.

Existem muitas outras opções do comando rsync. Para conferi-las, acesse as páginas de manual ou ajuda do utilitário com man rsync ou rsync –help

Rolar para cima