Les Liens NTFS
Points d'Analyse, Jonctions, Liens Symboliques, Liens Réels
Reparse Points, Junctions, Symbolic Links, Hard Links

On connaissait déjà les Liens NTFS sous XP, mais leur utilisation restait confidentielle . Avec Vista toute la panoplie est livrée accompagnée d'une commande dédiée : mklink. On va voir tout de suite comment Vista et Windows 7 abusent du procédé. Comment cela peut-il servir au particulier ? Essentiellement à raccourcir des chemins d'accès, où à résoudre des cas particuliers. On verra dans la conclusion qu'on peut faire des liens relatifs, très pratiques dans les volumes amovibles susceptibles de changer de lettre. Mais ce qui a motivé cet article est ceci : il faut prendre en compte cette présence de Jonctions dans le système si on veut faire des sauvegardes, ou délocaliser Users ... avec une Jonction !

Sommaire

 

Définitions

Reparse Points
Pour le NTFS les dossiers et fichiers sont des objets. Ces objets ont des propriétés, comme par exemple les noms courts, les noms longs, les attributs, les flux. Mais le principe va beaucoup plus loin, on parle de Filtres, de Tags, et de Points d'Analyse, qui est le terme habituellement adopté pour Reparse Points. Ces Points d'Analyse sont écrits dans la MFT (Master File Table).

Liens NTFS
Les Liens NTFS représentent une partie de cette technologie et permettent des redirections de fichiers au niveau NTFS, alors que les raccourcis (.LNK) habituels font de la redirection via le Système d'Exploitation.

Liens Réels
NTFS permet d'associer plusieurs noms à un fichier. Les Liens Réels ou Hard Links sont appelés ainsi car ils pointent directement vers les octets du fichier pris pour cible. Ils sont ainsi très résistants car on ne peut supprimer accidentellement cette liaison. Déplacer ou supprimer le fichier pris originellement pour cible n'a aucun effet, et il faudra supprimer tous les liens réels pour supprimer le fichier. Les Liens réels ne peuvent pointer vers un fichier situé sur un autre volume.

Soft Links
Par opposition aux Hard Links, les redirections Soft Links sont moins solides : si on déplace ou supprime la cible, le lien est rompu. Les Jonctions et les Liens Symboliques sont des Soft Links.

Jonctions
Redirection NTFS vers un dossier. Le chemin est absolu, la cible peut être située sur un autre volume. Les Jonctions font double-emploi avec Les Liens Symboliques mais sont conservés par souci de compatibilité.

Liens Symboliques
Ce sont des Jonctions à un sens plus large. Les Liens Symboliques peuvent pointer autant des fichiers que des dossiers. Comme pour les Jonctions la cible peut être située sur un autre volume. Le lien peut être relatif (exemple : ..\ailleurs\cible.txt) ou absolu (d:\ailleurs\cible.txt)

Points de montage
Les points de montage permettent de monter un volume en tant que dossier, au lieu de lui attribuer une lettre. Ceci permet de s'affranchir du nombre limité de lettres ou de ne pas encombrer le Poste de Travail. On peut désigner un volume à la fois par une lettre et un nom de dossier. Voir le Gestionnaire de disques (WIN+R, diskmgmt.msc)

 

Mise en évidence des Liens NTFS dans Vista et Win7

Si on ouvre dans l'explorateur de fichiers le dossier c:\Utilisateurs\NomduProfil à priori tout semble normal.

http://fspsa.free.fr/ng/jonctions-cachees.gif

Mais si on affiche les fichiers cachés et les fichiers systèmes (Afficher tous les fichiers), on voit des icones de dossiers affublés de flèches de raccourci. La plupart retournent un message d'interdiction d'accès quand on les clique. Ce sont des Jonctions.

http://fspsa.free.fr/ng/jonctions-visibles.gif

Pour ouvrir une Console de Commandes, le moyen le plus universel est d'entrer cmd dans Exécuter : WIN+R, cmd, Entrée. Pour info avec Vista/W7 on utilise CTL+MAJ+Entrée pour ouvrir la Console en Mode Administrateur.

La commande DIR liste les fichiers et dossiers. Entrer dir /? pour voir son utilisation. Ses commutateurs permettent d'obtenir différentes présentations. Par exemple /S permet de lister les sous-dossiers, alors que /A permet de choisir de spécifier des Attributs. Par exemple /AL va afficher seulement les Liens NTFS, et /A-L va au contraire afficher tout sauf ces Points d'Analyse.

DIR /AL /S permet de ressortir les Liens NTFS de types <JONCTION> ou <SYMLINKD> (Lien Symbolique).
Le résultat de la commande a été expurgé des informations inutiles pour plus de clarté.
L'affichage du nom donné au Lien est suivi du chemin vers sa cible :

C:\Users\JF>cd\

C:\>dir /AL /S

Répertoire de C:\
<JONCTION> Documents and Settings [C:\Users]

Répertoire de C:\Program Files
<JONCTION> Fichiers communs [C:\Program Files\Common Files]

Répertoire de C:\Program Files\Windows NT
<JONCTION> Accessoires [C:\Program Files\Windows NT\Accessories]

Répertoire de C:\ProgramData
<JONCTION> Application Data [C:\ProgramData] ***
<JONCTION> Bureau [C:\Users\Public\Desktop]
<JONCTION> Desktop [C:\Users\Public\Desktop]
<JONCTION> Documents [C:\Users\Public\Documents]
<JONCTION> Favoris [C:\Users\Public\Favorites]
<JONCTION> Favorites [C:\Users\Public\Favorites]
<JONCTION> Menu Démarrer [C:\ProgramData\Microsoft\Windows\Start Menu]
<JONCTION> Modèles [C:\ProgramData\Microsoft\Windows\Templates]
<JONCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
<JONCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]

Répertoire de C:\ProgramData\Microsoft\Windows\Start Menu
<JONCTION> Programmes [C:\ProgramData\Microsoft\Windows\Start Menu\Programs]

Répertoire de C:\Users
<SYMLINKD> All Users [C:\ProgramData]
<JONCTION> Default User [C:\Users\Default]

