Pourquoi existe-t-il tant de façons différentes de mesurer l'utilisation du disque?


114

Lorsque je résume la taille de mes fichiers, j'obtiens un chiffre. Si je cours du, je reçois un autre chiffre. Si je cours dusur tous les fichiers de ma partition, cela ne correspond pas aux dfrevendications utilisées. Pourquoi existe-t-il tant de chiffres différents pour la taille totale de mes fichiers? Les ordinateurs ne peuvent-ils pas ajouter?

En parlant d’ajouter: quand j’ajoute les colonnes «Utilisé» et «Disponible» df, je n’obtiens pas le chiffre total. Et ce chiffre total est inférieur à la taille de ma partition. Et si j'additionne la taille de mes partitions, je n'ai pas la taille de mon disque! Ce qui donne?

Réponses:


144

Additionner des nombres est facile. Le problème est qu'il y a beaucoup de nombres différents à ajouter.

Combien d'espace disque un fichier utilise-t-il?

L'idée de base est qu'un fichier contenant n octets utilise n octets d'espace disque, plus un bit pour certaines informations de contrôle: les métadonnées du fichier (permissions, horodatage, etc.), et un peu de surcharge pour les informations que le système a besoin de trouver où le fichier est stocké. Cependant, il existe de nombreuses complications.

Complications microscopiques

Pensez à chaque fichier comme une série de livres dans une bibliothèque. Les fichiers plus petits ne constituent qu'un seul volume, mais les plus gros sont constitués de plusieurs volumes, comme une encyclopédie. Afin de pouvoir localiser les fichiers, il existe un catalogue de cartes qui référence chaque volume. Chaque volume est légèrement surchargé par les couvertures. Si un fichier est très petit, cette surcharge est relativement importante. De plus, le catalogue de cartes lui-même prend de la place.

Pour aller un peu plus technique, dans un système de fichiers simple typique, l’espace est divisé en blocs . Une taille de bloc typique est de 4 Ko. Chaque fichier occupe un nombre entier de blocs. À moins que la taille du fichier ne soit un multiple de la taille du bloc, le dernier bloc n'est que partiellement utilisé. Ainsi, un fichier de 1 octet et un fichier de 4096 octets prennent chacun un bloc, alors qu'un fichier de 4097 octets nécessite deux blocs. Vous pouvez observer ceci avec la ducommande: si votre système de fichiers a une taille de bloc de 4 Ko, alors duil signalera 4 Ko pour un fichier de 1 octet.

Si un fichier est volumineux, des blocs supplémentaires sont simplement nécessaires pour stocker la liste des blocs qui le composent (il s’agit de blocs indirects ; des systèmes de fichiers plus sophistiqués peuvent l’optimiser sous forme d’ extensions ). Celles-ci n'apparaissent pas dans la taille du fichier telle que rapportée par ls -lou GNU du --apparent-size; du, qui indique l’utilisation du disque par opposition à la taille, en tient compte.

