Qu'est-ce qu'un fichier clairsemé et pourquoi en avons-nous besoin? La seule chose que je peux obtenir, c'est que c'est un très gros fichier et qu'il est efficace (en gigaoctets). Comment est-il efficace?
Supposons que vous ayez un fichier contenant de nombreux octets vides \x00
. Ces nombreux octets vides \x00
sont appelés trous. Le stockage d'octets vides n'est tout simplement pas efficace, nous savons qu'il y en a beaucoup dans le fichier, alors pourquoi les stocker sur le périphérique de stockage? Nous pourrions plutôt stocker des métadonnées décrivant ces zéros. Lorsqu'un processus lit le fichier, ces blocs de zéro octet sont générés dynamiquement au lieu d'être stockés sur un stockage physique (regardez ce schéma de Wikipedia):
C'est pourquoi un fichier clairsemé est efficace, car il ne stocke pas les zéros sur le disque, mais contient plutôt suffisamment de données décrivant les zéros qui seront générés.
Remarque: la taille du fichier logique est supérieure à la taille du fichier physique pour les fichiers épars. En effet, nous n'avons pas stocké physiquement les zéros sur un périphérique de stockage.
Modifier:
Lorsque vous exécutez:
$ dd if=/dev/zero of=output bs=1G count=4
La commande copie ici des blocs 4G d'octets nuls dans output
. Pour voir ça:
$ stat output
File: ouput
Size: 4294967296 Blocks: 8388616 IO Block: 4096 regular file
--omitted--
Vous pouvez voir que ce fichier a des blocs 8388616 qui lui sont alloués, ces blocs ne stockent rien mais octets vides copié à partir de /dev/zero
et ils occupent de l'espace disque physique, ce sont des trous stockés sur le disque (zéros épars). dd
a fait ce que vous aviez demandé, en copiant des blocs de données d'un fichier à un autre.
Maintenant, exécutez cette commande pour détecter les trous et rendre le fichier clairsemé sur place:
$ fallocate -d output
$ stat output
File: swapfile
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
--omitted--
Avez-vous remarqué quelque chose? Le nombre de blocs est maintenant de 0 car les blocs qui ne stockaient que des octets vides ont été désalloués. Rappelez-vous, les blocs de output
ne stockent rien, seulement un tas de zéros vides, fallocate -d
a détecté les blocs qui ne contiennent que des zéros vides et les a désalloués, car tous les blocs de ce fichier contiennent des zéros, ils ont tous été désalloués.
Notez également comment la taille est restée la même. Il s'agit de la taille logique (virtuelle) du fichier, pas de sa taille sur le disque. Il est crucial de savoir que output
n'occupe pas physique d'espace de stockage maintenant, il a 0 blocs qui lui sont alloués et donc je n'utilise pas vraiment d'espace disque. La taille préservée après l'exécution de fallocate -d
donc lorsque vous lisez plus tard le fichier, vous obtenez les octets vides générés par le système de fichiers lors de l'exécution. La taille physique de output
est cependant nulle, elle n'utilise aucun bloc de données.
N'oubliez pas que lorsque vous lisez le fichier output
, les octets vides sont générés dynamiquement par le système de fichiers au moment de l'exécution, ils sont pas réellement stockés physiquement sur le disque et la taille du fichier telle que rapportée par stat
est la taille logique et la taille physique est nulle pour output
. Dans ce cas, le système de fichiers doit générer 4 Go d'octets vides lorsqu'un processus lit le fichier.
Pour générer un fichier fragmenté à l'aide de dd
:
$ dd if=/dev/zero of=output2 bs=1G seek=0 count=0
$ stat
stat output2
File: output2
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
GNU dd
utilise en interne lseek
et ftruncate
, donc vérifiez truncate (2) et lseek (2).
Un fichier épars est un fichier qui est principalement vide, c'est-à-dire qu'il contient de grands blocs d'octets dont la valeur est 0
(zéro).
Sur le disque, le contenu d'un fichier est stocké dans des blocs de taille fixe (généralement 4 Ko ou plus). Lorsque tous les octets contenus dans un tel bloc sont 0
, un système de fichiers qui implémente des fichiers clairsemés ne stocke pas le bloc sur le disque, mais conserve les informations quelque part dans les métadonnées du fichier.
Avantages de l'utilisation de fichiers clairsemés:
0
, il est simplement défini sur 0
tous les octets du tampon d'entrée et les données sont prêtes; il n'est pas nécessaire d'accéder au périphérique de stockage lent;0
) et place l'ID de bloc dans la liste des blocs vides (dans le fichier de métadonnées); aucune donnée n'est écrite sur le disque.Plus d'informations sur les fichiers épars peuvent être trouvées sur le page Wikipedia .