Défragmentation des fichiers

Lorsqu’un fichier est écrit sur un disque, il arrive parfois qu’il ne puisse pas être écrit dans des clusters contigus. Les clusters non contigus ralentissent le processus de lecture et d’écriture d’un fichier. Plus les clusters non contigus sont éloignés sur un disque, plus le problème est grave en raison du temps qu’il faut pour déplacer la tête de lecture/écriture d’un disque dur. Un fichier avec des clusters non contigus est fragmenté. Pour optimiser l’accès rapide aux fichiers, un volume peut être défragmenté.

La défragmentation est le processus consistant à déplacer des portions de fichiers sur un disque afin de défragmenter des fichiers, c’est-à-dire à déplacer des clusters de fichiers sur un disque pour les rendre contigus. Pour plus d'informations, consultez les sections suivantes :

Défragmentation d’un fichier

Dans un système d’exploitation simple à une seule tâche, le logiciel de défragmentation est la seule tâche, et il n’y a pas d’autres processus pour lire ou écrire sur le disque. Cependant, dans un système d’exploitation multitâche, certains processus peuvent lire et écrire sur un disque dur pendant qu’un autre processus défragmente ce disque. Le défi consiste à éviter les écritures sur un fichier en cours de défragmentation sans interrompre le processus d’écriture trop longtemps. La résolution de ce problème n’est pas triviale, mais elle est possible.

Pour permettre la défragmentation sans nécessiter une connaissance détaillée de la structure du disque du système de fichiers, un ensemble de trois codes de contrôle est fourni. Les codes de contrôle offrent les fonctionnalités suivantes :

  • Permettre aux applications de localiser des clusters vides
  • Déterminer l’emplacement des clusters de fichiers sur le disque
  • Déplacer des clusters sur un disque

Les codes de contrôle gèrent également de manière transparente le problème d’inhibition et de permission des autres processus de lire et d’écrire sur les fichiers pendant les déplacements.

Ces opérations peuvent être effectuées sans empêcher d’autres processus de s’exécuter. Cependant, les autres processus ont des temps de réponse plus lents pendant qu’un disque dur est défragmenté.

Pour défragmenter un fichier :

  1. Utilisez le code de contrôle FSCTL_GET_VOLUME_BITMAP pour trouver un emplacement sur le volume suffisamment grand pour accueillir un fichier entier.

Remarque

Si nécessaire, déplacez d’autres fichiers pour faire un espace suffisamment grand. Idéalement, il y a suffisamment de clusters non alloués après la première étendue du fichier pour pouvoir déplacer les étendues suivantes dans l’espace après la première étendue.

  1. Utilisez le code de contrôle FSCTL_GET_RETRIEVAL_POINTERS pour obtenir une carte de la disposition actuelle du fichier sur le disque.

  2. Parcourez la structure RETRIEVAL_POINTERS_BUFFER renvoyée par FSCTL_GET_RETRIEVAL_POINTERS.

  3. Utilisez le code de contrôle FSCTL_MOVE_FILE pour déplacer chaque cluster au fur et à mesure que vous parcourez la structure.

    Remarque

    Vous devrez peut-être renouveler soit la bitmap, soit la structure de récupération, soit les deux à différents moments lorsque d’autres processus écrivent sur le disque.

Deux des opérations utilisées dans le processus de défragmentation nécessitent un handle sur un volume. Seuls les administrateurs peuvent obtenir un handle sur un volume, donc seuls les administrateurs peuvent défragmenter un volume. Une application doit vérifier les droits d’un utilisateur qui tente d’exécuter le logiciel de défragmentation, et elle ne doit pas permettre à un utilisateur de défragmenter un volume s’il ne dispose pas des droits appropriés.

Lorsque vous utilisez CreateFile pour ouvrir un répertoire pendant la défragmentation d’un volume de système de fichiers FAT ou FAT32, spécifiez la valeur de masque d’accès GENERIC_READ. Ne spécifiez pas la valeur de masque d’accès MAXIMUM_ALLOWED. L’accès au répertoire est refusé si cela est fait.

N’essayez pas de déplacer des clusters alloués dans un système de fichiers NTFS qui s’étendent au-delà de la taille de fichier arrondie au cluster, car cela entraînerait une erreur.

