Criando backup tar multi-volume usando FIFO
Dica publicada em Linux / Comandos
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
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
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.