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
[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).