Windows 2000 inclut une version améliorée du système de fichiers NTFS qui gère le cryptage de fichier, la possibilité d'ajouter de l'espace disque à un volume NTFS sans redémarrage, le suivi des liaisons distribuées (qui permet de résoudre les raccourcis et les liaisons OLE (Object Linking and Embedding) dans les fichiers NTFS ayant fait l'objet d'une modification du nom ou du chemin d'accès) et des quotas de disque par utilisateur pour surveiller et limiter l'utilisation de l'espace disque, ainsi que de nombreuses améliorations des performances.

Jean-Claude Bellamy nous livre ses secrets :

Structure d'un secteur de boot

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 :

  • La zone qui s'étend de l'offset 00B à l'offset 023 s'appelle "BIOS Parameter Block" (BPB) 
  • La zone qui s'étend de l'offset 024 à l'offset 053 s'appelle "extended BIOS Parameter Block" (EBPB) 
  • La routine de boot fait en réalité plus de 426 octets et peut s'étendre sur les 15 secteurs suivants
  • La MFT (Master File Table) d'une partition NTFS n'est pas située à une adresse fixe, comme peut l'être  la FAT (File Allocation Table) d'une partition FAT. Son emplacement est défini par le contenu de l'offset 030
  • Le nombre de secteurs par cluster dépend de la taille de la partition. Il est de 1 jusqu'à 512Mo, 2 jusqu'à 1 Go, ..., 64 jusqu'à 32 Go, et 128 au delà.

Structure de la 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 :

  • Informations standards : attributs "classiques" de fichier (Read only, System,..), dates de création, modification, accès, liens symboliques. 
    On retrouve ces mêmes informations dans le répertoire contenant le fichier
  • Nom : le nom du fichier en UNICODE. Il peut y avoir plusieurs noms (en particulier le nom "court" 8.3)
  • Descripteur de sécurité : informations de contrôle d'accès au fichier.
  • Données non nommées : le contenu (total ou partiel) du fichier sous la forme d'un flux "anonyme"
  • Données nommées : autre(s) flux de données, non anonyme(s) (facultatif(s))
  • Index : Seulement pour les gros répertoires
  • Filtre : Un filtre du système de fichiers utilisé lors de l'accès au fichier ou répertoire

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.

  • Si ça peut tenir, l'attribut est appelé "attribut résident", et donc le fichier est contenu INTÉGRALEMENT dans la MFT.
  • Si ça ne tient pas, le système écrit le contenu de l'attribut ailleurs sur le disque, et inscrit un pointeur vers cette zone dans l'entrée de la MFT. (attribut non résident)

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 flux multiples

Un fichier peut contenir plusieurs "flux", ou lots, ou "versions" de données. Cette fonctionnalité est très rarement employée pour l'instant (un fichier = un flux de données), avant tout pour des questions de compatibilité (il faut être en NTFS) mais elle peut (pourrait) s'avérer très pratique avec certains types de données.
C'est le cas p.ex. des bitmaps. On peut inclure à la fois le bitmap lui-même, mais aussi une "vignette". Ainsi, un éditeur de bitmap utilisant cette propriété, quand il va accéder à un fichier, pourra soit afficher le bitmap complet, soit la vue réduite, sans autre manipulation que de sélectionner le flux auquel il veut accéder.

De même, un traitement de texte pourra(it) stocker plusieurs versions du même document, dans un fichier unique!

Exercice sur les flux (très basique) (partition NTFS obligatoire) :

Dans une fenêtre de commande, taper les 2 commandes suivantes :

M:\>echo "May the Force be with You" > Starswar.txt:Yoda
on crée le fichier texte "Starswar.txt", dans lequel on crée un flux nommé "Yoda"

M:\>echo "You don't know the power of the dark side" > Starswar.txt:Vador
on ajoute à ce fichier un 2ème flux nommé "Vador"

Si maintenant on tape la commande "dir Starswar.txt", on risque d'être déçu :

M:\>dir Starswar.txt
Le volume dans le lecteur M s'appelle DOWNLOAD
Le numéro de série du volume est 5C8D-4ABF

Répertoire de M:\
25/11/99 14:09 0 Starswar.txt
1 fichier(s) 0 octets
56 837 632 octets libres

Cette taille de 0 octets peut surprendre, mais c'est du au fait que "dir" ne s'intéresse qu'aux flux anonymes (standards) !

On peut s'assurer que le fichier n'est pas vide en réalité :

M:\>more <Starswar.txt:Yoda
"May the Force be with You"

M:\>more <Starswar.txt:Vador
"You don't know the power of the dark side"

Si on édite avec notepad (ou autre) le fichier Stawswar.txt, on le découvrira vide! (parce que les éditeurs texte habituels savent accéder qu'aux flux anonymes)
(Ces flux nommés peuvent servir d'astuce pour stocker certaines infos confidentielles !!! ;+))

Les liens symboliques

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.

Si on veut programmer un peu, 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 kernel32.dll

Pour créer un lien, on lui passe :

  • pszFileName : le nouveau chemin (= le lien)
  • pszExistingFileName : le chemin du fichier réel
  • lpSecurityAttributes : pointeur éventuel (car il peut être égal à "null") vers une structure contenant un nouveau descripteur de sécurité (cela permet d'avoir un contrôle d'accès au lien différent de celui du fichier réel)

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.

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)

Lire le NTFS sous Windows 9x/ME ?

Le programme NTFS for Windows 98 remplit parfaitement cette mission.