Certains systèmes de fichiers tentent de réutiliser l’espace libre restant dans le dernier bloc pour regrouper plusieurs fichiers dans un même bloc . Certains systèmes de fichiers (tels que ext4 depuis Linux 3.8 utilisent 0 blocs pour les fichiers minuscules (quelques octets seulement) qui tiennent entièrement dans l'inode.

Complications macroscopiques

En règle générale, comme indiqué ci-dessus, la taille totale indiquée par duest la somme des tailles des blocs ou des étendues utilisées par le fichier.

La taille indiquée par dupeut être plus petite si le fichier est compressé. Les systèmes Unix supportent traditionnellement une forme de compression brute: si un bloc de fichier ne contient que des octets nuls, alors au lieu de stocker un bloc de zéros, le système de fichiers peut tout simplement omettre ce bloc. Un fichier avec des blocs omis comme celui-ci s'appelle un fichier fragmenté . Les fichiers fragmentés ne sont pas créés automatiquement lorsqu'un fichier contient une grande série d'octets nuls. L'application doit prendre des dispositions pour que le fichier soit fragmenté.

Certains systèmes de fichiers tels que btrfs et zfs prennent en charge la compression à usage général .

Complications avancées

Deux caractéristiques principales des systèmes de fichiers très modernes tels que zfs et btrfs rendent la relation entre la taille du fichier et l'utilisation du disque beaucoup plus distante: les instantanés et la déduplication.

Les instantanés sont un état figé du système de fichiers à une date donnée. Les systèmes de fichiers prenant en charge cette fonctionnalité peuvent contenir plusieurs instantanés pris à des dates différentes. Ces instantanés prennent de la place, bien sûr. À un extrême, si vous supprimez tous les fichiers de la version active du système de fichiers, le système de fichiers ne deviendra pas vide s'il reste des instantanés.

Tout fichier ou bloc qui n'a pas changé depuis un instantané, ou entre deux instantanés pris, existe de manière identique dans l'instantané et dans la version active ou dans un autre instantané. Ceci est implémenté via une copie sur écriture . Dans certains cas extrêmes, il est possible que la suppression d'un fichier sur un système de fichiers complet échoue en raison d'un espace disque insuffisant, car la suppression de ce fichier nécessiterait la copie d'un bloc dans le répertoire, sans laisser plus de place à ce bloc.

La déduplication est une technique d'optimisation du stockage consistant à éviter de stocker des blocs identiques. Avec des données typiques, la recherche de doublons ne vaut pas toujours la peine. Les deux zfs et Btrfs prennentchargedéduplication en option.

Pourquoi le total est-il dudifférent de la somme des tailles de fichiers?

Comme nous l'avons vu plus haut, la taille indiquée par dupour chaque fichier est normalement la somme des tailles des blocs ou des étendues utilisées par le fichier. Notez que, par défaut, les ls -ltailles sont exprimées en octets, mais duen KiB ou en unités de 512 octets (secteurs) sur certains systèmes plus traditionnels ( du -koblige à utiliser des kilo-octets). La plupart unix modernes prennent en charge ls -lhet du -hd'utiliser des numéros « lisibles par l' homme » en utilisant K, M, G, etc. suffit (pour Kio, MiB, GIB) , selon le cas.

Lorsque vous exécutez duun répertoire, il résume l'utilisation du disque de tous les fichiers de l'arborescence, y compris les répertoires eux-mêmes. Un répertoire contient des données (les noms des fichiers et un pointeur indiquant où se trouvent les métadonnées du fichier), de sorte qu'il nécessite un peu d'espace de stockage. Un petit répertoire prendra un bloc, un plus grand nécessitera plus de blocs. La quantité de stockage utilisée par un répertoire dépend parfois non seulement des fichiers qu'il contient, mais également de l'ordre dans lequel ils ont été insérés et de la suppression de certains fichiers (avec certains systèmes de fichiers, cela peut laisser des trous - un compromis entre espace disque et performances ), mais la différence sera minime (un bloc supplémentaire ici et là). Quand tu coursls -ld /some/directory, la taille du répertoire est listée. (Notez que la ligne «total NNN» en haut de la sortie ls -lest un nombre non lié, c'est la somme des tailles en blocs des éléments énumérés, exprimée en kiB ou en secteurs.)

Gardez à l'esprit que dules fichiers point qui lsn'apparaissent que si vous utilisez l' option -Aou -a.

Parfois, durapporte moins que la somme attendue. Cela se produit s’il existe des liens physiques dans l’arborescence: duchaque fichier n’est compté qu’une seule fois.

Sur certains systèmes de fichiers, comme ZFSLinux, dune rapporte pas la totalité de l'espace disque occupé par les attributs étendus d'un fichier.

Attention, s'il y a des points de montage dans un répertoire, dutous les fichiers de ces points de montage seront également comptabilisés, sauf si l' -xoption vous le permet. Donc, si vous voulez par exemple la taille totale des fichiers de votre système de fichiers racine, ne le lancez du -x /pas du /.

Si un système de fichiers est monté dans un répertoire non vide , les fichiers de ce répertoire sont masqués par le système de fichiers monté. Ils occupent toujours leur espace, mais dune les trouvent pas.

Fichiers supprimés

Lorsqu'un fichier est supprimé , cela supprime uniquement l'entrée de répertoire, pas nécessairement le fichier lui-même. Deux conditions sont nécessaires pour réellement supprimer un fichier et ainsi récupérer son espace disque:

  • Le nombre de liens du fichier doit tomber à 0: si un fichier a plusieurs liens en dur, la suppression d'un lien n'affecte pas les autres.
  • Tant que le fichier est ouvert par un processus quelconque, les données sont conservées. Ce n'est que lorsque tous les processus sont fermés que le fichier est supprimé. La sortie fuser -mou lsofsur un point de montage inclut les processus ayant un fichier ouvert sur ce système de fichiers, même si le fichier est supprimé.
  • même si aucun fichier n'a été ouvert par un processus, il est possible que l'espace du fichier ne soit pas récupéré s'il s'agit du fichier dorsal d'un looppériphérique. losetup -a(as root) peut vous dire quels loopappareils sont actuellement configurés et sur quel fichier. Le périphérique en boucle doit être détruit (avec losetup -d) avant que l’espace disque ne puisse être récupéré.

Si vous supprimez un fichier dans certains gestionnaires de fichiers ou environnements graphiques, il peut être placé dans une corbeille où il peut être annulé. Tant que le fichier peut être restauré, son espace est toujours utilisé.

Quels sont ces chiffres dfexactement?

Un système de fichiers typique contient:

  • Blocs contenant des données de fichier (y compris des répertoires) et certaines métadonnées (y compris des blocs indirects et des attributs étendus sur certains systèmes de fichiers).
  • Blocs gratuits.
  • Blocs réservés à l'utilisateur root.
  • superblocs et autres informations de contrôle.
  • Inodes
  • Un journal

Seul le premier type est rapporté par du. En ce qui concerne dfce qui va dans les colonnes "utilisé", "disponible" et total, dépend du système de fichiers (bien sûr, les blocs utilisés (y compris les indirects) sont toujours dans la colonne "utilisé", et les blocs inutilisés sont toujours dans " disponible ”colonne).

Les systèmes de fichiers dans ext2 / ext3 / ext4 réservent 5% de l'espace disponible à l'utilisateur root. Ceci est utile sur le système de fichiers racine, pour maintenir le système en activité s’il est plein (en particulier pour la journalisation, et pour permettre à l’administrateur système de stocker quelques données tout en corrigeant le problème). Même pour les partitions de données telles que /home, garder cet espace réservé est utile car un système de fichiers presque complet est sujet à la fragmentation. Linux essaie d'éviter la fragmentation (ce qui ralentit l'accès aux fichiers, en particulier sur les périphériques mécaniques en rotation tels que les disques durs) en pré-allouant plusieurs blocs consécutifs lorsqu'un fichier est en cours d'écriture, mais s'il n'y a pas beaucoup de blocs consécutifs, cela ne fonctionnera pas. .

Les systèmes de fichiers traditionnels, jusqu’à ext4 inclus mais pas btrfs, réservent un nombre fixe d’ inodes lors de la création du système de fichiers. Cela simplifie considérablement la conception du système de fichiers, mais présente l'inconvénient que le nombre d'inodes doit être correctement dimensionné: avec trop d'inodes, l'espace est perdu; Avec trop peu d'inodes, le système de fichiers peut manquer d'inodes avant de manquer d'espace. La commande df -iindique combien d'inodes sont utilisés et combien sont disponibles (les systèmes de fichiers où le concept n'est pas applicable peuvent indiquer 0).

L'exécution tune2fs -lsur le volume contenant un système de fichiers ext2 / ext3 / ext4 contient certaines statistiques, notamment le nombre total et le nombre total d'inodes et de blocs libres.

Les sous - volumes (pris en charge dans btrfs et dans zfs sous le nom de jeux de données name ) sont une autre caractéristique susceptible de semer la confusion dans l’affaire . Plusieurs sous-volumes partagent le même espace, mais ont des racines d'arborescence de répertoires distinctes.

Si un système de fichiers est monté sur le réseau (NFS, Samba, etc.) et que le serveur exporte une partie de ce système de fichiers (par exemple, le serveur a un /homesystème de fichiers et l'exporte/home/bob ), dfun client reflète les données pour l'ensemble du système de fichiers, et non juste pour la partie exportée et montée sur le client.

Qu'est-ce qui utilise l'espace sur mon disque?

Comme nous l'avons vu plus haut, la taille totale indiquée par dfne tient pas toujours compte de toutes les données de contrôle du système de fichiers. Utilisez des outils spécifiques au système de fichiers pour obtenir la taille exacte du système de fichiers si nécessaire. Par exemple, avec ext2 / ext3 / ext4, exécutez tune2fs -let multipliez la taille du bloc par le nombre de blocs.

Lorsque vous créez un système de fichiers, il remplit normalement l’espace disponible sur la partition ou le volume. Parfois, vous pouvez vous retrouver avec un système de fichiers plus petit lorsque vous avez déplacé des systèmes de fichiers ou redimensionné des volumes.

Sous Linux, lsblkprésente un bon aperçu des volumes de stockage disponibles. Pour plus d'informations ou si vous n'en avez pas lsblk, utilisez des outils spécialisés de gestion de volume ou de partitionnement pour vérifier vos partitions. Sous Linux, il y a lvs, vgs, pvspour LVM , fdiskpour les partitions de type PC traditionnel ( « MBR ») (ainsi que TPG sur les systèmes récents), gdiskpour TPG partitions, disklabelpour disklabels BSD, Parted , etc. sous Linux, cat /proc/partitionsdonne un résumé rapide. Les installations typiques ont au moins deux partitions ou volumes utilisés par le système d'exploitation: un système de fichiers (parfois plus) et un volume d' échange .

Certains ordinateurs ont une partition contenant le BIOS ou un autre logiciel de diagnostic. Les ordinateurs avec UEFI ont une partition de chargeur de démarrage dédiée.

Enfin, notez que la plupart des programmes informatiques utilisent des unités basées sur des puissances de 1024 = 2 10 (car les programmeurs aiment les binaires et les puissances de 2). Donc, 1 Ko = 1024 B, 1 Mo = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B,… Officiellement, ces unités sont connues sous le nom de kibibyte KiB, mebibyte MiB, etc., mais la plupart des logiciels ne mentionnent que k ou kB, M ou MB, etc. D'autre part, les fabricants de disques durs utilisent systématiquement métrique (unités basées sur 1000). Ainsi, 1 To ne représente que 931 Gio ou 0,904 Gio.


1
@Kiwy tune2fsnécessite un accès en lecture au bloc qui contient le système de fichiers, lequel doit généralement être root car cela vous permet de lire le contenu de tous les fichiers.
Gilles

21
Je sais que "merci" est découragé dans le SE, mais Gilles mérite un immense "merci" pour cet article génial.
dotancohen

1
Je me souviens avoir vu un catalogue de cartes à l'âge de 6 ans. Je me demande combien de personnes ne sauront pas ce qu'elles sont?
Izkata

1
@ illuminÉ C'est trop avancé pour Solaris pour moi, je ne sais pas à quel niveau cela convient.
Gilles

1
du ne compte pour les blocs indirects. C'est la principale différence par rapport à la taille du fichier telle que rapportée par ls -l.
Stéphane Chazelas

4

Résumé succinct des complications liées au calcul de la taille des fichiers et des espaces disque:

  • L'espace que le fichier occupe sur le disque est un multiplicateur du nombre de blocs qu'il prend par rapport à la taille de chaque bloc + le nombre d'inodes qu'il prend. Un fichier de 1 octet prend au moins 1 bloc, 1 inode et une entrée de répertoire.

    Mais cela ne pourrait prendre qu'une entrée de répertoire supplémentaire si le fichier est un lien physique vers un autre fichier. Ce ne serait qu'une autre référence au même ensemble de blocs.

  • La taille du contenu du fichier. C'est ce qui lss'affiche.
  • L'espace disque disponible ne correspond pas à la taille du fichier le plus volumineux que vous pouvez contenir ni à la somme de toutes les tailles de contenu de fichier pouvant être stockées sur le disque. C'est quelque part entre les deux. Cela dépend du nombre de fichiers (prenant en charge les inodes), de la taille du bloc et du degré de remplissage du contenu de chaque fichier.

Cela ne fait qu'effleurer la surface des systèmes de fichiers et cela est trop simplifié. Rappelez-vous également que différents systèmes de fichiers fonctionnent différemment.

statest très utile pour repérer certaines de ces informations. Voici quelques exemples d'utilisation de stat et à quoi sert-il: http://landoflinux.com/linux_stat_command_examples.html


1
Un fichier de 1 octet prend généralement un bloc et non pas 8. La création d'un lien physique ne crée aucun inode: un fichier est un inode, quel que soit le nombre de liens vers le fichier. La création d'un lien physique ne nécessite que de l'espace pour l'entrée du répertoire.
Gilles

Merci pour les corrections, certes, ma mémoire concernant: étudier ext2 en profondeur est maintenant un peu floue. Je suivais les résultats de stat re: le nombre de blocs - cela me semblait excessif, mais c’est ce qui est là. Je vais corriger la réponse.
Pedro

1
En effet, 1 bloc ext2 = 8 blocs de statistiques, si le système de fichiers ext2 utilise des blocs de 4 Ko: la statistique compte dans des blocs de 512 octets pour des raisons historiques. Voir unix.stackexchange.com/questions/14409/…
Gilles

3

Je vais illustrer ici différents cas dont les causes dusont différentes df.

dfcompte les blocs alloués au système de fichiers, duutilise les informations de taille de chaque fichier. Une différence peut avoir plusieurs causes:

1) Fichiers non liés (supprimés) qui sont toujours ouverts par l'application. Les informations sur le fichier sont manquantes, les blocs sont toujours alloués. lsof +aL1 <filesystem>will vous aide à identifier les processus. La plupart du temps, vous devez tuer les processus pour libérer de l'espace (cela dépend du processus, un rechargement de la configuration est parfois suffisant).

2) Les fichiers situés sous les points de montage sont masqués dumais pas accessibles df. debugfscan vous aide à lire le système de fichiers.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Des fichiers clairsemés qui paraissent plus grands que la réalité. les blocs non alloués ne sont pas comptés par dfmais la taille apparente du fichier est comptée par du.

Notez que les liens physiques ne trompent pas du


3

dfest généralement utilisé pour voir quels sont les systèmes de fichiers, quel est leur contenu et où ils sont montés. Très utile lorsque vous manquez d'espace dans un système de fichiers et que vous souhaitez peut-être déplacer des éléments entre les systèmes de fichiers, ou acheter un disque plus gros, etc.

duaffiche les détails de la quantité de stockage cumulé consommée par chacun des répertoires (un peu comme windirstatdans Windows). Idéal pour trouver où vous êtes en train de monopoliser de l’espace lorsque vous essayez de nettoyer des fichiers.

Mis à part les petites différences numériques expliquées par d'autres, je pense que les utilitaires duet les dfservices publics ont des objectifs très différents.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.