Hugo Cisneiros (Eitch), hugo arroba devin ponto com ponto br
Versão 4.0, 2006
Índice
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.
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
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 :)
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 | |
---|---|
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 | |
---|---|
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. |