Défragmentation des fichiers

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

La défragmentation est le processus de déplacement de parties de fichiers sur un disque vers des fichiers de défragmentation, c’est-à-dire le processus de déplacement de 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 à tâche unique simple, le logiciel de défragmentation est la seule tâche et il n’existe aucun autre processus à partir duquel lire ou écrire sur le disque. Toutefois, dans un système d’exploitation multitâche, certains processus peuvent être la lecture et l’écriture sur un disque dur tandis qu’un autre processus défragmente ce disque dur. L’astuce consiste à éviter les écritures dans un fichier en cours de défragmentation sans arrêter le processus d’écriture pendant très 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 d’une structure de disque de système de fichiers, un ensemble de trois codes de contrôle est fourni. Les codes de contrôle fournissent les fonctionnalités suivantes :

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

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

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

Pour défragmenter un fichier

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

    Notes

    Si nécessaire, déplacez d’autres fichiers pour créer un emplacement suffisamment grand. Dans l’idéal, il y a suffisamment de clusters non alloués après la première étendue du fichier pour que vous puissiez déplacer les extensions suivantes dans l’espace après la première étendue.

     

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

  3. Parcourez la structure RETRIEVAL_POINTERS_BUFFER retournée par FSCTL_GET_RETRIEVAL_POINTERS.

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

    Notes

    Vous devrez peut-être renouveler l’image bitmap ou la structure de récupération, ou les deux à différents moments au fur et à mesure que 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 pour un volume. Seuls les administrateurs peuvent donc défragmenter un volume. Une application doit case activée les droits d’un utilisateur qui tente d’exécuter un logiciel de défragmentation, et elle ne doit pas autoriser un utilisateur à défragmenter un volume si l’utilisateur ne dispose pas des droits appropriés.

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

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 du cluster, car le résultat est une erreur.

Les points, les bitmaps et les listes d’attributs dans les volumes du 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 file:name:type ; par exemple, dirname:$i 30:$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.

Réduction des interactions entre la défragmentation et les clichés instantanés

Dans la mesure du possible, déplacez les données dans des 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 clichés instantanés sont activés, car l’espace de cliché instantané est augmenté et les performances sont réduites lorsque les conditions suivantes se produisent :

  • La taille du bloc de demande de déplacement est inférieure ou égale à 16 Ko.
  • Le delta de déplacement n’est pas par 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 au décalage X (sur disque) peut être déplacé vers un décalage de départ Y si la valeur absolue de X moins Y est un multiple pair de 16 Ko. Ainsi, en supposant des clusters de 4 Ko, un passage du cluster 3 au cluster 27 sera optimisé, mais pas un passage du cluster 18 au cluster 24. Notez que mod(3,4) = 3 = mod(27,4). Mod 4 est choisi, car quatre clusters de 4 Ko chacun équivaut à 16 Ko. Par conséquent, un volume mis en forme à une taille de cluster de 16 Ko entraîne l’optimisation de tous les fichiers de déplacement.

Pour plus d’informations sur les clichés instantanés, consultez Service de cliché instantané 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, des flux et des types de flux (également appelés codes de type d’attribut) pris en charge par FSCTL_MOVE_FILE. Les autres fichiers, flux et types de flux ne sont pas pris en charge par FSCTL_MOVE_FILE.

Types de flux pris en charge pour n’importe quel 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 n’importe quel répertoire.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

Voici les types de fichiers système, de flux et de flux pris en charge par FSCTL_MOVE_FILE au format « filename:streamname:$typename ».

  • $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:$I 30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I 30:$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:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I 30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I 30:$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