Hugo Cisneiros (Eitch), hugo arroba devin ponto com ponto br
Versão 4.0, 2006

The Linux Manual

8.1. Backup Remoto

Índice

8.1.1. Criando os backups com o comando tar
8.1.2. Transferindo o backup via FTP
8.1.3. Transferindo arquivos via SSH

Nem sempre as pessoas pensam em backup, só quando acontece alguma coisa com seu sistema. Um backup sempre é bom, mesmo que for bem simples. Nesta seção, vou apresentar algumas formas de se fazer backup de arquivos do sistema Linux, opcionalmente armazenando estas cópias em um servidor remoto via FTP e SSH. Com isso os administradores de redes podem centralizer os backups em uma máquina, para depois armazenar ou em uma fita dat, CD-ROM, DVD, ou seja lá o que for.

8.1.1. Criando os backups com o comando tar

Para fazer os backups, utilizaremos o clássico comando tar, que serve justamente para isso: armazenar arquivos em um arquivo. Vamos primeiro criar um exemplo de arquivo de backup:

tar -cf maquina-backup-full-20030212.tar /etc /var/named /var/log
bzip2 maquina-backup-full-20030212.tar

O que fiz foi armazenar os arquivos dos diretórios /etc, /var/named e /var/log no arquivo maquina-backup-20030212.tar, e depois compactá-lo no formato bzip2 (uma compactação melhor, mas que requer mais processamento), gerando então o arquivo maquina-backup-20030212.tar.bz2. Este mesmo comando pode ser feito em uma linha só:

tar -jcf maquina-backup-full-20030212.tar.bz2 /etc /var/named /var/log

Com este arquivo, teremos um backup completo dos três diretórios especificados. Vamos à mais um exemplo:

tar -zcf maquina-backup-full-20030212.tar.gz /etc /var/named /var/log
tar -zcf maquina-home-full-20030212.tar.gz /home

Aqui eu criei dois arquivos. Um arquivo contém o backup que criamos anteriormente, e outro arquivo terá o backup do diretório /home, ou seja, o diretório dos usuários do sistema. A diferença aqui é que eu usei a opção z e não a j. Isso quer dizer que o tar vai usar o programa gzip ao invés do bzip2.

Agora vamos supor que eu alterei o conteúdo do diretório /etc, adicionando um arquivo chamado teste e modificando o arquivo crontab. Para não ter que fazer um backup total novamente, eu posso incrementar este backup somente com as modificações feitas. Para isso eu utilizo o seguinte comando:

find /etc /var/named /var/log -mtime -1 -type f -print | \
tar zcvf maquina-backup-incremental-20030212.tar.gz -T -

Aqui o comando find vai procurar por arquivos modificados numa faixa de 1 dia (usado para backups incrementais diários) e armazená-los no arquivo maquina-backup-incremental-20030212.tar.gz. Vejamos agora um backup feito com os arquivos modificados numa faixa de uma semana:

find /etc /var/named /var/log -mtime -7 -type f -print | \
tar zcvf maquina-backup-incremental-20030212.tar.gz -T -

Agora se você quiser automatizar e poupar trabalho, use para a nomeação do arquivo o comando date, gerando assim a data no arquivo. Veja o exemplo dessa compactação:

# tar zcf backup-full-`date +%Y%m%d`.tar.gz /etc
# ls

backup-full-20030212.tar.gz

8.1.2. Transferindo o backup via FTP

Agora que você já aprendeu a fazer os backups, vamos armazená-lo remotamente. Eu assumo que você já tenha configurado um servidor FTP em outra máquina, se você ainda não fez isso, faça. Depois adicione um usuário com uma certa senha para acessar este ftp. Aqui no tutorial vamos usar como usuário: backup e como senha: segredo. Utilize o seguinte script para automatizar o processo:

#!/bin/bash
#
DATA=`date +%Y_%m_%d`