Répertoire de C:\Users\All Users
<JONCTION> Application Data [C:\ProgramData]
<JONCTION> Bureau [C:\Users\Public\Desktop]
<JONCTION> Desktop [C:\Users\Public\Desktop]
<JONCTION> Documents [C:\Users\Public\Documents]
<JONCTION> Favoris [C:\Users\Public\Favorites]
<JONCTION> Favorites [C:\Users\Public\Favorites]
<JONCTION> Menu Démarrer [C:\ProgramData\Microsoft\Windows\Start Menu]
<JONCTION> Modèles [C:\ProgramData\Microsoft\Windows\Templates]
<JONCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
<JONCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]

Répertoire de C:\Users\All Users\Microsoft\Windows\Start Menu
<JONCTION> Programmes [C:\ProgramData\Microsoft\Windows\Start Menu\Programs]

Répertoire de C:\Users\Default
<JONCTION> Application Data [C:\Users\Default\AppData\Roaming]
<JONCTION> Cookies [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Cookies]
<JONCTION> Local Settings [C:\Users\Default\AppData\Local]
<JONCTION> Menu Démarrer [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu]
<JONCTION> Mes documents [C:\Users\Default\Documents]
<JONCTION> Modèles [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Templates]
<JONCTION> My Documents [C:\Users\Default\Documents]
<JONCTION> NetHood [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Network Shortcuts]
<JONCTION> PrintHood [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Printer Shortcuts]
<JONCTION> Recent [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Recent]
<JONCTION> SendTo [C:\Users\Default\AppData\Roaming\Microsoft\Windows\SendTo]
<JONCTION> Start Menu [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu]
<JONCTION> Templates [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Templates]
<JONCTION> Voisinage d'impression [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Printer Shortcuts]
<JONCTION> Voisinage réseau [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Network Shortcuts]

Répertoire de C:\Users\Default\AppData\Local
<JONCTION> Application Data [C:\Users\Default\AppData\Local]***
<JONCTION> Historique [C:\Users\Default\AppData\Local\Microsoft\Windows\History]
<JONCTION> History [C:\Users\Default\AppData\Local\Microsoft\Windows\History]
<JONCTION> Temporary Internet Files [C:\Users\Default\AppData\Local\Microsoft\Windows\Temporary Internet Files]


Répertoire de C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu
<JONCTION> Programmes [C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs]


Répertoire de C:\Users\Default\Documents
<JONCTION> Ma musique [C:\Users\Default\Music]
<JONCTION> Mes images [C:\Users\Default\Pictures]
<JONCTION> Mes vidéos [C:\Users\Default\Videos]
<JONCTION> My Music [C:\Users\Default\Music]
<JONCTION> My Pictures [C:\Users\Default\Pictures]
<JONCTION> My Videos [C:\Users\Default\Videos]

Etc. Idem avec les autres comptes...
 

Les Liens NTFS pèsent zéro octet. En effet ces Liens ne sont pas des fichiers comme les raccourcis LNK et les URL, ça se passe ailleurs (dans l'index).

Noter l'exception pour  C:\Users\All Users  qui n'est pas une Jonction mais un Lien Symbolique absolu vers un dossier. Je n'ai pas trouvé la raison de cette différence de traitement, les deux procédés ne font aucune différence (simple enregistrement dans la MFT d'un lien absolu).
Merci de me contacter si vous connaissez la raison de cette exception.

Repérées par des *** sont les deux surprises du procédé : des Jonctions qui pointent sur leurs conteneurs. Ces Liens sont normalement cachés, mais ils ont aussi été rendus inaccessibles pour éviter les phénomènes de récursivité dans Explorer :

http://fspsa.free.fr/ng/application-data-acces-refuse.gif

La présence de ces particularités entraine une certaine incompréhension d'utilisateurs cherchant à faire des sauvegardes avec des logiciels inadaptés, ou oubliant le commutateur adéquat dans la commande. Vous trouverez des illustrations de ces phénomènes de récursivité ici :

Si on essaie d'accéder à C:\Users\All Users\Microsoft on abouti au bon endroit ==> C:\ProgramData\Microsoft.

Si vieux programme a besoin d'accéder à C:\Documents and Settings\All Users\Application Data\Microsoft il va fonctionner comme s'il était dans Windows XP. Un dossier créé sous une adresse apparaît simultanément sous l'autre adresse :

http://fspsa.free.fr/ng/vista-jonctions.gif

 

Agencement du dossier Utilisateurs

On a vu que le bien connu "Documents and Settings" de Windows XP est devenu le dossier Utilisateurs, de son vrai nom Users. Pour des raisons de compatibilité "Documents and Settings" existe toujours, mais sous la forme d'une Jonction vers  Users. Quand on clique sur la Jonction "Documents and Settings", un désagréable message "Accès refusé" nous invite à aller voir ailleurs. Il faut en effet rompre avec les anciennes habitudes. Maintenant c'est Users.

Il en est de même dans Users pour les anciens dossiers "All Users" devenu "c:\ProgramData" et "Default Users" devenu "c:\Users\Default". On pourrait penser qu'il y a une volonté de supprimer les espaces dans les noms ; mais ce n'est pas le cas, comme le confirme l'examen du contenu des profils dans le tableau ci-dessous. Par ailleurs le vrai nom de "c:\Programmes" est resté "c:\Program Files". Cette francisation "Programmes" est obtenue par le même artifice que pour Utilisateurs, à savoir un fichier caché et système Destop.ini

Évolution des profils

Windows XP

Nom anglophone

Vista/W7

    Entre parenthèses : nom véritable du dossier
  AppData AppData
Application Data   AppData\Roaming
Bureau Desktop Bureau (Desktop)
Cookies Cookies AppData\Roaming\Microsoft\Windows\Cookies
Favoris Favorites Favoris (Favorites)
Local Settings Local Settings AppData\Local
Local Settings\Application Data Application Data AppData\Local
Local Settings\Historique History AppData\Local\Microsoft\Windows\History
Local Settings\Temp Temp AppData\Local\Temp
Local Settings\Temporary Internet Files Temporary Internet Files AppData\Local\Microsoft\Windows\Temporary Internet Files
Menu Démarrer Start Menu AppData\Roaming\Microsoft\Windows\Menu Démarrer (Start Menu)
Menu Démarrer\Programmes Programs AppData\Roaming\Microsoft\Windows\Start Menu\Programmes (Programs)
Menu Démarrer\Programmes\Démarrage Startup AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Démarrage (Startup)
Mes Documents My Documents Documents
Mes documents\Ma musique My Music Musique (Music)
Mes documents\Mes images My Pictures Images (Pictures)
Mes documents\Mes Videos My Videos Vidéos (Videos)
  Pictures Images (Pictures)
