Structure d'un secteur de boot de partition NTFS (Windows NT)

Adresse
(hexa)

Contenu

Taille
(octets)

000 Instruction de saut à la routine de boot 3
003 Nom du fabricant et n° version(p.ex.NTFS) 8
00B Octets par secteur (0x200 = 512) 2
00D Secteurs par cluster (variable) 1
00E Nbre secteurs réservés (0x00) 2
010 inutilisé (0x00) 1
011 inutilisé (0x0000) 2
013 inutilisé (0x0000) 2
015 Descripteur de support (0xF8 pour un disque dur) 1
016 inutilisé (0x0000) 2
018 Nbre de secteurs par piste (variable) 2
01A Nbre de têtes (variable) 2
01C Distance entre 1er secteur du volume et 1er secteur du support 4
020 inutilisé (0x0000) 4
024 inutilisé (0x0000) 4
028 Nombre total de secteurs 8
030 N°logique de cluster de $MFT (Master File Table) 8
038 N°logique de cluster de $MFTMirr (Miroir de Master File Table) 8
040 Nombre de cluster par segment de fichier 4
044 Nombre de clusters par block d'index 4
048 N° de série du disque (créé au formatage à partir de la date) 8
050 Checksum 4
054
à 1FD
Routine de boot 426
1FE AA55 (code d'identification, id.secteur de partition) 2

Remarques :

Fonctionnalités de NTFS

Les différentes versions de NTFS

Il existe en effet plusieurs versions de ce type de partition, liées au système d'exploitation qui les a créées (ou modifiées).
Elles sont identifiées par un , qui ne correspond pas au n° de version du système.

On en dénote 3 :

Version NTFS Systèmes d'exploitation
1.1 Windows NT4 jusqu'au SP3 et versions antérieures
3.0 Windows NT4 à partir  du SP4
Windows 2000 jusqu'au SP2
3.1 Windows 2000 à partir du SP3
Windows XP

Les différences résident dans de nouvelles fonctionnalités.
Par exemple, la version 3.0 apporte par rapport à la 1.1 la gestion des quotas et le chiffrement.
La version 3.1 apporte  par rapport à la 3.0 la possibilité d'avoir une partition en lecture seule.

Cela peut poser des problèmes de compatibilité dans le cas de multiboot, et si un système donné veut atteindre une partition crée par un autre système plus récent.

Ainsi, une version de NT4 SP3 ne pourra pas accéder à une partition NTFS créée sous Windows 2000. Mais cela peut se corriger en installant au moins le SP4 sous NT4.
Toutefois
, compte tenu des informations supplémentaires contenues dans une NTFS 3.0, que NT4 ignore (quotas et chiffrement), il sera impossible d'effectuer une vérification (à l'aide de CHKDSK) d'une NTFS 3.0 sous NT4 (même après installation du SP4 ou supérieur). Seules les lecture et écriture seront possibles sous ce système. La vérification et/ou réparation devra s'effectuer obligatoirement sous Windows 2000 (ou au delà).

FSUTIL

Sous Windows XP, il existe l'utilitaire FSUTIL.EXE (mode console) qui permet d'obtenir (et définir) un grand nombre d'informations précises sur une partition.
Il est utilisable directement sous Windows 2000.

Il se lance dans une fenêtre de commandes, suivi d'un nombre variable de paramètres.

Commandes Rôles
behavior Contrôle le mode du système de fichiers
  query   Interroge les paramètres du mode de système de fichiers
  disable8dot3
  allowextchar
  disablelastaccess
  quotanotify
  mftzone
   
  set   Change les paramètres du mode de système de fichiers
  disable8dot3
  allowextchar
  disablelastaccess
  quotanotify
  mftzone
  1 ou 0
1 ou 0
1 ou 0
De 1 à 4 294 967 295 secondes
De 1 à 4
dirty Gère le bit d'impureté du volume
  query
set
  Interroge le bit d'intégrité
Définit le bit d'intégrité
file Commandes fichier spécifiques
  findbysid
queryallocranges
setshortname
setvaliddata
setzerodata
createnew
  Trouve un fichier par identificateur de sécurité
Interroge l'étendue allouée à un fichier
Définit le nom court d'un fichier
Définit la longueur de données valide d'un fichier
Définit la donnée zéro d'un fichier
Crée un nouveau fichier d'une taille spécifiée
fsinfo Informations du système de fichiers
  drives
drivetype
volumeinfo
ntfsinfo
statistics
  Liste tous les lecteurs
Recherche du type de lecteur
Recherche les informations du volume
Recherche les informations spécifiques aux volumes NTFS
Interroge les statistiques du système de fichiers
hardlink Gestion des liaisons permanentes
  create   Crée une liaison permanente
objectid Gestion des ID objets
  query
