Les Liens NTFS
Points d'Analyse, Jonctions, Liens Symboliques, Liens Réels
Reparse Points, Junctions, Symbolic Links, Hard Links, Soft 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 comment Vista et Windows 7 abusent du procédé. Cela peut-il servir au particulier ? On peut raccourcir des chemins d'accès, résoudre des cas particuliers. L'utilisation la plus populaire est de délocaliser des dossiers systèmes, ça permet d'alléger la partition Windows si elle devient limite. On verra dans la conclusion qu'on peut faire des liens relatifs, très pratiques dans les volumes amovibles susceptibles de changer de lettre. Il faut prendre en compte cette présence de Jonctions dans le système si on veut faire des sauvegardes. Il ne faut pas lever les protections de ces Jonctions (attributs et ACL) sous peine de quelques surprises.

Nouveau : Liens Réels et Symboliques - brillant résumé rédigé par freeAvvArea

Sommaire

 

Définitions

Reparse Points
How NTFS Works
NTFS Reparse Points
Reparse points are files or directories that have blocks of data called reparse data associated with them.
Pour le NTFS (New Technology File System) 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).
Points d'analyse
Les programmes peuvent intercepter les opérations d'ouverture des objets du système de fichiers et exécuter leur propre code avant de retourner les données du fichier. On peut s'en servir pour étendre les fonctionnalités du système de fichiers comme les points de montage qui peuvent servir à rediriger les données lues et écrites dans un dossier vers un autre volume ou disque physique.

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 mais pas sur le réseau. 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. À la différence des Jonctions la cible peut être un objet du réseau. 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

 

Mise en évidence des Jonctions et Liens Symboliques

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. Un Lien Symbolique peut pointer un objet situé sur le réseau.

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

Liens Récursifs
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 :

C:\Documents and Settings\All Users\Microsoft c'est kifkif C:\ProgramData\Microsoft
La vue suivante montre que la présence de ces Jonctions fait que si on essaie d'accéder directement à C:\Documents and Settings\All Users\Microsoft on abouti en fait en C:\ProgramData\Microsoft. Ceci illustre parfaitement le mécanisme des Jonctions. Toute modification dans un dossier apparaît dans l'autre, car il s'agit ni plus ni moins que du même dossier, C:\ProgramData\Microsoft. L'autre chemin qui utilise Documents and Settings n'est qu'un artifice.

Supposons qu'un vieux programme (mal) écrit pour XP ait besoin d'accéder en dur à C:\Documents and Settings\All Users\Application Data\Microsoft : il va fonctionner comme s'il était dans Windows XP grâce au leurre introduit par l'utilisation des Jonctions. Les Jonctions aident à préserver la compatibilité même avec des programmes ou des scripts qui font malheureusement appel à des chemins en dur au lieu d'utiliser les variables d'environnement.
Merci à Serge N. pour la réécriture de ce paragraphe.

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

Jonctions?>
Pour chercher plus facilement <JONCTION> et <SYMLINKD> voici un fichier reg à fusionner au registre pour ajouter une commande [Jonctions?>] dans le menu contextuel des objets. On obtiendra en un clic le résultat vu plus haut.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\Jonctions?>\command]
@="cmd /k dir /AL /S"

 

Mise en évidence des Liens Réels

Rien ne distingue dans Explorer les Liens Réels, des fichiers standards. On utilisera donc Link Shell Extension pour les marquer d'un symbole particulier. Une fois Link Shell Extension installé, une petite visite dans windows, system32, et winsxs, sera une révélation.
Comme ci-dessus pour les Jonctions et les Liens Symboliques, il est possible d'ajouter un item dans le menu contextuel des fichiers pour lister les éventuels Liens Réels ; voir HardLinks?>

 

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" comme il apparaît dans une Console CMD. 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".

Et il en est de même dans "Users" pour le dossier "All Users" remplacé par "c:\ProgramData" et le dossier "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 : les fameux Desktop.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

 

Évolutions des variables d'environnement

Pour lister les variables et leurs valeurs entrer la commande SET dans une Console CMD.
Comparer les résultats pour XP et pour W7 :