Mes documents récents (Recent) Recent AppData\Roaming\Microsoft\Windows\Recent
Modèles Templates AppData\Roaming\Microsoft\Windows\Templates
SendTo SendTo AppData\Roaming\Microsoft\Windows\SendTo
Voisinage d'impression PrintHood AppData\Roaming\Microsoft\Windows\Printer Shortcuts
Voisinage réseau NetHood AppData\Roaming\Microsoft\Windows\Network Shortcuts
     
  Contacts Contacts
  Documents Documents
  Download Download
  Links Liens (Links)
  Music Musique (Music)
  Saved Games Parties enregistrées (Saved Games)
  Themes AppData\Roaming\Microsoft\Windows\Themes

 

 

La commande MKLINK

Arrivée avec Vista la commande mklink permet de créer des Liens Réels vers des fichiers du même volume, des Jonctions vers des dossiers du volume ou d'un autre volume, et des Liens Symboliques relatifs ou absolus vers des fichiers ou des dossiers.

C:\>mklink /?
Crée un lien symbolique.

MKLINK [[/D] | [/H] | [/J]] Lien Cible

/D Crée un lien symbolique vers un répertoire. Par défaut,
il s'agit d'un lien symbolique vers un fichier.
/H Crée un lien réel à la place d'un lien symbolique.
/J Crée une jonction de répertoires.
Lien Spécifie le nom du nouveau lien symbolique.
Cible Spécifie le chemin d'accès (relatif ou absolu) auquel
le nouveau lien fait référence.

C:\>

Noter que si /D crée un Lien Symbolique vers un répertoire, mklink sans commutateur permet de créer un Lien Symbolique vers un fichier. Si le chemin de la cible est absolu (g :\un-dossier\un-sous-dossier\cible) le lien symbolique est absolu. si le chemin donné est relatif (.\un-dossier\un-sous-dossier\cible) le chemin est dit relatif. Nous verrons les conséquences de ces notions plus loin.


 

Réparation d'un Lien

Voici comment recréer la Jonction "Default User" dans le dossier Users avec la commande mklink /J. Comme cette Jonction est habituellement cachée et protégée on lui redonne les attributs H et R avec la commande ATTRIB. De plus, comme la plupart de ces Jonctions, il faut en interdire l'accès avec la commande ICACLS. Pour savoir quels attributs et protections il faut redonner à une jonction il faut regarder sur un autre compte. Comme il s'agit ici de Users\"Default User" il faut regarder sur une autre installation (installer au besoin une machine virtuelle). On utilise pour cela les commandes sans commutateur :

C:\Users\JF>cd..

C:\Users>attrib "Default User"
HR C:\Users\Default User

C:\Users>icacls "Default User"
Default User Everyone:(DENY)(S,RD)
Everyone:(RX)
NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)

1 fichiers correctement traités ; échec du traitement de 0 fichiers

C:\Users>

Il n'y a plus qu'à corriger la jonction sur la machine concernée :

C:\Users>mklink /J "Default User" Users\Default
Jonction créée pour Default User <<===>> Users\Default

C:\Users>attrib /L "Default User" +H +R

C:\Users>icacls "Default User" /DENY "Tout le monde":(RD) /L
fichier traité : Default User
1 fichiers correctement traités ; échec du traitement de 0 fichiers

Remarquer l'utilisation du commutateur /L qui autorise le traitement des "Links". Suite à l'action de la commande attrib ces Liens seront à nouveau cachés. Si l'utilisateur affiche les fichiers cachés et systèmes il sera tenté de cliquer sur ce qu'il voit comme des raccourcis. L'accès est alors refusé, résultat de la commande icacls. Le but est que l'utilisateur ne soit pas ensuite tenté de supprimer des fichiers qu'il pourrait croire en double alors qu'ils ne le sont pas. Cela protège également contre les jonction récursives observées dans certains dossiers comme Application Data.

 

La commande FSUTIL

La commande fsutil est également présente sur XP.
Par Zebulon : fsutil : la trousse à outils de votre disque

E:\>fsutil
---- Commandes prises en charge ----

behavior      Contrôle du mode du système de fichiers
dirty         Gestion du bit d'intégrité du volume
file          Commandes fichier spécifiques
fsinfo        Informations du système de fichiers
hardlink      Gestion des liens réels
objectid      Gestion des ID d'objets
quota         Gestion des quotas
repair        Gestion de réparation spontanée
reparsepoint  Gestion du point d'analyse
resource      Gestion du Gestionnaire transactionnel de ressources
sparse        Contrôle de fragmentation des fichiers
transaction   Gestion des transactions
usn           Gestion USN
volume        Gestion des volumes

E:\>md dossier

E:\>echo toto>toto.txt

E:\>fsutil hardlink create
Utilisation : fsutil hardlink create <nouveau nom de fichier>
<nom de fichier existant>
Par ex. : fsutil hardlink create c:\foo.txt c:\bar.txt

E:\>fsutil hardlink create totohardlink.txt toto.txt
Liaison permanente créée pour E:\totohardlink.txt <<===>> E:\toto.txt

E:\>type totohardlink.txt
toto

E:\>fsutil reparsepoint
---- Commandes REPARSEPOINT prises en charge ----

query Interroge un point d'analyse
delete Supprime un point d'analyse

E:\>mklink /J dossierj dossier
Jonction créée pour dossierj <<===>> dossier

E:\>fsutil reparsepoint query dossierj
Valeur de la balise d'analyse : 0xa0000003
Valeur de balise : Microsoft
Valeur de balise : Substitut de nom
Valeur de la balise : Point de montage
Décalage nom substitut : 0
Longueur nom substitut : 28
Décalage nom affiché : 30
Longueur nom affiché : 20
Nom substitut : \??\E:\dossier
Nom affiché : E:\dossier

