Petit topo sur les liens Unix

Introduction

Un fichier Unix est en réalité composé de 3 éléments:

  • NomFichier (pointe vers l’inode)
  • Inode , contient des infos comme les droits, le propriétaire..(pointe vers les données)
  • Données

Rien n’empêche donc de créer un autre “élément” NomFichier2 qui pointe lui aussi vers l’inode déja pointé par NomFichier.. C’est le lien “normal”.

Si NomFichier3 pointe, non pas vers l’inode, mais vers NomFichier… c’est un lien symbolique..

Exemples

$ echo totoot > toto  
$ cat toto  
totoot 

L’option -i permet de voir l’inode:

$ ls -i
923134 toto  

On créé un lien (non symbolique)
Autrement dit, on donne un second nom au même inode (donc aux mêmes données)
(La commande semble faire pointer vers le nom… alors qu’elle fait pointer vers l’inode pointé par le nom..bref..)

$ ln toto hardlink   
$ ls -i  
923134 hardlink
923134 toto  

Le nouveau nom de fichier affiche bien les mêmes données :

$ cat hardlink   
totoot

On créé un lien symbolique qui pointe non plus sur l’inode de toto, mais sur le nom toto.
On peut voir que l’inode est différent:

$ ln -s toto symbolink  
$ ls -i  
923134 hardlink
923140 symbolink
923134 toto  

L’option -l permet de voir que c’est un lien symbolique (le l juste après l’inode et la flèche à la fin de la ligne)

$ ls -il  
total 8  
923134 -rw-r--r-- 2 yannick yannick 7 2005-12-07 17:31 hardlink  
923140 lrwxrwxrwx 1 yannick yannick 4 2005-12-07 17:35 symbolink -> toto  
923134 -rw-r--r-- 2 yannick yannick 7 2005-12-07 17:31 toto

Concrètement, on obtient bien le contenu de toto en appelant symbolink

$ cat symbolink  
totoot  

Par contre cette fois, si en enlève toto, symbolink ne fonctionne plus… alors que hardlink oui

$ mv toto toto2  
$ cat symbolink  
cat: symbolink: Aucun fichier ou répertoire de ce type  
$ cat hardlink  
totoot

On remet toto et symbolink refonctionne

$ mv toto2 toto  
$ cat symbolink   
totoot

La 3ème colonne indique combien de liens (hard) pointent vers un inode (ci dessous 2 pour 923134)

$ ls -li  
total 8  
923134 -rw-r--r-- 2 yannick yannick 7 2005-12-07 17:31 hardlink  
923140 lrwxrwxrwx 1 yannick yannick 4 2005-12-07 17:35 symbolink -> toto  
923134 -rw-r--r-- 2 yannick yannick 7 2005-12-07 17:31 toto  

Si on en créé un autre… cela passe donc à 3:

$ ln toto hardkinleretour  
$ ls -li  
total 12  
923134 -rw-r--r-- 3 yannick yannick 7 2005-12-07 17:31 hardkinleretour  
923134 -rw-r--r-- 3 yannick yannick 7 2005-12-07 17:31 hardlink  
923140 lrwxrwxrwx 1 yannick yannick 4 2005-12-07 17:35 symbolink -> toto  
923134 -rw-r--r-- 3 yannick yannick 7 2005-12-07 17:31 toto  

Les données ne sont donc supprimées que si l’on supprime le dernier nom poitant vers l’inode.
A noter également que si 2 noms poitent vers le même inode, le sytème affiche la même taille pour chacun des 2… Cela ne signifie pas que les données sont en double!