Geralmente queremos fazer um backup e copiar para uma máquina na rede, mas dispomos de pouco espaço na máquina onde estão os dados ou simplesmente não queremos ocupar espaço para não gerar carga desnecessária. Uma solução é utilizar o tar e ssh com redirecionamento da saída.
Adaptado do artigo
Compactando diretórios e transferindo via pipe por SSH do usuário
Jefferson Diego.
O servidor de backup do local onde eu trabalho possui um robô de backup controlado por um programa chamado
Veritas Netbackup.
Recentemente este robô deu problema. Saímos então em busca de soluções para backup.
Concentrei meus estudos em ferramentas open source e pensei se seria possível construir um script de backup eficaz e eficiente. Eficaz no sentido de funcionar, e eficiente no sentido de não gerar carga na máquina que continha os dados originais.
Uma solução aceitável seria montar em cada máquina uma unidade de rede para onde os dados iriam. Assim seria necessário criar um script em cada máquina para copiar os dados a serem salvos para essa unidade de rede.
Outra solução encontrada foi utilizar o tar com o ssh para que apenas o servidor de backup executasse os scripts. É essa solução que apresento.
O comando é bem simples:
ssh user@host "tar -cf - <conteúdo a ser salvo> | bzip2 -9vv" | cat > arquivo_destino.tar.bz2
Ou então:
ssh user@host "tar jcvf - <conteúdo a ser salvo>" | cat > arquivo_destino.tar.bz2
A primeira linha eu adaptei do artigo original. O autor utiliza o tar separado do bzip2, provavelmente porque com o bzip2 a saída pode ser refinada e também para melhorar a compressão dos dados. Mas as duas funcionam.
Não se esqueça de adaptar o código para sua necessidade, substituindo:
- user pelo usuário;
- host pela máquina cliente;
- <conteúdo a ser salvo> pelo caminho absoluto do conteúdo;
- arquivo_destino.tar.bz2 pelo nome do arquivo de destino;
Utilizamos o ssh para executar um comando na máquina cliente.
O comando a ser executado é a compactação do arquivo.
Através do pipe, redirecionamos a saída para o programa cat na máquina local.
Assim temos o conteúdo listado na máquina local.
Com o redirecionamento para o arquivo_destino.tar.bz2, conseguimos obter o arquivo compactado.
Se você fizer a cópia de apenas um arquivo dentro do diretório, o tar criará toda a árvore de diretórios em que o arquivo está contido.
Por exemplo, suponha que o arquivo que queremos copiar está em /home/diretorio. Se utilizarmos o comando acima, o arquivo criado, ao ser descompactado, criará a árvore home/diretorio dentro do diretório corrente. Para evitar isso, utilize a opção -C, assim:
ssh user@host "tar -jcvf - -C /home/diretorio <conteudo a ser salvo>" | cat > temp.tar.bz2
Ex.: Temos o arquivo temp.ext2 (um arquivo formatado como sistema de arquivos ext2 que contém arquivos e diretórios). Ele está na pasta /home/testes. Sendo assim, fazemos:
ssh root@192.160.0.1 "tar -jcvf - -C /home/testes temp.ext2" | cat > temp.tar.bz2
No servidor de backup, descompactamos o arquivo:
tar jxvf temp.tar.bz2
temp.ext2
Para verificar, basta utilizar o comando md5sum no lado cliente e no lado servidor, gerando a soma MD5 para os arquivos temp.ext2 tanto do cliente quanto do servidor.
Nenhum comentário foi encontrado.