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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top