set
delete
create
  Interroge l'identificateur d'objet
Modifie l'identificateur d'objet
Supprime l'identificateur d'objet
Crée l'identificateur d'objet
quota Gestion des quotas
  disable
track
enforce
violations
modify
query
  Désactive le suivi et l'application des quotas
Active le suivi des quotas
Active l'application des quotas
Affiche les violations de quotas
Définit les quotas de disque pour un utilisateur
Interroge les quotas de disque
reparsepoint Gestion du point d'analyse
  query
delete
  Interroge un point d'analyse
Supprime un point d'analyse
sparse Contrôle de fragmentation des fichiers
  setflag
queryflag
queryrange
setrange
  Définit la fragmentation
Interroge la fragmentation
Interroge l'étendue
Définit l'étendue de la fragmentation
usn Gestion USN (Update Sequence Number)
  createjournal
deletejournal
enumdata
queryjournal
readdata
  Crée un journal USN
Supprime un journal USN
Énumère les données USN
Interroge les données USN d'un volume
Lit les données USN d'un fichier
volume Gestion du volume
  dismount
diskfree
  Démonte un volume
Détecte la quantité d'espace libre sur un volume

Exemple :

E:\WINNT\system32>fsutil fsinfo ntfsinfo e:
Numéro de série du volume NTFS : 0xb0ec120aec11cc0a
Version : 3.0
Nombre de secteurs : 0x00000000007d043e
Nombre total de clusters : 0x00000000000fa087
Clusters libres : 0x000000000006fb2c
Total réservé : 0x0000000000000000
Octets par secteur : 512
Octets par cluster : 4096
Oct./segment d'enreg. de fich. : 1024
Clust./segment d'enreg. de fich. : 0
Longueur de données valide MFT : 0x000000000300b000
LCN de démarrage MFT : 0x0000000000000004
LCN de démarrage MFT2 : 0x000000000007d043
Début de la zone MFT : 0x0000000000003000
Fin de la zone MFT : 0x000000000001f420

MFT = Master File Table

Bien que sa structure soit radicalement différente, la MFT est un peu à une partition "NTFS" ce que la FAT est à une partition "FAT". Cette table n'a pas d'emplacement prédéfini sur le disque, à la différence de la FAT qui se situe à partir du secteur 2 d'une partition FAT (et avec une taille fixe).
Son adresse est inscrite dans le secteur de boot (offset 0x30), et peut varier suivant les circonstances (secteur défectueux p.ex.), étant donné qu'un "mirroring" de cette table (adresse en 0x38) est effectué en permanence.

La MFT est constituée d'entrées de 1ko chacune, à raison d'une entrée par fichier (ou répertoire) existant dans la partition. Chaque entrée contient successivement les attributs suivants :

Quand un nouveau fichier est créé, le système créé les attributs nécessaires dans une nouvelle entrée de la MFT, mais il y a un problème évident :

La plupart des attributs ont une taille variable (Nom(s), données) et dépassent facilement le ko.

Un fichier raccourci (.lnk) arrive à tenir sans problème dans une entrée la MFT, si bien que son accès est très rapide. Par ailleurs, comme les attributs habituels des fichiers sont stockés dans la MFT, les opérations de recherches de fichiers (FindFirst, FindNext) ne nécessitent pas d'autre accès disque que celui de la MFT.
C'est pourquoi chercher un fichier sur une NTFS est beaucoup plus rapide que sur une FAT!