Analyser la longueur des données: 0x0000003c
Données d'analyse :
0000: 00 00 1c 00 1e 00 14 00 5c 00 3f 00 3f 00 5c 00 ........\.?.?.\.
0010: 45 00 3a 00 5c 00 64 00 6f 00 73 00 73 00 69 00 E.:.\.d.o.s.s.i.
0020: 65 00 72 00 00 00 45 00 3a 00 5c 00 64 00 6f 00 e.r...E.:.\.d.o.
0030: 73 00 73 00 69 00 65 00 72 00 00 00 s.s.i.e.r...

E:\>



 

Liens Réels

Un Lien Réel est une nouvelle entrée du Directory ou Index vers un fichier (NTFS adds a directory entry for the hard link without duplicating the original file)

Les Liens Réels ne concernent que les fichiers :
mklink /H c:\court\Toto.txt  "c:\très profonde arborescence\tas de dossiers\toto à la plage.txt" 

Le résultat est comme un second fichier mais les deux sont liés : une modification dans un fichier apparaît dans l'autre fichier. Un fichier n'est en effet qu'un paquet d'octets sur le disque dur, et ce que nous montre l'explorateur est une représentation imagée des fichiers. L'icone du fichier n'est pas le fichier, mais une évocation de celui-ci, un lien vers les octets.

L'analogie de la laisse

On utilise parfois l'analogie du chien Octet relié à son maître par une laisse. Le chien peut avoir plusieurs laisses. Tant que des laisses existent, le chien est là. Si la dernière laisse est coupée, le lien avec le chien est perdu, Octet n'a plus d'attache. C'est ce qui se passe quand nous supprimons un fichier, nous coupons la laisse, les octets existent toujours mais ont disparus. En informatique si on veut faire attention à ses octets, on surveille ses laisses.

La Corbeille est la ficelle de secours. Si nous la vidons, les octets sont alors livrés aux hasards des écritures et finiront par être remplacés.

La conséquence est qu'on peut supprimer l'un ou l'autre des deux fichiers : comme il reste une laisse vers les octets, l'autre fichier, qui pourtant peut porter un nom différent, reste en place. Comme on peut créer plusieurs Liens Réels vers un fichier, celui-ci ne sera perdu que quand on aura supprimé toutes les laisses.

De cette conception, un Lien Réel ne peut pas pointer vers un fichier d'un autre volume.
Sur XP on peut créer un Lien Réel avec la commande fsutil hardlink create
Cette commande est toujours utilisable sur Vista, mais fait double usage avec mklink, plus pratique.

Visualisation de Liens Réels dans la MFT :

Pour examiner ce qui se passe sur un volume quand on opère sur des fichiers, rien de tel qu'une petite clé USB fraîchement formatée. On se sert de l'excellent HxD pour visualiser ses octets. Le contenu du fichier texte étant connu, une simple recherche permet de retrouver les enregistrements :

http://fspsa.free.fr/ng/hardlink-demo.gif

 

Différences entre les types de Liens

Rappels

L'objet habituellement désigné sous le terme de raccourci est un fichier dont l'extension LNK est masquée. On peut faire plusieurs raccourcis vers un même objet (fichier ou dossier). Un raccourci peut pointer un objet situé sur un autre volume. Certains raccourcis ont une extension URL, ils utilisent des protocoles propres au web. Comme les raccourcis sont des fichiers, ils occupent de l'espace. Le procédé est indépendant du type de format. Enfin un raccourci ne peut être qu'absolu.

Certaines icones sur le bureau et dans le menu démarrer se comportent comme des raccourcis, mais ne sont pas supprimables et ont des menus contextuels particuliers. Ce sont des objets shell définis dans le registre http://fspsa.free.fr/objets-shell.htm

Les Liens NTFS

Les Liens Symboliques permettent de réellement créer de nouveaux chemins vers les objets. Dans l'exemple vu plus haut c:\court\Toto.txt désignera réellement les octets du fichier enfoui dans l'arborescence. Les deux chemins coexisteront et seront aussi valables l'un que l'autre.

Liens Réels

Un Lien Réel n'occupe pas de place, c'est un fichier virtuel. Un Lien Réel crée une référence supplémentaire dans la MFT (Master File Table) vers un fichier situé sur le volume. Si le fichier original est supprimé, les Liens Réels qui pointent vers ses octets existent toujours et restent utilisables. Pour que ces octets soient libérés il faut supprimer tous les Liens Réels concernés.

L'exercice suivant montre la création d'un fichier cible suivi de la création d'un Lien Réel. On modifie ensuite tour à tour les contenus de l'un ou l'autre. La suppression de la cible ne supprime pas le contenu du Lien Réel puisqu'il s'agit en fait des mêmes octets, sous deux noms différents :

G:\>echo Je suis un Lien Réel ! >cible

G:\>mklink /H lien cible
Liaison permanente créée pour lien <<===>> cible

G:\>type lien
Je suis un Lien Réel !

G:\>echo On sait ! >>lien

G:\>type cible
Je suis un Lien Réel !
On sait !

G:\>echo Je pars ! >>cible

G:\>del cible

G:\>type lien
Je suis un Lien Réel !
On sait !
Je pars !

G:\>del lien

Remarque : dans cet exemple en lignes de commandes on s'est affranchi des extensions en créant des fichiers textes car on affiche leurs contenus avec la commande type. En pratique il faut respecter les extensions des Liens Réels si on veut qu'en cliquant dessus ils s'ouvrent comme prévus. Même chose avec les Liens Symboliques quand ils pointent des fichiers.

 

Jonctions

Les Jonctions sont basées comme les Liens Symboliques sur un mécanisme du NTFS appelé Reparse Points. À la différence des Liens Symboliques ils ne peuvent désigner que des dossiers, éventuellement situés sur d'autres volumes, et n'utilisent que des chemins absolus.

Création d'un dossier cible, création d'une Jonction en utilisant un chemin relatif vers le dossier cible, vérification du Lien absolu enregistré avec dir, déplacement du lien et de la cible dans un dossier, revérification du lien avec dir, constatation que le lien absolu est perdu :

