Como posso determinar se a execução do tar fará com que o disco seja preenchido

19

Se eu executar tar -cvf em um diretório de tamanho 937MB para criar uma cópia facilmente transferível de uma estrutura de pastas profundamente aninhada, corro o risco de preencher o disco com a seguinte df -h output:

/dev/xvda1            7.9G  3.6G  4.3G  46% /
tmpfs                 298M     0  298M   0% /dev/shm

Perguntas relacionadas:

  • Se o disco puder ser preenchido, por que, por exemplo, o Linux (Amazon AMI) e / ou tar fazendo sob o capô?
  • Como posso determinar com precisão essas informações sozinho sem perguntando de novo?
por codecowboy 10.04.2014 / 09:53

5 respostas

22

tar -c data_dir | wc -c sem compressão

ou

tar -cz data_dir | wc -c com compressão gzip

ou

tar -cj data_dir | wc -c com compressão bzip2

imprimirá o tamanho do arquivo que seria criado em bytes, sem gravar no disco. Você pode comparar isso com a quantidade de espaço livre em seu dispositivo de destino.

Você pode verificar o tamanho do próprio diretório de dados, caso uma suposição incorreta tenha sido feita sobre seu tamanho, com o seguinte comando:

du -h --max-depth=1 data_dir

Como já foi respondido, o tar adiciona um cabeçalho a cada registro no arquivo e também arredonda o tamanho de cada registro para um múltiplo de 512 bytes (por padrão). O final de um arquivo é marcado por pelo menos dois registros consecutivos preenchidos com zero. Portanto, é sempre o caso de você ter um arquivo tar descompactado maior do que os próprios arquivos, o número de arquivos e como eles se alinham aos limites de 512 bytes para determinar o espaço extra usado.

Naturalmente, os próprios sistemas de arquivos usam tamanhos de bloco que talvez sejam maiores do que o conteúdo de um arquivo individual; portanto, tenha cuidado ao descompactá-lo; o sistema de arquivos pode não conter muitos arquivos pequenos, embora tenha espaço livre maior que o tamanho do tar !

link

    
por 10.04.2014 / 10:27
5

O tamanho do seu arquivo tar será 937MB mais o tamanho dos metadados necessários para cada arquivo ou diretório (512 bytes por objeto), e preenchimento será adicionado para alinhar os arquivos a um limite de 512 bytes.

Um cálculo muito aproximado nos diz que outra cópia dos seus dados deixará você com 3,4 GB grátis. Em 3,4 GB, temos espaço para cerca de 7 milhões de registros de metadados, assumindo que não há preenchimento, ou menos, se você assumir uma média de preenchimento de 256 bytes por arquivo. Então, se você tem milhões de arquivos e diretórios para o tar, você pode ter problemas.

Você pode atenuar o problema por

  • compactando rapidamente usando as opções z ou j para tar
  • fazendo o tar como um usuário normal para que o espaço reservado na partição / não seja tocado se você ficar sem espaço.
por 10.04.2014 / 10:16
2

tar pode informar sobre o tamanho de seus arquivos com a opção --test :

tar -cf - ./* | tar --totals -tvf -

O comando acima não escreve nada no disco e tem o benefício adicional de listar os arquivos individuais de cada arquivo contido no tarball. Adicionar os vários operandos z/j/xz a qualquer lado do |pipe manipulará a compactação da maneira que você desejar.

OUTPUT:

...
-rwxr-xr-x mikeserv/mikeserv         8 2014-03-13 20:58 ./somefile.sh
-rwxr-xr-x mikeserv/mikeserv        62 2014-03-13 20:53 ./somefile.txt
-rw-r--r-- mikeserv/mikeserv       574 2014-02-19 16:57 ./squash.sh
-rwxr-xr-x mikeserv/mikeserv        35 2014-01-28 17:25 ./ssh.shortcut
-rw-r--r-- mikeserv/mikeserv        51 2014-01-04 08:43 ./tab1.link
-rw-r--r-- mikeserv/mikeserv         0 2014-03-16 05:40 ./tee
-rw-r--r-- mikeserv/mikeserv         0 2014-04-08 10:00 ./typescript
-rw-r--r-- mikeserv/mikeserv       159 2014-02-26 18:32 ./vlc_out.sh
Total bytes read: 4300943360 (4.1GiB, 475MiB/s)

Não totalmente certo do seu objetivo, mas se for para baixar o arquivo, isso pode ser mais importante:

ssh you@host 'tar -cf - ./* | cat' | cat >./path/to/saved/local/tarball.tar

Ou simplesmente copie com tar :

ssh you@host 'tar -cf - ./* | cat' | tar -C/path/to/download/tree/destination -vxf -
    
por 10.04.2014 / 10:17
2

Eu fiz muita pesquisa sobre isso. Você pode fazer um teste no arquivo com uma contagem de palavras, mas não fornecerá o mesmo número de número que um du -sb adir .

tar -tvOf afile.tar | wc -c

du conta cada diretório como 4096 bytes e tar conta diretórios como 0 bytes. Você precisa adicionar 4096 a cada diretório:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096)))

você terá que adicionar todos os caracteres. Para algo que se parece com isso:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096 + $(tar -xOf afile.tar | wc -c) ))

Não tenho certeza se isso é perfeito, já que não tentei arquivos que foram tocados (arquivos de 0 bytes) ou arquivos com 1 caractere. Isso deve te aproximar.

    
por 07.04.2016 / 23:28
1

-cvf não inclui nenhuma compactação, portanto, fazer isso em uma pasta de ~ 1 GB resultará em um arquivo tar de ~ 1 GB (a resposta de Flub tem mais detalhes sobre o tamanho adicional no arquivo tar, mas observe se houver são 10.000 arquivos, isto é apenas 5 MB). Como você tem 4 GB ou mais, você não preencherá a partição.

an easily downloadable copy

A maioria das pessoas consideraria "mais fácil" sinônimo de "menor" em termos de download, então você deve usar alguma compressão aqui. bzip2 agora deve estar disponível em qualquer sistema w / tar, eu acho, então incluir j em seus switches é provavelmente a melhor escolha. z ( gzip ) é talvez ainda mais comum, e existem outras possibilidades (menos onipresentes) com mais squash.

Se você quer dizer, tar usa temporariamente mais espaço em disco na execução da tarefa, tenho certeza de que isso não acontece por alguns motivos, sendo que um remonta a uma época em que as unidades de fita eram uma forma de armazenamento primário e dois sendo que ele teve décadas para evoluir (e tenho certeza de que não é necessário usar espaço intermediário temporário, mesmo se a compactação estiver envolvida).

    
por 10.04.2014 / 10:17