# Dados do arquivo de backup
MAQUINA="sakura"
ARQUIVO="backup-full-$MAQUINA-$DATA.tar.gz"
DIRETORIOS="/etc /var/log"

# Dados do servidor FTP
HOST_FTP="192.168.0.1"
USUARIO_FTP="backup"
SENHA_FTP="segredo"

# A partir daqui não precisa mais editar.
# Cria o arquivo .tar.gz no /tmp (Temporário)
cd /tmp
tar zcf /tmp/$ARQUIVO $DIRETORIOS

# Acessa o FTP e coloca os arquivos
ftp -in <<EOF
   open $HOST_FTP
   user $USUARIO_FTP $SENHA_FTP
   bin
   lcd /tmp
   dele $ARQUIVO
   put $ARQUIVO
   bye
EOF

# Remove os arquivos temporarios
rm -rf /tmp/$ARQUIVO

Exemplo 8.1. Script para backup remoto de dados via FTP

Pronto! Lembre-se de proteger este arquivo aos olhos alheios, porque a senha do usuário do FTP está visível. Este pequeno script shell cria um backup dos diretórios /etc e /var/log, conecta ao servidor FTP e envia o arquivo. Você só precisará alterar as variáveis do começo do arquivo para as suas necessidades.

Outro método para transferir via ftp é utilizar o comando lftp caso esteja disponível. Com o lftp você pode substituir a parte do script anterior que contém o comando ftp por isso:


lftp -c "open ftp://$USUARIO_FTP:$SENHA_FTP@$HOST_FTP:/tmp && dele $ARQUIVO && \
         put $ARQUIVO"

Com isso você terá o backup remoto que precisar. Modificando o script você pode criar também backups incrementais e junto com o crontab (Seção 4.4, “Agendando tarefas com o crontab”), pode programar para as máquinas ficarem fazendo backups diários, semanais, mensais, ou como você quiser. Lembre-se sempre que os backups uma vez na máquina remota, devem ser colocados por segurança em uma mídia como Fita DAT ou CD-ROM. Cabe à você decidir :)

8.1.3. Transferindo arquivos via SSH

O SSH permite você acessar máquinas remotamente, e seus dados trafegam criptografados. Além disso, ele também permite transferir arquivos pelo protocolo e isso dá uma segurança ainda maior para seus backups, na hora de transferí-los remotamente. Para trasnferir o arquivo de backup para a máquina remota, utilize o comando:

scp arquivo.tar.gz usuario@host:/diretorio

O programa irá lhe perguntar a senha do usuário do host remoto. Indique-a e o arquivo será transferido.

[Nota] Nota

Devido ao arquivo estar sendo transferindo de forma criptografada, o seu sistema utilizará um pouco mais de processador para criptografar os dados para a máquina remota. O mesmo acontece com o servidor remoto, que precisa descriptografar para receber o arquivo.

Agora um truque legal: Supomos que você queira compactar e jogar um backup em uma máquina remota, sem ter que compactar primeiro na sua máquina (gastando espaço) e depois transferir para a máquina remota. Você pode fazer tudo isso de uma vez com um truque shell:

tar zcf - diretorio | ssh usuario@host "cat > backup.tar.gz"

Isso irá compactar em bzip2 (parâmetro do tar: z)o diretório diretorio e mandar o arquivo remotamente com o nome backup.tar.gz para a máquina host no diretório home do usuário que se loga (que no caso foi o usuario). Legal né?

E para fazer o contrário:

ssh usuario@hostremoto "zcat < backup.tar.gz" | tar xv

E o backup remoto vai ser restaurado localmente! :)

[Dica] Dica

O SSH sempre pede senha para conectar remotamente (óbvio), mas para automatizar esse processo em shell-scripts, você pode criar chaves de confiança entre máquinas para que elas loguem-se entre si sem necessitar de senha alguma. Consulte a documentação do ssh e outros tutoriais para saber como fazer isso.