Différence entre un hard link et un lien symbolique

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.

La discussion continue ailleurs

URL de rétrolien : https://davidmasclet.gisgraphy.com/index.php?trackback/28

Fil des commentaires de ce billet