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 du
commande: si votre système de fichiers a une taille de bloc de 4 Ko, alors du
il 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 -l
ou 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 du
est la somme des tailles des blocs ou des étendues utilisées par le fichier.
La taille indiquée par du
peut ê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 du
différent de la somme des tailles de fichiers?
Comme nous l'avons vu plus haut, la taille indiquée par du
pour 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 -l
tailles sont exprimées en octets, mais du
en KiB ou en unités de 512 octets (secteurs) sur certains systèmes plus traditionnels ( du -k
oblige à utiliser des kilo-octets). La plupart unix modernes prennent en charge ls -lh
et du -h
d'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 du
un 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 -l
est 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 du
les fichiers point qui ls
n'apparaissent que si vous utilisez l' option -A
ou -a
.
Parfois, du
rapporte moins que la somme attendue. Cela se produit s’il existe des liens physiques dans l’arborescence: du
chaque fichier n’est compté qu’une seule fois.
Sur certains systèmes de fichiers, comme ZFS
Linux, du
ne 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, du
tous les fichiers de ces points de montage seront également comptabilisés, sauf si l' -x
option 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 du
ne 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 -m
ou lsof
sur 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
loop
périphérique. losetup -a
(as root
) peut vous dire quels loop
appareils 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 df
exactement?
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 df
ce 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 -i
indique 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 -l
sur 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 /home
système de fichiers et l'exporte/home/bob
), df
un 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 df
ne 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 -l
et 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, lsblk
pré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
, pvs
pour LVM , fdisk
pour les partitions de type PC traditionnel ( « MBR ») (ainsi que TPG sur les systèmes récents), gdisk
pour TPG partitions, disklabel
pour disklabels BSD, Parted , etc. sous Linux, cat /proc/partitions
donne 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.
tune2fs
né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.