Joseph Tux

Copies, liens physiques, liens symboliques

samedi 23 mai 2009

Comparaison -par un exemple d’utilisation- des commandes :

  • cp -au
  • ln
  • ln -s / cp -s

Exemple utilisant aussi find et rm




À l’usage les petits scripts évoluent : corrections de bug, contrôles d’erreurs, fonctionnalités nouvelles etc..

Les scripts sont généralements installés dans le répertoire /usr/local/bin/, qui n’est accessible en écriture que sous root

Certains scripts très liés à la configuration particulière sont également sous /home/utilisateur/bin/

Je télécharge massivement des émissions de France-culture, pour les écouter en différé, mais aussi pour les conserver car je déplore la brièveté de son archivage sur le site de France-culture : les archives sonores anciennes ne sont plus accessibles, même si leurs informations figurent encore sur le site.

Or lorsque je m’intéresse particulièrement à un sujet, ce n’est pas nécessairement dans le trimestre, ni même l’année de sa diffusion. Il m’arrive de me souvenir d’une émission ancienne que j’aimerais réécouter..

Bref, je souhaite archiver un très gros volume de donnée, qui gonfle régulièrement.

J’ai donc écrit un petit script pour déplacer ces archives.

Ce script évolue, surtout à ses débuts

 Ne pas écrire directement dans /usr/local/bin/ ni dans /home/utilisateur/bin/

 préserver les versions

 Ecrire sans les droits root, grace au lien symbolique

  1. Je rédige ce script très spécialisé dans le répertoire de destination ( dans un sous-répertoire « ./script/ » )
  2. Dans ce répertoire script, j’utilise un sous-répertoire ./script/versions/ où sont copiées les versions au fur et à mesures de leur création :
    - cp -a script.versionx ./versions/
  3. Je modifie ce script en le renommant script.version(x+1) et en le renseignant.
  4. Je re-crée le lien physique de chaque nouvelle version vers son nom constant :
    - ln script.version(x+1) script.sh
  5. J’ai créé -une seule fois (sous root)- la commande :
    - ln -s script.sh /usr/local/bin/script

 Que fait ce script ?

  1. Il copie tous les nouveaux fichiers du répertoire (source)  /podcasts vers un autre répertoire (destination) /home/BKP_podcasts ( monté sur un autre disque dur ) :
    - cp -uav $rep_source* $rep_destination
  2. Puis il efface les fichiers sources déjà archivés qui ont plus de 92 jours [1] :
    - find /home/utilisateur/podcasts/ -iname « *.mp3 » -ctime +92 -exec rm -v {} ~;

 Explications

 cp , cp -a , cp -au

La commande cp -a source destination recopie un fichier source en créant un autre fichier destination.
- Ce nouveau fichier est entièrement réécrit et utilise autant d’espace ( en plus )
- Son « identité physique » s’appelle un « inode » DÉSIGNÉ PAR UNE ADRESSE UNIQUE : un N° d’inode nouveau et unique lui est attribué.
- l’option -a (-a : archive) permet de préserver les caractéristiques du fichier [2].

La commande cp -au utilise aussi l’option -u (-u : update) qui ne copie les fichiers que s’ils sont plus récents ( fichiers sources modifiés après avoir été copiés sur la destination ) ou, a forciori absent de la destination ; c’est ce qui nous intéresse dans ce script.

 LIMITES :

