Linux : comment créer un lien symbolique ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment et pourquoi créer un lien symbolique sous Linux, que ce soit entre deux fichiers ou deux répertoires.
Un lien symbolique (symlink) peut être vu ici comme un raccourci pointant vers un dossier ou un fichier sur le système. Ce dernier contient juste une référence vers le fichier cible et non les données du fichier en elles-mêmes, contrairement à un lien physique (hard link) qui est plutôt une copie conforme (noms de fichiers différents, mais même inode ou index) de son fichier cible.
Voici quelques avantages liés à l’utilisation des liens symboliques dans le cadre de l’administration d’un système sous Linux :
- La centralisation : l’utilisation de liens symboliques permet de centraliser les fichiers de configuration des applications et du système sans les déplacer physiquement. Cela facilite l’administration et la maintenance, ce qui peut offrir un gain de temps aux administrateurs. Par exemple, un lien symbolique dans « /etc/ » peut renvoyer vers un fichier de configuration stocké ailleurs.
- Le gain d’espace disque : les liens symboliques, contrairement aux liens physiques, sont des raccourcis qui pointent vers un fichier sans le copier, ce qui prend moins de place sur votre disque dur.
- La compatibilité avec plusieurs systèmes de fichiers
- Etc.
Version originale de l'article : 20 mars 2013
II. La syntaxe de la commande ln
Sous Linux, il est possible de créer un ou plusieurs liens vers un fichier ou vers un répertoire donné. Dans les deux cas, la syntaxe de création de liens symboliques suit la logique suivante :
ln -s /chemin/vers/fichier_cible lien_symbolique
Quelques explications s’imposent :
- La commande «
ln
» est utilisée pour créer un lien - L’option «
-s
» permet de spécifier qu’il s’agit d’un lien symbolique - Le fichier ou le répertoire source est placé avant le lien dans la commande
Par ailleurs, le nom du lien doit être différent de celui de tout fichier ou dossier existant dans le répertoire de destination de ce dernier, au risque de recevoir un message indiquant que le fichier ou le dossier existe déjà.
III. Créer un lien symbolique
A. Lien symbolique vers un répertoire
On va, par exemple, créer un lien symbolique vers le dossier « meister » situé à la racine de notre système. Ce lien s’appellera « meister1 » et sera situé dans le répertoire « home » de l’utilisateur root (soit « /root »).
ln -s /meister/ meister1
Ce qui donne en image :
On peut aller vérifier que tout est correct avec la commande suivante :
ls -al
Le résultat est visible sur l’image ci-dessous. Le lien symbolique est représenté par une flèche « -> » mettant en évidence la cible. La lettre « l » en début de lien est également un indicateur.
On va ensuite créer un fichier nommé « test » dans le dossier source «/meister ». Puis, quand ce sera fait, on va se déplacer vers le dossier lien « meister1 » du répertoire « home » de l’utilisateur root afin de lister les fichiers. Ce sera l’occasion de constater qu’on a bien accès au fichier « test » précédemment créé depuis le dossier source, grâce à notre lien symbolique.
# On crée le fichier « touch » depuis le dossier-source
touch /meister/test
# On se déplace ensuite vers le dossier-lien du répertoire « home » de l’utilisateur courant (root)
cd meister1
# On liste enfin les fichiers présents dans le dossier « /root/meister1 »
ls
En image :
B. Lien symbolique vers un fichier
La démarche est exactement la même qu’avec la création d'un lien symbolique vers un répertoire.
On va d’abord créer un fichier de configuration dans le dossier « /var/lib » qu’on appellera « config1 ». On y insère ensuite le texte « ma configuration pour mon application ». On va enfin créer un lien symbolique vers notre fichier dans le répertoire « /etc » (souvent utilisé par défaut pour stocker les fichiers de configuration de nombreuses applications).
# Création du fichier « config1 » dans le dossier « /var/lib »
touch /var/lib/config1
# On écrit ensuite dans le fichier « config1 »
echo 'ma configuration pour mon application' > /var/lib/config1
# On crée enfin le lien symbolique vers le fichier config1
ln -s /var/lib/config1 /etc/config
En image :
On peut vérifier le lien avec la commande suivante :
ls -al /etc/config
On peut encore aller plus loin en se rassurant qu’on puisse effectivement avoir accès au contenu du fichier de configuration source à partir du lien symbolique créé.
cat /etc/config
IV. Lister les liens symboliques sur Linux
On va terminer avec une astuce pour lister les liens symboliques sur une machine Linux. On peut utiliser plusieurs commandes pour cela, notamment les commandes find
et ls
. L'avantage d'utiliser la commande ls
couplée à grep
, c'est que l'on va pouvoir lister d'autres propriétés sur les fichiers en même temps (utile pour voir la source et la destination du lien).
Voici la syntaxe à adopter :
ls -lR /chemin/dossier | grep '^l'
Par exemple, pour lister tous les liens symboliques situés sous "/etc/" de façon récursive :
sudo ls -lR /etc/ | grep '^l'
Quelques explications sur cette commande :
ls -lR
: liste récursivement tous les fichiers avec détails.grep '^l'
: filtre les fichiers dont la ligne commence parl
(indiquant un lien symbolique).
Vous allez probablement obtenir une longue liste, sous cette forme :
lrwxrwxrwx 1 root root 41 avril 24 2024 bluetooth.service -> /usr/lib/systemd/system/bluetooth.service
lrwxrwxrwx 1 root root 44 avril 24 2024 snapd.seeded.service -> /usr/lib/systemd/system/snapd.seeded.service
lrwxrwxrwx 1 root root 44 avril 24 2024 cloud-config.service -> /usr/lib/systemd/system/cloud-config.service
V. Conclusion
À la suite de ce tutoriel, vous savez désormais créer des liens symboliques vers un fichier ou un répertoire sous Linux. Cependant, le lien ne fonctionnera plus une fois qu’on a renommé ou supprimé le fichier ou le répertoire source.
J’ai peut-être mal compris, mais tu écris dans II. que « source » sera un lien symbolique vers « dest », donc dest serait un répertoire existant ?
On créé un lien symbolique « source », qui pointera vers un répertoire existant « dest » si on comprend bien cette phrase, non ?
Puis dans le cadre rouge il y a écrit que dest ne doit pas exister et sera créé avec le lien….
La commande ln est ainsi si je ne me trompe pas :
ln -s [existing/directory] [new/link/directory] non ? donc ce que tu as écrit est faux : selon ta commande, c’est dest qui sera le lien symbolique vers source, ce pourquoi en effet il n’existe pas avant la création du lien, comme précisé dans le cadre rouge…
Je pense qu’il y a une confusion entre dest et source, soit dans la première phrase, soit dans la commande et dans le cadre rouge. D’ailleurs, je trouverais ça plus logique que ton lien soit au final « source -> dest », plutôt que « dest -> source » comme ce que l’on retrouve dans la capture …
En fait je pense que le terme « source » est ambigüe selon le point de vue, d’où la confusion : dans une certaine mesure la source peut être le lien sur lequel on pointe pour aller qq part, ou il peut être l’origine vers laquelle on veut aller avec le lien. Tandis que le terme « destination » lui n’est pas ambigüe, c’est là où on va, cad le répertoire existant.
Erreur dans la commande:
ln –s /root/source/ /root/dest
La correction est:
ln –s /root/source /root/dest
Premier lien google et l ‘explication est fausse
ln -s dossier_cible nom_du_lien
Bonjour, la dénomination « source » et « dest » pose en effet des problèmes de compréhension de l’article. Celui-ci a été modifié en conséquence.
Merci pour votre remarque.
Bonjour,
D’abord, cette commande a quelle endroit doit-on la mettre.
Dans quel fichier ?
Et par exemple :
si on veut que le dossier image du s-domaine A soit un répertoire raccourci du dossier image du domaine.
idem pour b, c etc
à quel endroit et dans quel fichier doit-on écrire ce code.
à la racine du serveur.
dans le .htaccess de chaque s-domaine ?
Suis nul mais je me corrige(smile)
excellent article franchement j’ai bien compris ce notion de lien symbolique il fallait just mentionner comme quoi que le fichier source et le fichier qui pointe sur ce dernier vont partager le meme inode du coup si en supprime le fichier source en aura plus de contenue dans le lien symbolique
effectivement, le lien symbolique d’un fichier (ou répertoire) synchronise les modifications d’un fichier d’un sens comme dans l’autre et si on supprime le fichier source, le lien symbolique pointant sur ce fichier source ne fonctionnera plus car il ne pointe sur aucun fichier à présent.
Néanmoins, il est possible de garder les données contenues dans un dossier ou fichier en utilisant la commande ln (sans l’option -s) :
$ ln source destination
Cela va créer un lien en dure, un fichier (ou dossier) sera créé, la synchronisation se fera normalement, mais quand le fichier (ou dossier) source sera supprimé, le fichier qui pointait sur ce fichier source conservera les données synchronisé et on pourra l’ouvrir, le modifier, etc…
Rectification : la commande ln pour les lien en dure ne fonctionne qu’avec les fichiers et non les répertoires !