G:\>md cible

G:\>mklink /J link cible
Jonction créée pour link <<===>> cible

G:\>dir /AL
 <JONCTION> link [
G:\cible]

G:\>move link aliens
1 répertoires déplacés.

G:\>move cible aliens
1 répertoires déplacés.

G:\>cd aliens

G:\aliens>dir /AL
<JONCTION> link [
G:\cible]

G:\aliens>cd link
Le fichier spécifié est introuvable.

En rouge, le chemin est absolu, alors que c'est un chemin relatif qui avait été entré. Les Jonctions ne sont pas concernées par les liens relatifs. On va voir que les Liens Symboliques sont capables d'être relatifs ou absolus.

Cette démo montre la façon dont sont enregistrés les Jonctions dans la MFT.
Les enregistrements sont absolus :

http://fspsa.free.fr/ng/junction-demo.gif

 

Liens Symboliques

Les Liens Symboliques désignent des fichiers ou des dossiers, et peuvent pointer vers d'autres volumes. De cette disposition, la suppression de la cible d'un Lien Symbolique le rend orphelin, comme cela arrive avec les raccourcis. Si le lien est relatif, le déplacement du lien symbolique provoque la perte de la liaison à sa cible. Les Liens Symboliques disposent d'un onglet "Raccourci" dans leurs Propriétés permettant de consulter la Cible du Lien.

Pour créer un lien relatif, il suffit d'indiquer un chemin relatif dans la commande mklink.
Création d'un fichier texte avec la commande echo, création d'un lien symbolique avec mklink, vérification du fonctionnement du lien avec type, déplacement du lien vers un autre dossier, vérification que le lien est cassé, déplacement de la cible dans le dossier, vérification du fonctionnement revenu du lien, et vérification du type de lien créé :

G:\>echo Coucou ! >cible

G:\>mklink link
cible
Lien symbolique créé pour link <<===>>
cible

G:\>type link
Coucou !

G:\>md aliens

G:\>REM Déplacement du lien vers un autre dossier

G:\>move link aliens
1 fichier(s) déplacé(s).

G:\>cd aliens

G:\aliens>type link
Le fichier spécifié est introuvable.

G:\aliens>move \cible .
1 fichier(s) déplacé(s).

G:\aliens>type link
Coucou !

G:\aliens>dir /AL
<SYMLINK> link [
cible]

http://fspsa.free.fr/ng/symlink-demo.gif

Pour créer un lien absolu vers un fichier, il suffit d'indiquer un chemin absolu :

G:\>echo Coucou !! >cible

G:\>mklink link
g:\cible
Lien symbolique créé pour link <<===>>
g:\cible

G:\>type link
Coucou !!

G:\>REM Déplacement du lien vers un autre dossier

G:\>move link \aliens
1 fichier(s) déplacé(s).

G:\>cd aliens

G:\aliens>type link
Coucou !!

G:\aliens>move ..\cible .
1 fichier(s) déplacé(s).

G:\aliens>type link
Le fichier spécifié est introuvable.

G:\aliens>dir /AL
<SYMLINK> link [
g:\cible]

http://fspsa.free.fr/ng/symlink-absolu-demo.gif

 

Copies de Liens Symboliques

Robocopy

Robocopy est une puissante commande de copie. Ses nombreux commutateurs permettent l'utiliser de différentes façons. Le commutateur le plus connu est sans doute /MIR qui permet de faire une copie miroir d'un dossier. Attention de ne pas se tromper en utilisant cette commande, le miroir d'un dossier vide vers un dossier empli de données n'est en général pas voulu ! Robocopy fait partie de Windows depuis Vista. Cette version n'est pas utilisable sur XP, voir téléchargement et utilisations.

Par défaut Robocopy copie non pas les liens NTFS en tant que liens, mais les dossiers et les fichiers qu'ils représentent, en gardant le nom donné au lien. Lors d'opérations de sauvegarde par exemple on voudra éviter de copier ces liens en utilisant les commutateurs comme /XJ (eXclure Jonctions), /XJD (eXclure Jonctions de Dossiers), et /XJF (eXclure Jonctions de Fichiers). Remarque : ce terme utilisé dans l'aide de Robocopy est abusif, il n'existe pas de Jonctions de fichiers, mais des Liens Symboliques de fichiers.

Dans l'exemple on utilise le commutateur /E pour copier aussi les dossiers vides.
Sans le commutateur /XJ la jonction est copiée en tant que dossier, c'est ce que montre le dir.
Avec le commutateur /XJ la jonction n'est pas copiée :
 

G:\>md dossier1

G:\>md dossier2

G:\>md dossier1\dossier-a-copier

G:\>mklink /J dossier1\jonction-de-dossier-a-copier dossier1\dossier-a-copier
Jonction créée pour dossier1\jonction-de-dossier-a-copier <<===>> dossier1\dossier-a-copier

G:\>robocopy dossier1 dossier2 /E

-------------------------------------------------------------------------------
ROBOCOPY :: Copie de fichiers robuste pour Windows
-------------------------------------------------------------------------------

Début : Sat Oct 03 16:16:17 2009

Source : G:\dossier1\
Dest : G:\dossier2\

Fichiers : *.*

Options : *.* /S /E /COPY:DAT /R:1000000 /W:30

-------------------------------------------------------------------------------

0 G:\dossier1\
Nouveau rép. 0 G:\dossier1\dossier-a-copier\
Nouveau rép. 0 G:\dossier1\jonction-de-dossier-a-copier\

-------------------------------------------------------------------------------

Total Copiés Ignorés Différences Échecs Supplém.
Rép. : 3 2 1 0 0 0
Fichiers : 0 0 0 0 0 0
Octets : 0 0 0 0 0 0
Durées : 0:00:00 0:00:00 0:00:00 0:00:00

Fin : Sat Oct 03 16:16:17 2009

G:\>dir dossier2
<REP> dossier-a-copier
<REP> jonction-de-dossier-a-copier
0 fichier(s) 0 octets

G:\>rd dossier2 /S /Q

G:\>md dossier2

