La formula: che cos'è quel numero?
total int = Sum of (physical_blocks_in_use) * physical_block_size / ls_block_size) per ogni file.
Dove:
ls_block_size
è una variabile di ambiente arbitraria (normalmente 512 o 1024 byte) che è liberamente modificabile con il --block-size=<int>
flag attivato
ls
, la POSIXLY_CORRECT=1
variabile di ambiente GNU (per ottenere unità da 512 byte) o il -k
flag per forzare unità da 1kB.
physical_block_size
è il valore dipendente dal sistema operativo di un'interfaccia di blocco interna, che può o meno essere connessa all'hardware sottostante. Questo valore è normalmente 512b o 1k, ma dipende completamente dal sistema operativo. Può essere rivelato attraverso il %B
valore su stat
o fstat
. Si noti che questo valore è (quasi sempre) non correlato al numero di blocchi fisici su un dispositivo di archiviazione moderno .
Perché così confuso?
Questo numero è abbastanza distaccato da qualsiasi metrica fisica o significativa. Molti programmatori junior non hanno avuto esperienza con file hole o collegamenti hard / sym . Inoltre, la documentazione disponibile su questo argomento specifico è praticamente inesistente.
La disgiunzione e l'ambiguità del termine "dimensione del blocco" è stata il risultato della confusione di numerose misure diverse e dei livelli relativamente profondi di astrazione che ruotano attorno all'accesso al disco.
Esempi di informazioni contrastanti: du
(o ls -s
) vsstat
L'esecuzione du *
in una cartella di progetto produce quanto segue: (Nota: ls -s
restituisce gli stessi risultati).
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
Totale : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 blocchi
Eppure quando uno corre stat
vediamo un diverso insieme di valori. L'esecuzione stat
nella stessa directory produce:
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
Totale: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 blocchi
Nota: è possibile utilizzare il comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> per generare (in ordine) il numero di blocchi, (in parentesi) la dimensione di tali blocchi, il nome del file e la dimensione in byte, come mostrato sopra.
Ci sono due cose importanti da asporto:
stat
riporta sia physical_blocks_in_use
e physical_block_size
come utilizzati nella formula sopra. Si noti che questi sono valori basati su interfacce del sistema operativo.
du
sta fornendo ciò che è generalmente accettato come una stima abbastanza accurata dell'utilizzo del disco fisico.
Per riferimento, ecco la ls -l
directory di sopra:
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
sul mio sistema non menziona quella linea, ma loinfo coreutils ls
fa. Come maiman ls
einfo coreutils ls
avere informazioni diverse sullo stesso comando? Perché non èls
solo documentato una volta? Avere due diverse documentazioni per lo stesso comando sembra impostato per un errore.