GNU/Linux >> Linux Esercitazione >  >> Linux

perché l'output di `du` è spesso così diverso da `du -b`

Confronta (per esempio) du -bm a du -m .

Il -b imposta --apparent-size --block-size=1 ,ma poi il m sovrascrive la dimensione del blocco in 1M .

Simile per -bh contro -h :il -bh significa --apparent-size --block-size=1 --human-readable , e ancora h sovrascrive quella dimensione del blocco.


Dimensione apparente è il numero di byte che le tue applicazioni pensano siano nel file. È la quantità di dati che verrebbero trasferiti sulla rete (senza contare le intestazioni del protocollo) se decidessi di inviare il file tramite FTP o HTTP. È anche il risultato di cat theFile | wc -c e la quantità di spazio degli indirizzi che il file occuperebbe se caricassi tutto usando mmap .

Utilizzo del disco è la quantità di spazio che non può essere utilizzata per qualcos'altro perché il tuo file sta occupando quello spazio.

Nella maggior parte dei casi, la dimensione apparente è inferiore all'utilizzo del disco perché l'utilizzo del disco conta l'intera dimensione dell'ultimo blocco (parziale) del file e la dimensione apparente conta solo i dati che si trovano nell'ultimo blocco. Tuttavia, la dimensione apparente è maggiore quando hai un file sparse (i file sparsi vengono creati quando cerchi da qualche parte oltre la fine del file e poi scrivi qualcosa lì - il sistema operativo non si preoccupa di creare molti blocchi pieni di zeri - - crea un blocco solo per la parte del file su cui hai deciso di scrivere).


Esempio di granularità minima del blocco

Giochiamo un po' per vedere cosa sta succedendo.

mount mi dice che sono su una partizione ext4 montata su / .

Trovo la sua dimensione del blocco con:

stat -fc %s .

che dà:

4096

Ora creiamo alcuni file con dimensioni 1 4095 4096 4097 :

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

e i risultati sono:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Quindi vediamo che qualsiasi cosa inferiore o uguale a 4096 occupa 4096 byte in effetti.

Quindi, non appena attraversiamo 4097 , va fino a 8192 che è 2 * 4096 .

È chiaro quindi che il disco memorizza sempre i dati in un limite di blocco di 4096 byte.

Cosa succede ai file sparse?

Non ho indagato su quale sia la rappresentazione esatta, ma è chiaro che --apparent lo prende in considerazione.

Questo può portare a dimensioni apparenti maggiori dell'effettivo utilizzo del disco.

Ad esempio:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

dà:

8192    f
1073741825      f

Correlati:come verificare se il file sparse è supportato

Cosa devo fare se desidero archiviare una serie di file di piccole dimensioni?

Alcune possibilità sono:

  • usa un database invece di un filesystem:database vs storage su file system
  • usa un filesystem che supporti la suballocazione dei blocchi

Bibliografia:

  • https://serverfault.com/questions/565966/which-block-sizes-for-milions-of-small-files
  • https://askubuntu.com/questions/641900/how-file-system-block-size-works

Testato in Ubuntu 16.04.


Linux
  1. Grep:perché le parentesi nel modello Grep rimuovono il processo Grep dai risultati di Ps?

  2. Perché la dimensione della partizione di swap dovrebbe essere il doppio della dimensione della RAM?

  3. Qual è la colonna dei buffer nell'output da free?

  4. Perché la password "sudo" è diversa dalla password "su root".

  5. Perché l'output di openssl passwd è diverso ogni volta?

Perché sono passato da Mac a Linux

Perché non installare pacchetti software da Internet

Perché Grep -o -w non mi dà l'output previsto su Mac Os X?

Perché Ls e Hexdump non sono d'accordo sulla dimensione del file?

Come impedire a `ls` di ordinare l'output?

Salva l'output di un comando dal terminale Debian in un file