cp -au /home/mes_donnees/* /mnt/sauvegarde/ ne copie pas les fichiers (et répertoires) cachés [3].
Cette limite est celle du shell et de ses jockers [4].

Si on écrit

  • cp -au .* , on a donc le complément de la commande
  • cp -au * .

Une autre solution consiste à se passer de jocker, en copiant l’arborescence ainsi :

  • cp /home/mes_donnees/ /mnt/backup/

Dans ce cas, le repertoire /mnt/backup/mes_donnees/ sera créé ( ou complété, s’il existe déjà )

 ln , ln -s

  1. La commande ln fichier1 fichier2 crée un LIEN PHYSIQUE du fichier1 vers le fichier2, à condition que ces 2 fichiers soient sur la même partition
    - Cette commande ne crée pas de nouveau fichier, mais elle donne une « identité » supplémentaire au même inode. Cet inode ( le fichier ) prend donc un deuxième nom ; il peut ainsi en prendre autant qu’on veut !
    Aucun de ces noms n’a de priorité sur un autre. On peut supprimer autant de noms ( liens physiques ) que l’on veut, seul la supression du dernier suprimera réellement son contenu.
    C’est donc une économie d’espace et de temps ( contrairement à cp ) et une sécurité quant à la permanence d’identité ( aucune différence possible : si on en modifie un, on les modifie tous, pusique c’est le même ) ;
    - ce n’est donc pas une sauvegarde : en cas d’altération physique du fichier ( crash du disque .. ), tous sont également touchés.
  2. La commande ln -s fichierO fichierLS crée un LIEN SYMBOLIQUE fichierLS sur le fichierO
    - La encore, il n’y a pas création de nouveau fichier physique.
    - Mais le lien symbolique présente 2 différences fondamentales avec le lien physique :
  • si le fichier d’origine disparait, ou simplement si son nom [5] change, le lien symbolique ne correspond plus à rien !
  • le lien symbolique peut être situé sur une partition différente du fichier qu’il représente.
    - Toute modification sur l’un est immédiatement effectué sur l’autre : là encore il ne s’agit que d’un seul fichier physique, mais avec un autre N° d’inode, qui ne contient qu’un lien, une sorte de renvoie vers l’inode unique du fichier.

 ln versus ln -s

  • Copie ( cp source destination ) : création d’une copie identique mais indépendante.
    - La modification de l’un n’affecte pas l’autre.( sauvegarde de sécurité )
    - Cela prend du temps
    - Cela consomme de l’espace sur le disque
    - Un autre système de fichier est possible
  • Lien physique ( ln source destination) :
    - La référence est l’inode.
    - un seul inode ( donc une même table de partition )
    - plusieurs noms, donc fichier intact tant qu’au moins un nom persiste. [6]
    - Attention : la création d’un nouveau fichier avec le même nom ne recréera pas le lien ; si un lien physique est renommé, il reste lié physiquement avec tous les autres liens physiques : ils restent tous des noms valides du même inode.
    - Impossible de lier un répertoire [7]
    - Préserve les attributs « date » et autres du fichier [8].
  • Lien symbolique (ln -s source destination) [9] :
    - la référence est le nom canonique de la source (celui qu’on utilise )
    - un inode pour chaque lien, donc :
    - Un autre système de fichier est possible
    - le nom d’origine est le seul à être effacé, même si des liens symboliques semblent persister.
    - Attention : effacer ou renommer un fichier source modifie ( perd ) le lien symbolique.
    - En revanche, si vous créez un fichier avec le même nom que celui que vous avez supprimé ( ou renommé ) il va retrouver le lien sur ce nouveau fichier.
    - Un lien symbolique est possible sur un répertoire [10].
    - Attributs « date » propre au lien (et non du fichier original) [11].

__jaune-irise-flou16.png__

C’est pour celà qu’il faut recréer le lien physique entre script.version_nouvelle et script.sh ( le fichier est peut-être une copie, donc avec un autre inode )

Par contre les liens symboliques de ...bin/script [12] vers script.sh sont automatiquement mis à jour ( le nom ne change pas )

L’édition d’un lien affecte toujours l’ensemble des fichiers concernés.

- On peut faire des liens physiques sur un lien symbolique : ils gardent les qualités du lien symbolique dont ils partagent l’inode.
- On peut faire des liens symboliques sur un lien physique, puisqu’il est un fichier ordinaire. Si le lien physique disparait, en laissant d’autres liens physiques sur le même inode que se passe-t-il ? [13]

[1 man find , mine inépuisable

[2date, permissions, propriétaire.. man cp pour les détails

[3Fichiers dont le nom commence par un point, comme /home/machin/.bashrc ou .vim ou .mozilla/

[4* et  ?

[5nom complet : nom de base ou arborescence

[6rm efface le nom, pas l’inode

[7cf

[8Comme cp -a

[9cp -s semble faire exactement la même chose

[10et permet d’accéder à son contenu

[11Comme cp sans l’option -a ni l’option -p

[12autre partition

[13Le lien symbolique n’est plus valide, puisqu’il pointait sur le nom ( disparu ) et non sur l’inode (persistant)

Voir en ligne : La magie de cp -la

Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 289 / 59178

Suivre la vie du site fr  Suivre la vie du site GNU, LINUX, BSD, LL  Suivre la vie du site AIDES GNU/LINUX  Suivre la vie du site Administration : astuces, stratégies   ?

Site réalisé avec SPIP 3.1.6 + AHUNTSIC

Creative Commons License