Variables d'environnement

Windows XP

Windows7

ALLUSERSPROFILE C:\Documents and Settings\All Users C:\ProgramData
APPDATA C:\Documents and Settings\JF\Application Data C:\Users\JF\AppData\Roaming
CommonProgramFiles C:\Program Files\Fichiers communs C:\Program Files\Common Files
USERPROFILE C:\Documents and Settings\JF C:\Users\JF

 

 

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.
Si attrib sans argument n'affiche pas les jonctions, utiliser DIR /AL pour les lister, ou utiliser la complétion de commandes en appuyant sur la touche tabulation : ATTRIB [TAB]
La plupart de ces Jonctions sont interdites d'accès au groupe "Tout le monde". La raison de cette disposition est expliquée ici. On utilisera la commande ICACLS pour rétablir cette restriction.
Pour savoir quels attributs et protections il faut redonner à une jonction regarder sur un autre compte, ou sur une autre installation (installer au besoin une machine virtuelle).
DIR /AL affiche les Jonctions et leurs cibles, ATTRIB [TAB] affiche les attributs, ICACLS  montre les ACL.

Première étape, examiner la jonction sur une installation servant de référence :

C:\Users\JF>cd..

C:\Users>dir /al

Répertoire de C:\Users

14/07/2009 07:08 <SYMLINKD> All Users [C:\ProgramData]
14/07/2009 07:08 <JONCTION> Default User [C:\Users\Default]

C:\Users>attrib "Default User"

HR C:\Users\Default User

C:\Users>icacls "Default User"
Default User Tout le monde:(DENY)(S,RD)
Tout le monde:(RX)
AUTORITE NT\Système:(F)
BUILTIN\Administrateurs:(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, en utilisant les mêmes commandes complétées des commutateurs adaptés :

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

C:\User>icacls "Default User"
Default User Tout le monde:(DENY)(S,RD)
Tout le monde:(I)(OI)(CI)(F)
AUTORITE NT\Système:(I)(OI)(CI)(F)
BUILTIN\Administrateurs:(I)(OI)(CI)(F)

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

C:\bidon>

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, et le cadenas sera à nouveau visible sur l'icone. 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 des jonctions récursives observées dans certains dossiers comme Application Data <== cet article montre également comment sauvegarder l'ACL d'un dossier, et comment utiliser cette sauvegarde pour réparer la protection.

Il est préférable d'utiliser le SID du groupe "Tout le monde", ça évite les problèmes de langue :
icacls "Default User" /DENY "*S-1-1-0":(RD) /L

Certaines jonctions ont l'attribut /i. D'après ce que dit l'aide (attrib /?) le fichier est ainsi indexé, mais sans contenu.

junction-restore-deny-access.vista-7.cmd
Si l'utilisation de lignes de commandes vous pose problème, ou si vous avez beaucoup de jonctions à traiter, vous pouvez vous aider de ce batch qui donne les attributs HSI et restaure l'interdiction d'accès au groupe "Tout le monde".

 

La commande FSUTIL

La commande fsutil est présente sur XP, Vista, Win7.
On a vu qu'elle pouvait être utilisée à l'instar de mklink pour créer des Liens Réels avec fsutil hardlink create.
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:\>

fsutil hardlink list <nom>
permet de lister les Liens Réels. On ne peut pas faire comme DIR et lister les liens réels présents dans un dossier, mais en indiquant un nom de fichier à la commande, fsutil trouve les enregistrements qui pointent vers les mêmes octets. En conséquence quel que soit le fichier, cible ou Lien Réel, le résultat est le même. Dans l'exercice qui suit, on crée un fichier avec la commande echo, puis un lien réel avec mklink. La commande type montre que le lien réel représente bien les mêmes octets. On applique ensuite la commande fsutil hardlink list au deux fichiers pour constater qu'on obtient bien le même résultat.

F:\>echo test>cible.txt

F:\>mklink /H lienreel.txt cible.txt
Liaison permanente créée pour lienreel.txt <<===>> cible.txt

F:\>type lienreel.txt
test

F:\>fsutil hardlink list cible.txt
\cible.txt
\lienreel.txt

F:\>fsutil hardlink list lienreel.txt
\cible.txt
\lienreel.txt

F:\>

HardLink?>
On peut se faire une petite commande (une de plus) qui apparaîtra dans le menu contextuel des fichiers avec ce reg :

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\HardLink?>\command]
@="cmd /k fsutil hardlink list %1"