(En FAT, si on recherche p.ex. tous les .txt sur un disque, il va falloir parcourir toute l'arborescence de chaque sous-répertoire, donc vraisemblablement explorer tout le disque)

Au départ (NT 3.x), la taille de chaque entrée était de 4 ko, mais MicroSoft l'a réduite à 1 ko avec NT4 pour perdre moins de place dans la MFT.

Les points de montages et la commande"mountvol"

Cette fonction est apparue avec Windows 2000.
Elle consiste à "greffer" une partition quelconque (n'ayant pas de lettre attribuée) dans un répertoire d'une partition NTFS existante.
On retrouve le principe de montage de partitions du monde UNIX (et Linux), à l'aide de la commande "mount" bien connue.
Sous Windows 2000 (et au délà), elle s'appelle "mountvol".

Elle permet ainsi d'avoir un nombre infini de partitions, en s'affranchissant de la contrainte de nommage avec les 26 lettres de l'alphabet.
NB: le gestionnaire de disques (à savoir la MMC DISKMGMT.MSC) permet d'effectuer les m^mes opérations, mais avec une interface graphique

Exemples :

Autre exemple :

Une partition (BART) n'a pas pu se voir attribuer de lettre.
Création d'un sous répertoire
\mnt\bart dans la partition U: de type NTFS
Pour l'instant, "U:\mnt\bart" apparaît comme un dossier
Détermination du nom physique de la partiton "BART" par examen de l'affichage de mountvol sans paramètres
Montage de la partition "BART" en tant que u:\mnt\bart
Dans l'explorateur, on constate que l'icône du dossier bart a été changée (disque et non plus dossier)
Dans les propriétés du dossier "U:\mnt\bart" , on voit que c'est un volume monté
On peut arriver au même résultat en utilisant le gestionnaire de disques DISKMGMT.MSC:
 

(clic droit sur la partition, menu "Modifier la lettre de lecteur...")

On peut donc avoir un nombre INFINI d'unités de disques, et non seulement de disques durs :
en effet, cela fonctionne aussi avec les lecteurs de CD (ainsi, on peut faire apparaître un graveur de CD comme "J:\mnt\graveur" !)
La seule condition requise est que la partition servant au montage soit obligatoirement de type NTFS.

on peut monter une partition ou un CD ayant déjà une lettre (mais l'intérêt d'une telle opération est assez réduit).

Grâce à ce système, on peut très bien avoir un PC ne comportant qu'une seule lettre (C:) (+ les disquettes), TOUTES les autres partitions n'apparaissant que sous la forme de sous répertoires.

Les flux multiples

Vu son importance, un chapitre entier est désormais consacré à cette fonctionnalité.

Les liens symboliques (Windows 2000)

Cette fonctionnalité existe depuis toujours, ou presque, dans UNIX! (et est requise d'ailleurs par tout OS conforme à POSIX)

Un lien symbolique (à ne pas confondre avec un raccourci) est un fichier virtuel qui pointe vers un fichier réel. Il va apparaître dans un répertoire cible, mais se limitera à une entrée dans le répertoire, et un lien symbolique dans la MFT, faisant la liaison entre le fichier réel et l'endroit où il apparaît virtuellement.

A l'opposé, un raccourci est un authentique fichier, bien réel, à extension ".lnk", qui contient des infos diverses qui seront interprétées par le shell pour aller chercher le fichier d'origine.
Un inconvénient d'un raccourci est qu'il ne "passe" pas les réseaux (si on monte un disque réseau, et que l'on clique sur un raccourci dans ce disque, on aura des surprises, le shell allant chercher le fichier sur la machine locale et non pas sur la machine distante). Il n'y a pas cet inconvénient avec un "vrai lien symbolique", puisque dès qu'un veut y accéder, il y a immédiatement un ré-aiguillage automatique vers le fichier d'origine.

Il faut bien avoir en tête savoir que les liens symboliques ne sont possibles qu'avec des partitions NTFS. Donc les logiciels habituels, prévus pour tourner indifféremment sur des FAT ou des NTFS, n'ont pas prévu cela.
Une restriction : fichier (ou dossier) d'origine et lien symbolique doivent résider sur le même disque logique.

Si on veut programmer un peu, et - TRÈS IMPORTANT - si on a Windows 2000, on peut utiliser la (nouvelle) fonction suivante de la KERNEL32.DLL :

BOOL CreateHardLink(LPCTSTR pszFileName,
LPCTSTR pszExistingFileName,
LPSECURITY_ATTRIBUTES
lpSecurityAttributes);

cette fonction se trouve à l'index 59 (CreateHardLinkA) et 60 (CreateHardLinkW) (versions ANSI et UNICODE) de la kernel32.dll de Windows 2000 SEULEMENT.
Elle n'existe pas dans la kernel32.dll de NT4, bien que les liens symboliques soient possibles dans la MFT. 

Pour créer un lien, on lui passe :

Une fois que l'on a appelé "CreateHardLink", le répertoire donné pour le lien contient un nouveau fichier (en apparence). Si on ouvre ce fichier, on ouvre en réalité le fichier d'origine.

Hardlink

Voici à titre d'exemple un petit programme (en mode console) de création de lien symbolique :

Téléchargement : (gratuit!)

module exécutable : hardlink.exe
code source : hardlink.cpp
syntaxe : hardlink <chemin_reel> <nom_du_lien>
avec :
<chemin_reel> : le nom du fichier ou dossier pour lequel on veut créer un lien <nom_du_lien> : l'emplacement du lien
exemple : hardlink d:\boot.ini d:\winnt\temp\boot.ini

Il est également possible de créer des liens symboliques à l'aide de l'utilitaire FSUTIL de Windows XP
Syntaxe :

FSUTIL hardlink create  <fichier lien> <fichier existant>

Exemple :

E:\>fsutil hardlink create e:\hosts.txt e:\winnt\system32\drivers\etc\hosts
Liaison permanente créée pour e:\hosts.txt <<===>> e:\winnt\system32\drivers\etc\hosts

La fonction Createhardlink ne permet de créer des liens symboliques que vers des fichiers.
Pour créer un lien vers un dossier, la méthode à utiliser est différente.
Il faut faire appel à la fonction CREATEDIRECTORY et à une structure non documentée FSCTL_SET_REPARSE_POINT

On trouvera un exemple de mise en pratique de cette méthode sur l'excellent site de chez Sysinternals :

"Junction" (exécutable et source disponibles)
 

Conclusion

Tout ce qui précède n'est qu'un aperçu des possibilités offertes par NTFS et sa MFT. Beaucoup sont encore inutilisées, ou partiellement utilisées.
Au niveau des inconvénients, la MFT peut s'avérer assez gourmande en espace disque (puisque 1 ko par fichier quel qu'il soit, en plus de la taille réelle du fichier s'il est >1 ko)

sommaireLe formatage bas niveau

C'est une opération magnétique, effectuée :

Le programme de formatage bas niveau détermine la taille de secteurs à utiliser (512 octets en principe), le nombre de têtes, le nombre de pistes (ou cylindres) et le nombre de secteurs par piste, tout cela à partir d'informations codées "électriquement" dans le disque dur par le constructeur.
Dans le cas d'une disquette, ces infos sont standardisées, fonction du type de support (p.ex. pour les disquettes Haute Densité  3"1/2 : 512 octets par secteur, 2 têtes, 80 pistes,18 secteurs par piste, soit 1.44Mo de capacité), ou transmises en paramètres au programme :
    format a: /F:taille /T:pistes /N:secteurs

Ce programme vérifie tous les secteurs un par un, en les magnétisant et en lisant le résultat, et stocke sur le disque des informations d'erreur éventuelle et d'identification pour chaque secteur. En effet, un secteur va être accédé par la suite par un n° logique, or ce n° ne correspond jamais à l'ordre physique des secteurs, pour des questions de performances. Compte tenu de l'inertie du mécanisme et du temps de lecture lui-même, quand on lit un secteur (LOGIQUE) donné, il est impossible de lire "posément" le suivant immédiat (géométriquement parlant), car la tête a souvent dépassé le début! On est alors obligé de faire un tour quasi complet.

Donc le suivant (LOGIQUE) a intérêt à être PHYSIQUEMENT plus loin (non contigu du précédent). Ce décalage correspond à ce qu'on appelle le "facteur d'entrelacement" (Interleaving" en anglais). Il dépend de la vitesse de rotation du disque et de la vitesse de traitement du contrôleur de disque. Par exemple, un facteur de "6" signifie qu'il faut "sauter" 5 secteurs physiques après avoir accédé à un secteur pour accéder au secteur logique suivant. 

Donc une erreur sur ce facteur peut rendre le disque inutilisable


C'est pourquoi le formatage bas niveau d'un disque dur :

Ce programme varie suivant les disques, et est généralement fourni par le constructeur du disque (ou disponible sur son site Web). Il est rarement interchangeable d'une marque à une autre. A ce stade, il n'est encore question que de disque PHYSIQUE dans son ensemble, indépendamment de tout système d'exploitation.

L’opération qui suit le formatage bas niveau est le partionnement, abondamment décrit plus haut.

Puis a lieu, pour chaque partition, le Formatage logique.
Il consiste en la "préparation" des zones de rangements (= les cloisons dans les compartiments créés) et est effectué par l'outil FORMAT (sous DOS, Windows), WINDISK (sous NT), MKFS (sous Linux), ...
Ce cloisonnement va permettre d'organiser et de prévoir un "catalogue" (vierge au début) de tout ce qu'on va mettre dans le compartiment par la suite. Cette organisation varie suivant les systèmes de fichiers prévus (supportés par le système d'exploitation correspondant).

Si on prend le cas de DOS (ou Windows 9x), le formatage logique va créer successivement :

Les opérations de "préparation" d'un disque avant usage sont donc :

Disque dur :

Disquette :

Mécanisme de boot d'un PC

Le programme de partition, décrit précédemment, et situé à l'adresse 0000:7C00, :

  1. identifie la partition active, définie soit par FDISK, par Windisk (NT), ou par un outil comme System Commander.
  2. détecte le système d'exploitation à lancer
  3. se déplace à l'adresse 0000:0600  
  4. charge le secteur de boot correspondant à l'adresse 0000:7C00
  5. lance le programme de boot qu'il contient, par un saut à l'adresse 0000:7C00

Ce (mini) programme cherche sur le disque un (ou deux) autre(s) programme(s) et lui passe la main.
Le nom de ce programme est également stocké dans le secteur de boot (à la fin généralement).
Ce(s) programme(s) s'appelle(nt) :

Dans le cas de DOS, il contient la majeure partie de l'OS. Dans le cas de NT (et aussi de Linux), ce programme n'est qu'une étape intermédiaire, avant de charger réellement l'OS.