REM         ====== PHASE 2 : avec commutateur /XJ ==========

G:\>robocopy dossier1 dossier2 /E /
XJ

-------------------------------------------------------------------------------
ROBOCOPY :: Copie de fichiers robuste pour Windows
-------------------------------------------------------------------------------

Début : Sat Oct 03 16:18:14 2009

Source : G:\dossier1\
Dest : G:\dossier2\

Fichiers : *.*

Options : *.* /S /E /COPY:DAT /XJ /R:1000000 /W:30

-------------------------------------------------------------------------------

0 G:\dossier1\
Nouveau rép. 0 G:\dossier1\dossier-a-copier\

-------------------------------------------------------------------------------

Total Copiés Ignorés Différences Échecs Supplém.
Rép. : 3 1 2 0 0 0
Fichiers : 0 0 0 0 0 0
Octets : 0 0 0 0 0 0
Durées : 0:00:00 0:00:00 0:00:00 0:00:00

Fin : Sat Oct 03 16:18:14 2009

G:\>dir dossier2
Le volume dans le lecteur G s'appelle GGG=Copie de F=
Le numéro de série du volume est FEE3-87FD

Répertoire de G:\dossier2

03/10/2009 16:18 <REP> .
03/10/2009 16:18 <REP> ..
03/10/2009 16:18 <REP> dossier-a-copier
0 fichier(s) 0 octets
3 Rép(s) 15 443 877 888 octets libres

Pour résumer Robocopy copie par défaut les contenus des Jonctions, ce qui explique les désagréments relatés plus haut quand des Jonctions ont pour cible leur propre conteneur (effet vache qui rit). Pour éviter cela on utilise en règle générale le commutateur /XJ et les jonctions sont simplement ignorées. Il n'est pas prévu de copier en tant que Liens des jonctions ou des liens symboliques de dossiers.

Si des Liens Symboliques de fichiers existent dans le dossier source, la copie est effectuée, mais en tant que fichier. Pour ne pas répliquer ces Liens, utiliser /XJ ou /XJF.

Il est toutefois possible, seulement pour les fichiers, de copier les Liens Symboliques au lieu des fichiers avec le commutateur /SL :
/SL:: copy symbolic links versus the target.
/SL:: copie les liens symboliques par opposition à la cible.

Dans cet exemple on crée un Lien Symbolique absolu d'un fichier dans source, puis on copie source vers cible avec le commutateur /SL :
 

U:\>md source

U:\>md cible

U:\>echo coucou >fichier.txt

U:\>REM Création d'un lien symbolique absolu dans source

U:\>mklink source\symbolic.txt u:\fichier.txt
Lien symbolique créé pour source\symbolic.txt <<===>> u:\fichier.txt

U:\>REM /SL copie les Liens au lieu des fichiers :

U:\>robocopy source cible
/SL

-------------------------------------------------------------------------------
ROBOCOPY :: Copie de fichiers robuste pour Windows
-------------------------------------------------------------------------------

Début : Sun Oct 04 02:15:48 2009

Source : U:\source\
Dest : U:\cible\

Fichiers : *.*

Options : *.* /COPY:DAT /R:1000000 /W:30

-------------------------------------------------------------------------------

1 U:\source\
Nouveau fichier 0 symbolic.txt

-------------------------------------------------------------------------------

Total Copiés Ignorés Différences Échecs Supplém.
Rép. : 1 0 1 0 0 0
Fichiers : 1 1 0 0 0 0
Octets : 0 0 0 0 0 0
Durées : 0:00:00 0:00:00 0:00:00 0:00:00

Fin : Sun Oct 04 02:15:48 2009

U:\>cd cible

U:\cible>dir
<
SYMLINK> symbolic.txt [u:\fichier.txt]
1 fichier(s) 0 octets

Le dossier cible contient le Lien Symbolique et non le fichier.
En lisant "/SL copie les liens symboliques par opposition à la cible" on pourrait espérer que cela serait possible avec les dossiers. Ça ne marche pas, ni avec les Liens Symboliques ni avec les Jonctions, et malgré l'utilisation du commutateur /SL on récupère des dossiers et non des Liens :

U:\>md cible

U:\>md source

U:\>md dossier

U:\>mklink /D source\link-de-dossier u:\dossier
Lien symbolique créé pour source\link-de-dossier <<===>> u:\dossier

U:\>robocopy source cible
/SL /E

-------------------------------------------------------------------------------
ROBOCOPY :: Copie de fichiers robuste pour Windows
-------------------------------------------------------------------------------

Début : Sun Oct 04 06:07:23 2009

Source : U:\source\
Dest : U:\cible\

Fichiers : *.*

Options : *.* /S /E /COPY:DAT /R:1000000 /W:30

-------------------------------------------------------------------------------

0 U:\source\
Nouveau rép. 0 U:\source\link-de-dossier\

-------------------------------------------------------------------------------

Total Copiés Ignorés Différences Échecs Supplém.
Rép. : 2 1 1 0 0 0
Fichiers : 0 0 0 0 0 0
Octets : 0 0 0 0 0 0
Durées : 0:00:00 0:00:00 0:00:00 0:00:00

Fin : Sun Oct 04 06:07:23 2009


U:\>dir cible
<
REP> link-de-dossier
0 fichier(s) 0 octets

Robocopy ne copiera pas les liens relatifs, il ne comprend que les liens absolus.


 

XCOPY

On a vu qu'avec l'arrivée de mklink plusieurs utilitaires avaient reçus des commutateurs supplémentaires adaptés aux Liens NTFS, par exemple /L avec dir, attrib, icacls. Xcopy voit apparaître le commutateur /B. Voici un extrait de l'aide, le commutateur /B a été ajouté tout à la fin :

xcopy /?
/B Copie le lien symbolique et non pas la cible du lien.

L'exemple montre l'utilisation de xcopy une première fois avec le commutateur /B, et une seconde fois sans le commutateur.
Xcopy demande toujours confirmation si ce qu'on copie est un fichier ou un dossier. Lorsqu'on copie un dossier, il suffit de terminer le chemin de la destination par une barre oblique inverse \ pour bien signifier que c'est un dossier. Avec un fichier on ne peut pas éviter la question. Si on veut automatiser on utilise une astuce consistant à écrire la réponse (F pour Fichier) dans un fichier dont on injecte le contenu en guise de réponse dans la commande. Le fichier créé avec la commande echo s'appelle ici simplement F. les commandes echo et xcopy sont enchainées avec && :

