Cos’è quel “totale” nella prima riga dopo ls -l?

Cos’è quel “totale” nell’output di ls -l?

$ ls -l /etc total 3344 -rw-r--r-- 1 root root 15276 Oct 5 2004 a2ps.cfg -rw-r--r-- 1 root root 2562 Oct 5 2004 a2ps-site.cfg drwxr-xr-x 4 root root 4096 Feb 2 2007 acpi -rw-r--r-- 1 root root 48 Feb 8 2008 adjtime drwxr-xr-x 4 root root 4096 Feb 2 2007 alchemist 

Puoi trovare la definizione di quella linea nella documentazione di ls per la tua piattaforma. Per coreutils ls (quello trovato su molti sistemi Linux), le informazioni possono essere trovate tramite info coreutils ls :

Per ogni directory elencata, preface i file con una riga `total BLOCKS ‘, dove BLOCKS è l’allocazione del disco totale per tutti i file in quella directory.

La formula: qual è quel numero?

int totale = sum di (physical_blocks_in_use) * physical_block_size / ls_block_size) per ogni file.

Dove:

  • ls_block_size è una variabile d’ambiente arbitraria (normalmente 512 o 1024 byte) che è liberamente modificabile con il --block-size= su ls , la POSIXLY_CORRECT=1 ambiente POSIXLY_CORRECT=1 GNU (per ottenere unità da 512 byte), o -k flag per forzare unità da 1kB.
  • physical_block_size è il valore dipendente dall’OS di un’interfaccia di blocco interno, che può o meno essere collegata all’hardware sottostante. Questo valore è normalmente 512b o 1k, ma dipende completamente dal sistema operativo. Può essere rivelato attraverso il valore %B 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 esperienza con buchi di file o collegamenti hard / sym . Inoltre, la documentazione disponibile su questo argomento specifico è praticamente inesistente.

La disarticolazione e l’ambiguità del termine “dimensione del blocco” sono il risultato del fatto che numerose misure diverse vengono facilmente confuse e i livelli relativamente profondi di astrazione che ruotano attorno all’accesso al disco.

Esempi di informazioni in conflitto: du (o ls -s ) vs stat

L’esecuzione du * in una cartella del 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

Tuttavia, quando si esegue una stat , vediamo un diverso insieme di valori. L’esecuzione di 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: è ansible utilizzare il comando stat * --printf="%b\t(%B)\t%n: %s bytes\n" > per produrre (in ordine) il numero di blocchi, (in paren- la dimensione di questi 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 che physical_block_size come usato nella formula sopra. Si noti che questi sono valori basati su interfacce OS.
  • du sta fornendo ciò che è generalmente accettato come una stima abbastanza accurata dell’utilizzo del disco fisico.

Per riferimento, ecco la ls -l della directory 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 

Questo è il numero totale di blocchi del file system, inclusi i blocchi indiretti, usati dai file elencati. Se si esegue ls -s sugli stessi file e si sumno i numeri riportati, si otterrà lo stesso numero.

Solo per citare – puoi usare -h (ls -lh) per convertire questo in formato leggibile dall’uomo.