Estou muito confuso com isso. Para fazer algumas experiências com o GlusterFS eu criei duas máquinas virtuais com o VirtualBox, rodando o Ubuntu 12.04, cada uma com 10GB de armazenamento. Eu escrevi um script que criou muitos pequenos arquivos em muitas pastas. Cada arquivo tinha 100k de dados aleatórios gerados por:
dd if=/dev/zero of=#{name} bs=1 count=0 seek=100K
Ao copiar os arquivos de uma máquina para outra, o destinatário fica sem espaço. O que deveria ter sido impossível, já que ambos são do mesmo tamanho e eu não guardei nada neles. Tentando descobrir o que estava errado, encontrei uma situação realmente confusa. Tudo isso está na máquina de origem.
De acordo com o df, estou usando apenas 26% do espaço:
root@revisionist:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/revisionist-root 9.2G 2.3G 6.5G 26% /
udev 237M 4.0K 237M 1% /dev
tmpfs 50M 292K 49M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 246M 0 246M 0% /run/shm
/dev/sda1 228M 48M 169M 22% /boot
de acordo com du, toda a estrutura de arquivos que criei leva 772M:
root@revisionist:~# du -h files/
...
4.0K files/3x/ey/hs
8.0K files/3x/ey
508K files/3x
772M files/
que está claramente errado, pois apenas essa pasta contém um único arquivo de 100K:
root@revisionist:~# ls -lh files/3x/ey/hs
total 0
-rw-r--r-- 1 root root 100K May 19 11:30 3xeyhst4lnkzg5abzeasiw.txt
Se eu segmentar esse diretório e arquivo com du, os dados estarão claramente errados:
root@revisionist:~# du -h files/3x/ey/hs/
4.0K files/3x/ey/hs/
root@revisionist:~# du -h files/3x/ey/hs/3xeyhst4lnkzg5abzeasiw.txt
0 files/3x/ey/hs/3xeyhst4lnkzg5abzeasiw.txt
Isso me levou a encontrar a opção --apapent-size que é documentada como:
--apparent-size
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like
e, de fato, isso parece melhor:
root@revisionist:~# du -h --apparent-size files/3x/ey/hs/3xeyhst4lnkzg5abzeasiw.txt
100K files/3x/ey/hs/3xeyhst4lnkzg5abzeasiw.txt
root@revisionist:~# du -h --apparent-size files/3x/ey/hs
104K files/3x/ey/hs
mas quando eu corro para toda a estrutura acabo com um resultado surpreendente:
root@revisionist:~# du -h --apparent-size files
...
104K files/3x/ey/hs
108K files/3x/ey
6.8M files/3x
11G files
Como pode ser 11G? O que está acontecendo? Apenas arredondando para cima? mas por que não cabe na outra máquina?