Différence entre un hard link et un lien symbolique
Par MD3804-GANDI le mercredi 23 décembre 2009, 11:39 - Lien permanent
Lorsque j'ai voulu faire un système de sauvegarde pour les données de mon serveur, j'ai voulu créer un dossier par date, mais je me suis vite rendu compte que cela allait prendre beaucoup de place. alors j'ai utilisé un hard link pour faire une sauvegarde incrémentale.
Hard link
Un hard link permet de faire un lien vers un autre répertoire mais dès que le contenu du lien change, un nouvel inode est crée.
Cela me permet d'avoir un dossier de sauvegarde où, lorsque je navigue à l'intérieur, j'ai tous les fichiers, mais au niveau du disque dur chaque dossier de sauvegarde d'une date d pointe vers le dossier de sauvegarde d-1. Seules les modifications de la date d sont stockées et prennent de la place sur le disque. Exemple :
Considérons un dossier le sauvegarde ci dessous :
=>Dossier 01_01 =>Dossier D1 Fichier F1 Fichier F2
Lors de la sauvegarde du 02/01, je crée un hard link avec la commande
cp
et l'option -l plutôt que ln
car ln
ne peux être fait que sur un fichier pas sur un répertoire : cp -ral
01_01 02_01
:
=>Dossier 02_01 =>Dossier D1 Fichier F1 Fichier F2
Les fichiers et 02_01 partagent les mêmes inodes que ceux de 01_01 :
ls -i 01_01/D1 232177 F1 232178 F2 ls -i 01_02/D1 232177 F1 232178 F2
A ce stade, la place sur mon disque dur reste inchangée. Maintenant supposons que le fichier F2 soit différent entre le 02/01 et le 01/01, dans ce cas le fait d'écraser le fichier F2 dans le dossier 02_01 va me créer physiquement un nouveau fichier (un nouvel inode). Seul le fichier F2 de 02_01 sera modifié et aura son propre inode, les autres fichiers pointent vers ceux du dossier 01_01 puisqu'ils sont inchangés. Par contre si D1 contenait des sous dossiers, deux dossiers seraient physiquement crées un dans 01_01 et un autre dans 02_01 car les hards links de répertoires ne sont pas possibles, en revanche les fichiers contenus dans les sous dossiers partageraient par défaut les mêmes inodes.
ls -i 01_01/D1 232177 F1 232178 F2 ls -i 01_02/D1 232177 F1 232179 F2
Il n'y aura pas de nouvel inode de crée si le fichier est renommé.
Pour utiliser des hard links avec rsync, j'ai donc utiliser la commande suivante :
date=`date "+%Y-%m-%dT%H:%M:%S"` rsync -aP --delete --link-dest=$HOME/Backups/current /path/to/important_files $HOME/Backups/back-$date rm -f $HOME/Backups/current ln -s back-$date $HOME/Backups/current
En savoir plus sur comment réaliser des sauvegardes avec hard links et Rsync | An other link
Lien symbolique
Un lien symbolique ne prend pas plus de place qu'un hard link, mais la différence et que toutes modifications apportées à la cible d'un lien se répercute sur la source du lien, et inversement. Si j'utilise un lien symbolique plutôt qu'un hard link, mes sauvegardes des dates d seraient égales aux sauvegardes des dates d-1 et je n'aurais donc, qu'une sauvegarde, et non une sauvegarde par date.
On crée un lien symbolique avec la commande ln
en passant le
paramètre -s
: ln -s source dest
.
La limitation des liens est qu'ils doivent se faire sur une même partition pour partager les mêmes inodes.
En savoir plus sur la commande ln.