G:\>md dossier

G:\>echo coucou>fichier.txt

G:\>mklink symbol.txt g:\fichier.txt
Lien symbolique créé pour symbol.txt <<===>> g:\fichier.txt

G:\>REM copie du lien symbolique dans dossier

G:\>echo F>F&&xcopy symbol.txt dossier
/B <F
G:symbol.txt
1 fichier(s) copié(s)

G:\>cd dossier

G:\dossier>type symbol.txt
coucou

G:\dossier>dir
<SYMLINK> symbol.txt [g:\fichier.txt]
1 fichier(s) 0 octets

G:\dossier>

G :\REM     ========= SECONDE PHASE =========

G:\>REM vérification que
sans /B c'est un fichier qui est copié

G:\dossier>del symbol.txt

G:\dossier>cd..

G:\>echo F>F&&xcopy symbol.txt dossier <F
G:symbol.txt
1 fichier(s) copié(s)

G:\>cd dossier

G:\dossier>type symbol.txt
coucou

G:\dossier>dir
8 symbol.txt
1 fichier(s) 8 octets

Lors de la copie du lien, le résultat est bien identifié comme SYMLINK et pèse zéro octet.
Dans le second cas c'est bien un fichier de huit octets qui a été copié.


 

Limitations

NTFS obligatoire. FAT et exFAT ne gèrent pas ces liens.
Contrairement aux raccourcis habituels, les Liens NTFS ne se réparent pas d'eux-mêmes. Ci la cible est déplacée ou renommée, le lien est perdu. Cette remarque ne concerne pas pour les Liens Réels qui ciblent directement l'enregistrement (les octets) du fichier. C'est pour cela qu'on les appelle des Hard Links (liens durs).
Les Jonctions ne concernent que des dossiers.
Mklink /J ou /D pour un fichier est accepté (!), mais le résultat prend l'allure d'un dossier et ne fonctionne pas.
On peut créer plusieurs Jonctions vers un même dossier. Idem pour les Liens Symboliques.
Les Jonctions et les Liens Symboliques peuvent cibler vers un autre volume NTFS.
Si on supprime ou renomme la cible le Lien devient sans effet (sauf pour les liens réels, qui pointent directement les octets du fichier).
Un Lien peut être supprimé ; la cible reste normalement inchangée.
On ne peut pas copier des Liens de dossiers : soit on ne copie rien, soit c'est le dossier et son contenu qui est copié.
Rien n'est prévu pour se protéger des effets des liens imbriqués, sauf à interdire leur accès avec icacls /L.
L'accès à certains Liens créés par le système est interdit (icacls /L).
Le commutateur /XJ empêche Robocopy de copier les dossiers pointés par les Liens.
Un Lien Réel ne peut concerner qu'un fichier du même volume.
On peut créer plusieurs Liens Réels vers un même fichier.
La suppression du fichier ou d'un Lien Réel n'a aucun effet sur le fichier et ses autres Liens Réels.
Il faut supprimer tous les Liens Réels et le fichier pour libérer les octets.
Note : comme d'habitude ces octets ne seront réellement libérés qu'après vidage de la corbeille.

 

Dangers

