Avez-vous déjà observé une différence dans l'utilisation du disque de certains fichiers lors de l'utilisation des commandes du et ls. Par exemple :
$ du -sh /u02/ticoprd/redo/* 515M redo1a.rdo 524M redo3b.rdo 518M redo4a.rdo
$ ls -ltrh /u02/ticoprd/redo/* -rw-r----- 1 oticoprd dba 1.1G Aug 4 01:09 redo1a.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 02:32 redo3b.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 03:51 redo4a.rdo
Nous pouvons voir que la commande "ls" affiche la taille du fichier à 1,1 Go alors que la taille du fichier de commande "du" n'est que de 515 Mo. Ces fichiers sont des fichiers fragmentés. Le "ls" affiche la taille apparente du fichier et "du" affiche la taille réelle du fichier résidant sur le disque.
Un fichier fragmenté est un type de fichier informatique qui tente d'utiliser plus efficacement l'espace du système de fichiers lorsque les blocs alloués au fichier sont pour la plupart vides. Ceci est réalisé en écrivant de brèves informations (métadonnées) représentant les blocs vides sur le disque au lieu de l'espace "vide" réel qui constitue le bloc, en utilisant moins d'espace disque (c'est-à-dire que les fichiers épars contiennent des blocs de zéros dont l'existence est enregistrée, mais n'ont pas espace alloué sur le disque). La taille complète du bloc est écrite sur le disque en tant que taille réelle uniquement lorsque le bloc contient des données "réelles" (non vides).
Lors de la lecture de fichiers épars, le système de fichiers convertit de manière transparente les métadonnées représentant des blocs vides en blocs "réels" remplis de zéro octet au moment de l'exécution. L'application n'a pas connaissance de cette conversion. Les fichiers fragmentés sont couramment utilisés pour les images de disque, les instantanés de base de données, les fichiers journaux, etc.
L'avantage des fichiers fragmentés est que le stockage n'est alloué qu'en cas de besoin :l'espace disque est économisé et des fichiers volumineux peuvent être créés même s'il n'y a pas suffisamment d'espace libre sur le système de fichiers.
Les inconvénients sont que les fichiers épars peuvent devenir fragmentés. Les rapports d'espace libre du système de fichiers peuvent être trompeurs et la copie d'un fichier clairsemé avec un programme qui ne les prend pas explicitement en charge peut copier la totalité de la taille non compressée du fichier, y compris les sections clairsemées, principalement nulles, qui ne sont pas sur le disque - perdre les avantages de la propriété sparse dans le fichier.
Nous pouvons voir ce comportement avec le fichier /var/log/lastlog.
# ls -lh /var/log/lastlog -rw-r--r--. 1 root root 144K Sep 8 22:45 /var/log/lastlog
# du -sh /var/log/lastlog 40K /var/log/lastlog
Création d'un fichier fragmenté
Nous pouvons créer un fichier sparse en utilisant la commande dd :
# dd if=/dev/zero of=sparse_file bs=1 count=0 seek=512M 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000381714 s, 0.0 kB/s
# ls -hl sparse_file -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
# du -sh sparse_file 0 sparse_file
Pour voir l'utilisation du disque du fichier avec la commande "ls", nous pouvons utiliser l'option "-s":
# ls -lhs sparse_file 0 -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
Pour voir la taille apparente du fichier en utilisant "du", nous pouvons utiliser l'option -apparent-size :
# du -h --apparent-size sparse_file 512M sparse_file
Copier le fichier sparse avec la commande "cp"
Le "cp" prend en charge les fichiers fragmentés et est bon pour le détecter, il suffit donc d'exécuter "cp". Mais cp a une option –sparse=WHEN.
# cp --sparse=always sparse_file sparse_file.2