Ce nouvel item [HardLink?>] permettra de lister les liens réels en rapport avec un fichier.
Si ce bricolage qui permet d'en savoir un peu sur les Liens Réels présents sur le disque dur a retenu votre attention, vous pourriez être intéressés par Link Shell Extension présenté plus loin. En effet, une fois installé, il permet de créer en un clic ce que le traducteur a choisi d'appeler "Liens physiques" et "Liens symboliques". Il ajoute un repère sur tous les Liens Réels, permettant ainsi de les visualiser facilement dans Explorer. enfin, il ajoute un onglet "Lien" aux propriétés des fichiers qui liste les Liens Réels.
En utilisant  [HardLink?>] ou Link Shell Extension pour analyser les Liens Réels présents dans Windows et System32 de W7, on verra des tas de choses intéressantes. On comprendra alors le rôle du mystérieux dossier winsxs dont le poids en apparence disproportionné inquiète les utilisateurs. Voir également Jonctions?>



 

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" 

Pour info les ADS sont également concernés : voir à la fin de cette petite démo.

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 relié à son maître par une laisse. Appelons-le "Octets". Le chien peut avoir plusieurs laisses. Tant que des laisses existent, le chien est là (en clair les octets du fichier sont accessibles). Si la dernière laisse est coupée, le lien avec le chien est perdu. C'est ce qui se passe quand nous supprimons un fichier, nous coupons la dernière laisse, les octets existent toujours mais ont disparu pour le système, ils ne sont plus accessibles. En informatique si on veut faire attention à ses octets, on surveille aussi ses laisses, sinon on aura besoin de fouiller la Corbeille.

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. Si on a vidé la Corbeille et ainsi perdu un fichier important il faut faire en sorte de ne plus écrire sur la partition, et utiliser un logiciel spécialisé pour identifier les octets, les copier sur une autre partition, et leur réattribuer ... une laisse. 
Noter qu'avec Vista est apparue une notion d'historique des fichiers dont l'utilisation a été avec bonheur étendue à toutes les versions de Windows 7. Il s'agit du système des Versions Précédentes. Exemple avec Récupération de ntuser.dat à partir d'une version précédente.

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. La commande fsutil a été très partiellement abordée à la section précédente.

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. Les propriétés d'un raccourci permettent d'y apporter des modifications, on peut par exemple ajouter des paramètres. 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

J'ai reporté en Annexe une section sur l'objet Folder Shortcut. Ça permet de faire de la redirection de dossiers sans utiliser le NTFS. Folder Shortcut intéressera certainement ceux qui sont en FAT32.

 

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. Ils ne peuvent cibler un dossier sur le réseau.

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 sur le réseau. 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 avec move, vérification que le lien est cassé (type link ne trouve plus le fichier), 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

On en déduit qu'on peut créer un lien relatif en remplaçant la lettre du lecteur par un point.
On en verra des exemples plus loin lors de la copie de liens relatifs.

 

Pour créer un lien absolu vers un fichier, on indique 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

Lorsqu'on copie un raccourci (LNK ou URL) avec Explorer, on copie le raccourci, il n'y a aucune ambiguïté. Avec les Jonctions et les Liens Symboliques, Explorer ne voit ces objets que comme on a prévu qu'il les voit. Copier les Liens plutôt que leurs Cibles nécessite de pouvoir signifier à l'utilitaire ce que l'on veut copier. Explorer n'a pas de commutateur ou de menu-contextuel ayant cette fonction, il faut utiliser d'autres outils.

Robocopy

Robocopy est une puissante commande de copie. Ses nombreux commutateurs permettent de 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, par exemple le miroir d'un dossier vide vers un dossier empli de données n'est en général pas voulu (la première fois) ! Bon à savoir, un commutateur permet de simuler une manip avant de l'exécuter en réel. Robocopy fait partie de Windows depuis Vista. Cette version n'est pas utilisable sur XP, aller 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 "La 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


 

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 copy, 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é.

 

