Utilisation du système Linux - École des Mines de Saint
Transcription
Utilisation du système Linux - École des Mines de Saint
École Nationale Supérieure des Mines SAINT-ÉTIENNE Cycle ISMIN Première année GP : Concepts et Outils pour l’Informatique UP : Environnement Informatique et Réseaux Utilisation du système Linux Philippe Lalevée Septembre 2016 Table des matières I Définitions et vocabulaire 3 1 Système informatique 3 1.1 Rôles d’un système informatique . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Support pour les applications 6 3 Langages de programmation 7 II 8 Utilisation de Linux 4 Présentation de Linux (Unix) 9 5 Première utilisation 11 5.1 Premiers pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 5.2 Interface graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.3 Commandes Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 6 Système de fichiers 15 6.1 Présentation et concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6.2 Manipulation des éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 6.3 Gestion des droits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.4 Le shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6.5 Gestion des activités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Prologue Ce cours constitue les premiers pas de la plupart des apprenants dans le monde des systèmes d’exploitation, en particulier les systèmes Unix. Même si beaucoup utilisent déjà des logiciels de bureautique ou de calcul mathématique, il est important d’étudier les principaux concepts du logiciel de base supportant ces applications, c’est-à-dire le système d’exploitation. 2 L’objectif majeur du cours est de rendre l’utilisateur indépendant ; c’est-à-dire, maîtrisant correctement l’utilisation des principales commandes et la consultation des pages du manuel en ligne de Unix. Pour atteindre cet objectif, les principales commandes Unix sont présentées avec leurs concepts afférents. C’est votre pratique régulière qui vous permettra de maîtriser et d’approfondir ce qui est vu en cours pour convenablement utiliser les commandes. Même si les environnements graphiques multifenêtres permettent de ne taper que peu de commandes, l’utilisateur averti connaît les commandes correspondantes. En outre, aucun environnement graphique multifenêtre ne pourra atteindre la puissance d’expression du « mode commande ». Enfin, les commandes permettent de mieux appréhender et comprendre les concepts des systèmes d’exploitation et leur utilisation quotidienne. C’est pourquoi le cours est une séquence de paires concept et suite de commandes. Voici quelques ouvrages et lectures recommandés. Bibliographie (et sources du cours) — — — — Principes des systèmes d’exploitation, A Silberschatz, P Galvin et G Gagne Les systèmes d’exploitation, A Tanenbaum Mon système Linux, P Lalevée et C Schüller Unix et Linux, JM Léry 3 Première partie Définitions et vocabulaire 1 Système informatique Définition — Un système informatique est un ensemble de matériels et de logiciels destiné à réaliser des tâches mettant en jeu le traitement automatique de l’information. — La communication d’un tel système avec le monde extérieur est assurée par des organes d’accès — Ces organes doivent « adapter » le monde réel au monde numérique — Nécessité de codage, numérisation, échantillonnage, etc. Données Système Données Informatique 1.1 Rôles d’un système informatique Fonctions d’un système La fonction d’un système informatique est la fourniture de prestations (services) capables d’aider à la réalisation de problèmes usuels. Quelques exemples : — gestion de l’information : stockage, désignation, recherche, communication, protection contre les intrusions ou les incidents — préparation et mise au point de programmes — gestion de l’ensemble des ressources pour permettre l’exploitation des programmes (c’est-à-dire création d’un environnement nécessaire à l’exécution du programme) — gestion et partage de l’ensemble des ressources (matériels, informations...) entre l’ensemble des usagers Composants matériels d’un ordinateur Un ordinateur est composé de — Unité centrale : traitements 4 — Mémoire centrale : stockage des données — Périphériques : unités externes (disques, son, écran...) Périphérique Unité Mémoire Centrale Centrale Périphérique Périphérique Composants d’un Système Informatique Programmes application Logiciel Programmes système Langage machine Matériel Équipements physiques Un système informatique est composé de — Matériel : exécutions des tâches — Les équipements physiques — Le langage machine, interface permettant de piloter les équipements — Programmes système : machine virtuelle — Programmes d’application : besoins utilisateur Rôle du système d’exploitation Fonction des programmes système Les programmes système sont des programmes qui remplissent deux grandes fonctions : — gérer les ressources matérielles en assurant leur partage entre les applications et/ou les utilisateurs (sécurité, performance, fiabilité) — présenter aux utilisateurs une interface simplifiée que celle de la machine physique =⇒ Machine virtuelle Définition Un Système d’exploitation (ou système) est composé de l’ensemble des programmes système. L’objectif global de l’architecture logicielle est de fournir une machine virtuelle comme abstraction du matériel utilisé (processeurs, disques, réseaux...). 5 La machine virtuelle a pour rôle d’offrir aux utilisateurs des fonctionnalités adaptées à leurs besoins. Le premier de ces besoins est de masquer les caractéristiques physiques du matériel afin que l’utilisateur ne voit pas de différences entre les différents ordinateurs qu’il utilise. Par exemple, le système Unix est utilisé de la même façon, que l’on travaille sur une machine monoprocesseur dans les salles de TP ou sur le serveur de calcul du service informatique, qui est une machine « multiprocesseurs ». Le second besoin est la distinction des différents niveaux d’abstraction. Un informaticien utilise sans doute directement les commandes du système d’exploitation. En revanche, un utilisateur néophyte accèdera, par exemple, à une application de comptabilité, qui s’occupera des appels des commandes de base du système d’exploitation. En conséquence, l’architecture logicielle suit, telle que dessinée dans ce transparent, une structure en couches logicielles, chacune offrant des services de plus en plus évolués au niveau supérieur. Plus les services sont évolués, moins les utilisateurs ont besoin de connaissances sur la gestion des ressources matérielles. Ce cours étudie la couche logicielle de base constituée du système d’exploitation. Les cours de programmation présenteront des langages et la méthodologie permettant de construire des logiciels applicatifs. Un cours de deuxième année sera consacré à la programmation système proprement dite. Les deux objectifs majeurs d’un système d’exploitation sont de transformer le matériel en une machine utilisable, c.-à-d. fournir des outils adaptés aux besoins des utilisateurs indépendamment des caractéristiques physiques, et d’optimiser l’utilisation des ressources (matérielles et logicielles), donc les partager principalement pour des raisons économiques. Prenons l’exemple d’un service présent sur tous les ordinateurs, le service d’impression. L’utilisateur demande des impressions de documents avec diverses options : titre, bannière, nombre de copies... Le premier objectif du système d’exploitation est de proposer à l’utilisateur une commande d’impression simple offrant les options citées ci-dessus. Le deuxième objectif est de permettre l’accès à tous de toutes les imprimantes disponibles. Cela suppose la mise en oeuvre de mécanismes de gestion des problèmes posés par le partage (synchronisation, gestion des conflits...). D’autres aspects peuvent aussi être considérés dans les objectifs d’un système d’exploitation, comme la sécurité (ne pas mélanger deux impressions), la fiabilité (obtenir un listing correct en cas d’incident, comme par exemple un bourrage papier) et la performance (obtenir le document imprimé dans un délai raisonnable). Ces derniers objectifs ne sont pas toujours obtenus sans faire des compromis. Par exemple, l’intégrité et les contrôles d’accès peuvent obliger l’administrateur de l’ordinateur à supprimer temporairement l’accès aux imprimantes lorsque des utilisateurs malveillants essaient de perturber le fonctionnement normal de cet ordinateur. Autre exemple, ces mêmes contrôles d’intégrité et d’accès prennent du temps et diminuent d’autant les performances de l’ordinateur. L’unité d’exécution (ou de traitement) gérée par le système d’exploitation est l’activité (ou tâche). Une activité correspond à l’exécution d’un ou plusieurs programmes. Un programme est la matérialisation du résultat de l’analyse, de la conception et de la programmation de tout ou partie d’une application. Il est possible que plusieurs activités simultanées et indépendantes correspondent à des exécutions du même programme. Ces différentes exécutions doivent ne pas mélanger leurs données : données en entrées, données intermédiaires pour les traitements, données d’accès aux périphériques, résultats... En outre, un programme peut lancer 6 l’exécution d’autres programmes. Ces derniers peuvent être exécutés successivement dans la même activité ou dans d’autres activités créées pour l’occasion en progressant simultanément et indépendamment. La « multiprogrammation » signifie avoir simultanément en mémoire centrale plusieurs activités candidates à l’exécution et pouvoir faire progresser indépendamment ces différentes exécutions. Le principe de base est d’attribuer l’unité centrale tour à tour aux différentes activités exécutant les différents programmes. Une activité est appelée un processus en Unix. Dans la suite du cours, le terme « processus » sera préféré au terme « activité » puisque le système d’exploitation étudié est Unix. L’une des caractéristiques les plus déterminantes pour classer les systèmes d’exploitation est le nombre d’utilisateurs pouvant potentiellement exécuter des commandes simultanément. Sur un ordinateur individuel, l’exécution d’une commande ne commence que lorsque l’exécution de la commande précédente est terminée. Dans le cas où une commande est en attente pendant une interaction avec un périphérique, par exemple en attente de données que l’utilisateur entre au clavier, le processeur n’est pas utilisé. Un tel système d’exploitation qui ne gère qu’un seul processus à la fois est dit mono-tâche. Avec un système multi-utilisateur, comme Unix par exemple, plusieurs utilisateurs peuvent travailler en même temps. Les services du système d’exploitation tels que le service d’impression peuvent aussi s’exécuter concurremment aux commandes des utilisateurs. Un tel système d’exploitation qui doit gérer plusieurs processus à la fois (système multitâche) est dit multiutilisateur ou à temps partagé. Le processeur est partagé par plusieurs processus qui en obtiennent le contrôle par quantums de temps. Ce type de système d’exploitation comporte entre autre une entité appelée un moniteur multitâche qui optimise l’utilisation de l’unité centrale. 2 Support pour les applications Architecture d’un système d’exploitation Util. 1 Util. 2 ... ... Programmes d’application Système d’exploitation Matériel 7 Util. n Comme cela a été montré précédemment, le système d’exploitation est une couche intermédiaire entre les applications des utilisateurs et le matériel. Du « haut » vers le « bas », le système offre une machine virtuelle aux applications ; et du « bas » vers le « haut », le système gère les ressources entre les applications. Un développeur doit donc connaître la machine virtuelle sur laquelle seront exécutées ses applications. Support pour les applications Interface de Programmation d’Applications (API) — Le système propose une interface de programmation pour accéder aux services, fournis dans des bibliothèques (libraries) — Il propose une « vision uniforme » des données et de leur accès Communication avec le système — Entrée-sortie : échange d’informations entre l’application et le « monde extérieur » selon un protocole précis — Deux interfaces sont privilégiées : le clavier et l’écran (terminal) Sauf exception, les applications n’ont pas d’accès direct au matériel ; parmi ces exceptions, on peut trouver des raisons de performance, de sécurité ou encore de portabilité. Tous les accès au matériel se font donc par l’intermédiaire du système d’exploitation, qui offre pour cela des bibliothèques de services, utilisables par les programmes et les outils. Cela permet en outre de fournir une vision uniforme des flux de données. Par exemple, la copie d’un fichier mp3 vers le fichier arte son utilise le même service que la copie d’un document vers l’imprimante. Ces échanges de et vers les organes externes d’un ordinateur s’appellent les entrées-sorties. Il existe très peu de programmes qui n’en effectuent pas. Pour utiliser les ressources d’un ordinateur, il faut donc maîtriser les instructions que sait traiter un processeur et la gestion des entrées-sorties. 3 Langages de programmation Concept de programme Un programme permet la réalisation d’une tâche : il peut être écrit dans différents langages Langages — sous la forme d’un algorithme : séquence d’actions élémentaires — sous la forme d’un exécutable : ensemble d’instructions permettant la réalisation du programme 8 — sous la forme d’un source : utilisation d’un langage de programmation, intermédiaire entre les deux Nécessité de passer d’un langage à un autre — algorithme −→ source : programmation — source −→ exécutable : compilation Programmation Définition La programmation consiste à traduire un algorithme dans un langage de programmation choisi Équation de Wirth (livre du même nom) Structures de données + Algorithmes = Programmes Étapes de programmation — Analyse des données (flux) du programme — Analyse de l’algorithme permettant de produire les données en sortie à partir des données en entrée Chaîne de développement Étapes du développement Nécessité de disposer d’outils (applications) pour cela... 9 Deuxième partie Utilisation de Linux 4 Présentation de Linux (Unix) GNU/Linux : système multiutilisateur Linux, issu d’Unix, est un système d’exploitation multi-utilisateur et multi-tâche — Le noyau contient les fonctionnalités du système — Les bibliothèques : interface de programmation (API) — Des interfaces homme/machine (IHM) textuelles ou graphiques — Des applications de gestion du système (outils) Applications Outils IHM Bibliothèques (API) Noyau (kernel) Matériel Le système d’exploitation étudié dans ce cours est Unix. Plus particulièrement, la version utilisée à l’EMSE s’appelle GNU/Linux. GNU signifie « Gnu is Not Unix » et comprend une suite très importante de logiciels dits libres. Cette suite de logiciels a d’abord été développée autour d’Unix, d’où son nom pour ne pas la confondre avec Unix. Linux vient des quatre premières lettres du prénom de l’initiateur du projet (Linus Thorsvald, finlandais) et de la dernière lettre de Unix. Plus précisément, la distribution installée est celle du distributeur Ubuntu. Les raisons de ce choix sont multiples, mais n’excluent pas l’intérêt de l’étude d’une autre distribution ou d’une autre version ou encore d’un autre système d’exploitation. La première raison du choix de Unix est son ancienneté et sa stabilité. Unix a été conçu en 1969 aux Bell Labs, chez AT&T par et pour des ingénieurs de développement. Le langage de programmation C a d’ailleurs été conçu initialement pour la refonte de Unix et son portage sur de nombreuses architectures matérielles. Unix a évolué grâce à d’importantes contributions de l’Université de Berkeley. Ces apports ont été capitalisés dans les versions notées BSD et fortement repris par la suite par d’autres versions. Parmi les nouveautés de BSD, il faut noter l’apparition de TCP/IP, qui deviendra plus tard Internet. Les principales versions actuelles sont System VR4, OSF/1, Linux, Solaris, FreeBSD, IBM AIX, HP UX... Pour qu’un système d’exploitation puisse être un Unix, il faut qu’il respecte la norme POSIX. La deuxième raison du choix de Unix est donnée par les orientations qui prévalent dès son origine : simplicité, nombreux logiciels dans le domaine dit « public » (voire « logiciel libre »), documentation importante, boîte à outils étendue, universalité (nombreuses architectures matérielles), confiance (normalisation et certification)... 10 L’architecture logicielle du système d’exploitation Unix possède une structure en couches. Entourant le matériel et en donnant le premier niveau d’abstraction, le noyau Unix ne fait pas l’objet de ce cours, si ce n’est par la présentation générale de quelques concepts tels que les inode du système de fichiers et les processus. Pour ceux que cela intéresse, des enseignements sont dispensés en deuxième année du cycle ISMIN sur la construction interne du noyau Unix. Le noyau Unix est programmé en langage C, c’est donc tout naturellement que son interface est décrite et accessible en langage C. Le langage C est le premier langage de programmation étudié dans le cycle ISMIN. Les logiciels de base au-dessus du noyau sont, classiquement, classés en interpréteurs de commande appelés shell en Unix, et outils et les utilitaires. Le cours porte surtout sur ces deux parties. D’autres couches logicielles existent au-dessus de ces couches basses pour donner des personnalités de gestion de la persistance avec les bases de données, de gestion de la répartition avec les middleware. . . Ces éléments sont étudiés à l’EMSE en deuxième et troisième années. Pourquoi choisir Linux ? Caractère universel d’Unix/Linux Multi-plateforme — Le système est structuré en couches =⇒ portabilité — Unix est présent sur (presque) tous les matériels existants Vision uniforme des données — Tous les flux de données sont « vus » comme des fichiers, avec la même sémantique — L’accès aux services utilise toujours le même mécanisme — Le système est écrit à 95% en langage C La plupart des système Unix sont open source, dont Linux Unix est le premier système d’exploitation qui n’ait pas été conçu pour une architecture matérielle particulière. Le caractère universel de Unix en fait l’un des rares systèmes d’exploitation (voire le seul) rencontré dans presque tous les types d’architecture matérielle existants à ce jour : des micro-ordinateurs aux super-calculateurs, en passant par les smartphones (sous Android) et les box Internet. Cette performance est obtenue par la programmation en un langage lui-même très largement répandu (le langage C), par les nombreux outils en standard et dans le domaine public, par la présence d’outils de communication locale très puissants (les tubes) et par des interpréteurs de commandes aussi très puissants (les shell). Les tubes et le shell sont étudiés plus loin. Utilisation de Linux Postes des salles informatiques — Démarrez l’application VirtualBox — et activez une machine virtuelle Linux 11 Votre machine personnelle — Installation fortement conseillée ! — Machine virtuelle : solution plus simple, mais nécessite des ressources =⇒ virtualbox (www.virtualbox.org) — Double boot : solution plus efficace, mais complexe à mettre en oeuvre =⇒ voir les rootz (install party) 5 Première utilisation 5.1 Premiers pas Session - Connexion — Tout utilisateur doit être « déclaré », enregistré avec un nom de compte (login) et un mot de passe (password) — La session débute par une connexion effectuée à partir d’un nom de compte et du mot de passe associé — La fin de la session intervient lorsque l’utilisateur clôt la session par le sous-menu « clore la session » dans le menu — D’autres connexions sont possibles dans un « terminal » — L’interpréteur de commande dans une fenêtre « terminal » s’appelle le shell — Le shell attend une commande en affichant une invite de commande (prompt) par défaut «$» — À chaque frappe sur ENTRÉE, le shell exécute la commande et affiche l’invite de commande — La connexion se termine avec la commande exit — Attention, Unix distingue les minuscules des MAJUSCULES dans l’écriture des commandes. À l’invitation de la fenêtre graphique d’ouverture de session, l’utilisateur s’identifie en donnant son nom de compte et son mot de passe. Toutes les commandes lancées par l’environnement graphique qui suivent appartiennent à la même session. La session débute par une connexion effectuée à partir du nom de compte. Lorsque l’utilisateur ouvre une fenêtre de terminal en tapant la commande xterm (ou une commande équivalente) ou en cliquant sur l’icône correspondant, une nouvelle connexion est ouverte et présente un message de bienvenue (tenu à jour par l’administrateur système) contenant des informations générales sur les services offerts. Si aucun message ne s’affiche, c’est que l’administrateur système n’a aucune information particulière à donner. L’interpréteur de commande, appelé shell en Unix, indique qu’il attend une commande en affichant un prompt (invitation à taper une requête) qui est par défaut la chaîne de caractères « $ ». La connexion se termine lorsque l’utilisateur se déconnecte normalement par la commande exit, et lorsqu’autorisée, par la commande CTRL-D. La session se termine lorsque l’utilisateur clique sur l’icone de fin de session. La terminaison de la session ferme toutes les fenêtres, y compris les terminaux, c.-à-d. les connexions, non encore fermés. Premières commandes sur l’environnement 12 — id : affiche le nom de connexion et le numéro d’identifiant de l’utilisateur et du groupe auquel il appartient — logname : affiche le nom de connexion — hostname : affiche le nom de la machine — uname : affiche le nom du système d’exploitation — clear : efface l’écran — who : liste les utilisateurs connectés sur le même site sam onsole Aug 2 09:45 pol ttyp2 Aug 2 12:17 (elia) lo ttyp3 Aug 3 11:52 (:0.0) | | | | nom terminal date mahine ou éran — exit : termine le shell (idem CTRL-D si configuré) — su - nom_connexion : change temporairement l’identité de l’utilisateur Voici une première liste de commandes à taper pour connaître son environnement de travail. Pour chacune de ces commandes, il est intéressant de noter les informations suivantes : — id : le nom de l’utilisateur est le nom de connexion ; chaque utilisateur appartient à un groupe d’utilisateurs ; à chacun de ces noms correspond un numéro utilisé par le système d’exploitation. — logname : c’est le même nom d’utilisateur que celui fourni par id. hostname : chaque machine porte un nom pour être repérée dans le réseau. — uname : la commande uname -a donne plus d’informations : le type de machine, le nom de la machine fourni aussi par la commande précédente, le numéro de version du noyau du système d’exploitation (à ne pas confondre avec le numéro de version de la distribution), le nom du système d’exploitation (ici GNU/Linux) et la date de construction (par compilation) du noyau du système d’exploitation. — date : les informations affichées sont relatives au fuseau horaire indiqué avant l’année. — clear : les commandes étant tapées dans une fenêtre de terminal, la commande clear permet d’effacer l’affichage des commandes précédemment tapées et de leurs résultats : la fenêtre ne présente plus que le prompt sur la première ligne. — who : toutes les connexions sont listées ; il y en a donc au moins deux pour la personne utilisant le poste de travail : la connexion d’ouverture de session et la connexion de la fenêtre de terminal utilisée pour taper la commande who ; si un autre utilisateur s’est connecté à distance, son nom apparaît aussi dans la liste. — exit : il est préférable de taper cette commande plutôt que CTRL-D car lorsque plusieurs shell sont démarrés en cascade dans la même fenêtre de terminal, il est plus facile de compter le nombre de exit tapés que de CTRL-D. — su : la commande su permet un changement temporaire d’identité ; la commande demande le mot de passe de cet utilisateur et n’effectue le changement d’identité que si la réponse est correcte ; l’option tiret (su - domy) permet un changement d’identité équivalent à une connexion ; le retour à l’identité réelle s’effectue par exit ou CTRL-D. — xdpyinfo : c’est un utilitaire qui affiche des informations sur le serveur XWindow de la machine sur laquelle la commande est exécutée. Il est utilisé pour examiner les capacités d’un serveur, les valeurs prédéfinies pour les différents paramètres utilisés en communication entre les clients et le serveur et les différents types d’écrans. Mot de passe 13 — Mot de passe = clef d’accès au compte (fichiers, courrier...) — Doit être fiable (pas de prénom, pas de nom usuel, pas de mot courant, pas d’anagramme...) — Le même sur toutes les machines de l’EMSE ! — Attention, le changer régulièrement et dès qu’il existe un doute (que quelqu’un le connaisse) — Pour changer son mot de passe, procédure spécifique à l’EMSE — Avoir un compte implique des droits et des devoirs : se rappeler la charte signée lors de l’ouverture du compte L’école fournit un nom de compte et un mot de passe à chaque utilisateur à l’arrivée à l’EMSE. Pour changer de mot de passe, il faut utiliser un navigateur Web et suivre les instructions : — donner deux fois son mot de passe courant (la première fois pour la connexion distante par telnet, la deuxième pour autoriser le changement de mot passe) — puis deux fois le nouveau mot de passe (la première fois pour le choisir et la deuxième pour le confirmer et éviter les erreurs de frappe donnant un mot de passe non voulu voire non connu). 5.2 Interface graphique Environnement graphique Un environnement graphique consiste en : — Un programme appelé le serveur qui gère l’affichage et contrôle le clavier et la souris — Des programmes appelés clients qui offrent diverses fonctionnalités (terminal, édition de texte, messagerie...) — Un client particulier, le gestionnaire de fenêtres, qui gère les fenêtres (déplacement, « iconification »...) et permet de lancer d’autres clients grâce à des menus. Un environnement de bureau intégré permet l’accès convivial à des applications — Il y en a plusieurs sous Linux : gnome ou KDE — Un environnement de bureau utilise un gestionnaire de fenêtre. gnome utilise metacity — gnome propose un certain nombre d’applications : — nautilus est le gestionnaire de fichiers proposé par gnome — gnome-terminal exécute une fenêtre de terminal. Éditeurs de texte — Un éditeur de texte permet de saisir un texte brut, codé en ASCII ou Unicode, et de l’enregistrer dans un fichier texte. Les styles offerts (souligné, italique...) sont très limités et aucune mise en forme n’est possible. Plusieurs éditeurs de texte sont disponibles sur Unix — L’éditeur Unix standard vi est très puissant mais peu convivial : le mode par défaut au lancement est le mode « commande » — L’autre éditeur parmi les plus populaires est emacs. Il est très puissant aussi ; à l’inverse du précédent, le mode « saisie » est prépondérant — gedit, un client gnome permet aussi de faire de l’édition de texte, sans disposer des 14 fonctionnalités d’Emacs — eclipse est un environnement de développement intégré, comprenant un éditeur 5.3 Commandes Unix Syntaxe des commandes — La syntaxe générale d’une commande Unix est la suivante : nom [-options] [argument1...] où nom est le nom de la commande options représente une ou plusieurs options argument1 est le premier argument — Les options sont composées d’un caractère après un tiret — Il est possible d’accoler plusieurs options Par exemple, -asli pour les options -a -s -l -i — Si l’option demande un paramètre, il est séparé par un espace comme dans -o fichier — Les crochets désignent un élément facultatif, ils ne doivent donc pas être tapés. — Les points de suspension indiquent une répétition possible Par exemple, ls /etc /usr pour plusieurs arguments. — Dans une commande, chaque mot est séparé des autres par un espace ou une tabulation La syntaxe type d’une commande Unix comprend le nom de la commande (premier mot) suivi éventuellement d’options (sous la forme -x) et complété par des arguments parfois optionnels. Dans cette description, les points de suspension (...) signifient qu’un élément (option ou argument) peut être répété plusieurs fois et un nom donné entre crochets ([ nom ]) correspond à un élément facultatif. Le séparateur de mots est le caractère espace et il s’utilise aussi bien pour séparer la commande et les options que les différents arguments entre eux. On peut aussi utiliser la tabulation. Cependant, il existe quelques différences de syntaxe selon les versions, le plus souvent liées à des origines différentes et gardées dans un souci de compatibilité. Par exemple, un argument d’option est le plus souvent séparé par un espace (-x arg) mais il arrive qu’il soit collé à l’option (-xarg). Enfin, les commandes peuvent accepter le format des options à la GNU avec deux tirets (–xxx). Les noms d’option avec un seul tiret contiennent le plus souvent un seul caractère alors que les noms d’option à la GNU sont des mots anglais en entier à plusieurs caractères. Documentation — Toutes les commandes, tous les concepts système... sont documentés dans un manuel accessible en ligne. — Les principales sections de cette documentation sont : — La section 1 pour les commandes Unix utilisés dans ce cours — La section 2 pour les appels système utilisés dans les cours de deuxième année — La section 3 pour les sous-programmes de bibliothèques utilisés dans les cours d’algorithmique et de programmation en langage C — La section 4 pour les formats de fichiers Unix : passwd, host... — La section 7 concerne les fichiers spéciaux — La section 8 concerne l’administration (démarrage, génération...) Les commandes Unix présentent quelques différences, particulièrement au niveau des options selon l’origine des systèmes (System V, OSF/1, BSD, GNU/Linux...). Chaque utilisateur a donc 15 intérêt à consulter la documentation propre au système utilisé qui est la documentation de référence absolue. Cette documentation est disponible sous forme électronique. Avant d’étudier la commande man permettant de la consulter, voici son organisation. Tout d’abord, la documentation est classée en huit sections numérotées de 1 à 8. On peut également trouver d’autres sections, comme la section l pour les ajouts locaux ou la section n pour les logiciels diffusés par les news. De même, on trouve parfois un suffixe précisant le domaine (M pour maintenance, C pour communication. . .). D’autre part, chaque section contient une entrée intro définissant la liste des éléments de la section avec leurs particularités. Utilisation de la documentation — Dans une fenêtre de terminal, la commande man permet d’accéder à une page du manuel en ligne Par exemple, man id pour la page de la commande id — Les rubriques des pages du manuel en ligne sont : — NAME pour le nom de la commande — SYNOPSIS pour le syntaxe — DESCRIPTION pour le fonctionnement détaillé. — Chaque page du manuel en ligne est présentée par morceau selon la taille de la fenêtre de terminal. — Pour se déplacer dans une page du manuel, utilisez les touches suivantes : — ENTRÉE ou RETURN pour avancer d’une ligne — ESPACE pour avancer d’une page — b pour reculer d’une page — / suivi d’un mot pour rechercher ce mot — n pour rechercher l’occurrence suivante du même mot — q pour quitter l’aide 6 Système de fichiers 6.1 Présentation et concepts Présentation et concepts root / users ismin2013 boot dev bin dupont src lib etc prog.c var — Un élément de l’arborescence est repéré par son nom précédé de — Son chemin « absolu » et unique depuis la racine commençant par « / » Par exemple : /users/ismin2013/dupont/src/prog.c — Son chemin « relatif » par rapport au répertoire courant Par exemple : src/prog.c, prog.c... — Remarquez le double rôle de « / » — Au début du nom absolu pour indiquer la racine de l’arborescence 16 — Ailleurs comme séparateur de répertoires L’un des rôles importants du système d’exploitation est de donner accès aux données à manipuler, sachant que les programmes, dont font partie les commandes, sont eux aussi repérés par leur contenant, les fichiers. Cette section présente les concepts afférents à l’organisation et la manipulation (copie, renommage...) des données : les répertoires, les fichiers (ordinaires) et les fichiers spéciaux. La section se termine par le concept de droit d’accès aux données. La structure du système de fichiers se présente comme un arbre inversé comportant des noeuds qui repèrent les répertoires et des feuilles les fichiers. Le point d’entrée de l’arborescence est appelé racine et est noté par un slash (/). Tout élément de l’arborescence peut être référencé de deux façons, soit par rapport à la racine (le nom de l’élément est dit « absolu »), soit par rapport au répertoire de travail courant (le nom est alors dit « relatif »). On peut remarquer que le caractère slash joue un double rôle : en premier caractère d’un nom, il symbolise la racine et caractérise un nom absolu alors que partout ailleurs il ne sert que de séparateur de noms. Commandes pwd, cd et ls Dans un terminal, essayez les commandes suivantes : — pwd : affiche le nom absolu du répertoire de travail — cd : change le répertoire de travail — Avec argument : nom du répertoire destination (en absolu ou en relatif) — Sans argument : retour au répertoire de connexion — ls : liste les entrées d’un répertoire — Sans argument : les entrées du répertoire de travail — Avec arguments : les entrées repérées par les arguments Par exemple, ls, ls /, ls /usr, ls .bashrc — Dans la commande précédente (ls .bashrc), le fichier dont le nom commence par un point (« . ») est appelé un fichier caché — La commande ls possède de nombreuses options par exemple, –a pour visualiser les fichiers cachés, –l pour tous les attributs (type, droits, liens physiques, propriétaire, groupe, taille, date, nom) L’utilisateur qui se connecte est situé sous son répertoire de connexion et il peut en connaître le nom avec la commande pwd (print working directory) qui affiche le nom absolu du répertoire courant (ou répertoire de travail). Pour en connaître le contenu, il doit utiliser la commande ls qui liste les entrées (non cachées) du répertoire courant. L’utilisateur qui veut visualiser le contenu d’autres répertoires peut utiliser la commande ls avec le nom de ces répertoires en arguments ou se déplacer dans l’arborescence avant d’utiliser cette commande sans argument. La commande cd permet un déplacement sous le répertoire passé en argument. Quelle que soit sa position dans l’arborescence, l’utilisateur peut à tout moment revenir directement à son répertoire de connexion grâce à la commande cd sans argument. La commande ls permet d’afficher les entrées d’un répertoire avec plus ou moins d’informations selon les options utilisées. Par défaut, ls affiche seulement le nom des entrées dites non cachées, c.-à-d. celles dont le nom ne commence pas par un point. Pour visualiser les entrées cachées, il 17 faut ajouter l’option -a pour les afficher toutes. La commande ls dispose de beaucoup d’options dont la plus utilisée est l’option -l qui permet d’afficher les principaux attributs des entrées : type, droits, liens, propriétaire, groupe, taille, date et nom. Structure de l’arborescence — L’arborescence contient 3 types d’éléments : — Des répertoires qui sont des sortes de dossiers ou classeurs — Des fichiers ordinaires contenant une suite séquentielle d’octets — Des fichiers spéciaux repérant les périphériques — Le système d’exploitation possède une vision uniforme de ces entrées grâce au concept d’inode : même syntaxe, mêmes commandes, mêmes protections — Un inode contient ces informations : — Type de l’élément (fichier, répertoire, fichier spécial) — Identité du propriétaire et du groupe — Droits d’accès Dates de modification... — Autres (taille, liens, adresses...) La caractéristique principale du système de fichiers Unix est d’offrir une vision uniforme à l’utilisateur malgré la diversité des types d’éléments : répertoires, fichiers (traditionnels ou ordinaires) ou fichiers spéciaux. Les fichiers spéciaux représentent les périphériques. Ainsi, l’utilisateur dispose des mêmes commandes ou primitives, d’une même syntaxe et des mêmes possibilités (protection, identification. . .) pour accéder à un élément qu’il soit un répertoire, un fichier ordinaire ou un fichier spécial. Ensuite, le noyau effectue en interne un aiguillage sur le programme adapté selon la nature de l’élément. Cette uniformité est assurée grâce à la notion d’inode qui est une structure de 64 octets servant de descripteur pour toute entrée du système de fichiers. Clairement, cette uniformité a des limites : par exemple, on ne peut pas créer une entrée associée à un périphérique comme on crée un fichier ordinaire et certaines commandes sont spécifiques à un type d’élément (comme par exemple changer de répertoire courant). On retrouve aussi quelques différences au niveau de l’inode, en particulier l’adressage des blocs de données d’un fichier ordinaire est remplacé dans le cas d’un périphérique par un couple d’entiers servant d’index pour repérer le bon pilote. De même, certaines informations n’ont pas de signification pour tous les types d’éléments comme par exemple la taille d’un fichier qui ne représente rien pour les fichiers spéciaux. Pour pouvoir stocker des informations sur un support magnétique tel qu’un disque, celui-ci doit d’abord être formaté. Ensuite, le disque est découpé en partitions (ou disques virtuels), chacune étant alors utilisée comme un disque à part entière et se présente comme une suite de N blocs numérotés de 0 à N-1. Pour stocker des données sur une partition, il faut y créer une structure adaptée au type de système de fichiers. Cette opération a pour objet de distinguer quatre parties sur le disque et d’y créer un répertoire racine. Le premier bloc (bloc 0) est réservé pour contenir un programme chargeur (amorce) qui sert au démarrage du système. Bien que seul le disque de démarrage ait besoin de cette amorce, le bloc 0 de chaque système de fichiers est réservé pour des raisons d’homogénéité. 18 Le bloc suivant (bloc 1), appelé « super-bloc », sert de descripteur du système de fichiers. Il est pour un système de fichiers l’équivalent de l’inode pour un fichier. Il contient les caractéristiques du système de fichiers telles que son nom, la date de mise à jour, la taille des blocs... S’y trouvent également des informations de gestion telles que le début des listes d’inodes et de blocs libres. Un certain nombre de blocs à partir du numéro 2 sont réservés pour contenir la liste des inodes. Ce nombre d’inodes détermine le nombre maximal de fichiers que peut contenir ce système de fichiers. Les blocs suivants (du premier bloc après la liste des inodes jusqu’au dernier) servent pour stocker les blocs de données, ce qui comprend les blocs de données effectives, c.-à-d. le contenu réel des fichiers, les blocs libres et les blocs de chaînage qui servent pour l’adressage. Unix permet la création de fichiers vides : il suffit de créer un inode seul sans lui associer de données. Un système de fichiers peut être saturé de deux manières, soit par manque de blocs de données libres, soit par manque de blocs d’inodes. Fichiers ordinaires Un fichier ordinaire ne possède aucune structure particulière : c’est une suite d’octets Voici les commandes de base pour consulter le contenu d’un fichier de texte : — cat fich, more fich : affichage simple et page par page — head fich, head –n fich : affichage des 10/n premières lignes — tail fich, tail –n fich : affichage des 10/n dernières lignes — wc fich : affichage du nombre de lignes, de mots, de caractères — Options –l, –w et –c pour les nombres de lignes, de mots et de caractères. Un fichier ordinaire ne comporte aucune structure particulière, c’est une suite d’octets et le seul type d’accès est la lecture séquentielle. Un fichier ordinaire est composé d’une référence dans un répertoire (association entre son nom et son numéro d’inode), d’un inode et des blocs de données associés. Périphériques — Un périphérique est un matériel (physique) connecté à l’unité centrale d’un ordinateur : disque, souris, écran... — Les périphériques sont repérables par un nom dans l’arborescence (sous /dev) — Un pilote de périphériques (driver) est une fonction du système d’exploitation via les opérations classiques autorisées par les inodes : open, read, write, close — Un pseudo-périphérique est une entrée gérée comme un périphérique bien que non associée à un élément physique — La première utilisation est le repérage de périphériques dits virtuels, c.-à-d. des parties de périphériques (physiques), par exemple : les écrans virtuels de l’écran (physique), les partitions (logiques) du disque (physique)... — La seconde utilisation est la mise en évidence de fonctionnalités du système d’exploitation dans l’arborescence, par exemple : la « poubelle » qui a pour nom /dev/null, ou la génération de nombres aléatoires (/dev/random) 19 Unix offre à l’utilisateur une vision uniforme des entrées-sorties en attribuant un nom dans l’arborescence à tous les périphériques, ce qui leur confère les mêmes attributs qu’aux fichiers. Sous GNU/Linux, le répertoire /dev (devices) est prévu pour contenir toutes les entrées des périphériques tels que hdX (X : a à z) pour les disques, fd9 (0 à 9) pour les lecteurs de disquettes... Le système d’exploitation effectue un aiguillage interne soit vers le système de fichiers, soit vers les pilotes de périphériques, en distinguant deux modes d’utilisation : bloc et caractère. Il existe un pilote pour chaque type de périphérique. L’inode d’un périphérique contient deux entiers qui sont le majeur (major number) et le mineur (minor number). Le majeur sert d’index dans l’une des tables afin de sélectionner le pilote du périphérique concerné. Un pilote de périphérique pouvant gérer plusieurs unités du même type, par exemple plusieurs écrans ou plusieurs disques, le mineur permet de caractériser l’unité particulière du type de périphérique concerné. Parmi les périphériques en mode bloc, on trouve principalement les disques physiques, les partitions, les bandes magnétiques, les disquettes... La dernière caractéristique du mode bloc est la plus importante car elle signifie un accès aux informations en deux étapes : un transfert du disque vers la mémoire du système d’exploitation et une copie entre la mémoire du système d’exploitation et l’espace utilisateur. Le noyau garde la mémoire des données qu’il a lues. La lecture d’une information peut donc ne pas conduire à un accès au disque mais seulement à une copie de mémoire à mémoire. Il peut alors arriver qu’en cas de coupure de courant par exemple, il y ait incohérence, car des données en mémoire n’ont pas été écrites sur le disque. Aussi, lors du démarrage du système d’exploitation, si celui-ci s’aperçoit qu’il y a eu arrêt brutal de la machine, donc potentiellement des incohérences, la commande fsck (file system check) teste et rétablit si possible automatiquement la cohérence. Les principaux périphériques en mode caractère sont les écrans, les imprimantes, les lignes de communication... Les accès sont quasiment identiques à ceux liés aux fichiers ordinaires. La lecture standard sur ce type de périphérique s’effectue par ligne, c.-à-d. que les caractères lus ne sont transmis qu’après la lecture d’un code de validation (NEWLINE). Lors de la lecture, diverses opérations, en particulier des corrections (effacement de caractères, de mots ou de la ligne) sont possibles grâces à des codes de contrôle. Il existe un autre mode de lecture, appelé brut (raw), dans lequel les caractères sont transmis au fur et à mesure. Ce mode de lecture caractère par caractère est utilisé par divers utilitaires tels que des éditeurs, des logiciels de communication... Les périphériques en mode bloc peuvent aussi être gérés en mode caractère pour permettre certaines opérations avec de meilleures performances. Pour cela, un périphérique dispose d’une entrée dans chacune des deux tables. Le terme pseudo-périphérique qualifie des entrées qui sont gérées comme des périphériques donc par des pilotes bien qu’elles ne soient pas associées à des éléments physiques. On distingue deux catégories de pseudo-périphériques, ceux associés à des périphériques virtuels et d’autres liés à des fonctionnalités du système d’exploitation. Un périphérique virtuel correspond à une partie d’un périphérique physique et les principaux sont les écrans (ou terminaux) virtuels 20 et les partitions (ou disques logiques). Un terminal virtuel correspond à une fenêtre dans un environnement multifenêtre ou à une connexion distante via un réseau local. Tous les systèmes de fichiers disposent de quatre autres pseudo-périphériques standards, groupés comme les périphériques sous /dev et qui s’appellent null, zero, mem et tty. L’élément null sert de poubelle. Par exemple, il sert à créer des fichiers vides comme ceci : cp /dev/null fichier_vide. Les éléments tty et mem repèrent respectivement le terminal et l’image mémoire associés au processus en cours d’exécution. L’élément zero permet de générer des valeurs nulles. Répertoires — Le contenu d’un répertoire est un catalogue qui met en correspondance des noms de fichiers, de sous-répertoires avec des numéros d’inode — Dès la création par la commande mkdir rep, deux entrées existent : — La référence au répertoire parent (du répertoire créé) notée « .. » — La référence au répertoire lui-même notée « . » — La suppression s’effectue avec la commande rmdir rep — Pour supprimer un répertoire, il faut qu’il soit « vide » : ne contenir que « .. » et « . » — L’affichage du contenu d’un répertoire s’effectue par la commande ls — L’option -a permet de visualiser les entrées . et .. — L’option -l permet d’afficher les informations des inodes Un répertoire Unix est en fait un catalogue, c.-à-d. la mise en correspondance entre des noms de fichiers et des numéros d’inode. Dès sa création avec la commande mkdir, tout répertoire contient deux entrées qui sont notées « . » (point) pour le répertoire lui-même (auto-référence) et « .. » (point point) pour le répertoire de rattachement (parent) dans l’arborescence. Pour supprimer un répertoire avec la commande rmdir, il faut que celui-ci soit vide, c.-à-d. ne contienne que les deux éléments de départ (« . » et « .. »). Pour la racine (/), les deux éléments « . » et « .. » sont confondus. Principaux répertoires — — — — — — — — — — /boot : fichiers de démarrage du système /root : espace de travail de l’administrateur /etc : fichiers de configuration des programmes système /dev : périphériques /var : fichiers de données des programmes système /usr : programmes et outils pour les utilisateurs /bin et /usr/bin : commandes Unix standards /lib et /usr/lib : bibliothèques /home : espaces de travail des utilisateurs /tmp : fichiers temporaires 21 6.2 Manipulation des éléments Copie d’éléments Commande cp NOM cp - Copier des fichiers et des répertoires SYNOPSIS cp [OPTION]... [-T] SOURCE CIBLE cp [OPTION]... SOURCE... RÉPERTOIRE cp [OPTION]... -t RÉPERTOIRE SOURCE... DESCRIPTION Copier la SOURCE vers la CIBLE, ou de multiples SOURCEs vers le RÉPERTOIRE. La commande cp accepte deux syntaxes : — La première forme avec deux noms de fichiers en arguments (cp fic1 fic2) permet de dupliquer le premier fichier pour créer le deuxième. Cette commande crée une nouvelle entrée dans le répertoire, un nouvel inode et duplique les blocs de données. — La deuxième forme accepte deux arguments ou plus dont le dernier est un nom de répertoire (cp fic1 ... rep), ce qui permet de copier tous les arguments précédents (des fichiers) sur ce répertoire en leur donnant le même nom relatif. Si on se place sur le répertoire de destination avant de faire la copie, on peut donner le nom du répertoire courant avec son auto-référence (point). Il est intéressant d’utiliser les options -l et -i de la commande ls pour constater les différences entre un original et sa copie au niveau des attributs. En particulier, la comparaison montre que les numéros d’inode (premier champ) sont différents, ce qui prouve une duplication des données. Renommage ou déplacement d’éléments Commande mv NOM mv - Déplacer ou renommer des fichiers SYNOPSIS mv [OPTION]... [-T] SOURCE CIBLE mv [OPTION]... SOURCE... RÉPERTOIRE mv [OPTION]... -t RÉPERTOIRE SOURCE... DESCRIPTION Renommer la SOURCE en CIBLE ou déplacer la SOURCE vers le RÉPERTOIRE. Renommer un fichier correspond en réalité au déplacement d’une entrée d’un répertoire. D’ailleurs, la commande s’appelle mv (move). Cette commande accepte les deux mêmes syntaxes que cp, c.-à-d. soit deux arguments pour renommer le premier fichier par le second, 22 soit deux arguments ou plus avec en dernier un nom de répertoire, ce qui revient à déplacer les premiers arguments sur le répertoire donné en dernier avec les mêmes noms relatifs. De la même manière que pour cp, si on se place sur le répertoire de destination avant de faire le déplacement, on peut donner le nom du répertoire courant avec son auto-référence (point). La commande mv permet aussi de renommer des répertoires. La commande ls -li permet de montrer que le numéro d’inode n’a pas changé, ce qui confirme que ni l’inode, ni les blocs de données sur disque n’ont été modifiés. Liens et raccourcis — Lien = chemin d’accès à un fichier — Commande ln : création d’un lien, c.-à-d. ajout d’une entrée dans un répertoire $ ln R1/fbis R2/lien — Deux (ou plus de deux) chemins d’accès à un même contenu — Nom « local » (alias) plus court, nom « générique » (par exemple, console) — Pas de liens entre SF différents — À noter : les liens symboliques avec l’option -s, équivalents aux raccourcis Windows Une entrée d’un répertoire permettant l’accès à un fichier via son inode s’appelle un lien (référence ou chemin d’accès) et Unix permet la création de liens multiples sur un même élément. Chaque création d’un lien (avec la commande ln) consiste à ajouter une entrée dans un répertoire avec le même numéro d’inode et le même nom (possible uniquement si répertoires différents) ou un autre nom. Dans l’inode, le compteur de lien qui vaut un à la création du fichier est incrémenté d’une unité à chaque nouveau lien. Il y a plusieurs raisons d’utiliser des liens : — Un premier usage permet d’utiliser un nom local donc plus court pour référencer un élément. Ici, le lien joue le rôle d’alias et il évite une frappe longue, ce qui diminue le risque d’erreur. — Les liens servent aussi à définir différents noms logiques pour un même élément. Par exemple, un administrateur qui représente ses partitions par des noms logiques n’a que des liens à modifier lorsqu’il veut changer un disque et toutes ses procédures (démarrage, sauvegarde. . .) continuent à être opérationnelles si elles utilisent les noms logiques. Suppression d’éléments Commande rm NOM rm - Effacer des fichiers et des répertoires SYNOPSIS rm [OPTION]... FICHIER... 23 DESCRIPTION Le programme rm efface chaque fichier listé. Par défaut, il n’efface pas les répertoires. Exemples de rm — Suppression d’un lien : $ rm R1/fbis Fichier toujours accessible par R2/lien — Suppression du dernier lien = libération totale $ rm R2/lien La suppression d’un élément de l’arborescence, avec la commande rm (remove), est en fait la suppression d’un lien, c.-à-d. la mise à zéro du numéro d’inode, la décrémentation du nombre de liens et dans le cas où ce lien est le dernier, la libération des blocs de données et de l’inode. Par conséquent, un fichier ordinaire existe tant qu’il existe au moins un lien sur celui-ci, qu’il s’agisse du nom initial ou d’un lien établi ensuite. Ce type de lien présente trois limitations. Tout d’abord, on ne peut pas établir de liens entre systèmes de fichiers différents, chacun numérotant ses inodes à partir de deux. Ensuite, on ne peut pas non plus établir un lien sur un répertoire. D’ailleurs, pour un répertoire, le nombre de liens correspond au nombre de sous-répertoires qu’il contient (y compris les deux entrées « . » et « .. »). Enfin, l’inode contenant l’identifiant du propriétaire des données, si un autre utilisateur crée un lien sur le même fichier, le premier propriétaire ne peut pas seul décider de diminuer son quota de blocs de données. On trouve souvent un alias qui redéfinit la commande rm en intégrant l’option -i (alias rm=’rm -i’). Cette précaution est très utile pour des utilisateurs débutants car elle permet d’éviter des suppressions effectuées par erreur comme par exemple à la suite d’une erreur de frappe. Avec l’alias ci-dessus, l’utilisateur va s’apercevoir de son erreur quand le système d’exploitation demandera confirmation avant de supprimer un fichier à garder et il pourra arrêter la commande avec CTRL-C. Accès au contenu — Quelques commandes simples : — cat fich : affichage simple (et concaténation) — more fich ou less fich : affichage par page Requêtes avec touches espace, RETURN, help... — head fich : affichage début (10 lignes) — head -n fich : affichage début (n lignes) — tail fich : affichage de la fin (10 lignes) — tail -n fich : affichage de la fin (n lignes) — wc fich : affichage du nombre de lignes, de mots, de caractères — wc -l fich : affichage du nombre de lignes — wc -w fich : affichage du nombre de mots — wc -c fich : affichage du nombre de caractères — file fich : affichage de la nature du fichier Les premières commandes de ce transparent sont des premières commandes du type filtre. Un filtre est un programme qui réalise un traitement sur un flot de données, ici caractérisé par un fichier texte en entrée, pour fournir un flot de données en sortie. Ce concept plutôt classique prend tout son intérêt grâce aux différentes formes que peuvent prendre les flots de données. Ce point sera détaillé dans la section sur le shell avec les redirections et les tubes. 24 Les filtres présentés maintenant sont des filtres dits « simples ». Ces commandes acceptent de très nombreuses options que nous n’avons pas le temps ni l’espace de décrire ici. La commande de base pour afficher le contenu d’un fichier de texte est cat suivie du nom du fichier. Cette commande accepte plusieurs noms de fichiers comme arguments, ce qui permet de les concaténer (cat signifie concatenate) en un seul flot de sortie. Sans argument, la commande cat lit ce que l’on appelle l’entrée standard, c.-à-d. par défaut le clavier, ce qui permet de créer rapidement des petits fichiers. La fin de fichier ou fin de saisie est matérialisée par la frappe des touches CTRL-D. La commande cat n’est guère pratique avec des fichiers dont la taille dépasse celle de l’écran car l’affichage défile de façon ininterrompue et seules les dernières lignes affichées restent visibles sur l’écran à la fin de la commande. La commande more (ou less) prend en compte le nombre de lignes de l’écran pour offrir un affichage page par page. Cette commande affiche une page du fichier suivie d’une ligne d’information avec le pourcentage de texte déjà affiché et elle attend une requête du clavier. Si la commande est appelée avec plusieurs arguments, elle affiche en plus un en-tête avec le nom du fichier entre deux lignes constituées de caractères deux points ( :). Les requêtes les plus utilisées sont espace (ou z) pour afficher la page suivante, d pour afficher la demipage suivante, RETURN pour afficher la ligne suivante, v pour appeler un éditeur sur le fichier courant et q (ou Q) pour quitter la commande avant la fin. Enfin, la requête h donne toutes les requêtes disponibles. La commande tail affiche la fin du fichier passé en argument. Par défaut, tail affiche les dix dernières lignes. Cette commande permet également de suivre dynamiquement l’évolution d’un fichier. En utilisant l’option -f, elle affiche la fin du fichier puis elle entre dans une boucle infinie avec affichage chaque seconde de toute nouvelle information qui est ajoutée au fichier. La commande head affiche le début du fichier passé en argument. Par défaut, head affiche les dix premières lignes. Cette commande ressemble à la commande tail mais elle est plus limitée au niveau des options. En revanche, elle peut accepter plusieurs fichiers comme arguments. Dans ce cas, la commande head affiche avant le début de chaque fichier, un en-tête avec le nom du fichier. Toujours pour un fichier de texte, la commande wc (word count) permet de compter les lignes, les mots et les caractères. Lorsque la commande est appelée avec plusieurs arguments, elle affiche également un total cumulé. Avant d’appliquer un filtre sur un fichier, il est préférable de s’assurer que le fichier contient du texte. La commande file permet de le savoir. Dans le cas d’un fichier texte, elle précise si les caractères sont uniquement des caractères ASCII ou s’ils contiennent d’autres caractères, par exemple des caractères accentués ISO-8859-X (X dans [1-15]). 6.3 Gestion des droits Droits d’accès — À tout élément de l’arborescence sont associés trois droits d’accès — En lecture : r pour read — En écriture : w pour write — En exécution : x pour execute 25 — Pour trois catégories d’utilisateurs — Le propriétaire : u pour user — Le groupe : g pour group — Les autres : o pour others — Par exemple : rwx r-x r– — lecture, écriture et exécution autorisées pour le propriétaire — lecture et exécution autorisées pour le groupe — lecture seule autorisée pour les autres — Un groupe est un ensemble d’utilisateurs ayant les mêmes droits d’accès par rapport à un fichier d’un utilisateur ; vous appartenez au groupe de votre promotion Parmi les informations contenues dans l’inode de tout élément de l’arborescence, on trouve les droits d’accès dont les deux principes de base sont la simplicité et la confiance accordée aux utilisateurs. La protection d’un élément repose sur trois droits d’accès qui contrôlent les trois opérations de lecture (droit r pour read), d’écriture (droit w pour write) et d’exécution (droit x pour execute). Ces trois droits (rwx) sont appliqués à trois catégories d’utilisateurs qui sont le propriétaire (u pour user), (les membres de) son groupe d’appartenance (g pour group) et les autres utilisateurs (o pour other). Les identifiants des deux premières catégories sont donnés par la commande id. Le système de fichiers distingue trois catégories d’utilisateurs mais sans aucune hiérarchie entre elles. Ainsi, le contrôle des accès s’effectue en commençant par la recherche selon un ordre déterminé de la catégorie (propriétaire, groupe puis les autres), et ensuite, il se poursuit par la vérification du droit concerné. Les droits d’accès pour une catégorie ne servent à rien pour les autres catégories. Par exemple, si un fichier possède le droit d’exécution pour les catégories o et g mais pas pour le propriétaire, alors le propriétaire se voit refuser une demande d’exécution alors que tous les autres peut exécuter ce fichier. Tout système de protection doit offrir des mécanismes permettant certaines opérations avec des droits différents, en général plus puissants, comme par exemple la lecture du fichier contenant les mots de passe lors de la connexion. Ces mécanismes ne sont pas étudiés dans ce cours. Nous ne verrons pas les droits s pour l’utilisateur (bit SUID) ni pour le groupe (bit SGID). Pour information, il existe un dernier droit, le droit t (sticky bit) qui ne sera pas non plus présenté. Pour des informations sur ces droits, se référer à la bibliographie et aux pages du manuel en ligne. Tout système d’exploitation a également besoin de comptes spécialisés, avec des droits importants, pour des tâches d’administration. Sous Unix, il existe un compte root dit compte du super-utilisateur (ou administrateur), caractérisé par son numéro d’utilisateur (l’UID zéro) qui lui confère les pleins pouvoirs. Pour toute action avec cette identité, le système ne contrôle pas les droits d’accès et autorise l’opération. Modification des droits Modification avec la commande chmod selon 2 méthodes : 26 1. Valeur numérique calculée sur le poids de rwx : r = 4, w = 2, x = 1. Par exemple : — chmod 741 fichier −→ rwx r– –x — chmod 600 fichier −→ rw- — — 2. Valeur littérale : — Catégories : u, g, o, ou tous (a = all = ugo) — Opérations : ajout (+), retrait (-), ou affectation (=) — Droits : r, w, x et d’autres (t, s...) Par exemple : (fichier avec les droits rw- — —) — chmod g+r fichier −→ rw- r– — — chmod ug+x fichier −→ rwx r-x — — chmod a=r fichier −→ r– r– r– — chmod u+wx fichier −→ rwx r– r– — chmod go-r fichier −→ rwx — — La commande chmod (chmod droits fichier...) permet de modifier les droits d’accès qui peuvent être donnés sous une forme numérique absolue ou sous une forme littérale relative. La modification des droits d’un fichier n’est autorisée qu’à son propriétaire et bien sûr au superutilisateur. Une valeur numérique est composée de trois chiffres indiquant dans l’ordre, les droits du propriétaire, ceux du groupe et ceux des autres. Chaque chiffre est obtenu par addition des valeurs des droits à positionner en sachant que le droit r (lecture) vaut quatre, le droit w (écriture) deux et le droit x (exécution) un. La valeur littérale est composée de trois caractères précisant dans l’ordre la catégorie concernée, l’opération à effectuer et le droit à modifier. La catégorie peut prendre une ou plusieurs valeurs parmi les lettres u pour le propriétaire, g pour le groupe, o pour les autres ou a pour l’ensemble (a équivaut à ugo et c’est la valeur par défaut). L’opération peut prendre une valeur parmi les caractères + pour l’ajout, - pour le retrait ou = pour l’affectation qui correspond au positionnement du droit indiqué et au retrait des autres. Le droit peut prendre une ou plusieurs valeurs parmi les lettres r pour la lecture, w pour l’écriture ou x pour l’exécution. Le droit peut être omis si on souhaite supprimer tous les droits. Cas particuliers — Toute opération sur un fichier contrôlée à partir des droits r, w et x — Création d’un fichier = ajout du numéro d’inode et du nom dans un répertoire −→ création contrôlée par le droit w du répertoire d’accueil — Idem pour le renommage (changement de nom) et la suppression (mise à 0 du numéro d’inode) Attention : suppression d’un fichier conditionnée par les droits du répertoire et non pas ceux du fichier — Pour un répertoire, x autorise la traversée et le positionnement sous celui-ci — Pour un fichier spécial, x n’a pas de signification Toutes les opérations sur un fichier sont contrôlées à partir des droits r, w et x. Aussi, pour toute opération autre qu’une lecture, une écriture ou une exécution, il faut examiner à quoi elle correspond exactement. La création d’un fichier qui correspond à l’écriture d’une entrée dans un répertoire est contrôlée par le droit d’écriture dans ce répertoire. Le renommage ou le déplacement d’un fichier sont 27 aussi contrôlés par le droit d’écriture dans les répertoires. En outre, la suppression d’un fichier étant réalisée par la mise à zéro du numéro d’inode dans le répertoire, c’est encore le droit d’écriture qui s’applique. Un utilisateur peut donc avoir le droit de supprimer un fichier même s’il n’a pas le droit de le lire, de le modifier ni de l’exécuter. D’autre part, le droit x d’un répertoire autorise la traversée et le positionnement sous celuici. Un utilisateur peut donc avoir accès à un fichier sans avoir le droit de lire le contenu du répertoire qui le référence ni des répertoires parents dans l’arborescence. C’est une manière de protéger par le secret des données tout en donnant accès à certains utilisateurs avertis. 6.4 Le shell Généralement, les systèmes d’exploitation proposent deux manières de lancer des commandes. La première d’entre elles a été décrite précédemment : c’est l’interface graphique gnome pour GNU/Linux à l’EMSE. La deuxième forme a aussi commencé à être utilisée, c’est ce que l’on appelle le « mode commande » via les fenêtres de terminal. Le « mode commande » est présenté plus en détail dans cette section par le biais de l’interface correspondante appelée le shell en Unix. Comme cela a déjà été indiqué auparavant, même si les environnements graphiques multifenêtres permettent de ne taper que peu de commandes, l’utilisateur averti connaît les commandes correspondantes et aucun environnement graphique multifenêtre ne pourra atteindre la puissance d’expression du « mode commandes ». En outre, les commandes permettent de mieux appréhender et comprendre les concepts. Cette section définit le double rôle d’un shell : interpréteur et langage de programmation. Le shell est l’interface homme/machine Unix. Il en existe plusieurs qui diffèrent par la syntaxe mais aussi par les fonctionnalités offertes. Ici, nous étudions bash. Le shell possède un double rôle, celui d’interpréteur de commandes ainsi que celui de langage de programmation et à ce titre, il gère des variables et des fonctions et dispose de structures de contrôle (boucles, conditionnelles...). Ces fonctionnalités servent essentiellement pour l’écriture de procédures (appelées shell-scripts) qui permettent à chacun de paramétrer une session et de développer ses propres outils. Dans ce module d’introduction, le shell est principalement étudié dans son premier rôle d’interpréteur de commandes. Espace de travail — Chaque utilisateur dispose de son propre espace de travail — qu’il doit gérer : permissions, contenus, archiver, organiser... — qu’il doit utiliser : documents, TP, projets... — Chaque utilisateur appartient à un groupe : promotion P2013 — Représenté par un noeud dans l’arborescence du système — Pas de quota à l’école, mais surveillance... Interprète de commande 28 Principe : boucle infinie : 1. Affichage du prompt (« $ ») d’attente de lecture au clavier 2. Lecture d’une commande (RETURN) 3. Analyse syntaxique (découpe en mot) 4. Substitution (caractères spéciaux) 5. Exécution de la commande Exemple : — Le shell affiche « $ » et se met en attente — L’utilisateur tape ls -l /usr — Le shell reconnaît trois mots : commande, option et argument — Il crée un processus qui exécute la commande ls avec l’option -l et l’argument /usr — Il attend la fin du processus avant d’afficher « $ » Sortie de la boucle (déconnexion) par exit ou par CTRL-D (à éviter) L’algorithme général du shell est relativement simple. On sort de la boucle infinie soit par l’exécution de la fonction exit, soit par la frappe de la touche CTRL-D. Si le shell associé est celui de la connexion, cette sortie provoque la déconnexion de l’utilisateur et la fin de ce processus (et la fermeture de la fenêtre dans laquelle s’exécutait le shell). Pour analyser les commandes lues au clavier, le shell découpe la ligne lue en mots, dont le premier est considéré comme la commande à exécuter. Pour effectuer ce découpage en mots, le shell prend en compte les caractères définis comme séparateurs (par défaut espace, tabulation et NEWLINE) mais aussi certains caractères spéciaux, appelés méta-caractères qui sont alors substitués pour remplir leur rôle. Redirections — À la connexion, le shell dispose de deux flots de données : l’entrée standard (clavier) et la sortie standard (écran) — Redirection = association de l’entrée ou de la sortie standard vers d’autres flots — Entrée : utilisation de < Exemple : write paul < message — Sortie : utilisation de > (écrasement du fichier) Exemple : ls -l /usr > fichier — Sortie : utilisation de > > (ajout à la fin du fichier) Exemple : ls -l /etc > > fichier — Tubes (pipes) : utilisation de | entre deux commandes, dont la sortie de la première est associée à l’entrée de la seconde Exemple : wc -l /etc/password | wc -l Lorsque le shell est activé, il dispose de deux flots de communication qui sont l’entrée standard et la sortie standard. L’entrée standard est associée par défaut au clavier et la sortie standard est associée par défaut à l’écran. La modification de l’une de ces affectations par défaut s’appelle une redirection et elle n’est valable que le temps de la commande sur laquelle elle porte. Dans son travail d’interprétation, le shell traite en premier les redirections et cela indépendamment du résultat des commandes associées. Par conséquent, lorsqu’une commande échoue, la redirection associée a quand même été effectuée. La redirection la plus utilisée est celle de la sortie standard avec pour objectif la récupération du résultat d’une commande ailleurs qu’à l’écran, le plus souvent dans un fichier. Pour cela, il 29 suffit d’ajouter sur la ligne d’une commande le caractère supérieur suivi du nom du fichier de redirection (> nom_fich). L’exécution de la commande avec la redirection entraîne la création d’un fichier de nom nom_fich. Dans le cas de la sortie standard, si un tel fichier existe déjà, son contenu initial est perdu. Si l’on souhaite conserver l’information contenue dans un fichier de redirection, il faut utiliser deux fois le caractère supérieur (» nom_de_fichier) pour que le résultat soit ajouté à la fin du fichier. Comme pour une redirection simple, si le fichier de redirection n’existe pas, il est créé automatiquement. La redirection de l’entrée standard permet à une commande d’utiliser comme données le contenu d’un fichier à la place d’une lecture clavier. Pour cela, il suffit de placer le caractère inférieur suivi du nom de fichier de redirection (< nom_fich). À la différence d’une redirection en sortie, le fichier de redirection doit exister sinon cela provoque une erreur avec un message du style « no such file » ou « cannot open ». La redirection de l’entrée standard est peu utilisée car la plupart des commandes acceptent un nom de fichier en argument. Par exemple, la commande cat permet de visualiser soit l’entrée standard (appel sans argument), soit le contenu d’un fichier (dont le nom est passé en argument. Une redirection ne ferait qu’alourdir l’écriture (cat < fichier est équivalent à cat fichier). Un tube est une zone mémoire permettant à deux processus de communiquer de façon synchronisée, c.-à-d. que l’écrivain est mis en attente lorsqu’il n’y a plus de place disponible et de même, le lecteur est mis en attente quand il n’y a pas d’information prête. Ce principe est utilisable au niveau du shell avec le caractère barre verticale (« | ») entre deux commandes. Cela permet de rediriger la sortie standard de la première sur l’entrée standard de la seconde. Avec un tube, le résultat de la première commande n’est pas accessible. Parfois, il est utile de garder une telle information intermédiaire. Pour cela, la commande tee duplique l’entrée sans la modifier. L’information fournie en entrée à tee est répercutée en sortie et une copie est faite dans un fichier dont le nom est passé en argument : par exemple, ls | tee fichier | wc -l. Les tubes sont très utilisés avec les filtres. Le principal intérêt des filtres est de pouvoir les combiner grâce à des tubes pour cumuler leurs effets sans avoir besoin de fichiers intermédiaires. En effet, le principe consiste à décomposer un traitement complexe en plusieurs actions plus simples et à développer un outil pour chaque action de base, ce qui est plus facile que d’écrire directement un programme adapté au traitement global. Ensuite, les filtres développés peuvent être réutilisés dans la décomposition d’un autre traitement. En revanche, on rencontre une certaine redondance qui provient soit du développement simultané d’outils analogues dans des milieux différents, soit d’une volonté d’isoler certaines fonctions jugées très importantes. Caractères spéciaux Caractères spéciaux : permettent de paramétrer l’interprétation des commandes — Le texte entre deux simples quotes (’texte’) n’est pas interprété — Après un \, le caractère qui suit n’est pas interprété — Dans un texte entre guillemets ("texte"), le caractère \ et les séparateurs ne sont pas 30 interprétés. — Pour référencer des noms de fichiers : — * : chaîne de caractères quelconques — ? : un seul caractère, quelconque — [...] : un seul caractère parmi ceux cités — [...] : un seul caractère hors de ceux cités — Le caractère ˜ est remplacé par le répertoire de connexion ; ˜user est remplacé par le répertoire de connexion de user — Le caractère ; permet de placer plusieurs commandes sur une même ligne En dehors des caractères utilisés pour les redirections et les tubes, le shell gère de nombreux autres caractères spéciaux, permettant de paramétrer l’interprétation des commandes. Un texte donné entre quotes (’...’) n’est pas interprété par le shell mais considéré comme un simple mot. Cela permet en particulier d’inclure dans un argument des caractères spéciaux (espace, caractères de redirection. . .). Le caractère antislash («\n») précise que le caractère suivant ne doit pas être interprété par le shell, ce qui permet d’utiliser un caractère spécial comme la quote. La caractère antislash n’est effectif que pour le caractère suivant, il faut le répéter autant de fois que de caractères à ne pas interpréter. Les caractères d’un texte donné entre double quote ("...") ne sont pas interprétés sauf \ (annulation du sens). Plusieurs caractères jouent le rôle de « jokers » pour référencer des noms de fichiers, en particulier le caractère étoile (« * ») remplace une chaîne de caractères quelconque et le caractère point d’interrogation (« ? ») remplace un caractère quelconque. Le caractère étoile peut représenter la chaîne vide. Par ailleurs, utiliser seul, le caractère étoile représente la liste des fichiers non cachés du répertoire courant (équivalent au résultat de la commande ls). Il faut noter que le caractère point en début du nom d’un fichier doit être donné explicitement et non pas avec un « joker ». C’est pourquoi l’étoile seule ne repère pas les fichiers cachés. Il en est de même pour le caractère slash. Par contre, ailleurs qu’au début du nom, le point est traité comme les autres caractères. L’utilisation des crochets permet de définir un caractère quelconque appartenant à l’ensemble défini entre les crochets. Cet ensemble peut être défini à partir d’une liste de caractères juxtaposés ([aeiou]), ou à partir d’un intervalle pour inclure tous les caractères selon l’ordre ASCII entre les deux bornes séparées par un tiret ([0-9]), ou un mélange des deux ([09aeiou]). On peut également spécifier le complément de l’ensemble indiqué en mettant un point d’exclamation ( !) en premier caractère juste après le crochet ouvrant ([ !...]). Pour prendre en compte dans l’ensemble l’un des caractères servant à définir cet ensemble, il suffit de les placer ailleurs que là où ils ont une signification. Ainsi, le crochet ouvrant peut être placé n’importe où et le point d’exclamation n’importe où sauf en premier, le crochet fermant doit être placé en premier et le tiret en premier ou en dernier. Pour ces deux derniers éléments, la notion de premier caractère est étendue au deuxième lorsque le premier est le point d’exclamation. Une redirection (en entrée ou en sortie) ne faisant intervenir qu’un seul fichier, il n’est pas très logique d’utiliser les caractères spéciaux d’interprétation des noms de fichiers qui servent le plus souvent pour représenter en ensemble d’éléments. Mais s’ils sont utilisés quand même, le shell ne les interprète pas (les caractères correspondants étant alors des caractères ordinaires) sauf 31 si l’interprétation conduit à un seul nom de fichier. La touche ESCAPE offre un mécanisme de complémentation des noms de fichiers selon le principe suivant : lorsque l’utilisateur tape un nom de fichier, deux appuis successifs sur la touche ESCAPE entraînent l’affichage automatique du reste du nom. Si plusieurs solutions sont possibles (cas de plusieurs fichiers avec même début de nom), le shell affiche tous les caractères communs et attend que l’utilisateur continue la frappe. Et dans le cas où aucun nom de fichier ne commence par le texte déjà tapé, un « bip » est émis. Historique — Le shell mémorise les commandes tapées, et permet de les afficher et de les relancer. — La commande history permet d’afficher l’historique — Les touches « flèche vers le haut » ou « vers le bas » permettent de « naviguer » dans l’historique — Sur une ligne sélectionnée, — les touches « flèches vers la gauche » ou « vers la droite » permettent de « naviguer » sur cette ligne — Les touches Début, Fin, Suppr, Backspace ont leur signification usuelle — La touche Entrée relance l’exécution de la commande Configuration du compte Étapes du démarrage lors d’une connexion initiale — Les commandes placées dans le fichier /etc/profile sont exécutées — Les commandes placées dans le fichier ˜/.profile sont ensuite exécutées Étapes du démarrage lors d’une autre connexion — Les commandes placées dans le fichier ˜/.bashrc sont ensuite exécutées Ces fichiers permettent de configurer le compte au démarrage (man bash) 6.5 Gestion des activités Gestion des processus — Toute commande lancée conduit à la création d’un processus Unix — La commande ps permet de visualiser les processus de la machine — ps : les processus actifs de l’utilisateur — ps x : tous les processus de l’utilisateur — ps ax : tous les processus de tous les utilisateurs — La commande top permet un affichage répété des processus — Sous gnome, sous le menu Système / Administration, l’application Moniteur système gère les processus 32 — La commande kill permet d’arrêter un processus, en indiquant son numéro (pid) Exécution différée Exécution synchrone — Dans un terminal, le shell attend la fin de la commande, pour passer à la suivante =⇒ exécution synchrone — La commande s’exécute en mode foreground Exécution différée — — — — — Dans le cas d’une exécution asynchrone, le shell n’attend pas la fin =⇒ mode background Ajout de & à la fin de la commande jobs : liste des tâches du shell fg et bg : changement de mode CTRL-Z : stopper la commande active −→ choisir ensuite un mode Recherche de fichiers — find — find répertoire critères... : recherche de fichiers satisfaisant les critères sous le répertoire indiqué — Exemples de critère : -name, -type — Exemple : find . -type f -name ’*.c’ — locate : recherche dans tout le système, à partir d’une base de données journalière — which commande : affiche le nom absolu de la commande — Rechercher des fichiers dans le menu Raccourcis de gnome Commandes « bien » utiles — — — — Recherche de données : grep Gestion des données : sort, cut, awk Archivage et sauvegarde : tar, rsync Espace de travail : df, du, gzip 33