logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:systeme:ln [21/03/2015 10:59]
milou [Illustration pratique]
doc:systeme:ln [14/08/2024 17:38] (Version actuelle)
agp91 [Les liens physiques (hardlink) ] : Corrections de code
Ligne 1: Ligne 1:
-====== ​LN ======+====== ​ln ======
   * Objet: commande ln   * Objet: commande ln
   * Niveau requis :​{{tag>​débutant avisé}}   * Niveau requis :​{{tag>​débutant avisé}}
 +  * Commentaires : // Permet de créer des liens physiques ou symboliques //
   * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-)   * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-)
     * [[:​doc:​programmation:​shell:​chevrons | La commande chevron ">"​]]     * [[:​doc:​programmation:​shell:​chevrons | La commande chevron ">"​]]
-    * [[:​doc:​systeme:​ls | La commande ​LS]] +    * [[:​doc:​systeme:​ls | La commande ​ls]] 
-    * [[:​doc:​systeme:​rm | La commande ​RM]] +    * [[:​doc:​systeme:​rm | La commande ​rm]] 
-    * [[:​doc:​systeme:​droits-unix | Les Droits]] +    * [[:​doc:​systeme:​droits-unix | Les droits]] 
-    * [[:​doc:​editeurs:​nano | La commande d'​édition ​NANO]] +    * [[:​doc:​editeurs:​nano | La commande d'​édition ​nano]] 
- +  * Suivi : {{tag>​à-compléter}}{{tag>​à-tester}}
-  * Commentaires : // Permet de créer des liens physiques ou symboliques // +
-  * Suivi : {{tag>​à-compléter}}+
     * Création par [[user>​smolski]] le 21/06/2010     * Création par [[user>​smolski]] le 21/06/2010
-    * Testé ​par .... le ....+    * Modifié ​par [[user>​agp91]] ​le 11/08/2024
   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=113446|C'​est ici]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​pid=113446|C'​est ici]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
Ligne 18: Ligne 17:
 La commande ''​ln''​ établit un lien symbolique ou un lien physique entre 2 fichiers. La commande ''​ln''​ établit un lien symbolique ou un lien physique entre 2 fichiers.
  
-Son utilisation correspond à une redirection **active** entre deux //​fichiers// ​ désignés. \\ +Les modifications opérées //​sur/​dans//​ l'un sont visibles immédiatement depuis l'un ou l'​autre des fichiers liés.
- +
-Les modifications opérées //​sur/​dans//​ l'un sont visibles immédiatement depuis l'un ou l'​autre des fichiers liés. ​Autrement dit, un lien est un type spécial de fichier qui permet à plusieurs noms de fichiers de faire référence au même contenu sur un disque. +
 ===== Synopsis ===== ===== Synopsis =====
  
Ligne 28: Ligne 24:
 == Lien symbolique : == == Lien symbolique : ==
  
-   ln -s <​fichier_cible>​ <fichier_symbole+   ln -s <​fichier_cible>​ <nom_lien
-   ln -s <​répertoire_cible>​ <répertoire_symbole>​ +   ln -s <​répertoire_cible>​ <nom_lien>
-   ln -s <​point_cible>​ <​point_symbole>+
  
 == Lien physique : == == Lien physique : ==
Ligne 44: Ligne 39:
 == Les liens symboliques (symlink) == == Les liens symboliques (symlink) ==
  
-Un lien symbolique est constitué d'un réel fichier de petite taille ; il contient le nom du fichier auquel il correspond. Par conséquent,​ la suppression du fichier d'​origine,​ c'​est-à-dire la cible du lien, rendra le lien symbolique inutilisable puisqu'​il ne correspondra plus à un fichier valide ; le lien sera alors brisé. ​+Un lien symbolique est constitué d'un réel fichier de petite taille ; il contient le nom (chemin) ​du fichier auquel il correspond. Par conséquent,​ la suppression du fichier d'​origine,​ c'​est-à-dire la cible du lien, rendra le lien symbolique inutilisable puisqu'​il ne correspondra plus à un fichier valide ; le lien sera alors brisé. ​
  
 == Les liens physiques ou durs (hardlink) == == Les liens physiques ou durs (hardlink) ==
  
-Un lien dur associe deux ou plusieurs fichiers à un même espace sur le disque ​tout en préservant leurs indépendances lors de modifications ​de leurs contenusDe même, la suppression d'un fichier n'​affectera pas l'​autre.+Un lien dur associe deux ou plusieurs fichiers à un même espace sur le disque. Ainsi un fichier peut disposer réellement ​de plusieurs noms (chemins)La suppression d'un fichier ​lié physiquement ​n'​affectera pas les autres fichiers qui lui sont liés. 
  
 **Nota :** \\ **Nota :** \\