Copies de liens relatifs

Mklink permet de créer des Liens Symboliques de répertoire avec le commutateur /D, ou de fichiers en ne mettant aucun commutateur. En général on défini la cible du lien en indiquant son chemin complet. Mais si on remplace la lettre de lecteur par un point on obtient un lien relatif. Il serait intéressant de savoir copier des liens relatifs de façon à conserver une structure indépendante de la lettre de lecteur, ce serait utile en cas de sauvegarde. Le test suivant est effectué avec la simple commande copy et son commutateur /L

La commande echo crée un fichier texte.
La commande mklink sans commutateur crée un Lien Symbolique.
Le Lien Symbolique est relatif car la lettre du lecteur a été remplacée par un point.
On ajoute "-SR" (Symbolique Relatif) au nom du lien obtenu :

X:\>echo coucou>1.txt

X:\>mklink 1-sr.txt .\1.txt
Lien symbolique créé pour 1-sr.txt <<===>> .\1.txt

X:\>copy /L *.* y:
1-sr.txt
1.txt
2 fichier(s) copié(s).

X:\>

 On vérifie le résultat sur le disque cible :

Y:\>dir

22/11/2010 11:40 <REP> .
22/11/2010 11:40 <REP> ..
22/11/2010 11:39 <SYMLINK> 1-sr.txt [.\1.txt]
22/11/2010 11:39 8 1.txt

Le test final consiste à détruire les fichiers d'origine et à vérifier le fonctionnement de 1-sr.txt.
Dans cet exemple on symbolise le lien relatif en ajoutant "--" au nom :

X:\>md structure\dossier\repertoire

X:\>md cedossier

X:\>echo test>structure\dossier\repertoire\texte.txt

X:\>cd cedossier

X:\cedossier>mklink texte--.txt ..\structure\dossier\repertoire\texte.txt
Lien symbolique créé pour texte--.txt <<===>> ..\structure\dossier\repertoire\texte.txt

X:\cedossier>type texte--.txt
test

X:\cedossier>cd..

X:\>xcopy /S /E /B *.* y:
X:cedossier\texte--.txt
X:structure\dossier\repertoire\texte.txt
2 fichier(s) copié(s)

X:\>rd /S /Q cedossier

X:\>rd /S /Q structure

X:\>y:

Y:\>cd cedossier

Y:\cedossier>type texte--.txt
test

Y:\cedossier>dir texte--.txt
22/11/2010 12:29 <SYMLINK> texte--.txt [..\structure\dossier\repertoire\texte.txt]

 

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. Si la cible est déplacée ou renommée, le lien est perdu. Cette remarque ne concerne pas 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.
Les Jonctions ne peuvent cibler un dossier situé sur le réseau.
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

Une Jonction ne peut être qu'un chemin absolu vers un dossier.

On pourra donc utiliser les Jonctions pour créer des liens absolus vers des dossiers.
Et réserver 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.
Si on ne veut pas que ce soit listé avec DIR, alors faire un Hardlink.

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êmes 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 sur une clé USB fonctionneront quelle que soit la lettre attribuée par le système au volume amovible.

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://www.ntfs.com

Liens Réels et Symboliques

http://en.wikipedia.org/wiki/NTFS
http://en.wikipedia.org/wiki/NTFS_reparse_point
http://en.wikipedia.org/wiki/NTFS_junction_point
http://en.wikipedia.org/wiki/NTFS_symbolic_link
http://en.wikipedia.org/wiki/Inode 

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/Symbolic_link

http://fr.wikipedia.org/wiki/Master_File_Table

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

Syllabus Systèmes d'Exploitation de Monica Bastreghi

NTFS Documention par Richard Russon et Yuval Fledel - html
NTFS Documention par Richard Russon et Yuval Fledel - scribd

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

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