Les points de réanalyse, les bitmaps et les listes d’attributs dans les volumes de système de fichiers NTFS peuvent être défragmentés, ouverts pour la lecture et la synchronisation, et nommés à l’aide de la syntaxe fichier:nom:type ; par exemple, dirname:$i30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT, et mrp::$ATTRIBUTE_LIST.

Lors de la défragmentation de volumes de système de fichiers NTFS, la défragmentation d’un cluster virtuel au-delà de la taille d’allocation d’un fichier est autorisée.

Minimiser les interactions entre la défragmentation et les captures instantanées

Dans la mesure du possible, déplacez les données en blocs alignés les uns par rapport aux autres par incréments de 16 kilo-octets (Ko). Cela réduit la surcharge de copie sur écriture lorsque les captures instantanées sont activées, car l’espace de capture instantanée augmente et les performances sont réduites lorsque les conditions suivantes se produisent :

  • La taille du bloc de demande de déplacement est inférieure à 16 Ko.
  • Le delta de déplacement n’est pas en incréments de 16 Ko.

Le delta de déplacement est le nombre d’octets entre le début du bloc source et le début du bloc cible. En d’autres termes, un bloc commençant à l’offset X (sur disque) peut être déplacé à un offset de départ Y si la valeur absolue de X moins Y est un multiple pair de 16 Ko. Donc, en supposant des clusters de 4 Ko, un déplacement du cluster 3 au cluster 27 sera optimisé, mais un déplacement du cluster 18 au cluster 24 ne le sera pas. Notez que mod(3,4) = 3 = mod(27,4). Le module 4 est choisi car quatre clusters de 4 Ko chacun équivalent à 16 Ko. Par conséquent, un volume formaté avec une taille de cluster de 16 Ko permettra d’optimiser tous les fichiers déplacés.

Pour plus d’informations sur les captures instantanées, veuillez consulter la section Service de capture instantanée de volume.

Fichiers, flux et types de flux pris en charge pour la défragmentation

Bien que la plupart des fichiers puissent être déplacés à l’aide du code de contrôle FSCTL_MOVE_FILE, tous ne peuvent pas être déplacés. Vous trouverez ci-dessous la liste des fichiers, flux et types de flux (également appelés codes de type d’attribut) pris en charge par FSCTL_MOVE_FILE. D’autres fichiers, flux et types de flux ne sont pas pris en charge par FSCTL_MOVE_FILE.

Types de flux pris en charge pour tout fichier ou répertoire.

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP ::$EA et ::$LOGGED_UTILITY_STREAM ne sont pas pris en charge avant Windows 8 et Windows Server 2012

Types de flux pris en charge pour tout répertoire.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

Vous trouverez ci-dessous les fichiers système, les flux et les types de flux pris en charge par FSCTL_MOVE_FILE dans le format « nomdefichier:nomdeflux:$typenom ».

  • $MFT::$DATA
  • $MFT::$ATTRIBUTE_LIST
  • $MFT::$BITMAP
  • $AttrDef::$DATA
  • $AttrDef::$ATTRIBUTE_LIST
  • $Secure:$SDS:$DATA
  • $Secure::$ATTRIBUTE_LIST
  • $Secure:$SDH:$INDEX_ALLOCATION
  • $Secure:$SDH:$BITMAP
  • $Secure:$SII:$INDEX_ALLOCATION
  • $Secure:$SII:$BITMAP
  • $UpCase::$DATA
  • $UpCase::$ATTRIBUTE_LIST
  • $Extend:$I30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I30:$BITMAP
  • $Extend\$UsnJrnl:$J:$DATA
  • $Extend\$UsnJrnl::$ATTRIBUTE_LIST
  • $Extend\$UsnJrnl:$Max:$DATA
  • $Extend\$Quota:$Q:$INDEX_ALLOCATION
  • $Extend\$Quota::$ATTRIBUTE_LIST
  • $Extend\$Quota:$Q:$BITMAP
  • $Extend\$Quota:$O:$INDEX_ALLOCATION
  • $Extend\$Quota:$O:$BITMAP
  • $Extend\$ObjId:$O:$INDEX_ALLOCATION
  • $Extend\$ObjId::$ATTRIBUTE_LIST
  • $Extend\$ObjId:$O:$BITMAP
  • $Extend\$Reparse:$R:$INDEX_ALLOCATION
  • $Extend\$Reparse::$ATTRIBUTE_LIST
  • $Extend\$Reparse:$R:$BITMAP
  • $Extend\$RmMetadata:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I30:$BITMAP
  • $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
  • $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST