GNU/Linux >> Tutoriels Linux >  >> Linux

pourquoi la sortie de `du` est-elle souvent si différente de `du -b`

Comparer (par exemple) du -bm à du -m .

Le -b définit --apparent-size --block-size=1 ,mais alors le m remplace la taille de bloc par 1M .

Similaire pour -bh contre -h :le -bh signifie --apparent-size --block-size=1 --human-readable , et encore le h remplace cette taille de bloc.


Taille apparente est le nombre d'octets que vos applications pensent être dans le fichier. C'est la quantité de données qui seraient transférées sur le réseau (sans compter les en-têtes de protocole) si vous décidiez d'envoyer le fichier via FTP ou HTTP. C'est aussi le résultat de cat theFile | wc -c , et la quantité d'espace d'adressage que le fichier occuperait si vous chargiez le tout en utilisant mmap .

Utilisation du disque est la quantité d'espace qui ne peut pas être utilisée pour autre chose car votre fichier occupe cet espace.

Dans la plupart des cas, la taille apparente est inférieure à l'utilisation du disque, car l'utilisation du disque compte la taille complète du dernier bloc (partiel) du fichier, et la taille apparente ne compte que les données contenues dans ce dernier bloc. Cependant, la taille apparente est plus grande lorsque vous avez un fichier clairsemé (des fichiers clairsemés sont créés lorsque vous cherchez quelque part au-delà de la fin du fichier, puis écrivez quelque chose là-bas - le système d'exploitation ne prend pas la peine de créer beaucoup de blocs remplis de zéros - - il ne crée un bloc que pour la partie du fichier dans laquelle vous avez décidé d'écrire).


Exemple de granularité de bloc minimale

Jouons un peu pour voir ce qui se passe.

mount me dit que je suis sur une partition ext4 montée à / .

Je trouve sa taille de bloc avec :

stat -fc %s .

ce qui donne :

4096

Créons maintenant des fichiers avec des tailles 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

et les résultats sont :

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

Nous voyons donc que tout ce qui est inférieur ou égal à 4096 occupe 4096 octets en fait.

Puis, dès que l'on franchit 4097 , il monte jusqu'à 8192 qui est 2 * 4096 .

Il est alors clair que le disque stocke toujours les données à une limite de bloc de 4096 octets.

Qu'advient-il des fichiers fragmentés ?

Je n'ai pas étudié quelle est la représentation exacte, mais il est clair que --apparent en tient compte.

Cela peut entraîner des tailles apparentes supérieures à l'utilisation réelle du disque.

Par exemple :

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

donne :

8192    f
1073741825      f

En relation :Comment tester si le fichier sparse est pris en charge

Que faire si je veux stocker un tas de petits fichiers ?

Certaines possibilités sont :

  • utiliser une base de données au lieu d'un système de fichiers :stockage de la base de données contre le système de fichiers
  • utiliser un système de fichiers prenant en charge la sous-allocation de blocs

Bibliographie :

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

Testé dans Ubuntu 16.04.


Linux
  1. Pourquoi j'ai fait le passage de Mac à Linux

  2. Grep - Pourquoi les crochets dans le modèle Grep suppriment-ils le processus Grep des résultats Ps?

  3. Comment faire en sorte que `date` affiche l'heure d'un fuseau horaire différent ?

  4. Linux - La colonne des tampons dans la sortie de Free ?

  5. Pourquoi Ls -l affiche-t-il une taille différente de Ls -s ?

Pourquoi ne pas installer des progiciels à partir d'Internet

Pourquoi Grep -o -w ne me donne-t-il pas la sortie attendue sur Mac Os X ?

Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

Comment empêcher `ls` de trier la sortie ?

Enregistrer la sortie d'une commande du terminal Debian dans un fichier

Pourquoi pr_debug du noyau Linux ne donne-t-il aucune sortie ?