-Il semble que le système ​de fichier //privateur// ''​ntfs''​ __ne soit pas capable__ de gérer des ''​hardlink''​ (ni des ''​symlink''​) avec lui-mêmesinon d'une manière incomplète et //très très à la con// en fait:-)+Les systèmes ​de fichier ​msdos/fat/vfat et exfat ne prennent ​pas en charge ​ni les liens symboliquesni les liens physiques.\\ 
 +([[https://debian-facile.org/viewtopic.php?​pid=417068#​p417068|Démonstration dans le forum]])
  
-//Merci de ces remarques habiles au concert de //​**Mahoru`Tsunemi**//​ et de //​**captnfab**//​ sur l'​IRC.//​ +===== Préparatifs ​=====
- +
-===== Illustration pratique ​=====+
  
 Afin de bien comprendre les principes que nous avons décrits ci-haut, nous allons illustrer tout cela à l'aide de quelques exemples simples. Afin de bien comprendre les principes que nous avons décrits ci-haut, nous allons illustrer tout cela à l'aide de quelques exemples simples.
  
-Débutant - À savoir ​:+Dans ''/​home/​votre_user/'',​ créez un répertoire nommé ''​test_lien''​ avec [[:​doc:​systeme:​mkdir|mkdir]] et s'y positionner avec [[:​doc:​programmation:​shell:​cd | cd]] :
  
-  * [[:​doc:​programmation:​shell:​chevrons | La commande chevron ">"]] +<code user>cd 
-  * [[:​doc:​systeme:​ls | La commande LS]] +mkdir test_lien 
-  * [[:​doc:​systeme:​rm | La commande RM]] +cd test_lien 
-  * [[:​doc:​systeme:​droits-unix | Les Droits]] +</​code>​
-  * [[:​doc:​editeurs:​nano | La commande d'​édition NANO]]+
  
-//Et oui, tout ça cher Débutant ! Il reste que la plupart de ces commandes sont les commandes en ligne principales __usuelles__ à utiliser ​dans un terminal.// :-)+Créer ​dans ce répertoire ​un fichiers vide, ''​test1.txt'',​ avec [[:​doc:​systeme:​touch|touch]],​ puis ajoutez-y le texte //Bonjour toto// avec la commande [[:doc:​systeme:​echo|echo]].
  
 +<code user>
 +touch test1.txt
 +echo Bonjour Jojo > test1.txt
 +</​code> ​
  
-==== Créer les répertoires et fichiers tests que nous allons utiliser ====+On vérifie avec la commande [[:​doc:​systeme:​cat|cat]] ​que notre texte est bien écrit dans le fichier test1.txt :
  
-Dans ''​/home/votre_user/'',​ créez un répertoire nommé //​test_lien//​ avec [[:​doc:​systeme:​mkdir|mkdir]] et s'y positionner avec [[:​doc:​programmation:​shell:​cd | cd]] :+<code user> 
 +cat test1.txt 
 +</code><​code>​ 
 +Bonjour Jojo 
 +</code>
  
-<code user>cd ~</​code>​+==== Théorie simplifiée ====
  
-<code user>​mkdir test_lien</​code>​+Pour enregistrée un fichier sur un disque (dans une partition formatée avec un système de fichier), le disque et le système de fichier, découpent l'​espace alloué en très petites unités nommée **bloc**.
  
-<code user>cd test_lien/</​code>​ +Actuellement,​ sur un disque, la taille d'un bloc est le plus souvent de 4 K octets (4096 octets) ou de 512 octets (ancienne taille).
-   ​test_lien$+
  
-Créer dans ce répertoire ​un fichiers vide, //​test1.txt//,​ avec [[:doc:​systeme:​touch|touch]],​ puis ajoutez-y le texte //Bonjour toto// avec la commande [[:​doc:​systeme:​echo|echo]].+Un bloc est la plus petite unité qui peut être lue ou écrite.\\ 
 +Par exemple pour un système de fichier dont les blocs sont déterminés à  512 octets ​:
  
-<code user>​test_lien$ touch test1.txt</​code>​+  * Un fichier d'1 octet (d'un seul caractère) occupera un bloc complet. Sa taille sur le disque sera donc de 512 octets. 
 +  * Un fichier de 513 octets (513 caractères) occupera deux blocs, sa taille sera donc 1024 octets (1 K octets). 
 +  * Deux fichiers différents,​ d'un octet chacun, occupera chacun un bloc. Soit (pour les deux fichiers) un total de 1024 octets.
  
-<code user>​test_lien$ echo Bonjour Jojo > test1.txt</code> ​+La liste des blocs qu'​utilise un fichier est mémorisée par son **inode**((Un **inode** (Index Node, nœud d'​index,​ en français) est une structure de méta-données utilisée par un système de fichier de style Unix, pour identifier, décrire et accéder à un fichier.\\ Identifié par un identifiant unique (dans le système de fichier au quel il appartient),​ l'​inode mémorise les informations inhérentes à un fichier. Par exemples : Son type, ses permissions,​ son propriétaire,​ son groupe, sa date de création, celle de modification,​ sa taille, la liste des blocs qu'il occupe, le nombre de nom lié, etc. Voir : [[https://​fr.wikipedia.org/​wiki/​N%C5%93ud_d%27index|(fr) Noeud d'​index (wikipedia.org)]])).
  
-On vérifie avec la commande [[:​doc:​systeme:​cat|cat]] que notre texte est bien écrit ​dans le fichier ​test1.txt :+Quand un fichier ​est créé, un **inode** lui est attribué. Il identifie de façon unique ce fichier ​dans son système de fichier.\\ 
 +Le nom du fichier est alors rattaché (lié physiquement) à cet inode.
  
-<code user>test_lien$ cat test1.txt +<note tip
-   Bonjour Jojo</​code>​+Il y a trois principaux types de bloc :
  
-==== Créer un lien symbolique ​(symlink) : ====+  * Les **blocs physiques**,​ qui sont définis par le matériel (le disque). 
 +  *Les **blocs logiques**, qui sont aussi définis par le matériel. Ils permettent la rétrocompatibilité avec les systèmes qui ne supportent pas l'​augmentation de la taille des blocs physiques, apportée par l'​évolution du matériel. 
 +  * Et les **blocs des systèmes de fichier**, qui sont définis par le système de fichier (lors du formatage). 
 + 
 +**__Notes__ :** Une couche d’abstraction logiciel, tel que LVM (gestion de volume logique) ou LUKS (chiffrement des partitions ou de volumes logiques), peut modifier la taille des blocs logiques. 
 +</​note>​ 
 + 
 +<note warning>​ 
 +Ce tuto est réaliser dans un système de fichier ''​ext4'',​ utilisant des blocs de 4096 octets.\\ 
 +Un fichier (s'il n'est pas vide), occupera donc sur le disque, au minimum, 4096 octets (4 K octets). 
 +</​note>​ 
 + 
 +===== Les liens symboliques ​(symlink) : =====
  
 Situation de départ : Situation de départ :
-<code user> +<code user>ls -l</​code>​ 
-martin@madebian:​~/​test_lien$ ​ls -l+<​code>​
 total 4 total 4
 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
 </​code>​ </​code>​
 +
 +==== Créer un lien symbolique ​ ====
  
 On crée le lien symbolique : On crée le lien symbolique :
  
-<code user>test_lien$ ​ln -s test1.txt lien1.txt</​code>​+<code user>ln -s test1.txt lien1</​code>​
  
 Ce qui nous fait maintenant : Ce qui nous fait maintenant :
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1.txt -> test1.txt+lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt
 -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt -rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt
 </​code>​ </​code>​
  
-Attardons-nous un peu sur la ligne : +Attardons-nous un peu sur la ligne : ''​**l**rwxrwxrwx 1 martin martin ​ **9** déc 14 22:05 lien1 **<​nowiki>​-></​nowiki> ​test1.txt**''​
-**l**rwxrwxrwx 1 martin martin ​ **9** déc 14 22:05 lien1.txt **->** test1.txt+
  
-  - **l** indique un lien symbolique ​sur ce fichier +  - Dans le 1er champ (''​lrwxrwxrwx''​),​ la première lettre : **''​l''​**indique ​que ce fichier est un lien symbolique. 
-  - **9** indique ​l'​occupation réelle ​du fichier sur le disque +  - Dans le 5em champ, le chiffre ​**''​9''​**indique ​la taille en octet du fichier ​(elle ne doit pas être confondue avec la taille d'​occupation ​sur le disque). 
-  - **-> test1.txt** indique le fichier ​pointé par le lien symbolique+  - **''<​nowiki>​-> test1.txt</​nowiki>''​** indique le fichier ​que désigne ​le lien symbolique.
  
 Précisons aussi que : Précisons aussi que :
  
-  * Un //​fichier ​symbole// créé avec la commande ''​ln'' ​ne contient ​pas l'​occupation disque affichée qui est contenue dans le fichier cible. +  * La taille d'​un ​//​fichier ​d'un lien symbolique// ne correspond ​pas à la taille de son fichier cible. 
-  * Les modifications ​qui sont portées dans le contenu ​apparent ​d'un fichier ​symbole ​seront ​portés ​uniquement dans le fichier cible. +  * Les modifications ​apportées au contenu d'un fichier ​(cible) désigné par un lien symbolique ​seront ​portées ​uniquement dans le fichier cible. 
-  * La destruction totale d'​un ​fichier symbole ​ne détruit rien dans le fichier cible.+  * La destruction totale d'​un ​lien symbolique ​ne détruit rien dans le fichier cible.
  
-==== Modification du contenu des fichiers liés ====+----
  
-<code user>​test_lien$ echo Comment vas-tu ? >> lien1.txt</​code>​+Avant de poursuivre dans l'​usage des liens symboliques,​\\ 
 +Sont montrées, ci-dessous, quelques commandes qui ont attrait au liens symboliques.
  
-<code user>test_lien$ cat lien1.txt ​+Il a déjà été vu l'​option ''​-l''​ de la commande ''​ls''​.\\ 
 +Combinée avec l'​option ''​-L'',​ elle permet de retourner les informations de la cible plutôt que celles du lien : 
 + 
 +<code user> 
 +ls -Ll 
 +</​code><​code>​ 
 +total 4 
 +-rw-r--r-- 1 martin martin 13 déc 14 22:02 lien1 
 +-rw-r--r-- 1 martin martin 13 déc 14 22:02 test1.txt 
 +</​code>​ 
 + 
 +L'​option ''​-F''​ de la commande ''​ls'',​ ajoute un ''​@''​ (arobase) à la fin de chaque lien symbolique listé, permettant ainsi de les distinguer. 
 + 
 +<code user> 
 +ls -F 
 +</​code><​code>​ 
 +lien1@ test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +La commande **''​stat''​**((La commande **stat** permet de retourner des informations sur un fichier ou un système de fichier. Dans l'​écriture de script, il est conseillé d'​utiliser ''​stat''​ au lieu de ''​ls''​. Car ''​stat''​ permet de spécifier les informations retournées. Contrairement à ''​ls'',​ dont les champs retournés varient selon le type de fichier étudié et peuvent différer d'un système à l'​autre. [[https://​fr.manpages.org/​stat|manuel (fr) stat (1) : Afficher l'​état d'un fichier ou d'un système de fichiers (manpage.org)]] - ''​man stat''​)) qui permet de retourner des détails sur des fichiers.\\ 
 +(En permettant de choisir les informations retournées,​ la commande ''​stat''​ est plus souple que la commande ''​ls''​.)\\ 
 +Avec l'​option ''​-c''​ et le format ''​%N'',​ retourne le nom du fichier et s'il s’agit de lien symbolique, celui de sa cible : 
 + 
 +**__Note__ :** Dans un contexte de chemin, le caractère ''​*''​ est un caractère générique qui signifie n'​importe quelle chaîne de caractère. 
 + 
 +<code user> 
 +stat -c%N * 
 +</​code><​code>​ 
 +lien1 -> test1.txt 
 +test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +La commande **''​readlink''​**((La commande **readlink** affiche le nom du fichier ou du répertoire que désigne un lien symbolique. Sans option est retourné le chemin (le nom) tel qu'il a été fourni lors de la création du lien. Différentes options permettent d'en retourner le chemin absolu (canonique). [[https://​manpages.debian.org/​unstable/​manpages-fr/​readlink.1.fr.html|manuel (fr) readlink (1) : Afficher la valeur d'un lien symbolique... (debian.org)]] - ''​man readlink''​)) retourne la cible mémorisée par un lien symbolique : 
 + 
 +<code user> 
 +readlink lien1 
 +</​code><​code>​ 
 +test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +La commande ''​**file**''​((La commande **file** retourne le type d'un fichier. Voir : [[https://​fr.wikipedia.org/​wiki/​File_(Unix)|(fr) file (UNIX) (wikipedia.org)]] - [[https://​manpages.debian.org/​unstable/​manpages-fr/​file.1.fr.html|manuel (fr) file (1) : Déterminer le type d'un fichier (debian.org)]] - ''​man file''​ )) retourne le type de fichier étudié, s'il s'agit d'un lien symbolique, sa cible est aussi indiquée : 
 + 
 +<code user> 
 +file lien1 
 +</​code><​code>​ 
 +lien1: symbolic link to test1.txt 
 +</​code>​ 
 + 
 +==== Modification du contenu ==== 
 + 
 +<code user> 
 +echo Comment vas-tu ? >> lien1 
 +cat lien1 
 +</​code><​code>​
 Bonjour toto Bonjour toto
-Comment vas-tu ?</​code>​+Comment vas-tu ? 
 +</​code>​
  
-<code user>test_lien$ ​cat test1.txt ​+<code user> 
 +cat test1.txt 
 +</​code><​code>​
 Bonjour toto Bonjour toto
-Comment vas-tu ?</​code>​+Comment vas-tu ? 
 +</​code>​
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1.txt -> test1.txt+lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt
 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
 </​code>​ </​code>​
  
-Nous pouvons voir que seul le fichier cible //test1.txt// s'est trouvé modifié, passant de **13** à **30** octets d'​occupation !+Nous pouvons voir que seul le fichier cible '''​test1.txt'' ​s'est trouvé modifié, passant de **13** à **30** octets d'​occupation !
  
-== Modifier directement le fichier cible donnera le même résultat : ==+Modifier directement le fichier cible donnera le même résultat :
  
-  - nul pour le fichier ​symbole +  - Aucune modification ​pour le fichier ​du lien symbolique 
-  - effectif ​pour le fichier cible+  - Effectif ​pour le fichier cible
  
-=== Occupation ​concrète ​sur le disque ===+==== Occupation sur le disque ===
 + 
 +À l'aide de la commande ''​ls -li'',​ nous pouvons voir la taille des fichiers et comparer leurs inodes (l'​option ''​-i''​ demande l'​affichage de l'​identifiant d'un inode) :
  
-À l'aide de la commande ''​ls -li'',​ nous pouvons voir l'​occupation disque générée par un lien //symlink// en constatant les chiffres indiquant les index respectifs des inodes de chacun des fichiers liés : 
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -li+ls -li 
 +</​code><​code>​
 total 4 total 4
-8667148 lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1.txt -> test1.txt+8667148 lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt
 8667139 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt 8667139 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
 </​code>​ </​code>​
  
-Cela implique qu'​__il y a bien deux occupations différentes__ sur le disque, avec une occupation qui restera toujours fixe et minimale pour le fichier ​symbole. :-)+Le premier champ indique que chacun des fichiers ont un inode différent.\\ 
 +Cela implique qu'​__il y a bien deux occupations différentes__ sur le disque ​(2 fichiers différents), avec une occupation qui restera toujours fixe et minimale pour le fichier ​du lien symbolique. :-)
  
-==== Modification ​par effacement du fichier ​symbole ====+L'​option ''​-s''​ de la commande ''​ls''​ indique la taille occupée ​par le(s) bloc(s) utilisé(s) par un fichier.\\ 
 +L'​option ''​-h''​ permet de présenter les tailles avec l'​unité la plus appropriée (Ko, Mo, Go, etc).
  
-L'​effacement du fichier symbole ''​lien1.txt''​ ne détruit ni le contenuni l'​apparence du fichier cible ''​test1.txt''​ :+<code user> 
 +ls -lsh 
 +</​code><​code>​ 
 +total 4,0K 
 +   0 lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt 
 +4,0K -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt 
 +</​code>​
  
-<code user>​test_lien$ rm lien1.txt</code+Le fichier ''​test1.txt''​ de 30 octets (28 caractères imprimables + 2 caractères de saut de ligne) occupe un bloc entier. Il a donc, ici, une taille de 4 K octets.\\ 
 +Le fichier du lien symbolique ''​lien1''​ de 9 octets (correspondant au nombre de caractère du nom du fichier cible) n'​occupe aucun bloc, il est donc de taille nulle. 
 + 
 +<note>La véritable taille d'un lien symbolique, dépend du nombre de caractère du nom (chemin) du fichier qu'il cible. Au delà d'un certain nombre de caractère (ici 60), un bloc lui est attribué.\\ 
 +\\ 
 +La ligne de commande suivante crée deux liens symboliques et affiche leurs détails : 
 + 
 +  * Le premier nommé ''​59a'',​ cible un fichier (inexistant) nommé par 59 caractères (59 a). 
 +  * Le second nommé ''​60a'',​ cible un fichier (inexistant) nommé par 60 caractères (60 a).
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ls -l +(for i in {1..59};do n=a$n;done; ln -s $n 59a; ln -s a$n 60a); ls -lsh 59a 60a 
-total 4 +</​code><​code>​ 
--rw-r--r-- ​1 martin martin ​30 déc 14 22:08 test1.txt+   0 lrwxrwxrwx 1 martin martin 59 déc 14 22:15 59a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
 +4,0K lrwxrwxrwx ​1 martin martin ​60 déc 14 22:15 60a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 </​code>​ </​code>​
  
-==== Modification du nom des fichiers liés ====+Tant que le chemin (le nom) de la cible mémorisé par un lien symbolique, ne dépasse pas un certain nombre de caractère (ici 60), il est stocker par l'​inode du lien symbolique. Ainsi aucun fichier (bloc) n'est ouvert pour connaître la cible. Seul l'​inode est lu. Au delà, un bloc est utiliser. Alors le système doit ouvrir (lire) ce bloc pour accéder à la cible.\\ 
 +Voir : [[https://​fr.wikipedia.org/​wiki/​Lien_symbolique#​Stockage|(fr) Lien symbolique > Stockage (wikipedia.org)]]
  
-Recréons le même fichier symbole //​lien1.txt// ​: +La commande ''​[[doc:systeme:​rm|rm]]''​ permet de supprimer des fichiers.
-<code user>​test_lien$ ln -s test1.txt lien1.txt</​code>​+
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ls -l +rm -v 59a 60a 
-total 4 +</​code><​code
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:13 lien1.txt -test1.txt +'​59a'​ supprimé 
--rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt+'​60a'​ supprimé
 </​code>​ </​code>​
 +</​note>​
  
-=== Modifier le nom du fichier symbole ​===+==== Modification ​du nom d'un lien symbolique ====
  
-Modifions le nom du fichier ​symbole ​lien1.txt à l'aide de la [[:​doc:​systeme:​mv |commande ​mv]] : +Modifions le nom du fichier ​du lien symbolique ''​lien1'' ​à l'aide de la commande ​[[:​doc:​systeme:​mv |mv]] :
-<code user>​test_lien$ mv lien1.txt lien2.txt</​code>​+
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+mv lien1 lien2 
 +ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:13 lien2.txt -> test1.txt+lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:13 lien2 -> test1.txt
 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test1.txt
 </​code>​ </​code>​
Ligne 203: Ligne 308:
 Tout reste fonctionnel et en place. :-) Tout reste fonctionnel et en place. :-)
  
-<​note>​Pour poursuivre cette illustration dans la clarté, remettons le nommage du fichier symbole ​''​lien2.txt''​ en ''​lien1.txt''​.</​note>​ +<​note>​Pour poursuivre cette illustration dans la clarté, remettons le nommage du lien symbolique ​''​lien2''​ en ''​lien1''​.</​note>​ 
-<code user>test_lien$ ​mv lien2.txt lien1.txt</​code>​+<code user>mv lien2 lien1</​code>​
  
-=== Modifier le nom du fichier ​cible ===+==== Modification ​du nom de la cible ====
  
 Modifions le nom du fichier cible ''​test1.txt''​ : Modifions le nom du fichier cible ''​test1.txt''​ :
-<code user>​test_lien$ mv test1.txt test2.txt</​code>​ 
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+mv test1.txt test2.txt 
 +ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:13 lien1.txt -> test1.txt+lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:13 lien1 -> test1.txt
 -rw-r--r-- 1 martin martin 30 déc 14 22:08 test2.txt -rw-r--r-- 1 martin martin 30 déc 14 22:08 test2.txt
 </​code>​ </​code>​
  
-//Patatras !// Nous voyons alors que le fichier cible ''​lien1.txt''​ se met en carafe ​il devient ​écrit en rouge dans le terminal ​bash) dès le //rafraîchissement// du terminal ouvert.+//Patatras !// Nous voyons alors que le fichier cible ''​lien1''​ se met en carafe ​(il alors est écrit en rouge dans le terminal //bash//).
  
-Il suffit ​+Lorsque la cible d'un lien symbolique est manquante, le lien est dit brisé ou cassé. La commande ''​file''​ le montre ​
-  - de renommer le fichier cible ''​test2.txt''​ en ''​test1.txt'',​ + 
-<​del> ​ - ou bien de recréer le fichier symbole ​''​lien1.txt'' ​en le pointant sur le fichier cible ''​test2.txt'' ​par reformulation ​de la commande ​: +<code user> 
-   ​test_lien$ ​ln -test2.txt lien1.txt</​del>​+file lien1 
 +</​code><​code>​ 
 +lien1: broken symbolic link to test1.txt 
 +</​code>​ 
 + 
 +Puisque le lien est cassé (sa cible n'​existe plus), la commande ''​cat''​ retourne une erreur : 
 + 
 +<code user> 
 +cat lien1 
 +</​code><​code>​ 
 +cat: lien1: Aucun fichier ou dossier de ce type 
 +</​code>​ 
 + 
 +Ainsi que la commande ''​ls ​-L''​ 
 + 
 +<code user> 
 +ls -L lien1 
 +</​code><​code>​ 
 +ls: impossible d'​accéder à '​lien1':​ Aucun fichier ou dossier ​de ce type 
 +</​code>​ 
 + 
 +Pour rétablir les choses, ici, il suffit : 
 +  * De renommer le fichier cible ''​test2.txt''​ en ''​test1.txt'',​ 
 +  ​* Ou bien de recréer le lien symbolique ​''​lien1'' ​avec la commande ''​ln'',​\\ En désignant ​le fichier cible ''​test2.txt''​\\ Et en utilisant l'​option ''​f''​ (pour forcer l'​écrasement du fichier ​de destination) ​:\\ ''​ln -sf test2.txt lien1''​\\ :!: Attention de ne pas intervertir les deux noms, car sinon ce sera le fichier cible qui sera écrasé.
  
 Et tout redevient effectif. Et tout redevient effectif.
  
-Pour la suite du tuto, choisir de remettre le fichier en test1.txt +Pour la suite du tuto, choisir de remettre le fichier ​cible en ''​test1.txt''​
-<code user>​test_lien$ mv test2.txt test1.txt</​code> ​+
  
-==== Modifications des droits des fichiers liés : ====+<code user> 
 +mv test2.txt test1.txt 
 +</​code> ​
  
-Depuis le début de cette illustration,​ nous voyons que les droits restent immuablement complets pour le fichier ​symbole ​''​lien1.txt''​.+==== Modifications des droits ​ ==== 
 + 
 +Depuis le début de cette illustration,​ nous voyons que les droits restent immuablement complets pour le fichier ​du lien symbolique ​''​lien1''​.
  
    rwx rwx rwx    rwx rwx rwx
  
 Essayons de les modifier. \\ Essayons de les modifier. \\
-Modifions la propriété du fichier ​symbole ​''​lien1.txt''​ pour que root devienne ​le propriétaire. +Modifions la propriété du fichier ​du lien symbolique ​''​lien1''​ pour que seul le propriétaire ​puisse y accéder en lecture et écriture.
- +
-=== Modification des droits d'un fichier symbole ===+
  
 Situation de départ : Situation de départ :
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 23:00 lien1.txt -> test1.txt +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt 
--rw-r--r-- 1 martin martin ​13 déc 14 22:59 test1.txt+-rw-r--r-- 1 martin martin ​30 déc 14 22:08 test1.txt
 </​code>​ </​code>​
  
-En terminal root, changez les droits ​sur le fichier avec la commande [[:​doc:​systeme:​chmod|chmod]] : +Les droits ​d'​un ​fichier ​sont modifiés ​avec la commande [[:​doc:​systeme:​chmod|chmod]] : 
-<​code ​root>test_lien# ​chmod 700 lien1.txt</​code>​+<​code ​user>​chmod ​600 lien1</​code>​
  
 On obtient alors : On obtient alors :
  
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+ls -l 
 +</​code><​code>​
 total 4 total 4
-lrwxrwxrwx 1 martin martin ​ 9 déc 14 23:00 lien1.txt -> test1.txt +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt 
--rwx------ 1 martin martin ​13 déc 14 22:59 test1.txt+-rw------- 1 martin martin ​30 déc 14 22:08 test1.txt
 </​code>​ </​code>​
  
-Nous voyons que le fichier ​symbole ​''​lien1.txt''​ n'est pas affecté par cette modifications des droits : +Nous voyons que le fichier ​du lien symbolique ​''​lien1''​ n'est pas affecté par cette modifications des droits : 
-  lrwxrwxrwx 1 martin martin ​ 9 déc 14 23:00 lien1.txt -> test1.txt+  lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:05 lien1 -> test1.txt
  
-et que le fichier cible ''​test1.txt''​ s'en trouve directement rectifié par cette commande exécuter sur le fichier symbole ​''​lien1.txt''​ : +Et que le fichier cible ''​test1.txt''​ s'en trouve directement rectifié par cette commande exécuter sur le lien symbolique ​''​lien1''​ : 
-  ​rwx------ 1 martin martin ​13 déc 14 22:59 test1.txt+  ​ 
 +<​code>​-rw------- 1 martin martin ​30 déc 14 22:08 test1.txt</​code>​
  
-==== Créer un lien physique (hardlink) : ====+==== Copies de lien symbolique ​====
  
-Un lien physique est la création d'un fichier ​à l'identique ​de celui qu'il pointe.+La simple copie de lien symbolique produit ​un nouveau ​fichier ​pour chaque lien, identique ​à la cible.
  
-Mais outre d'évoluer à l'identique, comme avec un lien symbolique, ​les deux fichiers ​se nourrissent mutuellement et concrètement de toutes les modifications apportées à l'un ou à l'​autre.+Tout d'abord, créons le répertoire ​''​rep1''​.\\ 
 +Puis copions ​les deux fichiers ​:
  
 +<code user>
 +mkdir rep1
 +cp -v lien1 test1.txt rep1
 +</​code><​code>​
 +'​lien1'​ -> '​rep1/​lien1'​
 +'​test1.txt'​ -> '​rep1/​test1.txt'​
 +</​code>​
  
-<note important>​**ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible !</​note>​ +Maintenant listons (avec les détails) ​le contenu du répertoire ''​rep1''​
-==== Créer un lien physique ====+
  
-Commençons par supprimer ​les fichiers liés symboliquement et créer un fichier de départ videtest2, : +<code user> 
-<code user>​test_lienrm *1.txt +ls -l rep1/* 
-touch test2.txt</​code>​+</​code><​code>​ 
 +-rw-r--r-- 1 martin martin 30 déc 14 22:20 rep1/​lien1 
 +-rw-r--r-- 1 martin martin 30 déc 14 22:20 rep1/​test1.txt 
 +</​code>​ 
 + 
 +C'est bien la cible (''​test1.txt''​) du lien symbolique (''​lien1''​) qui à été copié dans le répertoire ''​rep1'',​ sous le nom du lien (''​lien1''​). 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien1: ASCII text 
 +rep1/​test1.txt:​ ASCII text 
 +</​code>​ 
 + 
 +---- 
 + 
 +L'​option ''​-P''​ ou ''​-d''​ de la commande ''​cp''​ permet de préserver ​les liens symboliques : 
 + 
 +<code user> 
 +rm rep1/* 
 +cp -vP lien1 test1.txt rep1 
 +</​code><​code>​ 
 +'​lien1'​ -> '​rep1/​lien1'​ 
 +'​test1.txt'​ -> '​rep1/​test1.txt'​ 
 +</​code>​ 
 + 
 +Affichage des détails du contenu du répertoire ''​rep1''​ : 
 + 
 +<code user> 
 +ls -l rep1/* 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:22 rep1/lien1 -> test1.txt 
 +-rw------- 1 martin martin 30 déc 14 22:22 rep1/​test1.txt 
 +</​code>​ 
 + 
 +Ce coup ci, le lien symbolique à été copier exactement comme il est, ciblant le fichier ​''​test1.txt''​ situé dans le même répertoire que lui (dans ''​rep1''​). 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien1: symbolic link to test1.txt 
 +rep1/​test1.txt:​ ASCII text 
 +</​code>​ 
 + 
 +Ici, tout va bien puisque le lien à été copié en même temps que sa cible. 
 + 
 +---- 
 + 
 +Si seul le lien avait été copié, un lien brisé (sans cible) aurait été obtenu : 
 + 
 +<code user> 
 +rm rep1/* 
 +cp -P lien1 rep1/​lien2 
 +ls -l rep1/* 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:24 rep1/lien2 -> test1.txt 
 +</​code>​ 
 + 
 +Le lien à été copié dans le répertoire ''​rep1'',​ mais il est brisé (puisqu'​il n'a pas de cible) : 
 + 
 +<code user> 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien2: broken symbolic link to test1.txt 
 +</​code>​ 
 + 
 +Cela provient du fait que le lien originel a été créé en désignant sa cible par un chemin relatif((Un **chemin relatif** désigne un emplacement depuis un répertoire.)). 
 + 
 +---- 
 + 
 +Il en serait autrement si le lien avait été construit en fournissant un chemin absolu((Un **chemin absolu** désigne un emplacement depuis le répertoire racine (''/''​).)).\\ 
 +Alors il désignerait toujours la même ciblemême s'il était copié n'​importe où dans l'​arborescence. 
 + 
 +**__note__ :** Le caractère ''​~''​ (tilde)placé au début d'un chemin, est remplacé durant l'​interprétation de //bash//, par le chemin absolu du répertoire personnel de l’utilisateur (ici ''/​homme/​martin''​). 
 + 
 +<code user> 
 +ln -s ~/test_lien/test1.txt lien3 
 +ls -l 
 +</​code><​code>​ 
 +total 8 
 +lrwxrwxrwx 1 martin martin ​   9 déc 14 22:05 lien1 -> test1.txt 
 +lrwxrwxrwx 1 martin martin ​  32 déc 14 22:30 lien3 -> /​home/​martin/​test_lien/​test1.txt 
 +drwxr-xr-x 2 martin martin 4096 déc 14 22:20 rep1 
 +-rw------- 1 martin martin ​  30 déc 14 22:08 test1.txt 
 +</​code>​ 
 + 
 +Les deux liens symboliques ''​lien1''​ et ''​lien3''​ désignent le même fichier cible : ''​test1.txt''​. 
 + 
 +  * Le premier désigne sa cible avec un chemin relatif (au répertoire ''/​home/​martin/​test_lien''​).\\ 
 +  * Le second désigne sa cible avec un chemin absolu, depuis la racine du système (''/''​). 
 + 
 +Copie du nouveau lien ''​lien3''​ dans le répertoire ''​rep1''​ : 
 + 
 +<code user> 
 +cp -P lien3 rep1/​lien4 
 +file rep1/* 
 +</​code><​code>​ 
 +rep1/lien2: broken symbolic link to test1.txt 
 +rep1/lien4: symbolic link to /​home/​martin/​test_lien/​test1.txt 
 +</​code>​ 
 + 
 +Contrairement à la copie du lien ''​lien1''​ (vers ''​rep1/​lien2''​),​ la copie du lien ''​lien3''​ (vers ''​rep1/​lien4''​) à conservé sa cible. 
 + 
 +<code user> 
 +cat rep1/​lien4 
 +</​code><​code>​ 
 +Bonjour toto 
 +Comment vas-tu ? 
 +</​code>​ 
 + 
 +==== Répertoire et lien symbolique ==== 
 + 
 +Un lien symbolique peut cibler un répertoire. 
 + 
 +<code user> 
 +ln -s rep1 lien_rep1 
 +ls -l lien_rep1 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin 4 déc 14 22:40 lien_rep1 -> rep1 
 +</​code>​ 
 + 
 +Le nouveau lien ''​lien_rep1'',​ à pour cible le répertoire ''​rep1''​.\\ 
 +Il peut-être utilisé pour accéder à sa cible, pour y réaliser toutes sortes d'​opérations.\\ 
 +Par exemple, en lister le contenu : 
 + 
 +<code user> 
 +ls -l lien_rep1/​* 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin ​ 9 déc 14 22:24 lien_rep1/​lien2 -> test1.txt 
 +lrwxrwxrwx 1 martin martin 32 déc 14 22:32 lien_rep1/​lien4 -> /​home/​martin/​test_lien/​test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +En utilisant un chemin absolu pour désigner la cible, un lien peut être placé n'​importe où : 
 + 
 +<code user> 
 +ln -s ~/test_lien /tmp 
 +ls -l /​tmp/​test_lien 
 +</​code><​code>​ 
 +lrwxrwxrwx 1 martin martin 21 déc 14 22:42 /​tmp/​test_lien -> /​home/​martin/​test_lien 
 +</​code>​ 
 + 
 +Un lien symbolique qui cible un répertoire,​ agit comme un répertoire.\\ 
 +Il est possible de s'y déplacer : 
 + 
 +**__Note__ :** La commande **[[doc:​systeme:​pwd|pwd]]** retourne le chemin du répertoire courant (celui où l'on se trouve). 
 + 
 +<code user> 
 +pwd 
 +</​code><​code>​ 
 +/​home/​martin/​test_lien 
 +</​code>​ 
 + 
 +<code user> 
 +cd /​tmp/​test_lien 
 +pwd 
 +</​code><​code>​ 
 +/​tmp/​test_lien 
 +</​code>​ 
 + 
 +C'est comme si l'on se trouvait dans le répertoire cible : 
 + 
 +<code user> 
 +ls -F 
 +</​code><​code>​ 
 +lien1@ ​ lien3@ ​ lien_rep1@ ​ rep1  test1.txt 
 +</​code>​ 
 + 
 +<code user> 
 +touch rep1/​fichier.txt 
 +ls -F ~/​test_lien/​rep1 
 +</​code><​code>​ 
 +fichier.txt ​ lien2@ ​ lien4@ 
 +</​code>​ 
 + 
 +==== Suppression de lien symbolique ==== 
 + 
 +Supprimer liens symboliques n'​altère en rien un fichier cible : 
 + 
 +<code user> 
 +rm -v lien1 lien3 rep1/lien* 
 +</​code><​code>​ 
 +'​lien1'​ supprimé 
 +'​lien3'​ supprimé 
 +'​rep1/​lien2'​ supprimé 
 +'​rep1/​lien4'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -l test1.txt 
 +</​code><​code>​ 
 +total 4 
 +-rw------- ​martin martin 30 déc 14 22:08 test1.txt 
 +</​code>​ 
 + 
 +---- 
 + 
 +Ni même un répertoire,​ lorsque l'on supprime le(s) lien(s) symbolique(e) le ciblant : 
 + 
 +<code user> 
 +cd ~/​test_lien 
 +rm -v /​tmp/​test_lien lien_rep1 
 +</​code><​code>​ 
 +'/​tmp/​test_lien'​ supprimé 
 +'​lien_rep1'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -R ~/​test_lien 
 +</​code><​code>​ 
 +/​home/​martin/​test_lien:​ 
 +rep1  test1.txt 
 + 
 +./rep1: 
 +fichier.txt 
 +</​code>​ 
 + 
 +**__Note__ :** Pour supprimer un répertoire avec la commande **[[doc:​systeme:​rmdir|rmdir]]**,​ le répertoire doit être vide. 
 + 
 +<code user> 
 +rm rep1/​fichier.txt 
 +rmdir rep1 
 +rm test1.txt 
 +</​code>​ 
 + 
 +===== Les liens physiques (hardlink) : ===== 
 + 
 +Un lien physique rattache un nom de fichier à un inode. 
 + 
 +Un inode (un fichier) peut être lié à plusieurs noms dans le même système de fichier.\\ 
 +Ainsi, plusieurs noms (chemins) peuvent permettre d'​accéder au même fichier (au même inode) 
 + 
 +<note important>​**ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible !\\ 
 +\\ 
 +L'​identifiant d'un inode est unique, uniquement dans le système de fichier au quel il appartient.\\ 
 +Puisque l'​identifiant d'un inode n'est unique que dans son système de fichier (il peut exister dans un autre système de fichier), un nom ne peut donc être lié à l'​inode d'un autre système de fichier.</​note>​ 
 + 
 +Commençons par créer un fichier de départ vide, ''​test2.txt''​ : 
 + 
 +<code user> 
 +touch test2.txt 
 +</​code>​
  
 Au départ, nous avons donc la situation suivante : Au départ, nous avons donc la situation suivante :
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -l+ls -l 
 +</​code><​code>​
 total 0 total 0
 -rw-r--r-- 1 martin martin 0 déc 15 00:02 test2.txt -rw-r--r-- 1 martin martin 0 déc 15 00:02 test2.txt
 </​code>​ </​code>​
 +
 +==== Créer un lien physique ====
  
 Pour créer un lien physique, on utilise la commande ''​ln''​ sans l'​option ''​-s''​. Pour créer un lien physique, on utilise la commande ''​ln''​ sans l'​option ''​-s''​.
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ln test2.txt lien2.txt +ln test2.txt lien2.txt 
-martin@madebian:​~/​test_lien$ ​ls -lv+ls -
 +</​code><​code>​
 total 0 total 0
 -rw-r--r-- 2 martin martin 0 déc 15 00:02 lien2.txt -rw-r--r-- 2 martin martin 0 déc 15 00:02 lien2.txt
Ligne 300: Ligne 686:
 Nous pouvons toutefois distinguer un changement dans le listage des droits des fichiers liés physiquement : Nous pouvons toutefois distinguer un changement dans le listage des droits des fichiers liés physiquement :
  
-Le chiffre ''​1''​ devient ''​2''​ dans la ligne du fichier ​cible test2.txt :+Le chiffre ''​1'' ​du second champs, ​devient ''​2''​ dans la ligne du fichier ​''​test2.txt'' ​:\\ 
 +''<​nowiki>​-rw-r--r--</​nowiki>​ **2** <​nowiki>​martin martin 0 déc 15 00:02 lien2.txt</​nowiki>''​
  
-Pareillement dans la ligne du fichier symbole physique ​lien2.txt ​créé ​+Pareillement dans la ligne du ''​lien2.txt'' ​:\\ 
-<code> +''​<nowiki>​-rw-r--r--</​nowiki> ​**2** <​nowiki>​martin martin 0 déc 15 00:02 lien2.txt</​nowiki>''​ 
--rw-r--r-- **2** martin martin 0 déc 15 00:02 lien2.txt + 
-</code>+<note tip>Le second champ retourné par le commande ''​ls -l'',​ indique ne nombre de fois que l'​inode d'un fichier est lié à un nom (le nombre de fois où un fichier est lié physiquement).\\ 
 +\\ 
 +  * ''​1''​ : Quand un fichier ne dispose que de son nom (l'​inode de ce fichier n'est lié qu'à un seul nom). 
 +  * ''​2''​ : Indique que l'​inode de ce fichier est lié à 2 noms. 
 +  * ''​3''​ : Indique que l'​inode de ce fichier est lié à 3 noms. 
 +  * Etc. 
 +</note>
  
 Une autre différence est le partage des droits qui sont là __tout à fait identiques__ entre les fichiers liés physiquement. Une autre différence est le partage des droits qui sont là __tout à fait identiques__ entre les fichiers liés physiquement.
  
-==== Modifions le contenu des fichiers ​liés physiquement ​==== +==== Modifications du contenu des fichiers ====
- +
-=== Ajout ===+
  
 Ajoutons du contenu dans l'un puis un second ajout dans l'​autre des fichiers liés //​physiquement//​ en vérifiant les contenus à chaque fois : Ajoutons du contenu dans l'un puis un second ajout dans l'​autre des fichiers liés //​physiquement//​ en vérifiant les contenus à chaque fois :
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​echo Très bien titi ! > lien2.txt +echo Très bien titi ! > lien2.txt 
- +ls -l 
-martin@madebian:​~/​test_lien$ ​ls -l+</​code><​code>​
 total 8 total 8
 -rw-r--r-- 2 martin martin 18 déc 15 13:49 lien2.txt -rw-r--r-- 2 martin martin 18 déc 15 13:49 lien2.txt
 -rw-r--r-- 2 martin martin 18 déc 15 13:49 test2.txt -rw-r--r-- 2 martin martin 18 déc 15 13:49 test2.txt
 +</​code>​
  
-martin@madebian:​~/​test_lien$ ​cat test2.txt+<code user> 
 +cat test2.txt 
 +</​code><​code>​
 Très bien titi ! Très bien titi !
 +</​code>​
  
-martin@madebian:​~/​test_lien$ ​echo Et toi Jojo ? >> test2.txt +<code user> 
- +echo Et toi Jojo ? >> test2.txt 
-martin@madebian:​~/​test_lien$ ​cat lien2.txt+cat lien2.txt 
 +</​code><​code>​
 Très bien titi ! Très bien titi !
 Et toi Jojo ? Et toi Jojo ?
 +</​code>​
  
-martin@madebian:​~/​test_lien$ ​ls -l+<code user> 
 +ls -l 
 +</​code><​code>​
 total 8 total 8
 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt
Ligne 339: Ligne 738:
 Toutes les modifications,​ __ajoutées ou retranchées__ dans chacun des fichiers agira de même dans l'​autre. Toutes les modifications,​ __ajoutées ou retranchées__ dans chacun des fichiers agira de même dans l'​autre.
  
-=== Occupation ​concrète ​sur le disque ===+==== Occupation sur le disque ===
 + 
 +À l'aide de la commande ''​ls -li'',​ nous pouvons voir la taille des fichiers et comparer leurs inodes : 
  
-À l'aide de la commande ''​ls -li'',​ nous pouvons voir l'​occupation disque générée par un lien //​hardlink//​ en constatant les chiffres indiquant les index respectifs des inodes de chacun des fichiers liés : 
 <code user> <code user>
-martin@madebian:​~/​test_lien$ ​ls -li+ls -li 
 +</​code><​code>​
 total 8 total 8
 8667149 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt 8667149 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt
Ligne 349: Ligne 750:
 </​code>​ </​code>​
  
-Ah ! Le même index d'​inode pour les deux fichiers !+Ah ! Le même d'​inode pour les deux fichiers !
  
-Cela implique qu'​__il n'y a pas deux occupations différentes__ sur le disque ​mais une seule occupation vers laquelle __pointe les deux fichiers__ ​liés en même temps ! :-)+Cela implique qu'​__il n'y a pas deux occupations différentes__ sur le disque.\\ 
 +Ces deux fichiers sont deux noms différents ​liés physiquement au même inode.\\ 
 +Ayant le même inode ils utilisent la même liste de bloc mémorisée par l'​inode.
  
 //On va pas s'​gêner avec pour les gonfler de données car cela ne doublera pas l'​occupation physique du disque !// :-D //On va pas s'​gêner avec pour les gonfler de données car cela ne doublera pas l'​occupation physique du disque !// :-D
  
-=== Suppression ===+Pourtant ce n'est pas ce qu'​indique le total de la commande ''​ls -l''​.\\ 
 +Ce total retourne que les deux fichiers (qui ne sont qu'un) occupent sur le disque 8 K octets.\\ 
 +La commande ''​ls -lh''​ le montre :
  
-Suppression du fichier cible ''​test2.txt''​ : 
 <code user> <code user>
-test_lien$ rm test2.txt+ls -lh 
 +</​code><​code>​ 
 +total 8,0 K 
 +-rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt 
 +-rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt 
 +</​code>​
  
-martin@madebian:~/​test_lien$ ​ls -l +Ces fichiers ont  une taille de 32 octets chacun (c'est indiqué dans le 5em champ),\\ 
-total 4 +Selon ''​ls'',​ ils occuperaient chacun un bloc (de 4 K octets), qu'​elle additionne.\\ 
--rw-r--r-- ​martin martin 32 déc 15 13:52 lien2.txt+C'est ce que montre ''​ls -lsh'' ​: 
 + 
 +<code user> 
 +ls -lsh 
 +</​code><​code>​ 
 +total 8,0 K 
 +4,0K -rw-r--r-- ​martin martin 32 déc 15 13:52 lien2.txt 
 +4,0K -rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt
 </​code>​ </​code>​
-Comme dit le captnfab dans sa relecture : \\ 
-Il est à remarquer que le chiffre ''​2''​ est passé à ''​1''​ car il n'y a plus de second fichier lié. 
  
-<note tip>​Chacun des fichiers liés par un lien physique survit nominalement et physiquement à l'effacement de l'autre.</​note>​+Il en va de même avec la commande ''​stat''​ (d'​écrite plus haut à la section [[#creer-un-lien-symbolique|Créer un lien symbolique]]),​ qui avec l'option ​''​-c''​ permet de définir les informations retournées.\\ 
 +Voici d'​autres formats supportés :
  
-Pour supprimer définitivement les deux fichiers et leurs contenus, nous devons les effacer tous deux+  * ''​%b''​ indique le nombre de bloc utilisé par un fichier. 
-<code user>​test_lien$ rm *2.txt</​code>​+  * ''​%B''​ retourne la taille d'un bloc
 +  Et ''​%n''​ retourne le nom du fichier.
  
-<code user>test_lien$ ls -l +<code user> 
-total 0</​code>​+stat -c "%b (x%B) %n" * 
 +</​code><​code>​ 
 +8 (x512) lien2.txt 
 +8 (x512) test2.txt 
 +</​code>​
  
-//Voilà pour la commande //''​ln''//​ dans tous ses états !// +La commande ''​stat''​ utilise par défaut des blocs de 512 octets.\\ 
-\\ +8x512 = 4096 (soit 4K octets), cela correspond aux tailles retournées par la commande ''​ls''​. 
-\\ + 
-//Merci au //**captnfab**// pour sa bienveillante ​et rigolote attention !// :-D+Mais cela est évidement erroné,​\\ 
 +Puisque ''​lien2.txt''​ et ''​test2.txt'',​ sont des noms (chemins) différents,​ qui mènent au même fichier (inode) stocké dans le système de fichier (sur le disque). 
 + 
 +<note tip> 
 +Pour connaître la taille réelle occupée par des fichiers, la commande ''​du''​ doit être utilisée. 
 +</note> 
 + 
 +<code user> 
 +du -h * 
 +</code><​code>​ 
 +4,​0K lien2.txt 
 +</​code>​ 
 + 
 +Puisque ''​lien2.txt''​ et ''​test2.txt''​ sont le même fichier, ''​du''​ n'en retourne qu'​un.\\ 
 +La taille total occupée est donc de 4 K octets, soit un bloc. 
 + 
 +Il est remarquable qu'ici ne soit pas retourné le fichier original.\\ 
 +''​Du''​ a simplement retourné le premier lien physique rencontré.\\ 
 +Cela met en évidence qu'il n'y a pas de différence entre le fichier original et le(s) fichier(s) qui lui est (sont) lié(s). 
 + 
 +==== Copies de fichier lié physiquement ==== 
 + 
 +8 K octets sera la taille totale obtenu si l'on copie ces deux fichiers liés : 
 + 
 +<code user> 
 +mkdir rep1 
 +cp -v *2.txt rep1 
 +</​code><​code>​ 
 +'​lien2.txt'​ -> '​rep1/​lien2.txt'​ 
 +'​test2.txt'​ -> '​rep1/​test2.txt'​ 
 +</​code>​ 
 + 
 +**__Note__ :** L'​option ''​-c''​ de la commande ​''​du''​ demande le total des fichiers listés. 
 + 
 +<​code>​ 
 +du -ch rep1/
 +</code><​code>​ 
 +4,​0K rep1/​lien2.txt 
 +4,​0K rep1/​test2.txt 
 +8,​0K total 
 +</​code>​ 
 + 
 +Ce coup ci, la commande ​''​du'' ​retourne deux fichiers de 4 K octets (1 bloc) chacun, soit un total de 8 K octets. 
 + 
 +Le format ''​%i''​ de la commande ''​stat''​ retourne l'​inode indexé d'un fichier.\\ 
 +Et ''​%h''​ le nombre de lien physique que dispose un fichier. 
 + 
 +<code user> 
 +stat -c "%i %h %n" *.txt rep1/*.txt 
 +</code><​code>​ 
 +8667149 2 lien2.txt 
 +8667149 2 test2.txt 
 +8667652 1 rep1/​lien2.txt 
 +8667653 1 rep1/​test2.txt 
 +</​code>​ 
 + 
 +Les inodes sont différents,​ il s’agit donc de deux fichiers différents.\\ 
 +La commande ''​cp''​ à copier le fichier ''​lien2.txt''​ puis le fichier ''​test2.txt'',​ sans maintenir les liens physiques. 
 + 
 +---- 
 + 
 +<note tip> 
 +L'​option ''​-l''​ de la commande ''​cp''​ permet de lier physiquement des fichiers au lieu de les copier.\\ 
 +(A condition qu'ils soient <​del>​copiés</​del>​ liés dans le même système de fichier.) 
 +</note> 
 + 
 +<code user> 
 +rm -v rep1/
 +</​code><​code>​ 
 +'​rep1/​lien2.txt'​ supprimé 
 +'​rep1/​test2.txt'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +cp -vl *2.txt rep1 
 +</​code><​code>​ 
 +'​lien2.txt'​ -> '​rep1/​lien2.txt'​ 
 +'​test2.txt'​ -> '​rep1/​test2.txt'​ 
 +</​code>​ 
 + 
 +<code user> 
 +stat -c "%i %h %n" * rep1/* 
 +</​code><​code>​ 
 +8667149 4 lien2.txt 
 +8695636 2 rep1 
 +8667149 4 test2.txt 
 +8667149 4 rep1/​lien2.txt 
 +8667149 4 rep1/​test2.txt 
 +</​code>​ 
 + 
 +Les deux nouveaux fichiers ont les mêmes inodes que les originaux. Ce sont donc des fichiers liées.\\ 
 +Le champs qui indique le nombre de lien physique (celui retourné par ''​%h''​),​ montre qu'il y a maintenant 4 fichiers liés (un seul fichier disposant de 4 noms). 
 + 
 +**__Remarque__ :** Pour le répertoire ''​rep1'',​ ce champs retourne 2 ! 
 + 
 +==== Répertoires et lien physique ==== 
 + 
 +Le système ne permet pas de créer un lien physique pour un répertoire : 
 + 
 +<code user> 
 +ln rep1 rep2 
 +</​code><​code>​ 
 +ln: rep1 : lien direct non permis pour un répertoire 
 +</​code>​ 
 + 
 +Même //root// ne peut le faire : 
 + 
 +<code root> 
 +ln rep1 rep2 
 +</​code><​code>​ 
 +ln: rep1 : lien direct non permis pour un répertoire 
 +</​code>​ 
 + 
 +Pourtant, le système en crée deux à chaque nouveau répertoire : 
 + 
 +  * ''​.''​ lié physiquement au répertoire créé, 
 +  * Et ''​..''​ lié physiquement au répertoire parent. 
 + 
 +**__Rappel__ :** Dans un système de fichier, un répertoire est un fichier qui contient tous les noms des fichiers (et répertoires) de ce répertoire. 
 + 
 +Ces deux fichiers (''​.''​ et ''​..''​) commencent par un point, ce sont donc des fichiers cachés.\\ 
 +Ils sont visible avec l'​option ''​-a''​ de la commande ''​ls''​ (l'​option ''​-R''​ demande un listing récursif) : 
 + 
 +<code user> 
 +ls -Ra 
 +</code><​code>​ 
 +.: 
 +.  ..  lien2.txt ​ rep1  test2.txt 
 + 
 +./rep1: 
 +.  ..  lien2.txt ​ test2.txt 
 +</​code>​ 
 + 
 +.. Ou s'ils sont directement nommés : 
 + 
 +<code user> 
 +stat -c "%i %h %n" rep1 rep1/. rep1/.. . ~/​test_lien 
 +</​code><​code>​ 
 +8695636 2 rep1 
 +8695636 2 rep1/. 
 +8695247 3 rep1/.. 
 +8695247 3 . 
 +8695247 3 /​home/​martin/​test_lien 
 +</​code>​ 
 + 
 +Ci-dessus est visible que : 
 + 
 +  * ''​rep1''​ et ''​rep1/​.''​ ont le même inode. 
 +  * ''​.'',​ ''​test_lien''​ et ''​rep1/​..''​ ont le même inode. 
 + 
 +Ainsi un répertoire est lié physiquement 2 fois : Par son nom et par le fichier ''​.''​ qu'il contient.\\ 
 +Plus un (+1) lien physique par répertoire fils (sous-répertoire) qu'il contient. 
 + 
 +Par exemple, s'il est ajouté 4 autres répertoires ​au répertoire ''​test_lien''​ (cela lui fera cinq sous-répertoires),​ il sera alors lié 7 fois : 
 + 
 +<code user> 
 +mkdir -v rep{2..5} 
 +</code><​code>​ 
 +mkdir: création du répertoire '​rep2'​ 
 +mkdir: création du répertoire '​rep3'​ 
 +mkdir: création du répertoire '​rep4'​ 
 +mkdir: création du répertoire '​rep5'​ 
 +</code> 
 + 
 +<code user> 
 +stat -c "%i %h %n" ~/test_lien . rep*/.. 
 +</​code><​code>​ 
 +8695247 7 /​home/​martin/​test_lien 
 +8695247 7 . 
 +8695247 7 rep1/.. 
 +8695247 7 rep2/.. 
 +8695247 7 rep3/.. 
 +8695247 7 rep4/.. 
 +8695247 7 rep5/.. 
 +</​code>​ 
 + 
 +---- 
 + 
 +<code user> 
 +rmdir rep{2..5} 
 +</​code>​ 
 + 
 +==== Suppression des fichiers ==== 
 + 
 +Supprimer des fichiers liés n’altère en rien ceux qui restent. 
 + 
 +**__Note__ :** La commande ''​rm -r //<​chemin_répertoire>//''​ permet de supprimer un répertoire non vide (et tout ce qu'il contient, sous-répertoires compris) 
 + 
 +<code user> 
 +rm -rv rep1 
 +</code><​code>​ 
 +'rep1/lien2.txt'​ supprimé 
 +'​rep1/​test2.txt'​ supprimé 
 +répertoire '​rep1'​ supprimé 
 +</​code>​ 
 + 
 +<code user> 
 +ls -li 
 +</​code><​code>​ 
 +total 8 
 +8667149 -rw-r--r-- 2 martin martin 32 déc 15 13:52 lien2.txt 
 +8667149 ​-rw-r--r-- 2 martin martin 32 déc 15 13:52 test2.txt 
 +</​code>​ 
 + 
 +Même supprimer le fichier original (qui en réalité ne peut plus être distingué),​ ne supprime pas les autres fichiers qui lui ont été liés : 
 + 
 +<code user> 
 +rm test2.txt 
 +ls -li 
 +</​code><​code>​ 
 +8667149 -rw-r--r-- 1 martin martin 32 déc 15 13:52 lien2.txt 
 +</​code>​ 
 + 
 + 
 +Comme dit le captnfab dans sa relecture : \\ 
 +Il est à remarquer que le chiffre indiquant le nombre de fichier lié est passé à ''​1''​ car il n'y a plus d'​autre fichier lié.\\ 
 +(Il ne reste plus qu'un seul nom lié à l'​inode du fichier). 
 + 
 +Pour supprimer définitivement des fichiers liés, tous doivent être supprimés. 
 + 
 +<code user> 
 +rm lien2.txt 
 +ls -l 
 +</​code><​code>​ 
 +total 0 
 +</​code>​
  
 ===== Conclusion ===== ===== Conclusion =====
Ligne 388: Ligne 1033:
  
 Autre point très intéressant,​ créer des liens, au lieu de copier les fichiers, assure que toute modification dans un fichier se retrouvera bien dans les « copies » dispersées un peu partout. Autre point très intéressant,​ créer des liens, au lieu de copier les fichiers, assure que toute modification dans un fichier se retrouvera bien dans les « copies » dispersées un peu partout.
 +
 +//Voilà pour la commande //''​ln''//​ dans tous ses états !//
 +
 +//Merci au //​**captnfab**//​ pour sa bienveillante et rigolote attention !// :-D
  
doc/systeme/ln.1426931965.txt.gz · Dernière modification: 21/03/2015 10:59 par milou

Pied de page des forums

Propulsé par FluxBB