A fórmula: qual é esse número?
total int = Soma de (Physical_blocks_in_use) * Physical_block_size / ls_block_size) para cada arquivo.
Onde:
ls_block_size
é uma variável de ambiente arbitrária (normalmente 512 ou 1024 bytes) que pode ser modificada livremente com o
--block-size=<int>
sinalizador ativado ls
, a POSIXLY_CORRECT=1
variável de ambiente GNU (para obter unidades de 512 bytes) ou o -k
sinalizador para forçar unidades de 1kB.
physical_block_size
é o valor dependente do SO de uma interface de bloco interno, que pode ou não estar conectada ao hardware subjacente. Esse valor normalmente é 512b ou 1k, mas depende completamente do sistema operacional. Pode ser revelado através do %B
valor em stat
ou fstat
. Observe que esse valor (quase sempre) não está relacionado ao número de blocos físicos em um dispositivo de armazenamento moderno .
Por que tão confuso?
Esse número é bastante desanexado de qualquer métrica física ou significativa. Muitos programadores juniores não tiveram experiência com falhas de arquivos ou links físicos / sym . Além disso, a documentação disponível neste tópico específico é praticamente inexistente.
A falta de articulação e a ambiguidade do termo "tamanho do bloco" resulta de inúmeras medidas diferentes serem facilmente confundidas e os níveis relativamente abstratos de abstração girando em torno do acesso ao disco.
Exemplos de informações conflitantes: du
(ou ls -s
) vsstat
A execução du *
em uma pasta do projeto produz o seguinte: (Nota: ls -s
retorna os mesmos resultados.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Total : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 blocos
No entanto, quando se corre stat
, vemos um conjunto diferente de valores. A execução stat
no mesmo diretório produz:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 blocos
Nota: Você pode usar o comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> para gerar (em ordem) o número de blocos (em parênteses) o tamanho desses blocos, o nome do arquivo e o tamanho em bytes, como mostrado acima.
Há duas coisas importantes a serem levadas em consideração:
stat
relata o physical_blocks_in_use
e physical_block_size
como usado na fórmula acima. Observe que esses são valores baseados nas interfaces do SO.
du
está fornecendo o que geralmente é aceito como uma estimativa bastante precisa da utilização do disco físico.
Para referência, aqui está o ls -l
diretório acima:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
no meu sistema não menciona essa linha, masinfo coreutils ls
faz. Como vemman ls
einfo coreutils ls
tem informações diferentes sobre o mesmo comando? Por que não éls
documentado apenas uma vez? Ter duas documentações diferentes para o mesmo comando parece estar configurado para falha.