TECHNET : Working with Files System
TECHNET : How NTFS Works (lire jusqu'à la fin !)
MSDN : About Directory Management (bis) - Programming Considerations (bis) - Creating Symbolic Links (bis)
MSDN : Hard Links and Junctions
MSDN : Symbolic Links
MSDN : Reparse Points
MSDN : Reparse Point Tags
MSDN : Reparse Points Operations
MSDN : Reparse Points and File Operations
MSDN : Per-User junctions ans System Junctions

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
http://www.flexhex.com/docs/articles/hard-links.phtml

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)

Délocalisation
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/ 
Cette technique est indiquée à titre d'information. Je la déconseille, à moins d'être absolument au courant de ce qu'on fait.
http://google.fr/search?num=99&q=Déplacer+Mes+Documents+par+défaut+et+par+script
http://www.chantal11.com/2010/02/deplacer-son-dossier-utilisateur-par-defaut-et-par-script-windows-7/
Un script pour délocaliser le dossier Public
Un script pour délocaliser "Mes Documents"
http://www.forum-seven.com/forum/topic4073.html
What's New in Folder Redirection and User Profiles
When you use the System Preparation Tool (Sysprep) or Windows Vista Setup to apply the FolderLocations unattend settings, some system directory junctions do not point to the new target location

http://www.tutoriaux-excalibur.com/forum-7/documents-and-settings-n-est-pas-accessible-acces-refuse-t999.html
http://google.fr/search?num=99&q=site:tutoriaux-excalibur.com/forum-7+"documents+and+settings"

Access Control : Understanding Windows File And Registry Permissions
Les nouvelles ACL améliorent la sécurité dans Windows Vista

 


 

Articles en relation

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

 

Annexe

Folder Shortcut

L'objet Folder Shortcut a pour CLSID {0AFACED1-E828-11D1-9187-B532F1E9575D}. Il permet, avec l'aide d'un fichier Desktop.ini accompagné d'un raccourci Target.lnk d'obtenir un comportement ressemblant aux jonctions : en cliquant sur un dossier TOTO on ouvre un dossier cible TITI qui peut être situé sur un autre volume. Le contenu du véritable dossier TOTO reste caché (héhé). Ce procédé permettra comme pour les jonctions de tromper Windows ou un programme, et de corriger ainsi certains problèmes de délocalisation ou d'installation. Utilisable sur FAT32, c'est indépendant du système de fichiers. C'est implanté sur tous les Windows.

Registre :
HKLM\SOFTWARE\Classes\CLSID\{0AFACED1-E828-11D1-9187-B532F1E9575D}
linktarget

Utilisation :
On crée dans le dossier A un raccourci nommé TARGET (son nom complet est donc target.lnk) pointant vers un dossier B.
On ajoute dans le dossier A un fichier Desktop.ini dont le contenu est :

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2
ConfirmFileOp=0

Il reste à donner l'attribut System au dossier A pour que celui-ci exploite son Desktop.ini avec la commande attrib +s "chemindudossier"
Pour retrouver le comportement habituel et pouvoir afficher le contenu de A (et non le contenu de B), retirer l'attribut.
On voit qu'on passera facilement d'un état à l'autre simplement avec cette commande attrib (faire des batchs).

Gilles Ronsin a créé un script automatisant la création des fichiers desktop.ini et target.lnk nécessaires à la redirection :
http://gilles.ronsin.free.fr/#targetlnk
http://gilles.ronsin.free.fr/fichiers/targetlnk.vbs

Plus d'infos :
http://www.google.fr/search?num=100&q=0AFACED1-E828-11D1-9187-B532F1E9575D
http://www.google.fr/search?tbs=bks%3A1&q=0AFACED1-E828-11D1-9187-B532F1E9575D
http://www.hotline-pc.org/registreshell.htm
http://www.johnlandells.com/reparsing-folders-in-xp
Cet article compare les Shell Links aux Junctions : http://www.pearlmagik.com/winbolic/
System.Link.TargetParsingPath
The Shell Link Object and the Shell Folder Shortcut Object support being the host object of a shell instance object

 

 

 

Notes

http://fr.wikipedia.org/wiki/Captive_NTFS
http://www.ntfs.com/disk-scan.htm



 

compteur Free
Publié le 21/9/2009