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=1variabile di ambiente GNU (per ottenere unità da 512 byte) o il -kflag 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 %Bvalore su stato 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 -srestituisce 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 statvediamo un diverso insieme di valori. L'esecuzione statnella 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:
statriporta sia physical_blocks_in_usee physical_block_sizecome utilizzati nella formula sopra. Si noti che questi sono valori basati su interfacce del sistema operativo.
dusta fornendo ciò che è generalmente accettato come una stima abbastanza accurata dell'utilizzo del disco fisico.
Per riferimento, ecco la ls -ldirectory 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 lssul mio sistema non menziona quella linea, ma loinfo coreutils lsfa. Come maiman lseinfo coreutils lsavere informazioni diverse sullo stesso comando? Perché non èlssolo documentato una volta? Avere due diverse documentazioni per lo stesso comando sembra impostato per un errore.