Essentiels laboratoire Linux - Wiwishack
Transcription
Essentiels laboratoire Linux - Wiwishack
Laboratoire-linux Essentiel Administration Système Prépa 1 Auteur : Labo-linux Relecture : Marc Pybourdin et Hermantino Singodiwirjo Version 1.0 – 26 novembre 2004 SUPINFO - Ecole Supérieure d’Informatique de Paris 23. rue de Château Landon 75010 Paris Site Web : http://www.supinfo.com Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 2 / 81 Table des matières 1. Préambule.........................................................................................................................................5 2. Première approche du système.......................................................................................................6 2.1. Les terminaux .....................................................................................................................................................6 2.2. Le shell................................................................................................................................................................6 2.3. Utilisation de l'aide .............................................................................................................................................7 2.3.1. Les pages de manuel ou man pages..............................................................................................................7 2.3.2. Aide simplifiée .............................................................................................................................................7 3. Commandes de base ........................................................................................................................8 3.1. Opérations sur les fichiers et répertoires.............................................................................................................8 3.2. Affichage du contenu d’un fichier ......................................................................................................................8 3.3. Noms, attributs des fichiers et globbing .............................................................................................................8 3.3.1. Noms des fichiers .........................................................................................................................................8 3.3.2. Attributs des fichiers ....................................................................................................................................9 3.4. Le globbing .........................................................................................................................................................9 3.5. L'éditeur Vim ....................................................................................................................................................10 3.5.1. Appel de l’éditeur.......................................................................................................................................10 3.5.2. Modes d’édition..........................................................................................................................................10 3.5.3. Mode Edition..............................................................................................................................................11 3.6. Archivage et compression avec tar, gzip et bzip2.............................................................................................11 3.6.1. Créer des archives avec tar.........................................................................................................................11 3.6.2. gzip .............................................................................................................................................................12 3.6.3. bzip2 ...........................................................................................................................................................13 3.7. Recherche de fichiers........................................................................................................................................13 3.7.1. find .............................................................................................................................................................13 3.7.2. slocate – locate ...........................................................................................................................................14 3.8. "Pipes" et Redirections .....................................................................................................................................14 3.8.1. Les flux standards.......................................................................................................................................14 3.8.2. Redirections................................................................................................................................................15 3.8.3. Pipes ...........................................................................................................................................................16 4. Organisation du FHS.....................................................................................................................17 4.1. FHS ...................................................................................................................................................................17 4.1.1. Arborescence de "/"....................................................................................................................................17 4.1.2. Arborescence de /usr ..................................................................................................................................17 4.1.3. Arborescence de /var ..................................................................................................................................17 5. Gestion des utilisateurs et groupes...............................................................................................19 5.1. Les utilisateurs ..................................................................................................................................................19 5.1.1. Le fichier /etc/passwd.................................................................................................................................19 5.1.2. Le fichier /etc/shadow ................................................................................................................................20 5.2. Les Groupes ......................................................................................................................................................20 5.3. Les commandes de gestion des utilsateurs........................................................................................................20 5.3.1. Ajouter un utilisateur..................................................................................................................................20 5.3.2. Suppression d'un utilisateur........................................................................................................................22 5.3.3. Changer le mot de passe d'un utilisateur ....................................................................................................22 5.3.4. Afficher des informations sur un utilisateur...............................................................................................22 5.4. Les commandes de gestion des groupes ...........................................................................................................23 5.4.1. Créer un groupe..........................................................................................................................................23 5.4.2. Suppression d'un groupe.............................................................................................................................23 5.4.3. Modifier les groupes secondaires d'un compte...........................................................................................23 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 3 / 81 5.4.4. Afficher des informations sur les groupes..................................................................................................23 5.5. Changer d'identité .............................................................................................................................................24 6. Les permissions ..............................................................................................................................25 6.1. Propriétaire........................................................................................................................................................25 6.1.1. Changer l'appartenance d’un fichier...........................................................................................................25 6.1.2. Changer le groupe propriétaire...................................................................................................................25 6.2. Les droits ..........................................................................................................................................................26 6.2.1. Modifier les droits ......................................................................................................................................26 6.3. Umask ...............................................................................................................................................................27 6.4. Les droits spéciaux............................................................................................................................................28 6.4.1. Le bit SUID ................................................................................................................................................28 6.4.2. SGID ..........................................................................................................................................................28 6.4.3. Le Sticky bit ...............................................................................................................................................28 7. Composants de base d’un système Linux ....................................................................................30 7.1. Configuration et compilation d’un noyau Linux...............................................................................................30 7.1.1. Préambule...................................................................................................................................................30 7.1.2. Pourquoi recompiler son noyau ?...............................................................................................................31 7.1.3. Note sur les modules ..................................................................................................................................31 7.1.4. Configuration et compilation......................................................................................................................31 Noyaux 2.4.x ...........................................................................................................................................................33 Noyaux 2.6.x ...........................................................................................................................................................33 7.1.5. Quelques compléments...............................................................................................................................33 7.2. Le boot loader ...................................................................................................................................................34 7.2.1. Lilo .............................................................................................................................................................35 7.2.2. GRUB.........................................................................................................................................................35 7.2.3. Boot loader sur disquette............................................................................................................................36 7.3. Schéma de lancement de services au démarrage ..............................................................................................37 7.3.1. Le fichier inittab .........................................................................................................................................37 7.3.2. Introduction à la notion des services ..........................................................................................................38 7.3.3. Gestion des services ...................................................................................................................................39 8. Gestion des disques ........................................................................................................................43 8.1. Les disques durs sous Linux .............................................................................................................................43 8.1.1. Partitions.....................................................................................................................................................43 8.1.2. Accès aux périphériques de stockage .........................................................................................................45 9. Gestion des processus ....................................................................................................................47 9.1. Introduction à la notion de processus................................................................................................................47 9.2. Envoi de signaux aux processus .......................................................................................................................48 9.3. Arrière-plan, premier plan et détachement .......................................................................................................49 9.4. Modification des priorités du Scheduler ...........................................................................................................49 9.5. Planification de tâches ......................................................................................................................................50 9.5.1. La commande crontab ................................................................................................................................50 9.5.2. Le fichier crontab système .........................................................................................................................51 9.5.3. La commande at .........................................................................................................................................51 10. Gestion réseau ................................................................................................................................53 10.1. Configuration Automatique ..............................................................................................................................53 10.2. Configuration manuelle ....................................................................................................................................53 10.2.1. Les interfaces et la commande ifconfig......................................................................................................53 10.2.2. Les routes ...................................................................................................................................................54 10.2.3. La résolution de nom..................................................................................................................................55 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 4 / 81 10.3. Les outils de tests réseau...................................................................................................................................55 10.3.1. Ping ............................................................................................................................................................55 10.3.2. Traceroute...................................................................................................................................................56 10.3.3. Netstat.........................................................................................................................................................56 11. Installation de programmes ..........................................................................................................57 11.1. L’approche Redhat............................................................................................................................................57 11.1.1. Comment obtenir ces Paquetages ? ............................................................................................................57 11.1.2. Installation, désinstallation de paquetage...................................................................................................57 11.1.3. Création d'un rpm à partir des sources rpm................................................................................................58 11.2. L’approche Debian ...........................................................................................................................................58 11.2.1. Installation, désinstallation, informations, mise à jour...............................................................................59 11.2.2. Création d'un fichier deb à partir des sources dsc ......................................................................................60 11.3. L’approche Gentoo ...........................................................................................................................................60 11.3.1. Installation, désinstallation, informations sur les paquetages ....................................................................61 11.4. Installation par les sources ................................................................................................................................61 12. Scripting Bash ................................................................................................................................63 12.1. Introduction.......................................................................................................................................................63 12.2. Création et invocation d'un script .....................................................................................................................63 12.2.1. Création d'un script.....................................................................................................................................63 12.2.2. Invocation d'un script .................................................................................................................................63 12.3. Commentaires et taches de fond : .....................................................................................................................64 12.4. Valeur retournée par un script shell à la fin de son execution ..........................................................................65 12.5. Commandes d'un shell-script ............................................................................................................................65 12.5.1. Commandes simples...................................................................................................................................65 12.5.2. Commandes composées .............................................................................................................................65 12.6. Affichage à l'écran ............................................................................................................................................67 12.7. Lecture au clavier..............................................................................................................................................67 12.8. La commande select..........................................................................................................................................68 12.9. Redirections des entrées-sorties standard .........................................................................................................69 12.10. Variables et paramètres .............................................................................................................................70 12.10.1.Variables.....................................................................................................................................................70 12.10.2.Paramètres ..................................................................................................................................................71 12.11. Calcul mathématique.................................................................................................................................72 12.12. Les structures conditionnelles ...................................................................................................................73 12.12.1.Les conditions ............................................................................................................................................73 12.12.2.Les tests ......................................................................................................................................................73 12.12.3.Tests sur les entiers ....................................................................................................................................74 12.12.4.Tests sur les chaînes ...................................................................................................................................74 12.12.5.Combinaison de tests..................................................................................................................................74 12.12.6.Structure Si...Alors...Sinon.........................................................................................................................74 12.12.7.Structure TantQue ......................................................................................................................................75 12.13. Autres structures exécutives......................................................................................................................77 12.13.1.Structure Pour.............................................................................................................................................77 12.13.2.Structure Selon ...........................................................................................................................................77 12.13.3.Structure Lorsque .......................................................................................................................................79 12.14. Fonctions ...................................................................................................................................................80 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 5 / 81 Essentiel Administration Système - Prépa 1 1. Préambule Unix est né en 1969 de la volonté de Ken Thompson et Dennis Ritchie, issus de Bell Labs, de faire un système d'exploitation à la fois multitâches et Multi-Utilisateurs. Il était également question de concevoir de petits programmes ne faisant qu'un nombre limité de tâches, mais pouvant interagir entre eux. Depuis cette période, une grande quantité d'Unix ont vu le jour dont, parmi eux des Unix gratuits, comme celui de l'université de Berkeley dont sont dérivés les célèbres OpenBSD, NetBSD, FreeBSD... Fig 1. Ken Thompson et Dennis Ritchie À partir des systèmes Unix fut développé le concept de GNU/Linux (GNU : Gnu is Not Unix) fut mis en place à partir de 1991 par un étudiant finlandais, Linus Torvalds. Linux a su garder, au fil de ses évolutions, l'héritage des tout premiers systèmes Unix Parallèlement à cela, une philosophie nouvelle est apparue concernant le partage des connaissances, protégée par une licence qui garantirait la transparence des fichiers sources et la possibilité de les modifier. C'est la naissance de la GPL ("Gnu Public License") et de la FSF ("Free Software Foundation") toutes deux fondées par Richard Stallman. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 6 / 81 2. Première approche du système 2.1. Les terminaux Les systèmes Unix/Linux furent à l'origine conçus pour fonctionner en mode texte, sans interface graphique. Bien qu'aujourd'hui de nombreuses interfaces graphiques permettant de configurer le système ont été développées, celui ci demeure totalement administrable en ligne de commande (CLI - Command Line Interface), cette méthode restant la plus simple et la plus puissante. Cette ligne de commande est accessible via les terminaux qui jouent le rôle d'interface utilisateur/machine. Dans ce terminal, l’utilisateur interagit avec le système en utilisant un interpréteur de commandes : le shell. Note : Il est possible de se connecter sur plusieurs terminaux via la combinaison des touches Alt+Fn où Fn est une touche de fonction (Ex : F1,F2...). Depuis un environnement graphique, il est possible de revenir sur un terminal via la combinaison des touches Ctrl+Alt+Fn. Pour revenir au mode graphique, il faut en général utiliser la combinaison Alt+F7. Afin de pouvoir accéder au terminal, vous devez au préalable vous identifier grâce à un couple login/mot de passe. En fonction de cela, vous aurez accès à plus ou moins de programmes sur le système. On distingue principalement 2 types de comptes utilisables sur le système : • Le compte utilisateur classique • Le compte root (Administrateur) Un symbole de l'invite de commande vous permet de determiner le type de compte que vous utilisez. • Accés simple utilisateur : user@localhost $ • Accés root : root@localhost # 2.2. Le shell Le rôle du shell est d'assurer la correspondance entre ce que l'utilisateur tape et le système. Il en existe de nombreuses versions. Le plus connu d'entre eux ; bash ; est celui que nous utiliserons pendant ce cours. Chacun des shells existant dispose de ses propres spécificités. Le choix du shell dépend alors des fonctionnalités offertes par celui-ci, et donc de l'utilisation que l'on souhaite en avoir. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 Nom bash csh ksh sh tcsh zsh 7 / 81 Description (Bourne Again Shell) Offre l'édition de la ligne de commande et le rappel des commandes précédentes. (C Shell) Développé à Berkeley, compatible avec le shell Bourne. Il n’offre pas d'édition de la ligne de commande ni d'historique. (Korn Shell) offre l'édition de la ligne de commande (touches compatibles Emacs) Le shell original de Steve Bourne, pas d'édition de la ligne de commande. Version améliorée du csh, avec un support de l'édition de la ligne de commande avec correction des commandes tapées. Shell similaire au Korn shell, avec plus de dynamisme lors des affichages et gère la non redondance des commandes. Fig 2. Les différents shells et leurs caractéristiques Un système Unix/Linux fonctionne à l'aide d'une multitude de programmes qui assurent, en général, chacun une fonction bien distincte et sont capables de communiquer au sein du shell. 2.3. Utilisation de l'aide 2.3.1. Les pages de manuel ou man pages Sur un système Unix/Linux, la plupart des logiciels sont installés avec un manuel accessible par la commande man. La syntaxe est la suivante : man fonction_ou_commande Note : La commande : man man donne des informations sur l'utilisation du manuel en général. La commande man peut également être utilisée pour rechercher un terme dans l'ensemble des pages de manuel, grâce à l'option –k user@localhost $ man -k "disk space" Commande Espace Entrée b /mot q Description Avance dans le manuel d'une page entière Avance dans le manuel d'une ligne Recule dans le manuel d'une page Recherche mot dans le manuel. Ce peut être un nom ou une expression régulière Quitte le manuel Fig 3. Les commandes de navigation de man 2.3.2. Aide simplifiée Il est également possible d'obtenir un résumé du manuel via l'option --help. user@localhost $ df --help Usage: df [OPTION]... [FILE]... Show information about the filesystem on which each FILE resides, -B, --block-size=SIZE use SIZE-byte blocks Output truncated… Celle-ci permet donc de voir rapidement ou encore de vérifier l'existence d'une option. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 8 / 81 Essentiel Administration Système - Prépa 1 3. Commandes de base 3.1. Opérations sur les fichiers et répertoires Commande cd rep ls rep cp source destination mv source destination mkdir rep rm fichier ln source destination touch fichier ou repertoire Description Se déplace vers le répertoire rep Liste le contenu d’un répertoire (ls -R rep pour un listage récursif) Copie un fichier source vers un fichier destination (cp -R pour copier un répertoire) Déplace un fichier source vers une destination (sert aussi à renommer un fichier) Crée un répertoire nommé rep Efface un fichier (rm -rf rep pour effacer un répertoire) Crée un lien destination qui va pointer sur une source (ln –s source destination pour un lien symbolique) Met à jour la date de modification du fichier, ou crée un fichier vide si le fichier n’existe pas MsDos cd rep dir copy move mkdir rep del / deltree fichier non disponible non disponible Fig 4. Manipulations de base sur les fichiers 3.2. Affichage du contenu d’un fichier Commande cat fichier more fichier less fichier tail fichier head fichier grep "chaine" fichier Description Affiche le contenu du fichier sur la sortie standard Lit le contenu d’un fichier page par page. (Il doit lire l’intégralité du fichier avant de l’afficher) Equivalent à more sauf qu’il n’est pas obligé de lire l’intégralité du fichier avant affichage et permet de remonter dans l'affichage N’affiche que les dernières lignes d’un fichier (tail -n nombre fichier : permet de spécifier le nombre de lignes à afficher) Comme tail, mais affiche les N premières lignes d’un fichier (N=10 par défaut, head –n nombre fichier pour préciser le nombre de lignes) Recherche l’occurence de la chaine de caractères "chaine" dans un ou plusieurs fichiers Fig 5. Les commandes d’affichage de contenu de fichier 3.3. Noms, attributs des fichiers et globbing 3.3.1. Noms des fichiers Les noms de fichiers sont "case sensitives", c’est à dire qu’ils tiennent compte des majuscules et des minuscules. Le nom d’un fichier peut contenir jusqu’à 255 caractères. Pour accéder à un fichier comportant des caractères spéciaux dans son nom, on doit placer le nom du fichier entre guillemets (ou utiliser des backslash avant les caractères spéciaux) : user@localhost $ ls –l "ceci est un test.txt" user@localhost $ ls –l ceci\ est\ un\ test.txt Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 9 / 81 Essentiel Administration Système - Prépa 1 3.3.2. Attributs des fichiers Note : Pour lister le contenu d’un répertoire, nous utiliserons la commande ls Afin de disposer de plus d'informations, nous ajouterons l’option –l Un ensemble d’attributs sont ajoutés au nom du fichier afin de définir, entre autre, le type de fichier ainsi que les permissions qui lui sont associées. luser@localhost $ cd /tmp luser@localhost $ mkdir un_repertoire luser@localhost $ touch un_fichier luser@localhost $ ln -s un_fichier un_lien luser@localhost $ ls un_fichier un_lien un_repertoire luser@localhost $ ls -l total 4 -rw-r--r-- 1 luser lgroup 10 Dec 3 00:42 un_fichier lrwxrwxrwx 1 luser lgroup 10 Dec 3 00:43 un_lien -> un_fichier drwxr-xr-x 2 luser lgroup 4096 Dec 3 00:42 un_repertoire Attribut d l Description Fichier ordinaire Répertoire Lien symbolique Fig 6. Les attributs de fichiers Les caractères suivant celui définissant le type de l’objet (fichier, répertoire ou lien) montrent les permissions de cet objet et seront expliqués plus tard dans ce cours. Note : Les fichiers cachés sont les fichiers dont le nom commence par un ".". Pour les afficher, utilisez l’option –a de la commande ls. Par exemple le fichier nommé ".test" est un fichier caché. Cela marche de la même manière pour les répertoires. 3.4. Le globbing Au sein du shell, le globbing permet à l’utilisateur de désigner plus d’un motif à la fois grâce à l’utilisation de caractères spéciaux tels que "*", "?". • *: correspond à aucun ou plusieurs caractères • ? : correspond à un caractère • [a-z] : correspond à un ensemble de caractères. Ici ce sont tous les caractères alphabétiques entre la lettre "a" et la lettre "z" minuscule. • [^a-z] : correspond à tous les caractères sauf ceux de cet ensemble. Ici ce sera donc tous les caractères sauf ceux entre la lettre "a" et la lettre "z" minuscule. La lettre "A" est donc comprise dans cet ensemble. Voici la liste des fichiers utilisés pour l'exemple : user@localhost $ ls index.htm sommaire.htm t0st.c table.htm test.c On affiche tous les fichiers finissant par ".htm" Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 10 / 81 user@localhost $ ls *.htm index.htm sommaire.htm table.htm On affiche tous les fichiers sauf les fichiers finissant par la chaîne "htm". user@localhost $ ls *[^htm] t0st.c test.c Exemple avec "?" qui signifie un caractère non vide : user@localhost $ ls t?st.c t0st.c test.c On affiche tous les fichiers comportant "st" dans le nom : luser@localhost $ ls *st* t0st.c test.c Note : L’utilisation de ls * donne un affichage récursif sur un niveau 3.5. L'éditeur Vim Nous avons choisi de vous présenter cet éditeur de texte car il s’agit du plus utilisé sur les systèmes UNIX. Vim est une version améliorée de l'éditeur VI, possédant plus de commandes et d'options. Note : Le logiciel "vimtutor" permet d'apprendre les principales commandes très simplement, en vous les présentant pas à pas. 3.5.1. Appel de l’éditeur Éditer un fichier s’il existe, sinon, éditer un nouveau fichier vide : luser@localhost $ vi fichier Éditer chacun des fichiers à la suite : luser@localhost $ vi fichier_1 fichier_2 3.5.2. Modes d’édition Contrairement aux éditeurs wysiwyg (what you see is what you get) Vim fonctionne par mode. On distingue principalement 2 modes bien distincts : • Le mode insertion : Les caractères tapés s'insèrent directement dans le texte en cours • Le mode commande : Les caractères tapés sont considérés comme des commandes pour l’éditeur Le logiciel démarre par défaut en mode commande. • i : permet de passer en mode insertion Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 • • 11 / 81 ESC : permet de passer en mode commande ESC permet d’interrompre une commande Commande :w :q :q! :wq :f file2 /hop v d dd y yy p Description Sauvegarde les changements Quitte le document en cours Quitte le document en cours sans sauvegarder les changements Enregistre et quitte l'editeur Enregistre le document sous le nom file2 (équivalent de enregistrer sous) Recherche l'occurence hop et la met en surbrillance. Un appui sur la touche "n" permet de se positionner sur la prochaine occurence Permet de passer en mode visualisation pour faire une sélection par exemple Equivalent de couper, aprés une sélection par exemple Coupe la ligne entière Equivalent de copier, après une sélection par exemple Copie la ligne entière Coller après le curseur Fig 7. les principales commandes à utiliser en mode commande 3.5.3. Mode Edition Après l'utilisation de ces commandes, l'éditeur passe en mode édition : Commande a A i I o O Description Ajoute après le curseur Ajoute après la ligne courante Insère avant le curseur Insère au debut de la ligne courante avant le premier caractère non-blanc Ouvre une nouvelle ligne en-dessous de la ligne actuelle Ouvre une nouvelle ligne au-dessus de la ligne actuelle Fig 8. les principales commandes à utiliser pour passer en mode édition 3.6. Archivage et compression avec tar, gzip et bzip2 3.6.1. Créer des archives avec tar tar [options] [fichiers] La commande tar est une ancienne commande Unix qui permet aisément d’archiver, c’est-à-dire de réaliser la sauvegarde d’un ensemble de fichiers en un seul fichier. Ce fichier peut être compressé après, mais tar ne compresse pas les fichiers qu'il archive. fichiers désigne un ensemble de fichiers ou toute une arborescence précédée d’un chemin absolu (à partir de /) ou relatif. Attention, si vous archivez des fichiers à partir d’un chemin absolu (précédé d’un "/") alors tar enlèvera ce premier séparateur afin de ne pas remplacer des fichiers par des versions plus anciennes lors de la désarchivation. Par contre l’arborescence des fichiers et répertoires est sauvée. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 Option -x -c -t -f fichier -v -z -j -p 12 / 81 Description Extraire le contenu d’une archive Créer une nouvelle archive Afficher seulement la liste du contenu de l’archive, sans l’extraire Indiquer le nom du fichier archive Mode verbeux, affiche le détail des opérations Compresser ou décompresser en faisant appel à l’utilitaire gzip Compresser ou décompresser avec l’utilitaire bzip2 Préserver les permissions des fichiers Fig 9. Les options de la commande tar Exemples : Création d'archives 1 - Effectuer la sauvegarde de tous les fichiers du répertoire /home/toto dans le fichier sauve.toto.tar placé dans le répertoire courant : luser@localhost $ tar -cvf sauve.toto.tar /home/toto 2 - Effectue, en plus de l’archivage, une compression des fichiers : luser@localhost $ tar -cvzf sauve.toto.tar.gz /home/toto Listing luser@localhost $ tar -tvf sauve.toto.tar Extraction 1 – Extrait tout le contenu de l'archive dans le répertoire courant : luser@localhost $ tar -xvf sauve.toto.tar 2 - Décompresse et extrait : luser@localhost $ tar -xvfz sauve.tar.gz 3 – Extrait de l’archive le répertoire passé en argument : luser@localhost $ tar -xvfz sauve.tar.gz home/toto/tmp 3.6.2. gzip Cette commande est utilisée pour compresser un fichier quelconque, et en particulier une archive tar. L'extraction se fait par la commande gunzip, ou de manière totalement équivalente par gzip -d. gzip [options] [fichiers] Elle peut décompresser les fichiers .gz, mais aussi les fichiers .z , .Z Option -1 à -9 -d -c -l -r Description Fixe le niveau de compression -1 etant le plus faible Décompresse l'archive passée en argument Ecrit sur la sortie standard au lieu de remplacer le fichier d’origine Affiche des infos sur les fichiers de l'archive (taux de compression...) Gzip parcoure tous les répertoires de manière récursive lors de la dé/compression Fig 10. Les options de la commande gzip Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 13 / 81 Exemples : 1 - Compresse backup.tar et le remplace par le fichier backup.tar.gz d’une taille beaucoup plus réduite : luser@localhost$ gzip backup.tar /home/toto 2 - Compresse au maximum chaque fichier .txt séparément et les renomme en ajoutant le suffixe .gz : luser@localhost $ gzip -9 *.txt 3.6.3. bzip2 Bzip2 admet la même syntaxe que gzip, mais effectue une compression plus efficace au détriment d'un besoin accru de mémoire et temps processeur. 3.7. Recherche de fichiers 3.7.1. find find [chemin] [options] La commande find permet d’effectuer une recherche récursive à partir d’un certain répertoire spécifié par chemin en fonction des options précisées. Exemple : pour rechercher tous les fichiers textes contenus dans les répertoires personnels des utilisateurs : user@localhost $ find /home/ -name "*.txt" Option -atime +n (-n) -mtime +n (-n) -name "toto*" -maxdepth n -type type Description Trouve les fichiers auxquels on a accédé il y a plus de n jours (ou moins de n jours) Trouve les fichiers modifiés il y a plus de n jours (ou moins de n jours) Trouve les fichiers dont le nom commence par toto Définit le niveau maximum de sous-répertoire à explorer Indique le type de fichier à rechercher. type peut être : • d : pour les répertoires • f : pour les fichiers • l : pour les liens symboliques Fig 11. Les options de la commande find Exemple : nous voulons rechercher tous les répertoires du répertoire courant contenant "rep" dans leur nom, en ne descendant pas dans les sous-répertoires user@localhost $ find . -type d -maxdepth 0 "*rep*" On peut utiliser find pour exécuter une commande sur certains fichiers : find [chemin] [option] -exec cmd \{\} \; • • • Les fichiers trouvés sont passés à cmd comme des paramètres. \{\} sera remplacé par le nom du fichier. On est obligé de finir la ligne de la commande à l’aide du caractère ";". Ce caractère est échappé afin de ne pas être interprété par le shell. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 14 / 81 Exemple : Pour effacer tous les fichiers ".exe" de mon répertoire personnel : luser@localhost $ cd ~ luser@localhost $ find . -name "*.exe" -exec rm \{\} \; 3.7.2. slocate – locate locate est un lien symbolique de la commande slocate. La commande slocate utilise une base de données que vous devez mettre à jour régulièrement. Des fichiers récemment créés ne sont donc pas forcément référencés. La base de données peut être mise à jour manuellement par le super utilisateur (root) avec la commande slocate -u ou encore updatedb L’avantage de slocate est de permettre une recherche beaucoup plus rapide qu’avec la commande find. En effet, lors d'une recherche, la commande find parcoure à chaque lancement le contenu entier du disque tandis que locate utilise sa base de données qui est bien plus rapide. Exemple : recherche tous les fichiers dont le nom comporte la chaîne "toto" : luser@localhost $ locate toto 3.8. "Pipes" et Redirections Une des bases essentielles d'un système Unix/Linux est la redirection d'un flux émanant d'un programme en direction d'un autre. 3.8.1. Les flux standards Les flux standards sont au nombre de trois : • STDIN (0) : STDIN n’est ni plus ni moins que l’entrée au clavier (dite "entrée standard"). Cela veut dire que tout ce que vous tapez au clavier va passer par ce canal d’entrée/sortie. • STDOUT (1) : STDOUT est ce que l’on appelle la "sortie standard". Les informations qui apparaissent à l’écran passent par le canal STDOUT. • STDERR (2) : STDERR est la "sortie d’erreur standard". L’utilité d’avoir deux flux de sortie permet de séparer les messages d’erreurs et l’affichage normal du programme. Les numéros 0, 1, 2 désignent respectivement STDIN, STDOUT et STDERR, et peuvent être utilisés dans les commandes shell. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 15 / 81 Essentiel Administration Système - Prépa 1 Fig 12. Représentation des flux entrants et sortants 3.8.2. Redirections Si nous exécutons un programme tel que ls, le résultat sera affiché sur la sortie standard, c’est-à-dire l'écran par défaut. Il est cependant possible de rediriger ces différents flux vers des fichiers ou d’autres flux. Ceci peut être réalisé par le biais des signes "<" et ">". Une commande "command > file" va créer un fichier "file" contenant le résultat de la commande "command". De même, en utilisant le signe "<", le contenu du fichier "file" est utilisé comme entrée de la commande "command" : "command < file". Exemple : luser@localhost $ luser@localhost $ total 4872 -rwxr-xr-x 1 root -rwxr-xr-x 1 root -rwxr-xr-x 1 root ... cd /tmp ls -l /bin luser@localhost $ luser@localhost $ total 4872 -rwxr-xr-x 1 root -rwxr-xr-x 1 root -rwxr-xr-x 1 root ... ls -l /bin > un_fichier cat un_fichier root 3180 Jan 22 2001 arch bin 27380 May 18 2000 bzip2 bin 6708 May 18 2000 bzip2recover root 3180 Jan 22 2001 arch bin 27380 May 18 2000 bzip2 bin 6708 May 18 2000 bzip2recover A chaque fois qu’un flux est redirigé avec ">" dans un fichier, celui-ci est écrasé. Afin de conserver le contenu et d’ajouter notre sortie à la suite, il convient d’utiliser ">>". luser@localhost $ ls linux-lfs/ linux-lfs-flat.vmdk linux-lfs.vmx linux-lfs.vmdk linux-lfs.vmx.WRITELOCK Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs nvram vmware.log 16 / 81 Essentiel Administration Système - Prépa 1 luser@localhost $ ls evolution/ addressbook-sources.xml config cache gtkrc-mail-fonts camel-cert.db local mail meta searches.xml shortcuts.xml vfolders.xml views luser@localhost $ ls linux-lfs/ >> fichier luser@localhost $ ls evolution/ >> fichier luser@localhost $ cat fichier linux-lfs-flat.vmdk linux-lfs.vmdk shortcuts.xml vfolders.xml […] 3.8.3. Pipes Les "pipes" ("|") quant à eux sont "des voies de communication" d’un processus vers un autre. Par exemple si nous faisons "command1 | command2", le résultat de la commande "command1" va être utilisé en entrée de la commande "command2". L’utilisation d’un pipe est équivalent à la séquence suivante : luser@localhost $ luser@localhost $ lrwxrwxrwx 1 root -rwxr-xr-x 1 root -rwxr-xr-x 1 root ls –la /bin > un_fichier grep "bzip" < un_fichier root 5 Feb 12 2001 bunzip2 -> bzip2 bin 27380 May 18 2000 bzip2 bin 6708 May 18 2000 bzip2recover Il est possible de chaîner ce type de commande autant que l’on veut : user@localhost $ ls -la /bin | grep "bzip" lrwxrwxrwx 1 root root 5 Feb 12 2001 bunzip2 -> bzip2 -rwxr-xr-x 1 root bin 27380 May 18 2000 bzip2 -rwxr-xr-x 1 root bin 6708 May 18 2000 bzip2recover Fig 13. Représentation d’un tube (pipe) de communication Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 17 / 81 4. Organisation du FHS 4.1. FHS Le FHS (Filesystem Hierachy Standard) est une convention qui organise l'arborescence des répertoires sous Linux. Cette convention est aussi valable pour Unix et est primordiale. Grâce à lui, lorsque vous installez un programme sous Linux, peu importe votre distribution, les fichiers iront toujours dans les mêmes répertoires. 4.1.1. Arborescence de "/" Sous Linux, toute l'arborescence part de "/" appelé "root" ou racine. Ici se trouvent tous les dossiers élémentaires : Répertoire /bin /boot /dev /etc /home /lib /mnt /proc /root /sbin /tmp /usr /var Contenu les binaires (exécutables) vitaux pour l'utilisateur les fichiers relatifs au bootloader tous les périphériques les fichiers de configuration et des fichiers nécessaires au démarrage (rc scripts) les répertoires personnels des utilisateurs les librairies partagées et les modules du noyau (/lib/modules) les dossiers pour les points de montage temporaires accès direct aux paramètres du noyau répertoire personnel du super utilisateur (root) les binaires vitaux pour l'administrateur (root) les dossiers et fichiers temporaires. Le dossier est vidé à chaque démarrage tout ce qui n'est pas vital au système (voir ci-dessous) les fichiers qui changent fréquemment, tels que : les logs, les mails, queues d'impression Fig 14. Structure du FHS 4.1.2. Arborescence de /usr Le répertoire "/usr" contient certains dossiers déjà présents dans "/" (bin, sbin, lib, tmp). Mais ceux-ci ne sont pas nécessaires au fonctionement minimal du système. On y trouve les fichiers relatifs aux programmes tierce partie, par exemple le navigateur web ou les lecteurs multimédias. Répertoire /usr/bin /usr/doc /usr/lib /usr/man /usr/sbin /usr/src /usr/X11R6 Contenu les binaires pour l'utilisateur la documentation des programmes installés (hors manpages) les librairies partagées les manpages (pages de manuel) les binaires pour l'administrateur les sources du noyau les fichiers du serveur X Fig 15. Structure de /usr 4.1.3. Arborescence de /var Un fichier variable est un fichier dont le contenu va changer fréquemment et sans l'intervention directe de l'utilisateur (ex : fichiers de log). Ils sont opposés aux fichiers statiques, fichiers dont le contenu ne varie pas (ex : fichier de configuration). Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 Le dossier "/var" contient tous les fichiers variables. Répertoire /var/log /var/mail /var/run /var/spool Contenu tous les fichiers de log les boites aux lettres de chaque utilisateur les fichiers des PID des deamons les queues en cours (envoi de mail, impression, crontab) Fig 16. Structure de /var Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 18 / 81 Essentiel Administration Système - Prépa 1 19 / 81 5. Gestion des utilisateurs et groupes 5.1. Les utilisateurs Unix est un système multi-utilisateurs. Plusieurs personnes peuvent l'utiliser de façon simultanée via différents terminaux (via le réseau). Pour le système, un utilisateur n'est pas obligatoirement une personne physique. Un utilisateur peut détenir des fichiers, exécuter des programmes ou encore déclencher automatiquement des fonctions systèmes. Par exemple, un utilisateur peut être créé dans le seul but de détenir des fichiers publics. On parle alors de « pseudo utilisateur ». Un utilisateur possède un nom d'utilisateur appelé aussi login lui permettant de démarrer une session. Ce login est associé à un mot de passe personnel. Pour accéder aux ressources du système, l'utilisateur doit entrer la bonne paire login/mot de passe : c'est l'authentification. Les utilisateurs sont identifiés par le système grâce à un UID (identifiant d'utilisateur) unique. Cet identifiant est une valeur numérique. 5.1.1. Le fichier /etc/passwd Le fichier /etc/passwd contient les informations relatives à tous les utilisateurs du système. On y trouve leur : • login • mot de passe (chiffré) • UID • GID principal • nom complet et autres informations • répertoire principal • leur shell La syntaxe de "/etc/passwd" est très simple, chaque ligne concerne un utilisateur. les différents champs sont séparés par des ":" : login:mot-de-passe:UID:GID:info-utilisateur:répertoire-principal:shell • • • • • • Login : c'est l'identifiant que doit entrer l'utilisateur pour s'authentifier. Les caractères spéciaux ne sont pas autorisés Mot de passe : Chiffré en md5 par la commande passwd, ce champ peut prendre plusieurs significations : • "*" : il est impossible de s'authentifier sur le système avec ce compte • "!!" : Le compte est désactivé • "x" ou "!" : le mot de passe est dans un fichier shadow (voir ci-après) • champ vide : Il n'y a pas de mot de passe pour ce compte. UID : il s'agit de l'identifiant unique de l'utilisateur. • L'utilisateur root possède l'UID 0 • Par convention, les UID inférieurs à 100 sont réservés aux comptes système. GID : l'identifiant du groupe principal de l'utilisateur Info utilisateur : des informations sur l'utilisateur. chaque information est séparée par une virgule (le nom complet, numéro de poste ...). répertoire personnel : Il s'agit du répertoire dans lequel sont stockés les fichiers appartenant à l'utilisateur. En général de la forme /home/login. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 • 20 / 81 shell : c'est l'interpréteur de commandes qui sera lancé après l'authentification. 5.1.2. Le fichier /etc/shadow Le fichier /etc/passwd est accessible en lecture par tout le monde. En effet, certaines commandes ont besoin de connaître la liste des utilisateurs ou la correspondance login/UID. La présence du mot de passe dans /etc/passwd, même crypté, pose un problème de sécurité. La solution à ce problème est de stocker les mots de passe dans un fichier différent : /etc/shadow. Pour garantir la sécurité, seul l'administrateur peut le lire. Note : Sous Linux, si le fichier /etc/shadow n'est pas utilisé, l'utilitaire pwconv permet, à partir d'un fichier /etc/passwd unique, de créer le fichier /etc/shadow qui lui correspond. 5.2. Les Groupes Le fichier /etc/group contient les information relatives au groupes présents sur le système. Voici sa syntaxe : groupe:*:GID:utilisateurs • • • • groupe : le nom du groupe * : la présence de ce champ est lié aux anciennes versions d'Unix et n'est plus utilisé. Il peut rester vide ou contenir le caractère "*" ou "x". GID : c'est l'identifiant unique du groupe sous la forme d'une valeur numérique. utilisateur : il s'agit de la liste des utilisateurs appartenant au groupe. Ils sont séparés par des virgules : compta:x:230:pierre,romain,jerome 5.3. Les commandes de gestion des utilsateurs Afin de manipuler les fichiers /etc/passwd, /etc/shadow et /etc/group facilement, des commandes ont été crées. Elles automatisent les vérifications (l'utilisateur à créer existe-t-il déja ? le mot de passe est-il assez compliqué ?...) évitant ainsi toute erreur de saisie. 5.3.1. Ajouter un utilisateur La commande useradd permet de créer un utilisateur : useradd [options] login Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 Option -c commentaire -d répertoire -e date -f nombre de jours -g groupe principal -G groupes supplémentaire -m -k [ répertoire ] 21 / 81 Explication Informations concernant l'utilisateur (nom, poste) Chemin du répertoire personnel de l'utilisateur Date d'expiration du compte. Le format est AAAA-MM-JJ C'est le nombre de jours suivant l'expiration du mot de passe après lequel le compte est désactivé. La valeur 0 permet de désactiver le compte dès que le mot de passe expire. La valeur -1 permet de désactiver cette caractéristique. La valeur par défaut est -1 Le nom du groupe ou le numéro du groupe de connexion initial de l'utilisateur. Le nom ou le numéro du groupe doivent exister. Le numéro de groupe par défaut est 1 Les autres groupes auxquels appartient l'utilisateur (séparés par des virgules) Le répertoire de l'utilisateur sera créé (par défaut, cela n'est pas fait) A utiliser si et seulement si l'option -m est présente. Permet de copier les fichiers et répertoires contenus dans le répertoire répertoire (/etc/skel si non spécifié) dans le répertoire de l'utilisateur Vous pouvez saisir le mot de passe en option. Il doit être chiffré (pour récupérer la version cryptée d'un mot de passe il faut utliser la bibliothèque crypt). Le comportement par défaut est de désactiver le compte Shell lancé à la connexion de l'utilisateur -p le mot de passe chiffré -s chemin vers un exécutable -u uid L'identifiant unique de l'utilisateur Fig 17. Les options de la commande useradd Exemple : nous voulons créer l'utilisateur lambda : • commentaire : "utilisateur lambda" • son shell : /bin/zsh • son répertoire personnel : /home/lambda • nous recopions le contenu de /etc/skel dans son répertoire • il appartient aux groupes "dev" et "final" • le compte sera désactivé immédiatement après expiration du mot de passe root@localhost # useradd -c "utilisateur lambda" -f 0 -G final,dev -m -k /etc/skel -s /bin/zsh lambda La commande useradd -D montre les options par défaut : GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL= SKEL=/etc/skel Il est possible de changer les valeurs par défaut grâce aux options suivantes : Option -h répertoire -e date -f nombre de jours -g GID Explication Répertoire dans lequel créer les répertoires utilisateurs La date d'expiration du compte Délai de désactivation après expiration du mot de passe Le groupe par défaut Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 -s chemin 22 / 81 Le shell par défaut Fig 18. Options de la commande useradd (2) 5.3.2. Suppression d'un utilisateur La commande userdel permet de supprimer un utilisateur : root@localhost # userdel options login Note : L'option -r efface le répertoire personnel de l'utilisateur. 5.3.3. Changer le mot de passe d'un utilisateur La commande passwd permet de changer le mot de passe d'un utilisateur. L'administrateur peut changer n'importe quel mot de passe. Un utilisateur normal ne peut changer que son propre mot de passe. passwd [ options ] [ login ] Si l'argument login n'est pas spécifié, le changement de mot de passe s'applique sur l'utilisateur actuellement connecté. Option -k -l --stdin -u -d -S Explication Indique que seul le mot de passe doit être mis à jour sans toucher aux propriétés d'expiration Permet de verrouiller le compte spécifié en préfixant le mot de passe crypté par le caractère "!". Seul l'utilisateur root peut utiliser cette option Le mot de passe doit être lu à partir de l'entrée standard qui peut alors être un tube (pipe) Déverrouille le mot de passe du compte. Seul l'utilisateur root peut utiliser cette option Supprime le mot de passe d'un compte. Le champ réservé au mot de passe crypté sera supprimé dans le fichier de configuration. Seul l'utilisateur root peut utiliser cette option Affiche des informations sur le statut du mot de passe pour un compte donné. Seul l'utilisateur root peut utiliser cette option Fig 19. Options de la commande passwd 5.3.4. Afficher des informations sur un utilisateur Pour connaître l'identité de l'utilisateur courant (bien que cela soit affiché dans la majorité des prompts par défaut) on utilise la commande whoami. Elle affiche le login de l'utilisateur courant. Les commandes who, users et w permettent de connaître les utilisateurs actuellement connectés sur la machine. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 23 / 81 5.4. Les commandes de gestion des groupes 5.4.1. Créer un groupe La commande groupadd permet de créer un nouveau groupe : root@localhost # groupadd option groupe Option -g -r -f Explication Permet de choisir la valeur numérique du GID du nouveau groupe. Cet identifiant doit être unique Cette option permet d'ajouter un groupe système (dont le GID est inférieur à 500) Permet de stopper la commande lorsque le groupe ou le GID du nouveau groupe existe déjà Fig 20. Les options de la commande groupadd 5.4.2. Suppression d'un groupe Pour supprimer un groupe, on utilise la commande groupdel : groupdel GID Note : On ne peut pas supprimer un groupe si c'est le groupe principal d'un utilisateur. 5.4.3. Modifier les groupes secondaires d'un compte Pour modifier les groupes secondaires d'un utilisateur, on utilise la commande usermod qui est similaire à useradd et supporte les mêmes options : root@localhost # usermod -G toto,users,fileshare,dev toto Ceci permet d'ajouter l'utilisateur "toto" dans les groupes "toto", "users", "fileshare" et "dev". 5.4.4. Afficher des informations sur les groupes Pour connaître les groupes auxquels appartient un utilisateur, on utilise la commande groups. Sans argument, elle affiche les groupes de l'utilisateur courant. Pour connaître les groupes d'un utilisateur particulier, il suffit de passer son login en argument de la commande : root@localhost # groups root wheel disk adm sys daemon bin luser@localhost $ groups toto toto users fileshare Sur de très anciens SystemV, il n'était pas possible d'activer plusieurs groupes simultanément pour le même utilisateur. La commande id permet de connaître les groupes actifs : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 24 / 81 root@localhost # id uid=0(root) gid=0(root) groupes=0(root), 10(wheel),6(disk),4(adm),3(sys),2(daemon),1(bin) Pour changer le groupe actif sur un tel système, on utilise la commande newgrp. Lorsqu'elle est utilisée sans argument, elle active le groupe principal de l'utilisateur (le groupe qui figure dans "/etc/passwd"). 5.5. Changer d'identité Il se peut qu'un utilisateur soit obligé d'effectuer des tâches avec une identité différente. La situation la plus courante étant un utilisateur normal voulant effectuer quelques tâches en tant qu'administrateur. La commande su (switch user), permet de changer d'identité : Commande su su lambda su - lambda su -c "mount /dev/cdrom /mnt/cdrom" Explication Sans option, su permet de se connecter en tant qu'administrateur Agir en tant qu'utilisateur lambda Se connecter en tant que lambda. Avec "-" on récupère tout l'environnement de l'utilisateur lambda l'option -c permet simplement d'exécuter la commande entre guillemet en tant que root (pas d'option). Une fois la commande terminée, on reprend son identité Fig 21. Les options de la commande su Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 25 / 81 6. Les permissions Comme vu précédemment, la commande ls -l nous donne beaucoup d'informations sur un fichier. root@localhost # ls -l -r-xr-xr-x 1 root wheel 32464 27 May 09:35 /bin/ls Nous allons nous intéresser aux parties : droits et propriétaire du fichier. 6.1. Propriétaire Un fichier appartient à un utilisateur et un à un groupe, généralement le groupe principal de l'utilisateur. Dans l'exemple ci-dessus, root est l'utilisateur propriétaire et wheel le groupe propriétaire. 6.1.1. Changer l'appartenance d’un fichier Nous allons pouvoir changer l’appartenance d’un fichier grâce à la commande : chown. Cette commande ne peut être utilisée que par root de la manière suivante : chown [-R] user[:group] fichier L'option -R est utilisée pour changer le propriétaire de façon récursive pour les dossiers. Exemple : root@localhost # ls -l fichier -rw-r--r-- 1 andrew kernel 0 7 Sep 10:52 fichier root@localhost # chown linus -rw-r--r-- 1 linus kenrel 0 7 Sep 10:52 fichier root@localhost # chown richard:gpl -rw-r--r-- 1 richard gpl 0 7 Sep 10:52 fichier Note : les options entre crochets [ ] sont des options facultatives 6.1.2. Changer le groupe propriétaire L’utilisateur n’ayant pas la possibilité d’utiliser la commande chown, il dispose de la commande chgrp pour changer le groupe propriétaire du fichier. Note : L'utilisateur doit appartenir au nouveau groupe. chgrp [-R] group fichier Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 26 / 81 Essentiel Administration Système - Prépa 1 Exemple : user@localhost # ls -l fichier -rw-r--r-- 1 user gpl 0 7 Sep 10:52 fichier user@localhost # chgrp gnu fichier -rw-r--r-- 1 user gnu 0 7 Sep 10:52 fichier 6.2. Les droits Sous linux, on distingue 3 types de permissions attribuables à un fichier , ces permissions sont affichés à l’aide de la commande ls -l • r : lire (read) • w : écrire (write) • x : exécuter (execute) Ces trois permissions vont être définies pour trois types de personnes : • l'utilisateur propriétaire : User • le groupe propriétaire : Group • les autres : Others Selon que l’élément soit un fichier ou un répertoire, ses permissions auront une portée différente. En effet dans le cas d’un répertoire, le droit d’exécution correspond au droit de traverser ce répertoire. 6.2.1. Modifier les droits Nous allons pouvoir modifier les droits avec la commande chmod. Cette commande peut être utilisée de deux façons différentes : chmod [–R] droits fichier Il est possible d’utiliser des caractères alphabétiques : lettre u g o a signification utilisateur groupe others tous lettre r w x signification read write execute Fig 22. Symbolisation des permissions avec chmod Afin de définir ces permissions, il faut utiliser les opérateurs suivants : + = Ajoute un droit Supprime un droit Définit un droit Fig 23. Les opérateurs de chmod Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 27 / 81 Essentiel Administration Système - Prépa 1 Exemple : root@localhost # ls -l fichier -rw-r--r-- 1 root wheel 0 7 Sep 10:52 root@localhost # chmod u+x fichier -rwxr--r-- 1 root wheel 0 7 Sep 10:52 root@localhost # chmod g+wx,o-r fichier -rwxrwx--- 1 root wheel 0 7 Sep 10:52 root@lab# chmod a=r fichier -r--r--r-- 1 root wheel 0 7 Sep 10:52 fichier fichier fichier fichier Il est également possible d’utiliser des valeurs numériques à la place des caractères, ces derniers ètant alors transformés en valeurs octales : chiffre 4 2 1 signification read write execute Fig 24. Equivalences octales En additionnant ces chiffres, on arrive à un nombre à trois chiffres. Les centaines pour l'utilisateur, les dizaines pour le groupe et les unités pour les autres. Exemple : Nous allons donner les droits de lecture, écriture et exécution à l'utilisateur. Les droits de lecture et exécution au groupe et aux autres. r+w+x Æ r+x Æ 4+2+1 = 7 4+1 = 5 root@localhost # ls -l fichier -rw-r--r-- 1 root wheel 0 7 Sep 10:52 fichier root@localhost # chmod 755 fichier -rwxr-xr-x 1 root wheel 0 7 Sep 10:52 fichier 6.3. Umask Le umask est un filtre permettant de définir les permissions par défaut lors de la création d’un fichier. Sans umask, tous les fichiers créés ont comme droit 666 et les dossiers 777. Lors de la création d'un fichier, le système va soustraitre l'umask aux droits par défaut. La valeur par défaut du umask est à 022. On a donc 666 - 022 = 644. Exemple : root@localhost # touch document root@localhost # ls -l document -rw-r--r-- 1 root wheel 0 7 Sep 11:02 document On peut définir le umask grâce à la commande umask. root@localhost # umask 077 En plus des permissions standards sont également disponibles des permissions spéciales. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 28 / 81 6.4. Les droits spéciaux En plus des permissions classiques que nous venons de traiter, il existe également un ensemble de permissions spéciales permettant de contrôler de manière plus avancée la politique de sécurité sur les fichiers d’un système GNU/Linux. 6.4.1. Le bit SUID Lorsqu’une commande est exécutée, celle-ci hérite des droits inhérents à l’identité de l’utilisateur l’ayant invoquée, elle se verra donc attribuer les mêmes restrictions d’accès au système de fichier que celui-ci. Le bit suid permet de changer ce comportement, en donnant à la commande les droits de l’utilisateur propriétaire du fichier, qui peut être différent de l’utilisateur exécutant la commande. La commande ping par exemple à besoin d’accéder à l’interface réseau, opération que seul l’utilisateur root peut réaliser. Afin de permettre à tous les utilisateurs du système d’utiliser cette commande, l’exécutable appartient à root et possède le bit suid activé. Il faut bien entendu que la commande possède également les droits d’exécution. Voici les permissions de la commande ping : user@localhost$ ls -l /sbin/ping -r-sr-xr-x 1 root wheel 24876 27 May 18:18 /sbin/ping Le bit suid est représenté par la lettre "s" qui se situe à la place du droit d’exécution (x) de l’utilisateur propriétaire. Pour activer le bit suid sur un fichier, il faut utiliser la commande chmod de la manière suivante : user@localhost$ chmod u+s <fichier> 6.4.2. SGID Le droit sgid fonctionne de la même façon que le suid mais concerne les droits du groupe propriétaire. Le sgid peut aussi être attribué à un dossier, tout fichier créé dans un tel dossier aura comme groupe propriétaire le groupe du dossier. Pour activer le bit sgid sur un fichier, il faut utiliser la commande chmod de la manière suivante : user@localhost$ chmod g+s <fichier> 6.4.3. Le Sticky bit Lorsqu’un utilisateur posséde le droit d'écriture sur un dossier, il peut alors renommer ou supprimer tous les fichiers qu'il contient. Ce fonctionnement n'est pas adéquat pour un dossier public, où tout le monde à accès en écriture comme "/tmp" par exemple. Si le sticky bit est placé sur un dossier, seul le possesseur d'un fichier pourra le renommer ou le supprimer. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 29 / 81 Pour activer le sticky bit sur un répertoire, il faut utiliser la commande chmod de la manière suivante : user@localhost$ chmod +t <repertoire> Il est également possible d’inclure les droits spéciaux dans le umask et les chmod classiques en mode numérique. Pour cela, il suffit d’ajouter un chiffre à gauche de la valeur initiale avec les valeurs suivantes : Valeur 4 2 1 Description SUID SGID Sticky Bit Fig 25. Valeurs numériques des droits spéciaux Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 30 / 81 7. Composants de base d’un système Linux Un système GNU/Linux est composé de trois éléments essentiels. • Un noyau Le cœur même du système, appelé noyau Linux, se charge de la communication avec la partie matérielle. Les processus des utilisateurs utilisent une interface d’appels systèmes afin de communiquer avec le noyau et ainsi d’utiliser les ressources matérielles de votre ordinateur (disque dur, carte graphique etc .. ). • Un boot loader Au démarrage de votre ordinateur, un noyau de système d’exploitation doit être chargé en mémoire, il peut s’agir d’un noyau Linux, un noyau de système Windows ou encore un noyau de système MacOSX. Cette tâche est prise en charge par un "boot loader". • Un schéma de lancement de services au démarrage Une fois le noyau chargé en mémoire et initialisé, il est temps pour le système de lancer différents services nécessaires à configurer votre environnent (configuration réseau, lancement de services), et éventuellement de charger des modules additionnels dans le noyau. C’est le premier processus du système qui se charge de cela : init. Une fois le noyau chargé par le boot loader et les différents services démarrés, votre système est prêt à recevoir vos commandes. Nous allons à présent voir de manière un peu plus détaillée la configuration de notre noyau, du boot loader et les différentes phases du démarrage (boot) d’un système Linux. 7.1. Configuration et compilation d’un noyau Linux 7.1.1. Préambule Comme nous l’avons présenté, le noyau Linux gère les communications avec la partie matérielle de votre ordinateur. C’est donc au niveau du noyau que vous pouvez décider d’activer ou désactiver les pilotes de périphériques. Ces pilotes peuvent être destinés à contrôler du matériel (carte graphique, carte son) ou bien à contrôler des fonctionnalités logiques (systèmes de fichiers, gestion de la mémoire ..). Le noyau Linux est monolithique et modulaire. Un noyau monolithique est caractérisé par le fait que tout le code des différents pilotes est compilé puis lié en une seule image finale destinée à être chargée en mémoire. À l’opposé on trouve les micro-noyaux qui eux sont composés d’un cœur de très petite taille faisant communiquer entre eux les pilotes existants. (exemple : MacosX). Afin d’offrir d’avantage de souplesse, le noyau Linux intègre depuis sa version 2.0 la possibilité d’utiliser des modules dont le code objet compilé n’est pas directement inséré dans le noyau. Il est alors possible de charger et de décharger des modules à chaud afin d’utiliser ponctuellement un certain matériel ou fonctionnalité compilée dans ledit module, ceci peut réduire considérablement la taille du noyau en mémoire. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 31 / 81 7.1.2. Pourquoi recompiler son noyau ? Afin de simplifier la mise en place des systèmes Linux, de nombreuses distributions comme RedHat/Fedora ou Mandrake proposent un noyau dit générique. Il s’agit simplement d’un noyau intégrant un maximum de fonctionnalités et de pilotes de périphériques, l’avantage étant la réduction des incompatibilités matérielles et donc de simplifier la prise en main du système. La contrepartie étant la taille importante du noyau, qui comprend des pilotes inutiles au système, il est alors pratique de pouvoir configurer son noyau afin de supprimer le superflu et de le rendre plus rapide. L’intérêt de la recompilation de son noyau ne s’arrête pas là, il est également possible de recompiler le noyau afin de combler des failles de sécurités, de l’optimiser pour le processeur ou pour y intégrer des nouvelles fonctionnalités. 7.1.3. Note sur les modules Les modules sont des fonctionnalités du noyau compilées de manières à pouvoir être chargés ultérieurement de manière dynamique. Ceux-ci sont en théorie spécifiques à une version de noyau, il est toutefois possible que certains modules s’adaptent à plusieurs versions de noyaux, comme c’est par exemple le cas des drivers NVIDIA. Après la compilation, les modules sont stockés dans le répertoire /lib/modules/VERSION-DU-NOYAU/. Ceci implique quelques contraintes, il n’est, bien entendu, pas possible de compiler en modules les pilotes de base du système. Il n’existe pas de règle absolue quant au choix des drivers à sélectionner en tant que modules ou à intégrer directement dans le noyau. Généralement, il est conseillé d’insérer dans le noyau toutes les options utilisés en permanence, comme par exemple le pilote du système de fichier, de la carte mère ou encore de la carte réseau. 7.1.4. Configuration et compilation Nous allons dans cette section expliquer les étapes nécessaires à la construction d’un nouveau noyau pour un système GNU/Linux. Tout d’abord, il vous faut récupérer le code source du noyau de votre choix, ce dernier est disponible à l’adresse ftp.kernel.org. Une fois l’archive récupérée, il faut la décompresser dans le répertoire /usr/src et créer un lien symbolique /usr/src/linux pointant sur le répertoire nouvellement créé. Il est maintenant temps de configurer le noyau, pour cela il faut se rendre dans le répertoire des sources puis lancer le menu de configuration : cd /usr/src/linux make menuconfig (menus en mode texte, nécessite la librairie ncurses) ou make xconfig (menus graphiques, nécessite un environnement graphique) Note : Pour l’exemple on étudiera le cas de make menuconfig car il s’agit de la méthode de configuration la plus couramment utilisée et reste valide sur un serveur ne possédant pas de serveur graphique. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 32 / 81 Fig 26. Menu de configuration du noyau Linux Il est possible de naviguer dans les menus afin de trouver l’option souhaitée. Exemple : Activation du support bluetooth. Il faut donc se déplacer dans la section adéquate et cocher la ligne voulue : Puis dans le menu "Networking support" : Enfin le support bluetooth : Cocher la ligne en tant que module (touche m) Note : Nous aurions tout aussi bien pu sélectionner l’option en tant que partie intégrante du noyau (touche ‘y’) : Une fois cela effectué, il ne reste plus qu’à sortir du menu de configuration en sélectionnant plusieurs fois Exit grâce à la touche <TAB> et <Entrée> pour confirmer. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 33 / 81 Le fichier de configuration doit alors être sauvegardé. Selon la version du noyau téléchargée l’étape suivante diffère légèrement. Noyaux 2.4.x Pour compiler un noyau de cette famille, il faut : • • • • Générer les dépendances Créer l’image du noyau Compiler les modules Installer les modules dans /lib/modules Toutes ces étapes peuvent être exécuté grâce à la ligne de commande suivante : make dep bzImage modules modules_install Noyaux 2.6.x La compilation de ce type de noyaux est plus simple, les trois premières étapes se faisant automatiquement, il suffit alors de saisir : make && make modules_install À la fin de cette étape, une image du nouveau noyau est disponible dans le répertoire : arch/i386/boot/bzImage Note : Si le noyau a été compilé sur une architecture de type ppc, le noyau se trouve directement dans le répertoire courant sous le nom de vmlinux Peu importe l’architecture utilisée les modules sont copiés dans : /lib/modules/VERSION-DU-NOYAU Il ne reste plus qu’à faire en sorte que notre nouveau noyau soit chargé au démarrage à la place de l’ancien. Ceci est le rôle d’un programme appelé boot loader que nous allons étudier ci-après. 7.1.5. Quelques compléments La compilation du noyau ne présente pas de difficultés ou de risques particuliers. Il cependant quelques points supplémentaires qui méritent d’être exposés. Il est des cas ou il est inutile de compiler la partie des modules, car une fonctionnalité a juste été ajoutée ou supprimée dans le noyau. Il suffit alors de spécifier au programme make de ne générer que l’image du noyau : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 34 / 81 Noyaux 2.4.x make bzImage Noyaux 2.6.x make De même il est possible de ne traiter que la partie de la compilation concernant les modules : Noyaux 2.4.x make dep modules modules_install Noyaux 2.6.x Make modules_install Dans le cas ou l’on ne compile pas le noyau et ses modules pour la première fois, il est plus prudent de garder la précédente version du noyau ainsi que les modules qui lui sont associés. Pour cela il faut éditer le fichier appelé Makefile et changer la valeur de sous version (EXTRAVERSION) situé au début du fichier : Fig 27. Extrait du fichier Makefile Dans ce cas là par exemple les nouveaux modules générés seront situés dans le répertoire /lib/modules/2.6.8-monnoyau/. Après chacune des configurations sauvegardées (à la sortie du make menuconfig) un fichier appelé ".config" est créé. Il contient l’ensemble des options sélectionnées dans la phase de configuration. Lorsque vous récupérez les sources d’un nouveau noyau il est possible de copier ce fichier dans le répertoire de celle-ci. Il suffit ensuite de lancer ensuite une fois la configuration et quitter en sauvegardant directement. Les nouvelles versions des pilotes sont alors disponibles sans avoir à tout reconfigurer. 7.2. Le boot loader Le boot loader est un programme lancé avant n’importe quel système d’exploitation par le BIOS. Son rôle est de charger le noyau du système souhaité. Il peut également permettre une sélection interactive. Il en existe un certain nombre parmis lesquelles on citera Grub et Lilo ou encore NTLDR pour architectures x86, Silo pour sparc ou yaboot pour ppc. Note : Que se passe t'il entre le moment où l'on allume sa machine jusqu'au moment où l'on entre son login et mot de passe : -le BIOS effectue une série de tests sur le matériel (RAM, détection des disques, ...) nommé POST : Power On Self Test. C'est pendant cette étape que l'utilisateur peut appuyer sur une touche pour entrer dans le BIOS. -le bootloader est chargé en mémoire, l'utilisateur peut alors choisir le système à démarrer -le noyau linux est chargé en mémoire par le bootloader, il s'initialise, détecte les périphériques, ... -le noyau passe alors la main au programme sysvinit, souvent dénommé init, père de tous les processus. En effet c'est ce programme ayant comme PID 1, qui va lancer tous les services au démarrage. -init lance en dernier un terminal virtuel qui demande un login/password pour ouvrir un shell Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 35 / 81 Voici la présentation de Lilo et Grub deux boot loader couramment utilisés sur architecture x86. 7.2.1. Lilo Probablement le boot loader le plus répandu sur les distributions à base GNU/Linux il est séparé en deux stages : • le stage_1 est un petit programme (<= 512 octets) pouvant être placé dans le MBR (Master Boot Record) ou une disquette. Ce stage fait appel au second qui possède plus d'espace mémoire • le stage_2, appelée chargeur d'amorçage, est généralement placé sur le disque dur. Il offre un menu permettant la sélection des systèmes d'exploitations et de charger le noyau en RAM Voici un exemple de son fichier de configuration /etc/lilo.conf : #Emplacement du secteur de boot boot = /dev/hda #Temps d’attente avant de démarrer sur l’image par défaut delay = 10 #1 - Emplacement de l’image du noyau sur le disque #2 - Nom qui sera affiché lors de la sélection interactive au démarrage #3 - Partition à utiliser pour démarrer image = /boot/vmlinuz-2.4.26 label = Ancien noyau root = /dev/hda1 read-only #La même chose mais pour un autre noyau image = /boot/bzImage-2.6.8-mm4 label = Nouveau noyau root = /dev/hda1 read-only #Une entré pour un système d’exploitation alternatif, Windows par exemple : other = /dev/hda3 label = Windows tabe = /dev/hda Une fois ce fichier modifié il est impératif de relancer la commande lilo pour que les changements prennent effet. 7.2.2. GRUB GRUB (Grand Unified Bootloader) est également un standard pour les architectures x86. Son fichier de configuration se trouve habituellement dans le répertoire /boot/grub/menu.lst (ou /boot/grub/grub.conf). Comme lilo, grub fonctionne par stages. En plus des 2 stages évoqués dans lilo, grub intègre un stage intermédiaire, le stage 1_5 qui permet de charger le stage 2 sur n'importe quel système de fichier. Pour installer Grub il faut taper les commandes suivantes. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 root@localhost # grub grub> root (hd0,0) grub> setup (hd0) grub> quit 36 / 81 #partition où sont les fichiers de #configuration de grub #Emplacement du stage_1, ici le MBR Voici le fichier de configuration de grub qui aboutit au même résultat que le fichier de configuration Lilo précédemment exposé : #Temps d’attente avant de démarrer sur l’image par défaut timeout 10 #Nom de la configuration à utiliser par défaut title Ancien Noyau #Partition sur laquelle le noyau doit démarrer (/boot). Attention le comptage commence à 0 et non à 1 ! root (hd0,0) #Emplacement de l’image du noyau sur le disque kernel /vmlinuz-2.4.26 root=/dev/hda1 ro #La même chose pour un autre noyau title Nouveau Noyau root (hd0,0) kernel /bzImage-2.6.8-mm4 root=/dev/hda1 ro Une entrée pour un système windows title Windows rootnoverify (hd0,0) makeactivz chainloader+1 Dans le cas de GRUB pas besoin de relancer de commande, il suffit de redémarrer pour pouvoir sélectionner le nouveau noyau. 7.2.3. Boot loader sur disquette L'un des autres moyens de booter un système est de placer le boot loader sur disquette. Ceci peut être très utile si on écrase le MBR, ou si une erreur dans un fichier de configuration empêche la machine de redémarrer. Le cas de Lilo L'installation de lilo sur disquette se fait en modifiant l’option "boot" du fichier de configuration. boot=/dev/fd0 Puis on exécute la commande lilo pour copier le stage_1 sur une disquette. Le cas de Grub Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 37 / 81 Pour grub, pas besoin de modifier le fichier de configuration. On va simplement copier les deux stages sur deux disquettes. Il faut tout d’abord formater les deux disquettes : roto@localhost # fdformat /dev/fd0 root@localhost # mke2fs /dev/fd0 Puis il suffit de copier les deux stages sur les disquettes nouvellement formatées. L’utilitaire dd est tout à fait adapté à cette tâche : root@localhost # dd if=/boot/grub/stage1 of=/dev/fd0 bs=512 count=1 root@localhost # dd if=/boot/grub/stage2 of=/dev/fd0 bs=512 count=1 Pour finir on utilise l’utilitaire grub pour rendre la disquette contenant le stage 1 "bootable" : root@localhost # grub grub> root(fd0) grub> setup(fd0) grub> quit 7.3. Schéma de lancement de services au démarrage Une fois le noyau chargé en mémoire par le boot loader, il met en place un certain nombre de mécanismes de protection de la mémoire et recherche ensuite ; sur la partition marquée comme root dans le fichier de configuration du bootloader ; un programme appelé "init". Celui-ci va consulter le fichier de configuration /etc/inittab et en exécuter le contenu. Le premier processus de votre système sera donc toujours init qui aura comme pid 1. C’est à ce niveau que sont exécutés les scripts de démarrage pour la gestion du réseau, du montage des disques , de la mise en place des terminaux etc .. Il existe sous les systèmes Linux plusieurs niveaux d’initialisation (runlevels) symbolisés par des chiffres de 0 à 6. Chacun de ces niveaux possède une vocation particulière, à chaque niveau d’exécution est associé un jeu de scripts à exécuter. Afin de changer de niveau d’exécution lors d’une session, il suffit de saisir : init id (id = numéro du niveau d’exécution désiré). Les différents niveaux d’exécution sont définis comme tels : • • • • • • • 0 - halt : arrêt du système 1 - Single user mode : comparable à un mode « sans echec » 2 – Multi user, without NFS : même chose que le niveau 3 mais sans support réseau 3 - Full multi user mode : niveau par défaut, tout est activé sauf le mode graphique 4 – Unused : non utilisé 5 - X11 : comme le niveau 3 mais avec le mode graphique 6 - reboot 7.3.1. Le fichier inittab Le fichier /etc/inittab, contient des directives qui vont être utilisées par le processus init. On trouvera généralement des lignes au format suivant : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 38 / 81 id :niveaux_init :action :commande_ou_script • • • id : Permet d’identifier la tâche à exécuter niveaux_init : Identifiant du niveau d’exécution dans lesquels le script ou la commande devra s’exécuter action : Permet de spécifier le comportement d’init après avoir exécuté sa commande (ex : attendre la fin de l’exécution de la tâche, réexécuter la tâche après quelle se soit terminée etc ..) Voici un exemple du fichier /etc/inittab : id:3:initdefault: # System initialization. si::sysinit:/etc/rc.sysinit l0:0:wait:/etc/rc l1:1:wait:/etc/rc l2:2:wait:/etc/rc l3:3:wait:/etc/rc l4:4:wait:/etc/rc l5:5:wait:/etc/rc l6:6:wait:/etc/rc 0 1 2 3 4 5 6 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # Run gettys in standard runlevels 1:2345:respawn:/sbin/agetty 38400 tty1 2:2345:respawn:/sbin/agetty 38400 tty2 3:2345:respawn:/sbin/agetty 38400 tty3 4:2345:respawn:/sbin/agetty 38400 tty4 5:2345:respawn:/sbin/agetty 38400 tty5 6:2345:respawn:/sbin/agetty 38400 tty6 7.3.2. Introduction à la notion des services La gestion des services sur un système Linux pose différents problèmes du fait de la dépendance entre les services. Par exemple, il ne faudrait pas démarrer le service FTP avant l’activation du réseau. Un service ne doit donc pas être inséré à n’importe quel moment du démarrage. On parle notamment de différents niveaux d’exécution (runlevels) avec à chaque étape un ensemble de services. Il existe différentes méthodes de gestion de ces services, en fonction des distributions. Avant de présenter les différentes étapes en fonction des différentes déclinaisons de Linux, nous allons d’abord présenter les bases de la gestion de services. Linux provient de son ancêtre UNIX, disposant lui de 2 systèmes d’initialisation des services : • • System V BSD Linux a adopté le principe de mise en place System V ou chaque service va être associé à un script placé dans un répertoire commun /etc/init.d. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 39 / 81 Fig 28. Exemple de contenu du répertoire /etc/init.d Le démarrage et l’arrêt des services est réalisé par l’intermédiaire de liens symboliques placé dans différents répertoires, de rc0.d à rc6.d, répertoires correspondant aux différents runlevels du système. Fig 29. Exemple des scripts correspondant au niveau d’exécution 3 Lors du passage dans un runlevel spécifique, le processus init va exécuter tous les scripts commençant par K (Kill) avec le paramètre stop et tous les scripts commençant par S (Start) avec le paramètre start Convention de nommage des scripts et des liens symboliques Les scripts présents dans /etc/init Il n’existe pas de convention de noms spécifiques bien qu’il soit conseillé de nommer les scripts avec une appellation relative au nom du processus démarré. Les liens symboliques présents dans rcX.d • • Première lettre : S (script de lancement) ou K (script d’arrêt) Second et troisième caractères : un n° permettant d’indiquer l’ordre d’exécution des scripts dans le répertoire Afin de simplifier la saisie de tout cela, les différentes distributions proposent différents utilitaires de gestion des services 7.3.3. Gestion des services Selon la distribution utilisée, la gestion des services diffère légèrement, nous allons traiter les trois cas les plus couramment rencontrés. a) L’approche Debian Debian fournit 2 utilitaires afin de simplifier la gestion des services : • • Update-rc.d : Pour interroger la configuration des services et leur comportement au démarrage Invoke–rc.d : Pour manipuler un service L’utilitaire update-rc Cet utilitaire permet de mettre en place ou de supprimer les liens présents dans les différents répertoires rcX.d (System V) Sous le système Debian, les informations telles que la priorité d’arrêt ou de démarrage ou encore les niveaux d’exécution par type de lien sont précisés dans la ligne de commande Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 40 / 81 Exemple : root@localhost # update-rc.d <service> start 20 3 5 . stop 15 0 1 2 4 6 . <service> : nom du script présent dans /etc/init.d 20 3 5 . : priorité du service ainsi que les différents niveaux d’éxécution (un point à la fin) de démarrage (S) 15 0 1 2 4 6 : priorité des liens symboliques de type arrêt de services (K) avec les différents niveaux d’exécution concernés Pour supprimer le service, il suffit d’utiliser la commande update-rc.d <service> remove L’utilitaire invoke-rc Cette commande permet de démarrer ou d’arrêter un service en utilisant les mots-clé start, stop, restart ou status Exemple : invoke-rc.d sshd start Note : Cette commande est l’équivalent de la commande /etc.init.d/sshd start b) L’approche RedHat et Mandrake Ces deux distributions utilisent les commandes chkconfig et service. chkconfig La commande chkconfig permet de gérer les services ainsi que les démarrages automatiques du système. Pour chaque service que l’on souhaite gérer avec chkconfig, il faut ajouter dans le script la liste des niveaux d’éxecution par défaut ainsi que les priorités d’arrêt et de démarrage. Voici comment utiliser chkconfig pour ajouter un service au démarrage : root@localhost # chkconfig –add <nom> root@localhost # chkconfig –level <niveaux> <nom> <on|off|reset> Et voici comment faire pour supprimer un service : chkconfig –del <nom> Exemple : Utilisation de la commande chkconfig : chkconfig –del sshd chkconfig –level 35 sshd on chkconfig –list sshd sshd 0:Arrêt 1:Arrêt 2:Arrêt 3:Marche 4:Arrêt 5:Marche 6:Arrêt Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 41 / 81 Service Service est utilisé pour manipuler un service courant et permet notamment de gérer les services pris en charge par inetd et xinetd de manière transparente root@localhost # service ssh I need an action ssh is an inetd service root@localhost # service ssh start ssh is an inetd service Rechargement de la configuration [OK] Si l’on utilise la commande service sur un service indépendant des superserveurs, on obtient la liste des options disponibles root@localhost # service ssh Utilisation : ssh {start|stop|restart|reload|status} c) L’approche Gentoo Pour ajouter ou supprimer un script d’un certain niveau d’exécution avec la distribution gentoo, on utilise la commande rc-update. Les trois opérations de bases traitées par la commande rc-update sont : • Ajout d’un script : rc-update add script <runlevels> Si l’argument runlevels est "default" le script va être ajouté au niveau d’exécution par défaut spécifié dans /etc/inittab. • Suppression d’un script : rc-update del script [runlevels] • Lister les scripts d’un certain niveau d’exécution : rc-update show [runlevels] Contrairement à RedHat ou Mandrake, la distribution gentoo ne possède pas de script pour lancer ou arrêter les services, pour cela, il faut utiliser ceux situés dans /etc/init.d/<nom_de_service>. Exemple : Pour arrêter le service ssh : /etc/init.d/sshd stop Pour finir, il est également possible de consulter l’état des services d’un certain niveau d’exécution. Attention, Gentoo n’utilise pas des nombres mais nomme ces niveaux d’exécution afin de connaître le nom ceux-ci il faut utiliser la commande rc-status : Fig 30. Les différents niveaux d’execution avec Gentoo Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 42 / 81 Essentiel Administration Système - Prépa 1 Pour lister par exemple l’état des services du niveau d’exécution par défaut on pourra saisir : Fig 31. Consultation de l’état des services avec Gentoo d) L’approche BSD (Slackware) L’approche BSD classe tous les scripts dans /etc/rc.d Dans ce répertoire, tous les scripts qui possèdent le droit d’exécution sont lancés. Il est donc possible de gérer ses services grâce à la commande chmod. Hierarchie des scripts d’initialisation Nom rc.S (Sysinit) rc.K (single user) ou rc.M (multi user) rc.inet1 rc.inet2 rc.apache rc.mysql rc.local Description montage des disques config interfaces reseau, et autres services à lancer Scripts personnels, lancés après tous les précédants Fig 31. Les scripts d’initialisation avec l’approche BSD Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 43 / 81 8. Gestion des disques 8.1. Les disques durs sous Linux "Sous un système Unix, tout est fichier" Tous les éléments de votre système, qu’il s’agisse du processeur, de la carte réseau, d’un processus ou encore d’un fichier texte, sont considérés comme des fichiers. Les disques durs n'échappent pas à cette règle. Par convention tous les périphériques sont représentés dans le dossier "/dev". On distingue deux types de disques : les disques IDE et les disques SCSI. Ils sont nommés respectivement "hd" et "sd". Afin de distinguer les différentes partitions de ceux-ci on ajoute un suffixe composé d'une lettre et d'un chiffre. La lettre représente la position du disque sur le bus et le chiffre représente l'une des partitions de ce disque. Par exemple, le disque maître du premier contrôleur IDE sera nommé "/dev/hda". La première partition de ce disque sera "/dev/hda1", la seconde "/dev/hda2". 8.1.1. Partitions Un disque ne peut contenir que 4 partitions primaires. Il est possible de remplacer une partition primaire par une partition étendue, celle-ci peut contenir jusqu’à 12 partitions logiques. Notre disque pourra donc contenir 15 partitions utilisables soit 3 primaires plus les 12 partitions logiques. Cette méthode est la plus utilisée, indépendemment du système d'exploitation. Il existe une autre méthode appelé LVM (Logic Volume Manager) mais elle ne sera pas abordée dans ce cours. Sous un système Linux, contrairement à un système Microsoft, chaque partition n'est pas représentée sous forme de lecteur. Nous allons pouvoir monter, c’est-à-dire ajouter cet espace disponible à notre système de dossier hiérarchique. Par exemple si une machine fait office de serveur FTP, il est possible de créer une partition dédiée qui sera montée dans "/var/ftp/". Ainsi le serveur FTP n'utilisera pas la place réservée aux utilisateurs ou aux fichiers de logs. Note : Il faudra aussi prévoir une partition réservée à la swap. La swap est utilisée comme complément à la mémoire vive du système. Partitionner un disque dur Il existe plusieurs outils pour partitionner un disque dur sous linux. Les plus communs sont : • fdisk : utilitaire en mode texte avec menu interactif • cfdisk : utilitaire en mode curses (pseudo graphique) avec une liste des partitions. Ces deux utilitaires se lancent de la même façon : commande /dev/disk Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 44 / 81 Il est possible de modifier les partitions d'un disque dur en cours d'utilisation. Il faut cependant redémarrer pour que les changements soient pris en compte. Exemple avec fdisk Nous allons ici créer une partition primaire contenant la swap (512Mo) et une partition logique contenant "/" (5Go) root@localhost # fdisk /dev/hda Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2434, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-2434, default 2434): +512M Command (m for help): t Selected partition 1 Hex code (type L to list codes): 82 Changed system type of partition 1 to 82 (Linux swap) Command (m for help): n Command action e extended p primary partition (1-4) e Partition number (1-4): 2 First cylinder (64-2434, default 64): Using default value 64 Last cylinder or +size or +sizeM or +sizeK (64-2434, default 2434): Using default value 2434 Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (64-2434, default 64): Using default value 64 Last cylinder or +size or +sizeM or +sizeK (64-2434, default 2434): +5000M Command (m for help): p Disk /dev/hda: 20.0 GB, 20020396032 bytes 255 heads, 63 sectors/track, 2434 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 1 63 506016 82 Linux swap /dev/hda2 64 2434 19045057+ 5 Extended /dev/hda5 64 672 4891761 83 Linux Command (m for help): w Writing table partition Commande m p n d t w q Description Aide Affiche l'état du disque Crée une nouvelle partition Supprime une partition Change le type de partition (82 : Linux Swap, 83 : Linux Native) Sauver et quitter Quitter sans sauver Fig 32. Les commandes de fdisk Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 45 / 81 Formater une partition Une fois les partitions définies, il faut à présent les formater afin de pouvoir créer un système de fichier dessus. Le type de système de fichier indique, entre autres, comment organiser les données sur le disque dur. Dans la majorité des cas, nous utiliserons la commande mkfs. Certains systèmes de fichiers utilisent leur propre commande, nous les verrons ci-dessous. Il existe deux moyens d'utiliser la commande mkfs : mkfs -t type /dev/partition mkfs.type /dev/partition Voici un tableau des systèmes de fichiers utilisables sous linux avec la commande à utiliser. Commande swap ext2 ext3 reiserfs xfs jfs vfat Description mkswap mke2fs, mkfs -t ext2, mkfs.ext2 mke2fs -j, mkfs -t ext3, mkfs.ext3 mkreiserfs mkfs -t xfs, mkfs.xfs mkfs -t jfs, mkfs.jfs mkfs -t vfat, mkfs.vfat Fig 33. Les commandes de formatage 8.1.2. Accès aux périphériques de stockage Une fois le disque dur partitionné et formaté, il est à présent utilisable. Comme dit précedemment, pour accéder à ce disque il est necessaire de le monter, c’est-à-dire de l’ajouter dans notre arborescence (le FHS). Dans la pratique, cela consiste à ajouter un répertoire, appelé point de montage, qui va pointer vers la ressource voulue. Par convention, les points de montage sont regroupés dans le dossier "/mnt". commande mount / umount La commande mount va permettre de monter un périphérique. Si l'on utilise la commande mount sans paramètres, on obtiendra la liste des périphériques déjà montés. mount -t type /dev/partition /mnt/dir L'option -t renseigne le système de fichier utilisé. Il est également possible d’ajouter "auto" pour que mount essaie de trouver le système de fichier lui-même. Note : Pour connaître tous les systèmes de fichier supportés par votre noyau, consultez le fichier "/proc/filesystems" Il est possible de passer plus d'options grâce à l'argument -o (voir figure 34) La commande umount va elle, au contraire, démonter un périphérique. umount /mnt/dir Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 46 / 81 Le fichier /etc/fstab Ce fichier a principalement deux utilisations : • contenir toutes les partitions à monter automatiquement au démarrage. • faciliter l'utilisation de la commande mount, en entrant toutes les options à utiliser pour chaque périphérique. Dans le fichier "/etc/fstab" chaque ligne représente un périphérique à monter. Chaque ligne est composée de six parties : • Le chemin du périphérique matériel (dans /dev) • Le point de montage (dans le FHS) • Le type de système de fichier • Les options (argument -o de mount) • Le mot clé "dump" : active ou non la sauvegarde du disque avec l'utilitaire dump (1 ou 0) • Le mot clé "fsck" : active ou non la vérification du système de fichier avec l'utilitaire fsck (0, 1, 2 ou 3) Exemple de fichier /etc/fstab /dev/hda1 /dev/hda5 /dev/cdrom none / /mnt/cdrom swap sw 0 0 ext3 defaults 0 0 iso9660 noauto,users,ro 0 0 Grâce à ce fichier, maintenant les deux commandes suivantes sont équivalentes. mount -t iso9660 -o noauto,users,ro /dev/cdrom /mnt/cdrom mount /mnt/cdrom Option no/auto defaults no/exec no/suid ro rw nom d'utilisateur no/users Description Monte automatiquement le périphérique Active rw, suid, exec, auto, nouser Autorise l'exécution de binaires Autorise l'utilisation du suid et guid Lecture seule Lecture écriture Autorise un utilisateur à monter et démonter un périphérique Autorise tous les utilisateurs à monter ou démonter un périphérique Fig 34. Les options de la commande mount et du fichier fstab Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 47 / 81 9. Gestion des processus Un processus est l'instance d'un programme en cours d’execution. Le rôle du système d’exploitation est d'exécuter l'ensemble des processus d'une ou plusieurs applications et ce de manière concurrentes en controlant l’attribution du temps processeur à chacun d'eux. Il est, bien entendu, possible de définir des priorités sur ces processus. Dans ce chapitre, nous verrons les commandes permettant de controler les processus au sein du système. 9.1. Introduction à la notion de processus Un processus peut prendre différents états définissant son comportement. Les principaux états sont : • l'état "actif" (running) : le processus est traité par le processeur. • l'état "prêt" (sleeping) : le processus attend d’être traité par le processeur. • l'état "attente" (idle) : le processus attend un signal qui le passera à l'état prêt. Il existe beaucoup d'autres états qui seront mis en évidence par l'utilisation de certaines commandes. Une fois un processus lancé, le système lui affecte non seulement une identification numérique unique portant le nom de PID (Process Identifier) permettant de le reconnaître dans la masse des processus mais aussi un héritage. En effet lorsqu'un processus est lancé celui-ci fait partie d'une descendance, tout processus est le "fils" ou le "parent" d’un ou plusieurs processus. Note : Tous les processus sont hérités du premier processus executé par le système : init. Il prend en charge l'exécution de l'ensemble des processus lancés par l'utilisateur par l'intermédiaire du shell (interpréteur de commande). L’arreet d’un processus provoque l’arrêt de tous ses processus "fils" Ainsi le processus init a un PID égal à 1. De même qu'il existe des commandes indiquant l'état d'un processus, des commandes permettent de mettre en évidence les relations d’heritage entre les processus. Commande Description ps Permet de lister les processus suivant un certain nombre de critères top Permet d'avoir un suivi de l'évolution des processus et ce faisant, d'effectuer des traitements comme on pourrait le faire avec ps, mais de façon interactive pstree Permet de lister les processus dans un arbre indiquant les liens de parentés entre eux jobs Permet de lister les processus lancés dans le shell courant Fig 35. Les commandes de monitoring de processus La commande ps peut être appellée avec différentes options, citons en exemple ps aux qui permet tous les processus Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 48 / 81 Champ PID USER PR SIZE RSS SHARE STAT Description Identifiant du processus Le propriétaire du processus Priorité de la tâche (plus le chiffre est petit plus la tâche est prioritaire) Taille du processus en mémoire incluant la partie données et la pile Quantité totale de mémoire occupée par la tâche Quantité de mémoire partagée Ce champ identifie par des lettres les différents états possibles pour un processus • D : En sommeil imperturbable (ce qui arrive souvent à certain modules kernel) • R : En cours d'exécution • S : En sommeil • T : Stoppé ou stracé (notamment pour le débugage) • Z : Zombie (peut arriver lorsqu'un processus n'a pas attendu la fin de l'exécution de l'un de ses fils) LIB Nombre de pages occupées par les bibliothèques %CPU Taux d'occupation du (des) processeur(s) par ce processus. Il peut être supérieur à 100% dans le cadre de machine ayant plusieurs processeurs %MEM Taux d'occupation de la mémoire physique du processus TIME Temps total d'exécution au sein du(des) processeur(s) depuis le lancement du processus COMMAND Affiche la ligne de commande qui a permis de lancer le processus Fig 36. Les champs de ps et de top 9.2. Envoi de signaux aux processus Afin de communiquer avec les processus, l’utilisateur ou le système leur envoi des signaux. Ceci est effectué par l’intermédiaire de la commande kill. L’option –l de la commande permet de lister les signaux disponibles. Nom du SIGNAL SIGHUP SIGKINT SIGKILL SIGTERM SIGTSTP Description Ce signal est envoyé directement lors de la déconnection à un modem ou oblige un daemon à relire son fichier de configuration Ce signal est équivalent au Ctrl-C et met fin à l'exécution d'un processus Tue un processus de manière immédiate. Ce signal est à envoyé dans des mesures drastiques et ne peut être ignoré par le processus Termine un signal "proprement" si possible Mets un processus en attente et , équivalent à Ctrl-Z Fig 37. Les principaux signaux utilité Note : Chaque signal est également représenté par un nombre. Attention : ce nombre peut varier d’un système à l’autre. C’est pour cela qu’il est préférable d’utiliser le nom complet. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 49 / 81 Essentiel Administration Système - Prépa 1 9.3. Arrière-plan, premier plan et détachement Lorsqu’un programme est éxécuté, le shell prend en compte l'exécution du processus. Il faut donc attendre la fin de celui-ci avant d'avoir à nouveau le prompt. On dit alors que le processus est au premier plan. Il peut alors recevoir directement des signaux par les combinaisons de touches Ctrl-?. Il existe cependant une autre possibilité ou le processus est dit en "Arrière plan". Le shell reprend alors la main sans attendre la fin de l’éxecution du nouveau processus. Pour executer un processus en arrière plan, il suffit d’ajouter un "&" à la fin de la commande. Note : Lorsqu’un processus est executé en arrière plan, aucun caractère de contrôle n’est disponible. Il est possible d’arretter un processuss sans pour l’interrompre. Le processus est alors dit en sommeil (sleeping). Il existe de plus d’autres commandes permettant de passer les processus en premier ou en arrière-plan. Il est important de noter que les processus sont identifiés au niveau du shell bash par un "numéro de job" visible grâce à la commande jobs Commande fg %N° de Job bg %N° de Job Ctrl-Z Description Permet de mettre un processus en avant plan Permet de mettre un processus en arrière plan Permet de mettre un processus en attente Fig 38. Contrôle des processus sous le shell bash Lorsque un shell est executé, ceci est fait au sein d’un terminal. Du fait de l’héritage, chaque processus initié par le shell est donc "attaché" a son terminal d’origine (TTY). Il est cependant possible de "détacher" ce processus par le biais de la commande disown suivi du PID du processus. Cette action permet nottamment de pouvoir fermer une session sans pour autant arretter le processus. Exemple : disown 1394 9.4. Modification des priorités du Scheduler Nous avons vu en introduction que les processus avaient des priorités et qu'elles étaient modifiables. En effet, les propriétés évoluent sur une échelle de -20 à +19. Tout processus, au lancement, peut avoir une priorité quelconque supérieure ou égale à zéro. Note : La prioritée la plus haute est représentée par -20, et la plus faible par +19 Cependant, un processus lancé par un utilisateur ne peut avoir une priorité négative. Seul l'administrateur système possède ce droit. Par défaut un processus est lancé avec la priorité 10. Les commandes permettant de contrôler les priorités des processus sont nice et renice. Commande nice priorité renice priorité Description Permet d'affecter une priorité aux processus dès leur lancement Permet de modifier la priorité d'un processus alors que celui-ci est déjà lancé Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Options -n N :permet d'ajuster la priorité par défaut à N -u "User" :change la priorité de tous les processus d'un utilisateur Essentiel Administration Système - Prépa 1 50 / 81 Fig 39. Les commandes nice et renice Les 2 commandes utilisent l’option -p "PID" qui change la priorité d'un processus ayant un pid précis 9.5. Planification de tâches Sur un système Linux, il est possible de planifier des tâches afin d’en démarrer l’execution à un instant précis, ou de manière régulière. Deux services (daemons) sont chargés de cette tâche : • atd : pour les taches différées • crond : pour les tâches répétées Chacun de ces deux daemons possèdent une commande en premier plan : crontab pour crond et at pour atd. Pour gérer les accès à ces commandes, l'administrateur dispose de fichiers de permissions situés dans le répertoire /etc : cron.allow et at.allow qui definissent les autorisations et cron.deny et at.deny les refus. Selon la présence ou l'absence de ces fichiers plusieurs règles rentrent en jeu : • Aucun des fichiers n'existe : dans ce cas seul root à le droit d'utiliser les commandes • Les fichiers cron.allow et at.allow existent : les utilisateurs dont les noms sont présents sont abilités à exécuter les commandes • Les fichiers cron.deny et at.deny existent : les utilisateurs dont les noms sont présents ne peuvent exécuter les commandes. 9.5.1. La commande crontab Il est important de ne pas faire l'amalgame entre la commande crontab et le fichier crontab. La commande crontab permet de créer un fichier crontab possédant les différentes requêtes que l'utilisateur veut effectuer. Ce fichier porte le nom de l'utilisateur et est stocké dans le répertoire /var/spool/cron avant d'être exécuté par crond. Cette commande permet notament d'éditer le fichier et d'en supprimer le contenu. Option -u utilisateur -e -l -r Définition Installation du fichier crontab pour utilisateur (nécessaire d'être root pour l'utiliser) Modification du fichier crontab à l'aide de l'éditeur spécifié par les variables VISUAL ou EDITOR Liste le contenu du fichier crontab courant Élimination du fichier crontab courant Fig 40. Les options de la commande crontab Le fichier crontab créé par l'utilisateur est composé de cinq champs marquant la périodicitété et la commande à effectuer. Ces champs sont ainsi définis: Minute heure date mois "jour du mois" commande La périodicité de chacun de ces 5 champs est représentée par des valeurs numériques comme ci dessous: • minutes (0-59) • heures (0-23) • date (0-31) • mois (1-12) • jour de la semaine (0-7)ou (0 ou 7 indique le Dimanche) Vous pouvez affiner la notion de périodicité par l'utilisation de: Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 51 / 81 Essentiel Administration Système - Prépa 1 • • • • , : sépare plusieurs valeurs - : marque une période (exemple: 1-7,du lundi au dimanche) * : représente l'ensemble des valeurs possibles / : permet de spécifier tous les x temps (exemple: */2 dans la colone des jours veut dire chaque 2 jours). 9.5.2. Le fichier crontab système Le fichier /etc/crontab est également lu par le daemon crond et est différent du format d'un fichier crontab ordinaire. En effet, celui-ci possède des informations d'environnement qui précèdent généralement ses entrées (cela est aussi permis pour les fichiers crontab ordinaires mais ce n'est pas souvent utilisé). Après les cinq champs initiaux se trouve le nom d'un utilisateur pour lequel la commande doit être appelée. Ce fichier est généralement utilisé pour appeler les scripts contenus dans les répertoires "cron.periode" se situant dans le répertoire /etc : • /etc/cron.hourly • /etc/cron.daily • /etc/cron.weekly • /etc/cron.* répertoire contenant les exécutables L'autre différence du fichier système crontab est qu'il fait appel à une commande particulière : run-parts. Cette commande prend en argument un nom de répertoire et appelle tous les programmes compris dans ce répertoire Voici un exemple de fichier /etc/crontab: SHELL=/bin/bash PATH=/sbin:/bin:/usr/bin:/usr/sbin MAILTO=root HOME=/ # run-parts 01 * 02 4 22 4 42 4 * * * 1 * * * * * * * * root root root root run-parts run-parts run-parts run-parts /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly Ainsi, chaque matin, à 4:02, tous les scripts (ou programmes du répertoire /etc/cron.daily sont exécutés. Le répertoire cron.daily est créé lors de l'installation de votre distribution et contient des scripts servant à mettre à jour les bases de données slocate et whatis, à nettoyer les répertoires temporaires et à exécuter d'autres tâches de maintenance. 9.5.3. La commande at La commande at permet de planifier un seul évènement futur de manière simple : user@localhost $ at 6:00 ; mail joe < joe.msg Beaucoup d'autres commandes utilisent le daemon atd : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 • • 52 / 81 la commande atq (pour at queue, la file d'attente de at), fournit une liste des travaux at actuellement en cours. Tout utilisateur privilégié (root) peut entrer un nom d'utilisateur comme argument pour obtenir les travaux en cours d'autres utilisateurs. la commande atrm est utilisée pour éliminer les travaux at en cours. L'atJobID s'affiche lorsque le travail est soumis ainsi qu'à la demande de la commande atq. Tout utilisateur privilégié peut éliminer les travaux at d'autres utilisateurs en fournissant le nom d'utilisateur (user ID) de ceux-ci. Les commandes peuvent être indiquées (une par ligne), en terminant l'entrée par Ctrl-d seul, sur sa propre ligne. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 53 / 81 Essentiel Administration Système - Prépa 1 10. Gestion réseau Afin d'utiliser le réseau, il est tout d’abrd necessaire de disposer du support de la carte dans le noyau ou via un module chargé au lancement du système. Note : Certaines distributions incluent des outils de détection automatique. 10.1. Configuration Automatique Si le réseau dispose d’un serveur DHCP, la configuration se fait via la commande : dhclient Note : la commande dhclient est la plus récente et la plus utilisée, mais il existe d'autres commandes tel que dhcpcd et pump. 10.2. Configuration manuelle 10.2.1. Les interfaces et la commande ifconfig Le noyau Linux attribue des noms d'interfaces composées d'un préfixe précis selon le type. Toutes les interfaces Ethernet, par exemple, commençant par eth. Le préfixe est suivi d'un chiffre, le premier étant 0 (eth0, eth1, eth2...) Type Ethernet Anneau à jeton FDDI Désignation eth[01234...] tr[01234...] fddi[01234...] Fig 41. Les différents types d’interface réseau La commande ifconfig La commande ifconfig permet de connaitre l'état des interfaces réseaux présentes et détectées par le système ainsi que d’en faire la configuration. L'option -a permet d'afficher toutes les interfaces actives ou non. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 54 / 81 Essentiel Administration Système - Prépa 1 luser@localhost $ /sbin/ifconfig -a eth0 Link encap:Ethernet HWaddr 00:04:AC:45:63:7E inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:164442 errors:0 dropped:0 overruns:0 frame:1 TX packets:133671 errors:0 dropped:0 overruns:72 carrier:0 collisions:0 txqueuelen:100 RX bytes:91115012 (86.8 Mb) TX bytes:33953990 (32.3 Mb) Interrupt:10 Base address:0xc000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:3431 errors:0 dropped:0 overruns:0 frame:0 TX packets:3431 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:197669 (193.0 Kb) TX bytes:197669 (193.0 Kb) Pour la configuration d’une carte, il convient de respecter la syntaxe suivante : ifconfig interface inet adresse_ip netsmask masque_ss_réseau broadcast adr_broadcast ifup/ifdown La commande ifup permet d'activer une carte réseau : ifup <interface> Exemple : root@localhost # ifup eth0 La commande ifdown permet de désactiver une carte réseau : ifdown <interface> Exemple : root@localhost # ifdown eth0 Note : Attention les commandes ifup et ifdown ne sont pas présentes dans certaines distributions. Dans ce cas il faut avoir recourt à la commande ifconfig : root@localhost # ifconfig eth0 up root@localhost # ifconfig eth0 down 10.2.2. Les routes La commande route permet d'afficher la table de routage du système ainsi que la modification de celle ci : root@localhost # route Table de routage IP du noyau Destination Passerelle Genmask 172.16.0.0 * 255.255.0.0 default gate.esi-supinf 0.0.0.0 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Indic Metric Ref U 0 0 UG 0 0 Use Iface 0 eth0 0 eth0 Essentiel Administration Système - Prépa 1 55 / 81 Exemple de modification de la table de routage : Pour attacher un sous réseau local à une interface : root@localhost # /sbin/route add -net 172.16.1.0/25 dev eth0 Pour atteindre un sous réseau distant, il est nécessaire de spécifier une passerelle (gateway, en anglais) : root@localhost # /sbin/route add -net 172.16.1.128/25 gw 172.16.1.125 Les communications ne correspondant à aucune des routes présentes utilisent la route par défaut (pour l'Internet notamment) : root@localhost # /sbin/route add default gw 172.16.1.1 10.2.3. La résolution de nom Pour résoudre les noms sur le réseau, il faut stocker dans le fichier "/etc/resolv.conf" l'adresse IP de vos serveurs DNS : domain linux.net nameserver 216.223.224.7 nameserver 216.223.224.6 Nous avons ici configuré le domaine du réseau (nux.net) et l'IP de deux serveurs DNS. 10.3. Les outils de tests réseau 10.3.1. Ping La commande ping est la commande de base pour tester le réseau. Elle vérifie la connectivité entre 2 interfaces réseau grâce au protocole ICMP. user@localhost $ ping 127.0.0.1 127.0.0.1 est l'adresse loopback de votre interface réseau (lo). Si l’interface lo répond, c'est que le protocole TCP/IP est supporté par le Kernel. Pour tester la connectivité entre 2 interfaces, la syntaxe est la suivante : ping <adresse_ip> Note : Il est également possible d’utiliser ping avec un nom de machine afin de tester le bon fonctionnement de la résolution DNS Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 56 / 81 Essentiel Administration Système - Prépa 1 10.3.2. Traceroute La commande traceroute vous permet de connaître le chemin des paquets émis par une interface. La commande traceroute fonctionne au niveau réseau du modèle OSI. Elle ne détectera donc pas les passages par des équipements réseau fonctionnant sur des couches inférieures ( hub,switchs). Exemple : user@localhost $ /usr/bin/traceroute mail.supinfo.com traceroute to mail.supinfo.com (212.80.91.71), 30 hops max, 40 byte packets 1 gougniafier (192.168.1.1) 0.282 ms 0.147 ms 0.105 ms 2 193.253.160.3 (193.253.160.3) 55.493 ms 55.736 ms 58.933 ms 12 easy-interlan.router.easynet.fr (212.180.0.135) 55.892 ms 53.760 ms 13 easy-interlan-10.easynet.fr (212.180.93.42) 59.920 ms 56.677 ms 59.887 14 supinfo-2.supinfo.com (212.180.91.71) 57.182 ms 51.742 ms 53.876 ms 10.3.3. Netstat Netstat permet d'afficher des détails sur les connexions actives de la machine (statistiques, ports...) root@localhost # netstat -tlp Active Internet connexions (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:36167 *:* LISTEN tcp 0 0 *:6000 *:* LISTEN tcp 0 0 *:www *:* LISTEN tcp 0 0 *:ssh *:* LISTEN PID/Program name 20091/artsd 20032/X 17170/apache 8283/sshd Pour afficher la liste des connexions actives : root@localhost # netstat -top Active Internet connexions (w/o servers) Proto Recv-Q Send-Q Local Address name tcp 0 0 192.168.1.10:35514 7981/centericq tcp 0 0 192.168.1.10:36240 28124/ncftp tcp 0 0 192.168.1.10:33605 7981/centericq tcp 0 0 192.168.1.10:35936 Foreign Address State PID/Program 205.188.9.63:5190 ESTABLISHED nephtys.lip6.fr:45196 ESTABLISHED 207.46.106.47:1863 ESTABLISHED gougniafier:ssh ESTABLISHED 18543/ssh La commande netstat dispose de nombreuses options accessibles depuis la man page de la commande. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 57 / 81 11. Installation de programmes Il existe de nombreuses distributions différentes de Linux. Les principales différences sont : • Les utilitaires fournis avec le système pour l’administrer ou l’utiliser • Le gestionnaire d’installation des programmes • Des personnalisations au niveau du noyau Nous allons à présent étudier les différentes méthodes de gestion d’installation des programmes pour différentes distributions 11.1. L’approche Redhat Les paquetages de la distribution Redhat sont présents sous deux formats : • Un portant l'extension ".rpm" représentant l'application binaire (compilée) • Un portant l'extension "src.rpm" représentant les sources (fichiers sources, documentation, fichiers d'installation et de configuration) utilisées généralement pour créer des ".rpm". Ces deux types de paquetages sont installés via la commande rpm. 11.1.1. Comment obtenir ces Paquetages ? Redhat est une distribution commerciale destinée aux entreprises, elle est donc livrée avec un certain nombre de paquetages de base, testés et approuvés par la société Redhat. Toutes les applications autres que celles qui sont proposées doivent donc être téléchargées par l'utilisateur. Généralement le téléchargement se fait en allant directement sur le site du paquetage après une recherche sur un moteur de recherche. La difficulté de ce genre de méthode est la gestion des dépendances. En effet lorsque vous installez un paquetage il est très rare que ce dernier ne dépende d'aucun autre paquetage ou d'aucune librairie. Il est donc necessaire de télécharger l’ensemble des dépendances afin de pouvoir installer un logiciel L'arrivée de Fedora a changé l'esprit de la distribution Redhat en se munissant d'une commande appelée "yum", basée sur le rpm et permettant de télécharger des applications avec l'ensemble de leurs dépendances sur des miroirs dont le but principal est l'hébergement d'applications (exemple: ftp://freshrpms.net). 11.1.2. Installation, désinstallation de paquetage La commande rpm permet de gérer les programmes au travers des fichiers ".rpm" ainsi que de créer des fichiers rpm à partir des rpm sources (src.rpm). Option -i fichier.rpm -ql fichier.rpm -e fichier.rpm -qi fichier.rpm -qa -qf fichier qpi -V fichier Description Installation d’un paquetage rpm Liste les dépendances d’un paquetage Supprime un paquetage Informations sur un paquet déjà installé Liste de tous les paquets déjà installé Donne le rpm d’appartenance du fichier Informations sur les paquetages non installés Vérifie le paquetage. Fig 42. Les options de la commande rpm Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 58 / 81 Note : L’option –V vérifie un paquetage. Si le paquetage est bon il n'y aura aucune sortie sinon nous verrons apparaître des lettres indiquant les différents problèmes rencontrés. Voici donc ci-dessous un listing de ces différents caractères : 5 : somme de contrôle md5 S : taille du fichier L : lien symbolique T : date de modification D : fichier périphérique U : l'utilisateur propriétaire du fichier G : le groupe propriétaire du fichier M : le mode du fichier 11.1.3. Création d'un rpm à partir des sources rpm Tout fichier rpm est un fichier destiné à une architecture précise, par exemple : samba-2.2.5.i586.rpm est destiné aux ordinateurs dotés d'un processeur de type i586. Cependant il est intéressant d’utiliser les sources RPM afin de compiler une application de manière à ce qu'elle soit optimisée pour notre processeur Bien sûr, il existe des paquetages génériques c'est à dire qui correspondent à toute une famille de processeurs. Exemple : samba-2.2.5-i386.rpm correspond à la famille x86. Pour compiler un paquetage RPM source, il faut passer l'option --rebuild à la commande RPM comme ci-dessous: root@localhost # rpm --rebuild samba-2.2.5.src.rpm Après avoir compilé, le paquetage crée se retrouvera dans le répertoire /usr/src/redhat/RPMS/ dans lequel existe d'autres répertoires portant le nom d'architecture comme i386,i586,etc... Tous les paquetages généralement créés de cette manière placent le fichier compilé dans le répertoire i386. 11.2. L’approche Debian Les paquetages debian existent comme ceux de Redhat sous deux formats, un format binaire identifié par l'extension (.deb) et un format source indentifié lui par l'extension (.dsc). Les commandes généralement utilisées pour les installer sont celles présentées ci-dessous : dpkg : commande dite de bas niveau, en ligne de commande, elle permet l'installation , la désinstallation et la gestion des informations des paquetages installés. apt-get : cette commande est la commande la plus populaire du système débian.C'est une commande de haut niveau, servant d'interface à la commande dpkg. Elle permet le téléchargement et l'installation automatique des paquetages en gérant toutes les dépendances de celui-ci. dselect : c'est une interface de la commande apt-get. Elle est exécutée lors de l'installation d'un système Débian. Il est important de noter que chaque paquet provenant du monde libre est testé au maximum de ses possibilités, ceci permettant de lever tous les bugs possibles afin de les corriger et ainsi de les faire migrer vers le niveau de stabilité le plus sûr possible. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 59 / 81 Ces paquetages ainsi testés évoluent d'une version à une autre de Débian. En effet on distingue trois distributions de base chez Debian définie par le niveau de stabilité des logiciels : • • • Unstable ou "Sid" : cette distribution est la moins stable et la plus récente de Débian. Une fois certains bugs corrigés, les paquets migrent en testing. Elle est utile pour les utilisateurs expérimentés voulant bénéficier des dernières versions des applications. Testing ou "Sarge" : cette distribution offre des paquetages stables mais dont l'ensemble des tests de sécurité n'ont pas été effectués. Stable ou "Woody" : cette distribution est la plus stable de Débian. Elle est utilisé pour les Serveurs et les utilisateurs normaux. Les paquetages Debian, quelque soit la version utilisée, sont généralement téléchargés via la commande apt-get. La commande apt-get récupère les applications dans une arborescence bien définie appelée "pool" et présente sur différents mirroirs Debian. Cette arborescence est répartie en 3 grandes familles de répertoire. • Main : contient uniquement des logiciels libres qui représentent la distribution officielle Débian. • Contrib : c'est la que sont stockés des logiciels libres mais dépendant de paquetages propriétaires. • Non free : c'est le répertoire des logiciels payant ou possédant des licences très restrictives. 11.2.1. Installation, désinstallation, informations, mise à jour L'installation, d'une manière générale, est faite à l'aide de la commande apt-get, cependant la commande dpkg est tout de même nécessaire. dpkg -i samba-2.2.5.deb apt-get install samba Note : Si l’on ne connait pas le nom exact du logiciel, il est possible d'avoir une description des différents logiciels disponibles. En faisant apt-cache search "mot_clé" , on obtient un listing de tous les paquetages ayant soit dans leurs descriptions le mot clé recherché soit dans leurs noms. Ce mot clé accepte les globbings. Pour supprimer dpkg -r samba ou dpkg --purge samba apt-get remove samba ou apt-get --purge remove samba Note : L'option --purge indique ici de supprimer à la fois le paquetage mais aussi l'ensemble des fichiers de configurations installés. L'ensemble des informations d'un paquetage installé sont mises en évidence grâce à la commande dpkg. Voici quelques options les plus souvent utilisées dans ce cas : • dpkg -l : permet d'afficher l'ensemble des paquetages installés • dpkg -L foobar : affiche l'ensemble des fichiers constituant un paquetage • dpkg -s foobar : affiche l'état d'un processus • dpkg -S fichier : permet de retrouver l'appartenance d'un fichier à un paquetage Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 60 / 81 De même que Redhat, il est possible d'afficher notamment des informations sur les paquetages non installés, mais ce via la commande apt. L'option de la commande apt à utiliser fait appel à un cache ou est listé l'ensemble des fichiers à jour pouvant être téléchargés sur Debian. La commande est : apt-cache show feh Permet de visualiser les informations d'un paquetage installé ou pas sur la machine. Afin de mettre à jour le cache une commande doit être utilisée qui est : apt-get update. 11.2.2. Création d'un fichier deb à partir des sources dsc Si vous êtes un féru de programmation et que vous vous intéressez d'étudier le code source ou éventuellement de faire des corrections sur du code bogué avoir les sources d'une application serait intéressant. Pour cela apt fournit des commandes permettant de télécharger les sources et des fichiers permettant la création d'un fichier .deb . Pour télécharger un paquet source : apt-get source nomdupaquet Cela va télécharger trois fichiers : un .orig.tar.gz, un .dsc et un .diff.gz. Dans le cas où les paquets sont faits spécialement pour Debian, le dernier de ceux-ci n'est pas téléchargé et le premier n'a généralement pas « orig » dans le nom. Le fichier .dsc est utilisé par dpkg-source pour dépaqueter le paquet source dans le répertoire nomdupaquetversion. Avec chaque paquet source téléchargé, il y a un répertoire du nom de l'application qui contient les fichiers nécessaires pour la création d'un paquet .deb. Pour créer le .deb allez à l'intérieur du répertoire créé pour le paquet après le téléchargement et tapez la commande suivante: dpkg-buildpaquetage -rfakeroot -uc -b 11.3. L’approche Gentoo Gentoo a été dévéloppée en intégrant diverses idées provenant du monde BSD et Linux, mais en essayant d'automatiser un maximum de tâches. Les paquetages fournis par gentoo ; les ebuild ; fournissent la procédure automatisée de la construction et de la configuration du programme à partir des sources en incluant la gestion des dépendances. L'ensemble de ces paquetages fait partie d'une d'une arborescence appelée portage qu'il est important de mettre à jour régulièrement. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 61 / 81 La commande de base utilisée pour installer des paquetages Gentoo est la commande emerge, cette commande permet non seulement d'installer des paquetages mais aussi de supprimer , d'obtenir des informations et de mettre à jour l'ensemble du Portage. 11.3.1. Installation, désinstallation, informations sur les paquetages emerge samba Note : La commande emerge -s "mot_clé" permet de rechercher les paquetages faisant référence au mot clé spécifié. Pour supprimer un paquetage : emerge -C samba Pour mettre à jour les portages : emerge sync 11.4. Installation par les sources Les paquetages installés par les sources sont présents sous la forme de fichier tar compréssé soit en bzip2 soit en gzip2. Ces paquetages sont construits toujours de la même manière. On les appelle des "tarballs". Cette méthode d’installation générique fonctionne sur toutes les distributions La procédure d'installation d'un tarball suit toujours la même logique ainsi définie : Prenons l'exemple d'un paquetage appelé packetage.tar.gz : Etape 1 : Téléchargement de l’archive à l’aide de la commande wget user@localhost $ wget http://www.foobar.com/Dowload/packetage.tar.gz Etape 2 : Décompression de l’archive à l’aide de la commande tar user@localhost $ tar xzf packetage.tar.gz Etape 3 : Aller dans le répertoire créé par la décompression user@localhost $ cd packetage Etape 4 : Lancement du script shell configure user@localhost $ ./configure Cette étape aura pour but de créer un fichier Makefile à l'aide de l'utilitaire "autoconf", qui permettra la compilation du logiciel. Il est possible de passer des options à ce script, permettant par exemple de modifier le chemin d'installation, grâce à --prefix=<répertoire> (défaut : /usr/local). Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 62 / 81 Etape 5 : Compilation de l’application user@localhost $ make Etape 6 : Installation root@localhost # make install Note : Cette dernière étape doit être executée en tant que root car l’installation necessite la copie de fichiers dans les répertoires systèmes. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 63 / 81 12. Scripting Bash 12.1. Introduction Le shell est un interpréteur de commande qui sert d'interface entre l'utilisateur et le système d'exploitation. Bash est le plus utilisé des shells, c'est celui sur lequel nous nous baserons tout au long de ce chapitre. De plus, Bash est aussi un language de programmation complet visant à simplifier et automatiser les taches quotidiennes des administrateurs. 12.2. Création et invocation d'un script 12.2.1. Création d'un script Un script est un ensemble de commandes placées dans un fichier texte. Chaque ligne de ce fichier correspond à une ligne qui aurait pu être saisie par un utilisateur dans un terminal. Un script est destiné à un interpréteur qui lit, analyse, et exécute les commandes qu'il contient. Dans le cas d'un shell-script, l'interpréteur est un des shells d'Unix (bash, sh...). Dans ce document, nous allons apprendre à écrire un script en Bourne-shell (bash ou sh). La première ligne d'un script doit spécifier le programme à appeler pour l'interpréter. Elle doit commencer par la séquence "#!". Pour un shell-script écrit en Bourne-shell, elle sera : #!/bin/bash Pour un script Perl, la première ligne sera : #!/usr/bin/perl Le nom d'un shell-script peut être quelconque, mais on choisit généralement : - soit "mon script" (sans extension), pour que son nom ait l'air d'une commande Unix comme une autre. - soit "mon script.sh" pour indiquer explicitement qu'il s'agit d'un shell-script. 12.2.2. Invocation d'un script On peut exécuter un script comme toute autre commande en l'appelant par son nom. Pour cela, il faut d'une part que les droits d'exécution soient positionnés correctement : chmod +x mon_script et, d'autre part, que le chemin du fichier appartienne à la variable d'environnement PATH (sinon, vous devriez systématiquement préciser le chemin de votre script pour l'exécuter. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 64 / 81 Une autre façon d'exécuter un script, et qui aboutit au même résultat, est d'invoquer son interpréteur avec le nom du script en paramètre (exemple : "bash mon script.sh"). Il faut savoir que, ainsi lancé, un script s'exécute dans un shell secondaire (sous-shell), totalement indépendant du shell qui l'a appelé. Ceci aura pour effet d'annuler toute modification de l'environnement du script (changement de chemin avec cd, création ou modification de variables, etc...) dès lors que le script sera terminé. Pour éviter cela, et donc permettre à un shell-script de modifier l'environnement de votre shell, il suffit d'appeler ce script grâce à la commande "source" (ou '.'). . mon_script ou source mon_script Toutes les commandes du script sont alors exécutées dans le shell actuel. Premier exemple de script : #! /bin/bash echo "hello world" Execution de notre script : $ ./hello.sh Hello world Une autre facon de le lancer, cette fois-ci en appelant le script par l'interpreteur : $ bash hello.sh Hello World Enfin de cette facon le script est lancé dans le shell en cours : $ . hello.sh ou source hello.sh Hello World 12.3. Commentaires et taches de fond : Chaque ligne commençant par un # ne sera pas traitée comme une commande mais comme un commentaire par le shell. #! /bin/bash #debut du script echo hello world #fin du script De plus, toute commande suivie du caractère '&' s'executera en tâche de fond (arrière plan). Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 65 / 81 12.4. Valeur retournée par un script shell à la fin de son execution Par défaut un script renvoie en fin d’éxecution le code de retour de la dernière commande exécutée. Par convention, une valeur de retour égale à 0 signifie que le script s'est bien déroulé. Inversement, toute autre valeur indique une erreur. De plus, on peut fixer cette valeur par la commande : exit n Comme pour toute commande, la valeur de retour d'un script peut être récupérée dans la variable $?. 12.5. Commandes d'un shell-script 12.5.1. Commandes simples Dans un script, on peut employer toute commande exécutable par l'utilisateur dans un terminal: • un mot-clé appartenant au Bourne-shell (exemple : if, case, ...) • une commande interne (builtin) au Bourne-shell (exemple : echo, umask,...) • une fonction définie par l'utilisateur avec le mot-clé function • une commande externe (commande appartenant aux chemins de la variable PATH). Pour connaître le type une commande, on utilise type : $ type while while is a shell keyword $ type cd cd is a shell builtin $ type lsc lsc is aliased to 'ls -color=auto' $ type mkdir mkdir is /bin/mkdir 12.5.2. Commandes composées Les exemples qui suivent sont donnés avec deux commandes mais peuvent être étendus à N commandes. Commandes séquentielles commande1 ; commande2 Exécute commande1 puis commande2. Le point-virgule permet de réunir sur une seule ligne plusieurs instructions qui devraient être sur plusieurs lignes séparées. Note : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 66 / 81 Attention à ne pas systématiquement utiliser cette mise en forme car elle peut nuire à la lisibilité. Le pipe commande1 | commande2 Exécute commande1 et envoi le résultat à commande2. Grâce au tube, commande2 effectue son traitement sur le texte qu'aurait affiché commande1. Attention, commande1 et commande2 s'exécutent dans deux shells secondaires (sous-shells) et, par conséquent, toute modification qu'ils apportent à l'environnement (variables, chemin actuel,...) est perdue dès la fin de la commande. Commandes en parallèles commande1 & commande2 Exécute commande1 et commande2 en parallèles. commande1 est exécutée en tâche de fond. Commande sur erreur commande1 || commande2 Exécute commande2 si et seulement si commande1 a échoué ; généralement utilisé dans les conditions de structures de type if, while et until. Commandes sur réussite commande1 && commande2 Exécute commande2 si et seulement si commande1 s'est bien déroulée. Généralement utilisé dans les conditions des structures if, while et until. Commandes en paramètre commande1 $(commande2) ou commande1 `commande2` Cette combinaison exécute commande1 avec en paramètre le résultat de commande2. Exemple : #!/bin/sh # # Shell-script de mise en application de la récupération du résultat # d une commande. Affiche l'heure en français. heures=$(date +%H) minutes=`date +%M` echo "Il est $heures heures $minutes minutes et `date +%S` secondes" user @ localhost $ ./script.sh Il est 12 heures 29 minutes et 42 secondes Les deux variantes proposées sont strictement identiques. On peut utiliser l'une ou l'autre pour des raisons de commodités. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 67 / 81 Utilisation des parenthèses et des accolades { commande1 ; commande2; }, ( commande1; commande2 ) Les parenthèses et accolades permettent d'encadrer une série de commandes séparées les unes des autres par "&", "&&", "|", "||" ou " ;". L'usage des parenthèses ou des accolades permet à l'ensemble des commandes qu'elles contiennent de subir une redirection. En effet, avec la commande "ls src ; ls bin | lpr", seul le contenu du répertoire bin est imprimé car une redirection ne s'applique qu'à la commande qui précède. Par contre, la commande " {ls src ; ls bin ; } | lpr" provoque bien l'impression du contenu des répertoires src et bin. On préférera généralement les accolades aux parenthèses car les instructions situées entre parenthèses s'exécutent dans un shell secondaire indépendant du shell actuel (voir l'utilisation du tube, plus haut). Note : Attention, la dernière commande de la liste entre accolades doit être terminée par un point-virgule. 12.6. Affichage à l'écran La commande "echo texte" permet d'écrire un texte à l'écran. Bien que ce ne soit pas nécessaire, pour éviter tout problème il est vivement conseillé d'encadrer le texte à afficher par des guillemets. Si le texte à afficher est une chaîne vide, la commande provoque un saut de ligne. L'option -n évite le saut de ligne automatique à la fin du texte. Tout le texte situé entre les guillemets est interprété comme une chaine standard (à l’exception des variables). L'option -e permet l'interprétation des caractères spéciaux utilisés avec printf() en langage C{, tels l'alarme, le retour à la ligne, la tabulation, ou autre. Exemples : echo "Texte à afficher" echo "" echo -n "Ce texte ne sera pas suivi d'un saut de ligne" echo -e "\t\aCe texte commence par une tabulation et émet un signal sonore." 12.7. Lecture au clavier La commande read utilisée seule permet de récuperer une entrée faite au clavier et terminée par un retour chariot (touche entrée). La phrase lue est stockée dans la variable REPLY (attention a bien respecter la casse). La commande "read mot1 mot2 reste" permet aussi de lire une phrase au clavier mais son premier mot est affecté à la variable mot1, son deuxième mot est affecté à mot2 et le reste de la phrase est affecté à la variable reste. Exemple : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 68 / 81 user@localhost$ echo -n "Entrez votre nom de login et votre nom civil: "; read log nom Entrez votre nom de login et votre nom civil: moliere Jean-Baptiste Poquelin luser@localhost$ echo "$log est le login de $nom" moliere est le login de Jean-Baptiste Poquelin Attention : une opération comme "cat fichier | read ligne" ne fonctionnera pas car l'instruction read (tout comme l'instruction cat) sera exécutée dans un shell indépendant et le contenu de la variable ligne sera perdu dès la fin de l'opération. Par contre "read ligne < fichier" fonctionnera. 12.8. La commande select La commande select permet d'offrir un menu à l'utilisateur. Sa syntaxe est : select variable in "choix1" "choix2" ... "choixN" do liste d'instructions done Le menu présenté comporte l'ensemble des choix proposés précédés d'un numéro. Une invite est affichée et le shell attend une entrée au clavier. La variable PS3 doit contenir la chaîne d'invite ("# ? " par défaut). Lorsque l'utilisateur a entré son choix, le corps de la boucle est exécuté. La variable REPLY contient alors ce que l'utilisateur a rentré (un numéro normalement). Si le choix de l'utilisateur correspond à l'une des propositions qui lui sont faites, la variable "variable" contient aussi la chaîne correspondante ("choix1", "choix2", ... ou "choixN"). Exemple : #!/bin/bash echo "Faites un choix" select rep in "rep1" "rep2" "rep3" "rep4"; do if [ -z "$rep" ]; then echo "Erreur, veuillez saisir une autre valeur" else echo $rep break fi done Test: user@localhost$ ./test.sh Faites un choix 1) rep1 2) rep2 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 69 / 81 3) rep3 4) rep4 #? 12.9. Redirections des entrées-sorties standard Avant tout, il faut savoir que toute redirection ne s'applique qu'à la dernière commande. Dans le cas d'une série de commandes séparées par "&", "&&", "|", "||" ou " ;", si l'on veut que la redirection s'applique à l'ensemble des commandes, il faut employer des parenthèses (voir la partie "commandes composées"). L'entrée standard (stdin) peut être redirigée afin de lire dans un fichier plutôt qu'au clavier. Pour cela, placez "< fichier" en fin de commande. Exemple : pour lire la première ligne d'un fichier user@localhost$ read < mon_script; echo $REPLY #! /bin/sh La sortie standard (stdout) peut être redirigée afin d'écrire dans un fichier plutôt qu'à l'écran. Pour cela, placez "> fichier" ou ">> fichier" en fin de commande. Si l'opérateur ">>" est utilisé, le contenu actuel du fichier est conservé et le texte est ajouté en fin de fichier. Exemple : toto> echo "FIN DU FICHIER" >> fichier La sortie standard d'erreur (stderr) peut être redirigée afin d'écrire dans un fichier plutôt qu'à l'écran. Pour cela, placez "2> fichier" en fin de commande. Exemple : Pour supprimer les messages d'erreur de l'affichage : ./ma_commande 2> /dev/null La sortie standard et la sortie standard d'erreur peuvent être redirigées ensemble afin d'écrire dans un fichier plutôt qu'à l'écran. Pour cela, placez "&> fichier" en fin de commande. Exemple : Pour qu'une commande n'affiche rien, même pas les erreurs ma_commande &> /dev/null La sortie standard peut être redirigée vers la sortie standard d'erreur en ajoutant "1>&2" à la fin de la commande. Exemple : Pour afficher un message sur stderr plutôt que sur stdout : echo "Erreur fatale, le disque est plein!" 1>&2 en ajoutant "2>&1" à la fin de la commande. Exemple : Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 70 / 81 Pour afficher le résultat d'une commande page par page, y compris les erreurs : ma_commande 2>&1 | more L'entrée standard peut être lue depuis le shell-script en ajoutant "<<FIN DU TEXTE" à la fin de la commande. Toutes les lignes comprises entre la commande et la ligne "FIN DU TEXTE" seront interprétées comme si elles avaient été lues au clavier. Le texte à afficher peut contenir des variables voire même l'expression "$(commande)". Exemple : Pour afficher plusieurs lignes de texte sans utiliser echo à chaque fois : cat << FIN_DU_TEXTE Vous êtes l'utilisateur $USER. Vous êtes situé dans le répertoire $(pwd). Merci de votre visite. FIN_DU_TEXTE La redirection par tube et l'emploi de l'expression "$(xxx)" ont déjà été décrits dans la partie "Commandes composées". 12.10. Variables et paramètres 12.10.1. Variables Contrairement au DOS qui ne connaît que les variables d'environnement, les shells d'Unix font la distinction entre variables simples et variables d'environnement. Seules les variables d'environnement sont transmises aux programmes lancés depuis le shell. (exception : lorsqu'on utilise le tube ou les parenthèses dans une commande composée, toutes les variables sont communiquées aux sous-shells qui sont lancés implicitement - par contre, ce qui suit reste valable). La modification d'une variable n'est perçue que par le shell qui la modifie et par ses descendants (c'est-à-dire les commandes qu'il exécute) lorsque c'est une variable d'environnement. Il s'ensuit qu'un script ne pourra jamais modifier les variables du shell courant, sauf s'il est appelé avec la commande source (voir plus haut "Invocation d'un script"). En Bourne-shell, définir une variable se fait par la commande : variable="valeur". Il est important que valeur soit spécifiée entre guillemets ou apostrophes, et qu'il n'y ait d'espaces ni avant ni après le signe '='. Si valeur est absente, la variable est créée mais contient une chaîne vide. L'utilisation d'une variable se fait grâce à l'expression $variable ou ${variable}. La deuxième notation est nécessaire si la variable est suivie d'un texte qui pourrait être interprété comme faisant partie du nom de la variable. Exemple : user@localhost$ jour=10; mois=11; an=1997; heures=19; minutes=30 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 71 / 81 user@localhost$ echo "Nous sommes le $jour/$mois/$an" Nous sommes le 10/11/1997 user@localhost$ echo "Il est ${heures}h ${minutes}mn" Il est 19h 30mn Définir une variable d'environnement se fait par la commande "export variable=valeur". Transformer une variable en variable d'environnement se fait par la commande "export variable". Afficher la liste des variables d'environnement se fait par la commande "export". Afficher la liste complète des variables se fait par la commande "set". La commande "unset var" permet de détruire définitivement la variable var. Au lancement du shell, beaucoup de variables sont prédéfinies, qu'elle soient d'environnement ou non. Par exemple, USER contient le nom de l'utilisateur, HOME contient le chemin de son répertoire personnel, etc... Pour en avoir la liste complète, on utilise les commandes "set" ou "export". D’avantage d’informations sont disponibles sur le manuel en ligne : man bash Sous Bourne-shell, certaines variables ont un sens spécial : • $$ donne le numéro de processus (pid) du shell. • $! donne le numéro de processus (pid) de la dernière commande lancée en tâche de fond (c'est-àdire avec l'opérateur '&'). • $? donne la valeur retournée par la dernière commande. • $ donne la liste des options avec lesquelles le shell a été appelé. 12.10.2. Paramètres La variable $# donne le nombre de paramètres accompagnant l'appel du shell-script. Les variables $@ et $* donnent l'ensemble des paramètres. La différence entre les deux termes ne s'observe que lorsqu'ils sont donnés entre guillemets. En effet, "$*" correspond à une seule valeur contenant tous les paramètres alors que "$@" correspond à autant de valeurs qu'il y a de paramètres. On peut accéder à chaque paramètre en spécifiant son numéro après le signe $. Si le numéro tient sur deux chiffres ou plus, il doit être donné entre accolades. Exemples : $1, ..., $9, ${10}, ${11}, ...\ Le paramètre $0 correspond au nom complet (avec le chemin) du shell- script. La commande "shift N" élimine les N premiers paramètres de la liste des paramètres (N ne doit pas être supérieur au nombre de paramètres). La variable $# est diminuée d'autant. La commande shift permet de décaler les paramètres, c'est à dire que $1 prend la valeur de $2, $2 prend la valeur de $3, etc... #! /bin/sh # # params # # Shell-script de mise en application des paramètres d'un script. # Affiche l'ensemble des paramètres passés au script. echo "Vous avez lancé le shell-script $0" echo "Vous lui avez fourni $# paramètres qui sont: $*" echo "" echo "Liste des paramètres :" Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 72 / 81 echo "----------------------" numParam=1 for parametre in "$@"; do echo "Paramètre $numParam = $parametre" let $[numParam += 1] done echo "" echo -n "Après la commande 'shift $#', " shift $# echo "il reste $# paramètres" Test : user@localhost$ ./params A BC DEF "GH IJ" Le shell-script est executé en fournissant les 4 paramètres suivants : A BC DEF GHIJ: luser@localhost$./params A BC DEF GHIJ Liste des paramètres: --------------------Paramètre 1 = A Paramètre 2 = BC Paramètre 3 = DEF Paramètre 4 = GH IJ Après la commande 'shift 4', il reste 0 paramètres 12.11. Calcul mathématique Le shell permet d'effectuer des calculs mathématiques mais uniquement sur des entiers. Il y a deux syntaxes possibles : • let $[ expression mathématique ] • let $(( expression mathématique )) L'expression mathématique peut faire intervenir n'importe quelle variable (pas forcément précédée du signe $) ainsi que n'importe quel nombre entier décimal (219), hexadécimal (0xDB ou 16#DB), octal (0333 ou 8#333) ou binaire (2#011011011). Tous les opérateurs du langage C sont autorisés (+, -, *, %, ||, >>, =, +=, ^=, ==, !=, etc...), y compris les parenthèses. On peut aussi utiliser la formulation "commande $[ expression mathématique ]". Dans ce cas, l'expression mathématique est remplacée par sa valeur puis la commande est exécutée. Exemple : user@localhost$ 3 user@localhost$ 1 user@localhost$ 0 user@localhost$ user@localhost$ 144 echo $[ b % a ] echo $[ a != 0 ] echo $[ b > 20 ] let $[ c = ( ( b + a ) << 4 ) & 0xFF ] echo $c Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 12.12. 73 / 81 Les structures conditionnelles 12.12.1. Les conditions La condition d'exécution des structures conditionnelles qui suivent est qu'une commande aboutisse, c'est à dire que sa valeur de retour soit 0. La commande qui sert de condition peut être une commande composée, en particulier on utilise souvent une formule du type "commande1 && commande2" ou "commande1 || commande2". La condition peut donc être inversée si on fait précéder la commande d'un point d'exclamation. " ! commande" signifie que la condition est vraie si la commande échoue. Note : Attention, le point d'exclamation s'applique uniquement à la commande qui le suit ; pour qu'il s'applique à une commande composée, il faut l'encadrer avec des accolades (ou des parenthèses). Exemples : if commande; then echo "La commande a fonctionné"; fi if ! commande; then echo "La commande a échoué"; fi if commande1 && ! commande2; then \\ echo "commande1 a fonctionné mais pas commande2"; fi if ! { commande1 || commande2; } ; then \ echo "Ni commande1 ni commande2 n'ont fonctionné"; fi 12.12.2. Les tests La condition d'exécution devant être une commande, les tests s'effectuent par l'intermédiaire de la commande "test expression" qui peut être abrégée par la formule "[expression ]". Les tests possibles peuvent porter sur des entiers, des chaînes de caractères ou des fichiers / répertoires : Test -e fichier -s fichier -r fichier -w fichier -x fichier -O fichier -G fichier -b nom -c nom -d nom -f nom -L nom -p nom fichier1 -nt fichier2 fichier1 -ot fichier2" fichier1 -ef fichier2 Description Vrai si le fichier/répertoire existe. Vrai si le fichier à une taille supérieure à 0. Vrai si le fichier/répertoire est lisible. Vrai si le fichier/répertoire est modifiable Vrai si le fichier est exécutable ou si le répertoire est accessible. Vrai si le fichier/répertoire appartient à l'utilisateur. Vrai si le fichier/répertoire appartient au groupe de l'utilisateur Vrai si nom représente un périphérique (pseudo-fichier) de type bloc (disques et partitions de disques généralement). Vrai si nom représente un périphérique (pseudo-fichier) de type caractère (terminaux, modems et port parallèles par exemple). Vrai si nom représente un répertoire. Vrai si nom représente un fichier. Vrai si nom représente un lien symbolique. Vrai si nom représente un tube nommé. Vrai si les deux fichiers existent et si fichier1 est plus récent que fichier2. Vrai si les deux fichiers existent et si fichier1 est plus ancien que fichier2. Vrai si les deux fichiers représentent un seul et même fichier. Fig 43. Les tests sur fichiers et répertoires Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 74 / 81 Essentiel Administration Système - Prépa 1 12.12.3. Tests sur les entiers Test entier1 -eq entier2 entier1 -ge entier2 entier1 -gt entier2 entier1 -le entier2 entier1 -lt entier2 entier1 -ne entier2 Description vrai si entier1 est égal à entier2 vrai si entier1 est supérieur ou égal à entier2 vrai si entier1 est strictement supérieur à entier2. vrai si entier1 est inférieur ou égal à entier2. vrai si entier1 est strictement inférieur à entier2. vrai si entier1 est différent de entier2. Fig 44. Les tests sur entiers 12.12.4. Tests sur les chaînes Test -n "chaîne" -z "chaîne » "chaine1" ="chaine2" "chaine1" != "chaine2 » Description vrai si la chaîne n'est pas vide. vrai si la chaîne est vide. vrai si les deux chaînes sont identiques. vrai si les deux chaînes sont différentes. Fig 45. Les tests sur entiers 12.12.5. Combinaison de tests Lorsqu'un test doit être inversé ou lorsque plusieurs tests doivent être combinés par des ET et des OU, deux notations sont possibles. - La première a été présentée dans la partie précédente ("Les conditions") ; préférable car plus lisible. - La deuxième fait partie de la syntaxe de la commande test : "NON expr" se traduit par "test ! expr" ou "[ ! expr ]" "expr1 OU expr2" se traduit par "test expr1 -o expr2" ou "[ expr1 -o expr2 ]" "expr1 ET expr2" se traduit par "test expr1 -a expr2" ou "[ expr1 -a expr2 ]" 12.12.6. Structure Si...Alors...Sinon Il existe différentes manières d’effectuer un test et de déclencher une action en fonction du résultat de ce test : Algorithme : Si [TEST] Action Sinon si : Action Sinon : Action Exemple : if y = 3 then echo « y est égal à 3 » elif y = 4 then echo "y est égal à 4 » else echo « valeur inconnue » Note : Les sections "elif" et "else" sont optionnelles. D'autre part les actions à effectuer peuvent être composées de plusieurs commandes sur une ou plusieurs lignes. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 75 / 81 Essentiel Administration Système - Prépa 1 Exemple : #! /bin/sh # Shell-script de mise en application de l'instruction if...then...else. # Affiche le signe d'un nombre et de son opposé. # # Saisie de n # echo -n "Entrez un nombre: " read n if test $n -lt 0; then # n < 0 ? echo "Le nombre $n est négatif" elif test $n -gt 0; then # n > 0 ? echo "Le nombre $n est positif" else # n = 0 echo "Le nombre $n est nul" fi let $[ n = -n ] echo "Le nombre choisi devient $n" if [ $n -le 0 ]; then # n <= 0 ? if [ ! $n -eq 0 ]; then # n != 0 ? C'est à dire n < 0 ? echo "Le nombre $n est négatif" else # n = 0 echo "Le nombre $n est nul" fi else # n > 0 echo "Le nombre $n est positif" fi Test : user@localhost$ ./signe Entrez un nombre: 3 Le nombre 3 est positif Le nombre choisi devient -3 Le nombre -3 est négatif user@localhost$ ./signe Entrez un nombre: 0 Le nombre 0 est nul Le nombre choisi devient 0 Le nombre 0 est nul 12.12.7. Structure TantQue En Bourne-shell, la structure algorithmique se traduit par : TantQue commande aboutie action FinTQ while [y –lt 5 ]; do echo "hello world" ; let $[ y+=1 ] done TantQue commande échoue action FinTQ until [y –gt 5 ]; do echo "hello world" ; let $[ y+=1 ] done L'action à effectuer peut être composée de plusieurs commandes sur une ou plusieurs lignes. Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 Exemple : #! /bin/sh # # factorielle # # Shell-script de mise en application de l'instruction while. # Affiche la factorielle du nombre donné en paramètre. if [ $# -ne 1 ] || [ $1 -lt 0 ]; then echo "Usage: factorielle n (avec n >= 0)" 1>&2 else resultat=1 n=$1 while [ $n -gt 1 ]; do let $[ resultat *= n] let $[ n -= 1] done echo "$resultat" fi Test: user@localhost$ factorielle 3 6 user@localhost$ factorielle 6 720 user@localhost$ factorielle $(factorielle 3) 720 Exemple : #! /bin/sh # # testfact # # Shell-script de mise en application de l'instruction until. # Teste le shell-script de calcul de factorielles. n=0 until [ $n -eq 14 ]; do resultat=$(factorielle $n) echo "$n! = $resultat" let $[ n += 1 ] done Test: user@localhost$ ./testfact 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 […] 11! = 39916800 12! = 479001600 13! = 1932053504 Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 76 / 81 77 / 81 Essentiel Administration Système - Prépa 1 12.13. Autres structures exécutives 12.13.1. Structure Pour Pour chaque élément de l'ensemble (element1, element2, ..., elementN), on effectue une action sur element. En Bourne-shell, cette structure algorithmique se traduit par : for element in element1 element2 ... elementN; do action $element done Exemple : #! /bin/sh # # fichier_ou_repertoire # # Shell-script de mise en application de l'instruction for. # Affiche le type (fichier ou répertoire) de chaque paramètre. for param in "$@"; do # Pour chaque paramètre... if [ -f "$param" ]; then # C'est un fichier? echo "$param est un fichier." elif [ -d "$param" ]; then # C'est un répertoire? echo "$param est un répertoire." elif ! [ -e "$param" ]; then # N'existe pas echo "$param n'existe pas." else # C'est autre chose? echo "$param n'est ni un fichier, ni un répertoire." fi done Test : user@localhost$ ./fic_ou_rep XXX /etc "./un rep/" /etc/hosts "./un rep/un fic" /dev/lp0 XXX n'existe pas. /etc est un répertoire. ./un rep/ est un répertoire. /etc/hosts est un fichier. ./un rep/un fic est un fichier. /dev/lp0 n'est ni un fichier, ni un répertoire. luser@localhost$ Note : Sous Unix, les espaces sont des caractères légaux dans les noms de fichiers et de répertoires. Sans les guillemets dans le script et sur la ligne de commande, "./un rep/" aurait été interprété comme deux mots distincts : "./un" et "rep/". 12.13.2. Structure Selon En Bourne-shell, la structure algorithmique se traduit par : Selon valeur Cas X : action 1 case $VALUE in X) echo "Value est égale a X";; Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 78 / 81 Essentiel Administration Système - Prépa 1 cas Y : action 2 cas Z : action 3 defaut : FinSelon Y) echo "Value est égale a Y";; Z) echo "Value est égale a Z";; *) echo "Value est différent » esac Les actions à effectuer peuvent être composées de plusieurs commandes sur une ou plusieurs lignes. Pour chaque cas, la série de commandes à exécuter doit être terminée par deux points-virgules que l'on placera de préférence sur une seule ligne. Les cas à tester peuvent employer les caractères génériques autorisés pour les fichiers. Par exemple, les cas "a ? ? ?b", "A*B*C" et [a-z]*[0-9] sont tout à fait valides. Si toutefois un caractère fait partie d'un cas à tester, il faudra l'encadrer par des guillemets pour qu'il ne soit pas interprété. Exemple : #! /bin/sh # # question # # Shell-script de mise en application de l'instruction case. # Pose une question et attend une réponse par oui ou non. # La valeur retournée est 0 pour oui et 1 pour non. retour=X while [ "$retour" = "X" ]; do echo -n "On continue (O/N) ? " read reponse case "$reponse" in o* | O* ) retour=0 ;; [nN]* ) retour=1 ;; "?"* ) echo "Il n'y a pas d'aide disponible" ;; * ) echo "Erreur : entrez [O]ui ou [N]on." ;; esac echo "" done exit $retour Test : user@localhost$ question ; echo "Retour = $?" On continue (O/N) ? bof Erreur: entrez [O]ui ou [N]on. On continue (O/N) ? oui, je veux bien Retour = 0 user@localhost$ question ; echo "Retour = $?" On continue (O/N) ? ??? Il n'y a pas d'aide disponible On continue (O/N) ? Non, merci Retour = 1 user@localhost$ Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 12.13.3. 79 / 81 Structure Lorsque Grâce à la commande trap, on peut déclencher une action sur un événement particulier. La contrainte est que cet événement soit un signal que l'on peut intercepter Note : En utilisant trap –l, il est possible d’obtenir la liste des signaux. Enfin man 7 signal donne des détails supplémentaires sur ces signaux. En Bourne-shell, la structure algorithmique se traduit par : Lorsque le signal SIGNAL survient trap "action" SIGNAL action FinLorsque L'action peut être une commande composée. Dès qu'elle ne se limite pas à un seul mot, elle doit être précisée entre guillemets. Les guillemets et apostrophes situés à l'intérieur doivent être précédés par un anti-slash. - La commande trap utilisée seule donne la liste des actions exécutées pour chaque signal. - La commande "trap SIGNAL" annule l'action à exécuter à l'arrivée du signal SIGNAL. Exemple : #! /bin/sh # exTrap # Shell-script de mise en application de l'instruction case. trap "echo Le script s\'est terminé" EXIT trap "echo Vous avez appuyé sur Ctrl-C" SIGINT trap "echo Vous avez fait: kill $$" SIGTERM trap "echo J\'ai été stoppé et je continue" SIGCONT trap "echo J\'ai rec?u SIGUSR1 ou SIGUSR2" SIGUSR1 SIGUSR2 echo "Processus $$: J'attend un signal..." # # Compte à rebours # i=10 while [ $i -gt 0 ]; do echo -n "$i " sleep 1 let $[ i -= 1 ] done echo "0" Test : user@localhost$ ./exTrap Processus 1658: J'attend un signal... 10 9 Vous avez appuyé sur Ctrl-C 8 7 [1]+ Stopped exTrap user@localhost$ kill -SIGUSR1 1658 user@localhost$ fg exTrap J'ai reçu SIGUSR1 ou SIGUSR2 J'ai été stoppé et je continue 6 5 4 [1]+ Stopped exTrap Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 80 / 81 user@localhost$ kill -SIGUSR2 1658 user@localhost$ kill 1658 user@localhost$ fg exTrap J'ai reçu SIGUSR1 ou SIGUSR2 Vous avez fait: kill 1658 J'ai été stoppé et je continue 3 2 1 0 Le script s'est terminé user@localhost$ 12.14. Fonctions Le Bourne-shell offre la possibilité de définir ses propres fonctions. Bien qu'elles soient internes à un shell, elles s'emploient comme un script externe. Mais leur appel ne provoque pas le lancement d'un sous-shell, donc une fonction a accès à toutes les variables, pas seulement celles d'environnement, et leur modification reste prise en compte lorsque la fonction se termine. Syntaxe : function maFonction() { local var1 local var2="valeur" commande1 commande2 return val; } Le mot-clé "local" permet de définir des variables locales à la fonction. La dernière commande doit être terminée par un point-virgule. On accède aux paramètres d'une fonction comme à ceux d'un script : grâce aux variables $*, $@, $#, $1, $2, ... qui sont temporairement modifiées pendant toute la durée de la fonction. En revanche, $0 ne change pas. Le retour d'une valeur s'effectue grâce au mot-clé return. Si return n'est pas employé, la valeur de retour est celle de la dernière commande exécutée. Attention, l'emploi de la commande exit termine non seulement la fonction mais aussi le script. Une fonction peut être récursive, c'est à dire qu'elle peut s'appeler elle-même. Une fois définie, une fonction apparaît dans la liste des variables. On peut l'exporter vers les autres shells grâce à la commande "export -f maFonction". Exemple : #! /bin/sh # signe2 # Shell-script de mise en application des fonctions. # Affiche le signe d'un nombre et de son carré. # carré(nombre) # Retourne le carré du nombre donné en paramètre. # # Paramètres: $1 -> Le nombre dont on veut le carré # Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs Essentiel Administration Système - Prépa 1 function carré() { return $[ $1 * $1 ] } # affSigne(nombre) # # Affiche le signe du nombre donné en paramètre. # # Paramètres: $1 -> Le nombre dont on teste le signe. # function affSigne() { local signe if [ $n -lt 0 ]; then # n < 0 ? signe=négatif elif [ $n -gt 0 ]; then # n > 0 ? signe=positif else # n = 0 signe=nul fi echo "Le nombre $1 est $signe" } # # Programme principal # echo -n "Entrez un nombre: " read n # Saisie de n affSigne $n # Affichage du signe de n carré $n # Calcul du carré de n n=$? # Récupération du résultat echo "Le carré du nombre choisi est $n" affSigne $n # Affichage du signe de n Test : user@localhost$ ./signe2 Entrez un nombre: -5 Le nombre -5 est négatif Le carré du nombre choisi est 25 Le nombre 25 est positif user@localhost$ ./signe2 Entrez un nombre: 0 Le nombre 0 est nul Le carré du nombre choisi est 0 Le nombre 0 est nul Laboratoire SUPINFO des Technologies Linux Site Web : www.labo-linux.org – E-mail : [email protected] Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs 81 / 81