http://www.economicexpert.com/a/NTFS:Junction:point.htm
http://www.zebulon.fr/astuces/230-creer-un-lien-symbolique-sous-windows.html
http://fspsa.free.fr/recursivite.htm
Sur Vista les Liens NTFS sont identifiés par une flèche de raccourci sur l'icone. C'est une bonne initiative car l'un des reproches faits aux jonctions sur XP étaient leurs discrétions. On peut rapidement s'emmêler les crayons en confondant dossiers et jonctions.
Le meilleur outil pour créer une Jonction sur XP est l'outil junction de Sysinternals (voir la section Utilitaires ci-après). Utiliser son commutateur -D (Delete) pour supprimer sans risque une Jonction. Cependant, j'ai supprimé directement depuis l'explorateur de fichiers des Jonctions sur XP et Vista sans que cela supprime la cible.
La suppression d'un Lien NTFS via l'explorateur de fichiers ne devrait pas entrainer d'incident. Ils sont à présent bien identifiés comme des "raccourcis" par la petite flèche habituelle sur l'icone (svp résistez à l'envie de ne pas afficher ces symboles). Mais il n'est pas certain que d'autres logiciels interprètent bien ces objets et ne suppriment pas la cible avec le Lien.
Il se peut aussi que l'utilisateur, un programme, ou une commande, ne perçoive pas toujours la différence entre un Lien et sa cible. Les opérations qu'on pense faire sur un lien peuvent en fait s'appliquer à la cible plutôt qu'au lien. Par exemple la commande attrib va agir sur la cible si on oublie d'utiliser le commutateur /L.
 

Utilitaires

 

Conclusion

Tout au long de la rédaction de cet article je me suis demandé si la différence entre une Jonction et un Lien Symbolique absolu vers un dossier allait devenir évidente à mes yeux. Je n'en vois pas, à part le fait qu'une Jonction ne peut être qu'un chemin absolu, vers un dossier.

On pourrait n'utiliser les Jonctions pour créer des liens absolus vers des dossiers, et les Liens Symboliques pour des liens relatifs vers des dossiers.

Pour les fichiers on pourra utiliser les Liens Symboliques qui ont l'avantage d'être listés dans une commande DIR /AL.

On pourra utiliser des Liens Réels, ils ne seront pas affichés en tant que Liens NTFS par la commande DIR et apparaitront comme des fichiers-répliques du fichier originel. Retenir que ces Liens Réels ne sont que des laisses, et non les octets du fichier. Ce ne sont pas des sauvegardes. Cependant ils doivent tous être supprimés pour que les octets soient rendus à l'univers des octets sans attaches. Alors qu'un Lien Symbolique ou un raccourci peut très bien continuer à pointer vers des octets qui n'existent plus.

L'utilité de ces moyens est démontré par l'utilisation qui en est faite par Vista dans le dossier Users et ses sous-dossiers tels les profils des utilisateurs. D'autres systèmes d'exploitation utilisent ces même méthodes.

Au niveau utilisateur on avait déjà commencé sous XP à se servir des Jonctions pour délocaliser des dossiers du système afin de libérer de la place sur une partition système devenue trop étroite. Ou pour alléger les images de sauvegarde de la partition système. Si sur XP je n'ai jamais vu l'utilisation d'une Jonction pour délocaliser  "Documents and Settings", l'expérience semble devenir populaire avec le dossier Users de Vista et Win7. Il faut faire l'opération dès l'installation à cause de, justement, la présence des Jonctions dans les profils. Comme on l'a vu leur copie n'est en effet pas prévue. Quoique leur absence ne soit pas un drame, seule la compatibilité pourrait poser problème, leur recréation est souhaitable et nécessite l'utilisation d'un batch. Mais en procédant dès l'installation les Jonctions seront créées avec les profils.

Il est regrettable que les Liens NTFS ne fonctionnent pas avec le format exFAT (version pour XP) mis au point pour les volumes amovibles, les liens relatifs auraient été très appréciés (voir l'article sur les changements de lettres des volumes amovibles). On peut bien sûr formater, même sous XP, une clé USB en NTFS, mais ce n'est pas recommandé avec ce système, à cause de l'emprise que prend explorer.exe sur le volume en activant systématiquement la surveillance disque.

Ce problème n'a cependant plus cours sur Vista. Si on est sûr de ne connecter la clé que sur Vista ou Win7, pas de problème, la surveillance disque ne s'active plus automatiquement pour les volumes amovibles. Quand XP aura disparu de la circulation, on pourra abuser des Liens Symboliques relatifs ! Les liens fonctionneront quelle que soit la lettre attribuée par le système au volume.

Voici un exemple d'utilisation pratique des jonctions pour résoudre un problème de délocalisation de données utilisées intensivement, sur un disque rapide SSD. Cela permet de résoudre simplement la question sans avoir à corriger tous les logiciels devant avoir accès à ces données. C'est ici : De l'utilisation des points de jonctions pour l'optimisation du streaming de samples sonores (MAO)

 

Sources d'inspiration

http://en.wikipedia.org/wiki/NTFS
http://fr.wikipedia.org/wiki/Master_File_Table
http://en.wikipedia.org/wiki/NTFS_reparse_point
http://fr.wikipedia.org/wiki/Hard_link
http://en.wikipedia.org/wiki/Hard_link
http://fr.wikipedia.org/wiki/Lien_symbolique
http://en.wikipedia.org/wiki/NTFS_symbolic_link
http://en.wikipedia.org/wiki/Symbolic_link
http://en.wikipedia.org/wiki/NTFS_junction_point
http://en.wikipedia.org/wiki/Inode 
http://www.zebulon.fr/astuces/230-creer-un-lien-symbolique-sous-windows.html
http://www.zebulon.fr/astuces/commenter/1-230-creer-un-lien-symbolique-sous-windows
Dans le noyau de Windows Vista : Partie 1 ; Liens symboliques basés sur des fichiers
Un lien symbolique est un fichier virtuel qui pointe vers un fichier réel
http://www.bellamyjc.org/fr/theoriemultiboot3.html#liens_symboliques
Création d'un lien symbolique avec la commande FSUTIL
http://www.bellamyjc.org/fr/theoriemultiboot3.html#FSUTIL
XP : délocalisation du dossier C:\Windows\$hf_mig$ et mise en place d'un jonction pour tromper le système
http://www.bellamyjc.org/fr/windowsxp2003.html#hf_mig
L'effet vache qui rit
XP : délocalisation de Program Files et mise en place d'une jonction pour tromper le système
Et Documents and Settings ? C'est certainement possible de la même façon sans difficultés.
Il faut un CD comme ubcd4win pour opérer facilement. Curieusement il semble que personne n'ait tenté la manip alors qu'elle devient courante sur Vista/Win7 en particulier pour le dossier c:\Utilisateurs  (on en reparlera).

Syllabus Systèmes d'Exploitation de Monica Bastreghi

http://www.hotline-pc.org/ads.htm

Previewing the Windows NT 5.0 File System ; Hard Links ; Reparse Points ...

TECHNET : Working with Files System
MSDN : Hard Links and Junctions
MSDN : Symbolic Links
MSDN : Reparse Points

Link Shell Extension (LSE) : provides for the creation of Hardlinks , Junctions , Volume Mountpoints , and Vista's Symbolic Links

http://para.inria.fr/~remy/poly/system/camlunix/fich.html

MKLINK
   http://www.howtogeek.com/howto/windows-vista/using-symlinks-in-windows-vista/
   http://techblissonline.com/vista-create-or-delete-ntfs-symbolic-link-or-symlinks/       
   http://technet.microsoft.com/en-us/library/cc753194
   http://technet.microsoft.com/en-us/library/cc753194#BKMK_examples

KB391707 : Vista : l'utilisation de Liens Symboliques ou de Liens Réels peut poser des problèmes avec le système de localisation MUI (Multilingual User Interface) : When you use a symbolic link or a hard link to run a program in Windows Vista, the program does not run

KB973455 : How to troubleshoot Windows Backup and Restore issues when a reparse point folder or its subfolder is added to a user library in Windows 7. (Error codes 0x80070001 0x81000037 0x80070003)

Win7 (et Vista) : installation : délocalisation de Users, Program Files, et ProgramData, avant la création du premier profil
http://tuts4tech.net/2009/08/05/windows-7-move-the-users-and-program-files-directories-to-a-different-partition/ 

 


 

Articles en relation

http://fspsa.free.fr/lettre-lecteur-amovible.htm
http://fspsa.free.fr/lettre-lecteur-amovible.htm#liens-relatifs

http://fspsa.free.fr/robocopy.htm
http://fspsa.free.fr/recursivite.htm

http://fspsa.free.fr/users.htm


Bonnes délocalisations.
Retour au début
Les restes du site
JF (Jean-François)
 

compteur Free
Publié le 21/9/2009