Por que um arquivo TAR ser menor do que o seu conteúdo?
Pergunta
Eu tenho um diretório Eu estou arquivando:
$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode
Assim, o diretório é 1.4GB. O arquivo é significativamente menor, no entanto:
$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar
Apenas 897mb. Não é comprimida de forma alguma:
$ file oldcode.tar
oldcode.tar: POSIX tar archive
Por que o arquivo tar menor do que o seu conteúdo?
Solução
Você começa uma diferença por causa da forma como o sistema de arquivos funciona.
Em poucas palavras o disco é feito de clusters. Cada cluster tem um tamanho fixo de - digamos Vamos - 4 kilobytes. Se você armazenar um arquivo 1kb de tal 3kb conjunto não for utilizado. Os detalhes exatos variam de acordo com o tipo de sistema de arquivos que você usa, mas a maioria dos sistemas de arquivos funciona dessa forma.
3kb desperdício de espaço não é muito para um único arquivo, mas se você tiver lotes de arquivos muito pequenos resíduos podem tornar-se uma parte significativa do uso do disco.
Dentro do tar-arquivar os arquivos não são armazenados em clusters, mas um após o outro. É aí que a diferença vem.
Outras dicas
Sem ter conhecimento do que tar que você está usando ou que tipo de sistema Unix que você está usando, aqui está o meu palpite: OLDCODE contém vários arquivos menores, que, quando por eles mesmos usam espaço em disco de forma ineficiente, uma vez que o espaço em disco é alocada por alguns tipo de bloco, em vez de byte por byte. No arquivo tar, estão concatenados, e fazer uso máximo do espaço em disco que está atribuído.
Isto tem algo a ver com o tamanho do bloco de seu sistema de arquivos. man 1 du em MacOSX 10.5.6 estados:
O utilitário du exibe o sistema de arquivos o uso do bloco para cada argumento de arquivo e para cada diretório na hierarquia de arquivos enraizada em cada argumento diretório. Se nenhum arquivo for especificado, é apresentado o uso do bloco da hierarquia enraizada no diretório atual.
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 2 mirko wheel 68 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K .
Como você vê até mesmo um arquivo de 2 bytes leva um bloco inteiro de 4KB. Existem alguns sistemas de arquivos que evitem este desperdício de espaço por bloco alocações .
Existem 2 possibilidades.
pequenos arquivos
Muito provavelmente, ele não é menor do que seu conteúdo. Como Nils Pipenbrinck escreveu , du
exibe a quantidade de espaço aloca sistemas de arquivos, que desde os arquivos são armazenados em blocos do sistema de arquivos é mais do que o tamanho lógico do arquivo.
Para exibir o tamanho lógico do arquivo, du --apparent-size
uso. Neste caso, o resultado deve ser menor que o arquivo tar.
Sparse arquivos
arquivos Tar pode armazenar arquivos esparsos. Se o arquivo tar foi criada usando --sparse
, os buracos na arquivos esparsos será gravada, de modo que o tarball poderia ser menor do que o tamanho lógico dos arquivos.
Se a informação sparseness em sua cópia extraído foi de alguma forma perdeu (por exemplo, se você extraiu o tarball em um sistema de arquivos que não suporta arquivos esparsos, ou se era compactado e, em seguida, abriu o zíper, etc.), então df
irá relatar o tamanho expandido.
du contagens de blocos de disco, não o tamanho do arquivo duder.