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