Arquivo de saída gerado pelo tar

2

tar pode ser usado para reunir um diretório inteiro em um único arquivo. Eu tentei com o diretório de amostra sampledir contendo apenas alguns arquivos de texto, sem subdiretórios. Originalmente, o diretório ocupa 52K :

$ du -h sampledir/
52K sampledir/

eu corri

$ tar -cf tararchive.tar sampledir/

e o arquivo gerado é

$ du -h tararchive.tar 
40K tararchive.tar

É menor que sampledir : mas no comando não solicitei nenhuma compactação. Estou me referindo à versão BSD do tar (usado também no Ubuntu).

Então, o que exatamente faz tar ? Ele simplesmente reúne o diretório com todos os seus arquivos, inserindo algum cabeçalho para marcar seu fim e seu começo? Se assim foi, como pode tararchive.tar ser menor que o diretório original, mesmo sem compressão?

    
por BowPark 27.07.2015 / 23:26

1 resposta

8

Isso ocorre porque os arquivos ocupam espaço em incrementos de bloco inteiro. Portanto, se o tamanho do seu bloco for 512 bytes e você tiver um pequeno arquivo de 100 bytes, o tamanho que ele realmente usará será arredondado para o bloco mais próximo - nesse caso, 512. Quando tarring, porque o resultado é um único arquivo, essa ineficiência é reduzido, pois existe apenas um arquivo resultante - o arquivo .tar.

Você pode realmente ver isso em ação se criar 100 arquivos pequenos e ver o tamanho deles como arquivos individuais vs. combinados. A execução dos seguintes comandos criará um diretório com 100 arquivos de byte único e, em seguida, compara o tamanho deles individualmente versus todos combinados em um contra um tarball criado a partir deles.

mkdir tmp_small_file_test
for ((i=0; i<100; i++)); do head -c 1 /dev/zero > tmp_small_file_test/file$i; done
du -sh tmp_small_file_test
#on a 4096 byte block size filesystem this output 404K

cat tmp_small_file_test/file* >>  tmp_small_file_test/all_files_combined
du -sh tmp_small_file_test/all_files_combined
#this output 4.0K

rm -f tmp_small_file_test/all_files_combined
tar -cf tmp_small_file_test.tar tmp_small_file_test
du -sh tmp_small_file_test.tar
#this output 116K

NOTA: como tar tem alguma sobrecarga para armazenar cada arquivo em um tarball, se você selecionar o diretório acima, o arquivo tar não é tão pequeno quanto todos os arquivos combinados, mas ainda é muito menor que o arquivos por si mesmos (pelo menos em um sistema de arquivos com tamanho de bloco 4096).

Se você estiver usando um sistema de arquivos ext3 / ext4, você pode ver o tamanho do bloco usando algo como tune2fs -l /dev/sda1 |grep -i 'block size' (substitua / dev / sda1 qual o sistema de arquivos que você está usando). Isso deve funcionar para o primeiro du acima dividido por 100.

    
por 28.07.2015 / 01:50