Criando backup tar multi-volume usando FIFO

Publicado por Davidson Rodrigues Paulo em 26/12/2006

[ Hits: 16.329 ]

Blog: http://davidsonpaulo.com/

 


Criando backup tar multi-volume usando FIFO



Recentemente, precisei realizar um backup completo de um servidor que possuía vários GB de arquivos.

No entanto, o sistema de arquivos da máquina era Ext3 com suporte a arquivos maiores que 2 GB desabilitado, ou seja, o HD não aceitava a criação de arquivos maiores que 2 GB.

Como o meu backup era bem mair que isso, precisei pensar em uma forma de dividir o arquivo de backup em vários arquivos menores. Eu sabia que poderia fazer isso com o split, o problema é que eu precisaria primeiro gerar o backup completo, para só depois dividi-lo em arquivos menores, o que não podia ser feito.

Eu precisava de uma forma de gerar o backup e dividi-lo em arquivos de 2 GB em um único processo. Pensei um pouco, e então lembrei de algo que eu já havia utilizado em outras situações em que precisei reduzir o número de etapas necessárias para a execução de um procedimento: o FIFO.

Primeiramente, criei um FIFO dentro do diretório /root:

# cd /root
# mkfifo teste.fifo


Em seguida, rodei o comando split para dividir o arquivo teste.fifo em pedaços de 2000 MB cada, usando o prefixo backup-servidor-full.tar-:

# split -b 2000m teste.fifo backup-servidor-full.tar.gz-

Em seguida, rodei o comando tar para fazer o backup e grava-lo no arquivo teste.fifo:

# tar cpf teste.fifo /diretorio1 /diretorio2 /diretorio3 ... /diretorion

E pronto, tudo certinho. Os arquivos de backup foram sendo criados à medida que seu tamanho atingia 2 MB: backup-servidor-full.tar-aa, backup-servidor-full.tar-ab etc.

Agora, a explicação: um FIFO (siga de "First In, First Out", ou Primeiro a Entrar, Primeiro a Sair) é um arquivo especial que funciona como uma ponte entre 2 processos que trabalham gravando e lendo arquivos, respectivamente, permitindo que um processo possa manipular a saída de outro, em tempo real.

Quando eu executei o comando split, instruí a ele que dividisse o arquivo teste.fifo em arquivos de 2000 MB cada um. No entanto, o arquivo teste.fifo estava vazio, logo, a lógica nos diz que o split deveria encerrar imediatamente, certo? No entanto, o que acontece é que, quando um processo qualquer começa a manipular um FIFO, ele fica aguardando indefinidamente até que o FIFO comece a enviar dados.

Nesse nosso exemplo, os dados que queremos que o split processe estão no backup gerado pelo comando tar. Então, só precisamos fazer com que o tar crie um backup, gravando a saída no arquivo teste.fifo. Dessa forma, toda a saída gerada pelo tar será enviada diretamente para o split, com a diferença que tanto o tar quanto o split não "enxergarão" um ao outro, pois "pensarão" estar ambos manipulando um arquivo.

Como isso aqui é só uma dica, não vou me prolongar na explicação sobre FIFO e suas aplicações. Se você achou interessante, procure informações na internet.

Obrigado pela atenção.

Davidson Paulo

Outras dicas deste autor

Compilando aBiblia Software para Linux Fedora 9 e Zenwalk 5.2

Resolvendo problemas de dependências das bibliotecas do X

Baixando todos os arquivos de uma URL com o wget

urlmenor.com: acabe com as URL's quilométricas

Liberando acessos ao ldconfig com SELinux enforced

Leitura recomendada

Programas úteis para modo texto

Ajustando data e hora com NTP

Ajustando data e hora no Slackware com NTP

Exemplos de uso do comando SCP

Medindo o tempo de resposta de cada step de API/SITE no terminal

  

Comentários
[1] Comentário enviado por jrcmilanez em 02/01/2007 - 15:46h

para funcionar tudo de uma vez, primeiro crie o arquivo teste.fifo conforme apresentado.

depois, execute:

# split -b 2000m teste.fifo backup-servidor-full.tar.gz- | tar -czvf teste.fifo /diretorio1 /diretorio2 /diretorio3 ... /diretorion

para além de incluir ao mesmo tempo, adicionar os arquivos comprimidos.

[2] Comentário enviado por claudioveronezi em 08/01/2007 - 08:26h

amigo.. como faz pra voltar o backup??? funciona com o comando dd ??

Att.
Cláudio Veronezi Mendes
Londrina PR

[3] Comentário enviado por davidsonpaulo em 08/01/2007 - 09:26h

Claudio,

Para restaurar o backup, utilize o cat para enviar para o tar todos os pedaços de arquivo como se fossem um arquivo só, da seguinte forma:

# cat pedaço1 pedaço2 pedaço3 ... pedaçoN | tar xpf -

O "-" diz ao tar para ele manipular os dados vindos da entrada-padrão, e não de um arquivo (entrada-padrão, no caso, diz respeito aos dados enviados pelo comando cat através do pipe "|").

O FIFO pode, em teoria, ser usado com quaisquer comandos que manipulem arquivos (como tudo no mundo, deve haver exceções). Imagino que com o dd não haja problema em utilizá-lo, os procedimentos devem ser os mesmos citados nessa dica, bastando subtituir o tar pelo dd. Recomendo a você fazer o teste e postar os resultados aqui, para compartilhar a experiência com a comunidade.

Grande abraço

[4] Comentário enviado por fonsaca em 01/04/2008 - 14:46h

A sua dica é muito útil, mas pra funcionar vc tem que saber qual o tamanho final do arquivo compactado, no meu caso eu tenho um ponto montado em NFS e o limite também é 2gb, não tenho espaço na HD para realizar o backup inteiro pra ver qto vai dar pra depois criar os arquivos FIFO. Então sugiro utilizar desta forma:

tar -cf - /diretorio/*|split -b 2000m - /media/unidade_nfs/t.tar.gz

sendo:

/diretorio/* = a pasta que vai ser compactada, no caso inteira *
/media/unidade_nfs/t.tar.gz = arquivo de destino

o comando split quebra o arquivo em partes definidas pelo parâmetro:

-b 2000m = 2gb

Desta forma ele vai criando os arquivos a medida que forem necessários.

Para descompactar, use o comando cat para unir os arquivos e use o tar para descompactar normalmente.

Abraço a todos

[5] Comentário enviado por sandrocarva em 03/10/2008 - 15:35h

Muito boa sua dica, me ajudou em um problema.. mas agora estou com outro, talves possa me ajudar... Tenho 16Gb de arquivos pra gravar em DVD, segui sua dica, criei arquivos de 4.7GB nao consegui gravar no disco, recriei os arquivos que agora estao com 4.5GB mas ainda nao consigo gravar com o growisofs. estou utilizando o comando:
growisofs -Z /dev/hdd -R -J /dados/backup.tar.gz-aa
Retorna o erro: "mkisofs: Value too large for defined data type"

Alguma outra dica??

Grato.

[6] Comentário enviado por Diede em 16/07/2009 - 10:49h

Para quem estiver com o mesmo problema que o colega acima, a questão é que um DVD-5 tem 4.7GB, só que contados como se 1GB fosse 1 bilhão de bytes.
Ou seja, tem na verdade 4.38GB (ou GiB, no caso).



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts