Por que duas hierarquias de diretório que estão em sincronia têm tamanhos diferentes?

7

Estou usando o rsync para sincronizar duas pastas

rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/

e diz que tudo está bem, mas os relatórios de destino:

$ du -s path/media/
18335196    site_media/media/

e os relatórios de origem:

$ du -s path/media/
18473500        site_media/media/

Quando eu investigar o problema, todos os arquivos são do mesmo tamanho, mas os diretórios diferem em tamanho. Por quê? Ambos são VM's rodando o Ubuntu, a fonte está no 11.04 e o destino está no 12.04 LTS

Eu entendo por que eles não somam os mesmos números, o que eu gostaria de entender é por que as pastas relatam tamanhos diferentes.

    
por boatcoder 28.06.2012 / 01:43

4 respostas

4

Como são duas VMs diferentes executando diferentes versões principais do Ubuntu, eu suspeitava que o tamanho do bloco do sistema de arquivos fosse o culpado. du informa quanto do disco está sendo usado, não a soma dos tamanhos dos arquivos. Uma distinção sutil, mas importante.

Se você tiver um arquivo com tamanho de 1 byte e o tamanho do bloco for 1 KB, du reportará 1 KB como usado. Se o tamanho do bloco for 4KB, ele reportará 4KB usado. Se esse arquivo for 1025B, ele relataria 2 KB usado para o tamanho de bloco de 1 KB e 4 KB para o 4KB. E se o arquivo for 4097B, ele será relatado como 5 KB no tamanho do bloco de 1 KB e 8 KB no tamanho do bloco de 4 KB.

Esta sequência demonstra esse comportamento:

$ touch foo ; du -h foo
  0B    foo
$ echo -n 1 > foo ; du -h foo
4.0K    foo

Use este comando para mostrar o tamanho do bloco de seus sistemas de arquivos:

tune2fs -l /dev/sda1 | grep -i 'block size'

(Obviamente, substitua /dev/sda1 pelo dispositivo de bloco apropriado.)

Se for diferente, há sua discrepância.

A melhor maneira de verificar a exatidão do rsync é agrupar seus arquivos e comparar. Aqui está um exemplo:

find path/media -exec openssl sha1 {} + | sort > ~/hashes

Em seguida, diff os arquivos hashes .

    
por 28.06.2012 / 12:22
2

Existem muitas fontes de diferenças ao usar du . Verifique man para referência. Eu tenho enfrentado esse problema no aix também. No manual, há uma opção --apparent-size , que descreve bem essas diferenças. Além disso, observe o tamanho do bloco para o qual o tamanho é calculado em du (o padrão é 1024 bytes, mas pode variar dependendo do sistema). Você terá que lidar com isso usando um comando que mostre o tamanho exato dos arquivos ( ls ou find ), que foi o jeito que eu usei para resolver isso.

    
por 28.06.2012 / 08:05
1

Outra possibilidade é que rsync --archive flag não preserva hardlinks por padrão. Se você usa links físicos, esse também pode ser seu problema.

    
por 28.06.2012 / 12:28
0

É bem provável que você tenha adicionado e excluído arquivos em seus diretórios por um longo tempo. O espaço de arquivos desvinculados em um diretório é reciclado, mas talvez futuros acréscimos não possam usar esse espaço livre diretamente.

Suponho que você não espelhou todos os links e desvinculações de arquivos que já ocorreram - seria mais fácil para a fonte ter dez ou vinte vezes mais arquivos vinculados e desvinculados do que o destino - e o destino é portanto, não tão fragmentado.

Se você executar algumas calistênicas de diretórios super complicadas, poderá reduzir os tamanhos dos diretórios na origem; pareceria algo assim:

mkdir foo
mv media/* foo
rmdir media
mv foo media

Observe que isso não economizará espaço em disco suficiente para fazer valer a pena. É apenas um brinquedo divertido, se isso ...

    
por 28.06.2012 / 01:52