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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:systeme:ln [21/06/2010 09:31] smolski |
doc:systeme:ln [14/12/2012 21:35] martin_mtl [Illustration pratique] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== LN ====== | ||
+ | |||
+ | La commande ''ln'' établit un lien symbolique ou un lien physique entre 2 fichiers ou répertoires créés ou ajoutés. | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ===== Synopsis ===== | ||
+ | |||
+ | ln [option] <cible> <lien> | ||
+ | |||
+ | == Lien symbolique : == | ||
+ | |||
+ | ln -s <fichier_cible> <fichier_symbole> | ||
+ | ln -s <répertoire_cible> <répertoire_symbole> | ||
+ | ln -s <point_cible> <point_symbole> | ||
+ | |||
+ | == Lien physique : == | ||
+ | |||
+ | ln <fichier_cible> <fichier_lié> | ||
+ | |||
+ | |||
+ | ===== Remarque Importante ===== | ||
+ | |||
+ | == Les liens symboliques (symlink) == | ||
+ | |||
+ | Les liens symboliques (symlink) peuvent lier | ||
+ | |||
+ | * des fichiers | ||
+ | * des répertoires | ||
+ | * et tout ce qui se nomment... | ||
+ | |||
+ | entre des systèmes différents, car ils sont gérés au niveau de l'OS (Operating System = Système d'exploitation = Linux ici). | ||
+ | \\ | ||
+ | ---- | ||
+ | \\ | ||
+ | == Les liens physiques (hardlink) == | ||
+ | |||
+ | Les liens physiques (hardlink) ne peuvent lier | ||
+ | |||
+ | - que des fichiers | ||
+ | - et que dans le même système de fichier (une partition par exemple, ou un même systeme de fichier en reseau...), | ||
+ | |||
+ | car ils sont eux gérés au niveau du FS (File System = Système de fichier). | ||
+ | |||
+ | **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ême, sinon d'une manière incomplète et //très très à la con// en fait. :-) | ||
+ | |||
+ | //Merci de ces remarques habiles au concert de //**Mahoru`Tsunemi**// et de //**captnfab**// sur l'IRC.// | ||
+ | |||
+ | ===== Illustration pratique ===== | ||
+ | |||
+ | Débutant - À savoir : | ||
+ | |||
+ | * [[commande:mkdir | La commande MKDIR]] | ||
+ | * [[commande:cd | La commande CD]] | ||
+ | * [[commande:touch | La commande TOUCH]] | ||
+ | * [[commande:echo | La commande ECHO]] | ||
+ | * [[commande:cat | La commande CAT]] | ||
+ | * [[commande:> | La commande chevron ">"]] | ||
+ | * [[commande:ls | La commande LS]] | ||
+ | * [[commande:rm | La commande RM]] | ||
+ | * [[commande:a_savoir | Les Droits]] | ||
+ | * [[commande:mv | La commande MV]] | ||
+ | * [[commande:pwd | La commande PWD]] | ||
+ | * [[manuel: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 les répertoires et fichiers tests que nous allons utiliser ==== | ||
+ | |||
+ | |||
+ | Dans ''/home/votre_user/'', créez un répertoire nommé //''test_lien''// et s'y positionner : | ||
+ | |||
+ | $ cd ~ | ||
+ | |||
+ | $ mkdir test_lien | ||
+ | |||
+ | $ cd test_lien/ | ||
+ | test_lien$ | ||
+ | |||
+ | Créer dans ce répertoire deux fichier **test1.txt** rempli de la ligne //Bonjour toto// et test2.txt laissé vide : | ||
+ | |||
+ | test_lien$ touch test2.txt | ||
+ | |||
+ | test_lien$ echo Bonjour toto > test1.txt | ||
+ | |||
+ | test_lien$ cat test1.txt | ||
+ | Bonjour toto | ||
+ | |||
+ | ==== Créer un lien symbolique (symlink) : ==== | ||
+ | |||
+ | test_lien$ ln -s test1.txt lien1.txt | ||
+ | |||
+ | Visualisez le résultat : | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | lrwxrwxrwx 1 votre_user votre_user 9 jun 21 07:23 lien1.txt -> test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 13 jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | //**l**rwxrwxrwx 1 votre_user votre_user **8** jun 21 07:23 lien1.txt **-> test1.txt**// | ||
+ | - **l** indique un lien symbolique sur ce fichier | ||
+ | - **8** indique l'occupation réelle du fichier sur le disque | ||
+ | - **-> test1.txt** indique le fichier pointé par le lien symbolique | ||
+ | |||
+ | Nous pouvons en déduire : | ||
+ | |||
+ | * Un //fichier symbole// créé avec la commande ''ln'' ne contient pas l'occupation disque affichée qui est contenue dans le fichier cible. | ||
+ | * Les modifications qui sont portées dans le contenu apparent d'un fichier symbole seront portés uniquement dans le fichier cible. | ||
+ | * La destruction totale d'un fichier symbole ne détruit rien dans le fichier cible. | ||
+ | |||
+ | ==== Modification du contenu des fichiers liés ==== | ||
+ | |||
+ | test_lien$ echo Comment vas-tu ? >> lien1.txt | ||
+ | |||
+ | test_lien$ cat lien1.txt | ||
+ | Bonjour toto | ||
+ | Comment vas-tu ? | ||
+ | |||
+ | test_lien$ cat test1.txt | ||
+ | Bonjour toto | ||
+ | Comment vas-tu ? | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | lrwxrwxrwx 1 votre_user votre_user **9** jun 21 07:23 lien1.txt -> test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user **30** jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | 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 : == | ||
+ | |||
+ | - nul pour le fichier symbole | ||
+ | - effectif pour le fichier cible | ||
+ | |||
+ | === Occupation concrète sur le disque === | ||
+ | |||
+ | À 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> | ||
+ | test_lien$ ls -li | ||
+ | 604494 - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 lien2.txt | ||
+ | 604493 - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 test2.txt | ||
+ | </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. :-) | ||
+ | |||
+ | ==== Modification par effacement du fichier symbole ==== | ||
+ | |||
+ | L'effacement du fichier symbole ''lien1.txt'' ne détruit ni le contenu, ni l'apparence du fichier cible ''test1.txt'' : | ||
+ | |||
+ | test_lien$ rm lien1.txt | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | - rw- r-- r-- 1 votre_user votre_user **30** jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | ==== Modification du nom des fichiers liés : ==== | ||
+ | |||
+ | Recréons le même fichier symbole //lien1.txt// : | ||
+ | test_lien$ ln -s test1.txt lien1.txt | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | l rwx rwx rwx 1 votre_user votre_user **9** jun 21 07:23 lien1.txt -> test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user **30** jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | === Modifier le nom du fichier symbole === | ||
+ | |||
+ | Modifions le nom du fichier symbole lien1.txt : | ||
+ | test_lien$ mv lien1.txt lien2.txt | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | l rwx rwx rwx 1 votre_user votre_user **9** jun 21 07:23 lien2.txt -> test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user **30** jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | Tout reste fonctionnel et en place. :-) | ||
+ | |||
+ | <note>Pour pousuivre cette illustration dans la clarté, remettons le nommage du fichier symbole ''lien2.txt'' en ''lien1.txt''.</note> | ||
+ | test_lien$ mv lien2.txt lien1.txt | ||
+ | |||
+ | === Modifier le nom du fichier cible === | ||
+ | |||
+ | Modifions le nommage du fichier cible ''test1.txt'' : | ||
+ | test_lien$ mv test1.txt test3.txt | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | lrwxrwxrwx 1 votre_user votre_user **9** jun 21 07:23 <del>lien1.txt</del> -> <del>test1.txt</del> | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user **30** jun 21 07:22 test3.txt | ||
+ | </code> | ||
+ | |||
+ | //Patatras !// Nous voyons alors que le fichier cible ''lien1.txt'' se met en carafe (surligné et en rouge dans le terminal bash) dès le //rafraîchissement// du terminal ouvert. | ||
+ | |||
+ | Il suffit : | ||
+ | - de renommer le fichier cible ''test3.txt'' en ''test1.txt'', | ||
+ | - ou bien de recréer le fichier symbole ''lien1.txt'' en le pointant sur le fichier cible ''test3.txt'' par reformulation de la commande : | ||
+ | test_lien$ ln -s test3.txt lien1.txt | ||
+ | |||
+ | Et tout redevient effectif. | ||
+ | |||
+ | Pour la suite du tuto, choisir de remettre le fichier en test1.txt | ||
+ | test_lien$ mv test3.txt test1.txt | ||
+ | |||
+ | ==== Modifications des droits des fichiers liés : ==== | ||
+ | |||
+ | Depuis le début de cette illustration, nous voyons que les droits restent immuablement complets pour le fichier symbole ''lien1.txt''. | ||
+ | |||
+ | rwx rwx rwx | ||
+ | |||
+ | Essayons de les modifier. \\ | ||
+ | Modifions la propriété du fichier symbole ''lien1.txt'' pour que root devienne le propriétaire. | ||
+ | |||
+ | === Modification des droits d'un fichier symbole === | ||
+ | |||
+ | En terminal root, exécutez la commande : | ||
+ | test_lien# chmod 700 lien1.txt | ||
+ | |||
+ | <code> | ||
+ | test_lien$ $ ls -l | ||
+ | total 4 | ||
+ | l rwx rwx rwx 1 votre_user votre_user 9 jun 21 07:23 lien1.txt -> test1.txt | ||
+ | - rw- --- --- 1 votre_user votre_user 13 jun 21 07:22 test1.txt | ||
+ | - rw- r-- r-- 1 votre_user votre_user 0 jun 21 07:22 test2.txt | ||
+ | </code> | ||
+ | |||
+ | Nous voyons que le fichier symbole ''lien1.txt'' n'est pas affecté par cette modifications des droits : \\ | ||
+ | ''l **rwx rwx rwx** 1 votre_user votre_user 9 jun 21 07:23 lien1.txt -> 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'' : \\ | ||
+ | ''- **rw- --- ---** 1 votre_user votre_user 13 jun 21 07:22 test1.txt'' | ||
+ | |||
+ | ==== Créer un lien physique (hardlink) : ==== | ||
+ | |||
+ | Un lien physique est la création d'un fichier à l'identique de celui qu'il pointe. | ||
+ | |||
+ | 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. | ||
+ | |||
+ | <note important>**ATTENTION :** Un lien physique à la particularité de devoir se situer __sur le même système de fichier__ que sa cible !</note> | ||
+ | |||
+ | ==== Créer un lien physique ==== | ||
+ | |||
+ | Supprimons les fichiers liés symboliquement : | ||
+ | test_lien$ rm *1.txt | ||
+ | |||
+ | Pour créer un lien physique, on utilise la commande ''ln'' sans l'option ''-s''. | ||
+ | <code> | ||
+ | test_lien$ ln test2.txt lien2.txt | ||
+ | test_lien$ ls -l | ||
+ | total 2 | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 lien2.txt | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 test2.txt | ||
+ | </code> | ||
+ | |||
+ | Ah ! Plus de lettre "''l''" ni de "//flèches//" pour indiquer le lien physique. \\ | ||
+ | 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 : | ||
+ | |||
+ | <code> | ||
+ | - rw- r-- r-- 1 admijoel admijoel 0 jun 21 11:04 test2.txt (avant) | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 test2.txt (après) | ||
+ | </code> | ||
+ | |||
+ | Pareillement dans la ligne du fichier symbole physique lien2.txt créé : | ||
+ | <code> | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 lien2.txt | ||
+ | </code> | ||
+ | |||
+ | Une autre différences est le partage des droits qui sont là __tout à fait identiques__ entre les fichiers liés physiquement. | ||
+ | <code> | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 lien2.txt | ||
+ | - rw- r-- r-- 2 admijoel admijoel 0 jun 21 11:04 test2.txt | ||
+ | </code> | ||
+ | |||
+ | ==== Modifions le contenu des fichiers liés physiquement ==== | ||
+ | |||
+ | === 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 : | ||
+ | <code> | ||
+ | test_lien$ echo Très bien titi ! > lien2.txt | ||
+ | |||
+ | test_lien$ ls -l | ||
+ | total 8 | ||
+ | - rw- r-- r-- 2 admijoel admijoel 18 jun 21 11:04 lien2.txt | ||
+ | - rw- r-- r-- 2 admijoel admijoel 18 jun 21 11:04 test2.txt | ||
+ | |||
+ | test_lien$ cat test2.txt | ||
+ | Très bien titi ! | ||
+ | |||
+ | test_lien$ echo Et toi toto ? >> test2.txt | ||
+ | |||
+ | test_lien$ cat lien2.txt | ||
+ | Très bien titi ! | ||
+ | Et toi toto ? | ||
+ | |||
+ | test_lien$ ls -l | ||
+ | total 8 | ||
+ | - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 lien2.txt | ||
+ | - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 test2.txt | ||
+ | </code> | ||
+ | |||
+ | Toutes les modifications, __ajoutées ou retranchées__ dans chacun des fichiers agira de même chez l'autre. | ||
+ | |||
+ | === Occupation concrète sur le disque === | ||
+ | |||
+ | À 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> | ||
+ | test_lien$ ls -li | ||
+ | 604492 - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 lien2.txt | ||
+ | 604492 - rw- r-- r-- 2 admijoel admijoel 32 jun 21 11:04 test2.txt | ||
+ | </code> | ||
+ | |||
+ | Ah ! Le même index 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 ! :-) | ||
+ | |||
+ | //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 === | ||
+ | |||
+ | Suppression du fichier cible ''test2.txt'' : | ||
+ | <code> | ||
+ | test_lien$ rm test2.txt | ||
+ | |||
+ | test_lien$ ls -l | ||
+ | total 4 | ||
+ | - rw- r-- r-- 1 admijoel admijoel 32 jun 21 11:04 lien2.txt | ||
+ | </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> | ||
+ | |||
+ | Pour supprimer définitivement les deux fichiers et leurs contenus, nous devons les effacer tous deux. | ||
+ | test_lien$ rm *2.txt | ||
+ | |||
+ | test_lien$ ls -l | ||
+ | total 0 | ||
+ | |||
+ | //Voilà pour la commande //''ln''// dans tous ses états !// | ||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | //Merci au //**captnfab**// pour sa bienveillante et rigolote attention !// :-D | ||
+ | |||
+ | ===== TP01 - Nommer une partition ===== | ||
+ | |||
+ | Vous pouvez nommer facilement vos partitions et organiser ainsi votre espace de travail. | ||
+ | |||
+ | ==== Créer le répertoire de montage ==== | ||
+ | |||
+ | Créer le répertoire ''stock'' : | ||
+ | <code bash> | ||
+ | mkdir /media/stock</code> | ||
+ | |||
+ | Vérifier la création du répertoire stock et les droits d'accès : | ||
+ | <code bash> | ||
+ | ls -l /media | ||
+ | total 8 | ||
+ | drwxr-xr-x 2 root root 4096 jan 12 19:18 stock</code> | ||
+ | |||
+ | Éditer le fichier /etc/fstab avec [[NANO]] : | ||
+ | <code bash> | ||
+ | nano /etc/fstab</code> | ||
+ | |||
+ | Aller par les flèches du clavier sur /media/sda5 et remplacer sda5 par stock soit : | ||
+ | <code> | ||
+ | /dev/sda5 /media/sda5 ext3 defaults 0 2</code> | ||
+ | |||
+ | devient : | ||
+ | <code> | ||
+ | /dev/sda5 /media/stock ext3 defaults 0 2</code> | ||
+ | |||
+ | Enregistrez et quittez. | ||
+ | |||
+ | //(à suivre)... palpitant, hein ?// | ||
+ | |||
+ | ==== Créer le lien symbolique ==== | ||
+ | |||
+ | **Préalable :** | ||
+ | |||
+ | Par exemple, si vous aviez utilisé avant : ''media/sda5'', il est possible que de nombreuses applications aient mémorisé des fichiers créés ou consultés sous le chemin : \\ | ||
+ | media/sda5/suiteblabla... | ||
+ | |||
+ | Plutôt que de modifier tous ces chemins, \\ | ||
+ | |||
+ | ---- | ||
+ | \\ | ||
+ | //Car un bon //linuxien// est un //linuxien// qui laisse faire la bécane //AU MAXIMUM//. \\ | ||
+ | Ça repose et évite les erreurs.//\\ | ||
+ | |||
+ | ---- | ||
+ | \\ | ||
+ | En utilisant un lien symbolique, il est heureusement possible de faire en sorte que : | ||
+ | media/sda5/blabla | ||
+ | |||
+ | se traduise, dans notre exemple, systématiquement pour toutes ces applications par : | ||
+ | /media/stock/blabla | ||
+ | \\ | ||
+ | \\ | ||
+ | **Non** ? \\ | ||
+ | //Siiii// ! \\ | ||
+ | **Alleluia** ! \\ | ||
+ | //Dieu m'tripote.// \\ | ||
+ | \\ | ||
+ | Desprogien, j'adore ! ;-) | ||
+ | |||
+ | === Démonter la partition === | ||
+ | |||
+ | Démonter la partition à lier : | ||
+ | <code bash> | ||
+ | umount /dev/sda5</code> | ||
+ | |||
+ | Vérifier que /media/sda5 n'est plus monté: | ||
+ | <code bash> | ||
+ | ls /media/sda5 | ||
+ | total 0</code> | ||
+ | |||
+ | === Créer le nouveau répertoire symblink === | ||
+ | |||
+ | <code bash> | ||
+ | rmdir /media/sda5 (cela détruit le répertoire vide sda5)</code> | ||
+ | <code bash> | ||
+ | ln -s /media/stock /media/sda5 (cela créé le répertoire stock en mettant un lien | ||
+ | symbolique entre l'ancien répertoire sda5 et le nouveau répertoire stock)</code> | ||
+ | |||
+ | === Remonter la partition === | ||
+ | |||
+ | Pour réactiver la partition sda5. | ||
+ | <code bash>mount /dev/sda5</code> | ||
+ | <code bash>ls -l /media</code> | ||
+ | |||
+ | === Tester === | ||
+ | |||
+ | Ca marche ? Ouvrez un de ces logiciels (Gimp...) nourri avec l'ancien nom ''sda5'' pour voir si y r'trouve pas ses p'tits cailloux ! \\ | ||
+ | (traduction pour les grands : //Si le chemin se fait correctement...//) | ||
+ | |||
+ | //Qu'esch' qu'ça dit ? \\ | ||
+ | Et ben moi, c'est : //**Bye bye**//, que j'vous dis !// :-D | ||
+ | |||