EXPLOITATION DES SYSTEMES UNIX/LINUX ET WINDOWS Architecture, conception, utilisations, administration, sécurité Jacques PHILIPP AVANT PROPOS Les services fournis par l'ordinateur personnel se sont généralisés avec ses évolutions technologiques. Devenu fournisseur multimédia des services du Web, téléphone mobile, console de jeux, serveur d'applications, outils bureautique, etc., il a intégré les technologies objets ainsi que les systèmes d'exploitation permettant de l'utiliser. Les systèmes propriétaires Windows et les systèmes ouverts basés sur le système Unix (Solaris, Free BSD, Linux, etc.) dominent le marché en ce début du 21ième siècle. Ces systèmes différents et historiquement incompatibles sont devenus interopérables grâce à l'évolution des normes et des standards. L'objectif du présent ouvrage est de présenter : • les concepts de base d'architecture des ordinateurs personnels et des systèmes d'informations, • les principes généraux de conception des systèmes d'exploitation, • les outils constituant l'environnement sécurisé de l'ordinateur personnel, ainsi que ceux permettant de l'administrer. La première partie de l'ouvrage retrace l'histoire des systèmes d'informations et celle de la conception des systèmes permettant de les exploiter en mettant en évidence leurs architectures matérielle et logicielle, les techniques nécessaires à leur développement, les différences culturelles profondes entre systèmes propriétaires et système ouverts. La deuxième partie présente quelques mécanismes fondamentaux des systèmes d'exploitations (gestion des travaux, des fichiers, etc.) illustrés par une présentation orientée objet des systèmes Unix/Linux et Windows. Sont ensuite présentés les interprètes de commandes d'Unix/Linux, les principes et outils d'administration permettant d'exploiter au mieux les ordinateurs personnels. Public : étudiants des 1er et 2nd cycles universitaires, élèves ingénieurs, ingénieurs informaticiens, BTS, IUT… TABLE DES MATIERES CHAPITRE I : L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 9 1. Du boulier chinois aux systèmes propriétaires 2. L'évolution vers les systèmes ouverts 12 3. Historique d'Unix 16 4. Quelques applications des systèmes d'informations 21 CHAPITRE II : ARCHITECTURE DES ORDINATEURS PERSONNELS 9 23 1. Systèmes d'informations 23 2. Représentation numérique de l'information 26 3. Unité centrale des ordinateurs personnels 28 4. Compléments sur le système matériel 47 5. Tolérance de pannes et technologie RAID 54 6. Systèmes de stockage distribués nas et san 55 7. Exercice 55 CHAPITRE III : GENERALITES SUR LES SYSTEMES D'EXPLOITATION 59 1. Architecture et modélisation 59 2. Processus 61 3. Noyau 77 4. Gestion des travaux 78 5. Gestion mémoire 80 6. Gestion des entrées/sorties 87 7. Organisation et accès a l'information 89 8. L'implémentation des systèmes d'exploitation 92 9. L4G et langages de l'Internet 10. Marché des systèmes d'exploitation en 2007 100 102 6 EXPLOITATION DES SYSTEMES UNIX/LINUX ET WINDOWS ───────────────────────────────────────────────────────────── CHAPITRE IV : SESSION SOUS UNIX/LINUX 103 1. L'utilisateur 103 2. Gestion des utilisateurs et des sessions 104 3. Documentation en ligne 106 4. Informations relatives aux utilisateurs 107 5. Exercices 108 CHAPITRE V : GESTION DE FICHIERS SOUS UNIX/LINUX 109 6. La gestion objet des entrées/sorties 109 7. Nommage des fichiers 118 8. Opérations sur les fichiers standards 119 9. Opérations sur les répertoires 122 10. Opérations sur les fichiers ordinaires 123 11. Cycle de vie d'un fichier 129 12. L'arborescence traditionnelle d'Unix 132 13. Exercices 134 CHAPITRE VI : GESTION DES TRAVAUX SOUS UNIX/LINUX 137 1. Définitions 137 2. Descripteurs associés a un processus 141 3. Création et terminaison de processus 144 4. Synchronisation de processus 146 5. Signaux 147 6. Ordonnancement 150 7. Contrôle de l'exécution des processus 155 8. Gestionnaires de mémoire 157 9. Exercices 161 CHAPITRE VII : LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 163 1. Généralités sur les interprètes de commandes 163 2. Gestion des profils 165 TABLE DES MATIERES 7 ───────────────────────────────────────────────────────────── 3. Variable locale, variable exportée 169 4. Variables d'environnement prédefinies 170 5. Scripts 171 6. Programmation structurée en Korn shell 173 7. Présentation sommaire du C shell 185 8. Exercices (scripts) 186 9. Introduction à la programmation système 188 10. Corrigés des exercices (scripts) 190 11. Corrigé (interprète de commandes simplifié) 197 CHAPITRE VIII : GESTION DES ENTREES/SORTIES 207 1. Partitionnement d'un volume 207 2. Système de fichiers 209 3. Montage 215 4. Cohérence des systèmes de fichiers 217 5. Quotas 219 6. Outils avancés (Unix/Linux) 220 7. Volumes Logiques (IBM-AIX) 224 8. Cache disque 226 9. Pilotes 227 10. Gestion des flux 232 11. Chargement dynamique des pilotes 238 12. Le fonctionnement du pilote TTY 238 13. Adaptation du noyau Unix/Linux 240 14. Archivage et sauvegardes dans le monde Unix/Linux 242 CHAPITRE IX : QUELQUES MECANISMES INTERNES DE WINDOWS 251 1. Présentation du système Windows 251 2. Architecture en couches fonctionnelles 251 3. Mode utilisateur 252 8 EXPLOITATION DES SYSTEMES UNIX/LINUX ET WINDOWS ───────────────────────────────────────────────────────────── 4. L'exécutif Windows 254 5. Services système 258 6. Ordonnancement 258 7. Processus et fibres 260 8. Objets 267 9. Mécanismes de synchronisation 272 10. Sécurité 278 11. Système de gestion des entrées/sorties 281 12. La base de registres (registry) 288 CHAPITRE X : L'ADMINISTRATION ET SES OUTILS 293 1. L'administration et la sécurité 293 2. La gestion des utilisateurs sous Unix/Linux 298 3. Gestion des services systèmes sous Unix/Linux 306 4. Gestion des services sous Windows 316 5. Quelques principes de maintenance 321 6. L'administrateur, responsable micro 322 7. Conception d'un système d'informations 323 8. Conclusion 324 9. Exercices 325 CHAPITRE XI : ANNEXES 327 1. L'environnement utilisateur sous Unix/Linux 327 2. Impression 331 3. Généralités sur les éditeurs de textes 333 4. L'éditeur vi 333 5. L'éditeur ligne ed 338 6. Principales commandes d'Unix 340 CHAPITRE XII : BIBLIOGRAPHIE 344 CHAPITRE XIII : INDEX 345 CHAPITRE I L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 1. DU BOULIER CHINOIS AUX SYSTEMES PROPRIETAIRES 1.1 De l'antiquité à nos jours Avant de définir un système d'informations, il paraît important de retracer le cheminement historique intellectuel qui a conduit à l'automate puis à l'ordinateur. Dès l'antiquité, le boulier Chinois permet d'effectuer des calculs très rapidement. Au 16ième siècle, Pascal conçoit un additionneur utilisant des roues dentées mises bout à bout et numérotées de 0 à 9, le passage du 9 au 0 provoquant la rotation d'une unité de la roue immédiatement à sa gauche pour prendre en compte la retenue. Le concept de programme extérieur est défini au 18ième siècle : une action à exécuter est décrite par une perforation sur une planche en bois, le programme étant constitué par plusieurs planches à traiter en séquence. La machine de Falcon (1728) permet ainsi le pilotage d'un métier à tisser. Ce principe est amélioré en France par Jacquard. 10 CHAPITRE I ───────────────────────────────────────────────────────────── Charles Babbage conçoit en 1833 un calculateur à mémoire mécanique conservant nombres et instructions utilisées dont la capacité de stockage est de 1000 nombres de 50 chiffres décimaux qu'Ada Lovelace à l'idée de programmer. Le nom du langage de programmation ADA fut choisi en 1979 pour lui rendre hommage. En 1854, le mathématicien Georges Boole imagine un système de logique symbolique dont les formules, appliquées un siècle plus tard au système binaire, permettent de réaliser l'ordinateur numérique électronique. En 1882, Hermann Hollerith invente un langage codé sur carte perforée, ancêtre du codage binaire, permettant de commander une machine et crée la société qui va devenir IBM (International Business Machines) en 1924. En 1936, Alan Turing énonce le principe d'une machine universelle ou machine de Turing dont les caractéristiques préfigurent l'ordinateur moderne. En 1938, la théorie de l'Information de Claude Shannon fait le lien entre le système binaire, l'algèbre de Boole, et les circuits électriques en prouvant que les nombres exprimés en système binaire permettent les calculs logiques et arithmétiques réalisés à l'aide des opérations et circuits logiques de base ET, OU, NON. En 1945, John Von Neumann définit le programme enregistré séquentiellement dans la mémoire du calculateur avant son utilisation et la rupture de séquence ou branchement conditionnel qui permet à la machine, sans intervention humaine, de déterminer la séquence du programme à exécuter selon un résultat et donc de prendre des décisions. 1.2 Evolutions technologiques des ordinateurs On distingue cinq générations d'ordinateurs. • En 1949 est présenté le premier calculateur électronique, à base de tubes électroniques et lampes : l'EDSAC. En 1953, IBM fait son entrée dans l'industrie informatique pour en devenir le leader mondial. • La découverte du transistor (1948) conduit à une première révolution informatique dès 1960 avec la naissance de Digital Equipment (DEC) et Hewlett Packard (HP). • En 1970 apparaissent les microprocesseurs, la société Intel et le système Unix. • Des circuits intégrant quelques centaines de milliers de transistors permettent de créer l'ordinateur personnel (1981) et l'émergence de la société Microsoft. • Les microprocesseurs actuels intègrent des millions de transistors. ■ Miniaturisation Une fonction logique nécessitant une armoire électronique dans la première génération devient une plaquette imprimée de 10 cm2 dans la troisième génération et une puce de 0.1 µm2 dans la cinquième. ■ Fiabilité Le temps moyen de bon fonctionnement (Mean Time Between Failure - MTBF) passe de quelques minutes à plusieurs milliers d'heures. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 11 ──────────────────────────────────────────────────────────── ■ Puissance de calcul et coûts Depuis 1948, la puissance fournie double tous les 18 mois conformément à la loi de Moore et l'ordinateur actuel exécute quelques milliards d'instructions par seconde. Les coûts évoluent inversement à la puissance de calcul. ■ Unités Le système binaire permet une représentation numérique de l'information dans un ordinateur l'information digitale élémentaire, appelées binary digit ou bit, représentant la présence ou l'absence d'un signal électrique, notée symboliquement 0 ou 1. Un octet (abréviation o) est une suite de 8 bits pouvant représenter 256 informations. Unités décimales usuelles 1 Kilo octets (Ko) = 103 octets 1 Méga octets (Mo) = 106 octets 1 Giga octets (Go) = 109 octets 1 Téra octets (To) = 1012 octet 1 Peta octets (Po) = 1015 octets ■ unités digitales 1 Kibioctet (Kio) = 210 octets 1 Mébioctet (Mio) = 220 octets 1 Gibioctet (Gio) = 230 octets 1 Tébioctet (Tio) = 240 octets. 1 Pébioctet (Pio) = 250 octets Architecture Le modèle séquentiel de Von Neumann a évolué vers d'autres architectures permettant de réaliser des opérations vectorielles, des traitements parallèles, etc. Génération Caractéristiques Décennie Encombrement Technologie Fiabilité (h) Rapidité Langage 1ère 2ème 3ème 4ème 5ème 1950 150 m3 lampes 0.4 10-4 machine 1960 2 m3 transistor 2 10-2 procédural 1970 1980 1990 2 2 10 cm 1 mm 1µ 2 circuits intégrés microprocesseur 102 2*103 2*104 2 0.5 10 105 structuré objet parole Le vocable ordinateur décrit des calculateurs dont la puissance et les utilisations sont très différentes. Les super calculateurs sont utilisés depuis les années 1975 dès que la "plus grande puissance de calcul disponible" (Seymour CRAY) est nécessaire (aéronautique, prévisions météorologiques, etc.). Les ordinateurs universels (mainframe) sont utilisés dans des environnements propriétaires et prennent simultanément en charge un grand nombre d'utilisateurs. Certains les comparent aux dinosaures ou aux mammouths. 12 CHAPITRE I ───────────────────────────────────────────────────────────── 2. L'EVOLUTION VERS LES SYSTEMES OUVERTS Les révolutions informatiques successives ont conduit les utilisateurs à vouloir utiliser des systèmes ouverts et distribués au détriment des systèmes propriétaires. 2.1 Relations entre les utilisateurs et les gros systèmes ■ Les contraintes Dans un environnement propriétaire, l'utilisateur n'a pas la liberté de choix de son système car tout est imposé par le constructeur (normes ou absence de norme, outils, architecture, logiciels, maintenance, etc.). • La culture informatique est monolithique, à l'époque le tout IBM. • L'investissement initial est élevé, le coût d'exploitation important car les prix sont imposés par le constructeur en situation de monopole. • Le système est fermé et son évolution est coûteuse et délicate. • Il n'y a aucune garantie de fonctionnement des applications dans des environnement hétérogènes (portabilité). • Le mariage avec les utilisateurs est forcé le fournisseur étant pratiquement en situation de monopole (90% du marché mondial). ■ Les conséquences L'utilisateur est un acteur passif et mineur ne pouvant ni choisir ni influer sur le système propriétaire qu'il utilise. L'approche systèmes ouverts qui repose sur des systèmes décentralisés coopératifs fonctionnant selon le modèle client - serveur est différente, moins coûteuse et prometteuse. 2.2 Les révolutions informatiques ■ La révolution des microprocesseurs Le transistor fut inventé en 1948 par trois chercheurs des laboratoires Bell d'ATT (American Telephone et Telegraph) : Bardeen, Brattain et Shockley qui reçurent à cette occasion le prix Nobel de physique (1956). Shockley quitte Bell pour fonder Shockley Research Laboratories que quelques années plus tard Noyce et Moore quittent pour fonder Fairchild puis Intel en 1968. Là commence la véritable histoire des microprocesseurs puis des ordinateurs personnels. En 1969, Ted Hoff, ingénieur chez Intel, décide de rendre programmable le circuit 4 bits 4004 (environ 4000 transistors). Intel le commercialise et constate que ce dernier correspond à un besoin du marché. En 1972, Intel sort le 8008, premier microprocesseur 8 bits, suivi du 8080. Une partie de l'équipe d'Intel fonde alors Zilog, qui sort le Z80 en 1975. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 13 ──────────────────────────────────────────────────────────── La première mémoire RAM (1 Kb) apparaît en 1970, suivie en 1973 de la première RAM 4Ko. Actuellement, le marché de la micro-informatique est composé à 90% de PC à base de microprocesseurs 64 bits d'Intel ou AMD intégrant plusieurs cœurs (Intel core2 duo quad). ■ La révolution des ordinateurs personnels Depuis l'aube des années 80, les ordinateurs personnels et les consoles de jeux pénètrent dans tous les milieux sociaux et professionnels pour un coût toujours plus faible. En 1974, Bill Gates, juste sorti d'Harvard, et Paul Allen, programmeur chez Honeywell développent un interprète Basic. Le succès immédiat de ce logiciel les amène à créer la société Microsoft en 1975, devenue aujourd'hui l'une des premières sociétés mondiales par sa capitalisation boursière et faisant de son fondateur l'un des hommes les plus riches du monde. En 1976, Gary Kildal fonde Digital Research et développe le système d'exploitation CP/M, devenu alors le standard des systèmes personnels. En 1979 sont développés les premiers traitements de texte, tableurs, gestionnaires de données. La légende rapporte qu'en 1976, Steve Jobs et Stephen Wozniak fabriquent dans un garage le premier ordinateur personnel de la firme Apple dont le succès est immédiat en occident. Le Sinclair ZX80 doté d'1 Ko de mémoire RAM utilise une télévision pour l'affichage, un lecteur de minicassettes pour le stockage. Aucune norme de conception ou d'utilisation n’existe et les systèmes d'exploitation sont multiples. Les "grands constructeurs" ne s'intéressent pas à ce marché "marginal" jusqu'au lancement par IBM en 1981 du Personal Computer : le PC est doté du microprocesseur 8/16 bits 8088 d'Intel et du système d'exploitation MS/DOS de Microsoft, largement basé sur le système CP/M. En moins d'un an, IBM s'adjuge 90 % du marché mondial des ordinateurs personnels… ■ La révolution des réseaux et des systèmes distribués Dans les années 1980 apparaissent les réseaux et services répartis et distribués entre les premiers systèmes hétérogènes interopérables, avec une interface d'accès ergonomique. La puissance du poste de travail permet de concevoir des systèmes coopératifs basés sur des architectures clients serveurs. Ainsi, en 1982, les microprocesseurs 32 bits donnent naissance aux stations de travail (workstation) fonctionnant sous Unix (SUN, Apollo, HP, BULL, etc.). Très utilisées dans le domaine scientifique et l'informatique de gestion. 14 CHAPITRE I ───────────────────────────────────────────────────────────── ■ Le monopole des systèmes propriétaires Windows En 1984, IBM est victime de son succès avec l'apparition des PC compatibles, meilleur marché et/ou plus performants causant la perte de sa suprématie dans ce domaine : dès 1986, IBM ne détient plus "que" 25 % de ce marché. Après avoir contribué à l'établissement d'un standard des ordinateurs personnels, IBM tente de le casser pour retrouver sa suprématie par le lancement en 1987 du PS/2 (Personal System) à base de microprocesseurs 32 bits d'Intel, véritable fiasco commercial. IBM se retire alors d'un marché dont il n'a pas la culture. Les bénéficiaires vont être Microsoft et les fabricants de PC compatibles. MS/DOS étant inadapté aux évolutions 32 bits, une ébauche de solution est proposée avec Windows 3.x. En 1994 est commercialisé Windows NT, le premier système 32 bits de Microsoft pour la gestion des réseaux. Windows 95, remplacé par Windows 98 est commercialisé pour le grand public. Tous ces systèmes ont convergés vers Windows XP puis Windows Vista. Les systèmes propriétaires Windows sont un standard sur 90% du parc mondial des ordinateurs personnels ce qui ne signifie pas (encore ?) qu'on soit au tout Microsoft. 2.3 Ouverture, interopérabilité, portabilité, normalisation ■ Révolution culturelle L'utilisateur est devenu un acteur majeur qui veut comprendre et disposer d'outils, ergonomiques, et standards, sans dépendre d'un constructeur unique. Les média numériques (télévision, téléphonie mobile, réseaux publics (Internet) ou privés (Intranet), ordinateur personnel, appareil photo, caméra, etc.) dont la simplicité d'utilisation (ergonomie) s'impose communiquent. Ils sont donc interopérables. ■ Interopérabilité En dépit de la tentative de Microsoft d'imposer ses standards, cet industriel a été condamné par les justices américaine et européenne à ouvrir les systèmes Windows à la concurrence. Simultanément, deux approches opposées ont, depuis une vingtaine d'années, permis de rendre les systèmes interopérables : la normalisation des systèmes d'informations et la mise au point de systèmes non propriétaires, dits ouverts ou libres comme Linux. ■ Standard de facto Lorsqu'une nouvelle application apparaît, il existe une phase d'expansion aux cours de laquelle de nombreux produits similaires et incompatibles sont développés jusqu'à ce que le marché en sélectionne quelques uns. C'est la première étape du processus de normalisation. Exemples L'architecture de l'ordinateur personnel, les protocoles TCP/IP, bases de tous les services fournis sur Internet. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 15 ──────────────────────────────────────────────────────────── ■ Organismes de normalisation La normalisation par des organismes nationaux (AFNOR) ou internationaux (ISO, CCITT, etc.), ainsi que la législation imposant des systèmes normalisés ont permis l'interconnection des systèmes et le portage des applicatifs et des données, les logiciels étant développés conformément à des règles de portabilité normalisées (normes ISO). ■ Groupes de travail Les organismes de normalisation internationaux disposent de nombreux groupes de travail qui rassemblent les principaux acteurs du marché (constructeurs, éditeurs de logiciels, représentants des administrations gouvernementales, groupes d'utilisateurs) pour définir des normes de connexion, développement, d'utilisation et de portabilité. ■ Normes Une norme est élaborée à l'échelon d'un pays, d'un continent, ou mondiale. Cette dernière étape consiste à mettre au point, avec un minimum d'ambiguïté, un document accepté par tous. Ce processus long peut conduire à des batailles homériques telle celle des normes du langage Java de SUN. La plupart des langages de programmation ont été normalisés (C, C++, Fortran, Java, SQL, XML, etc..) ainsi que les systèmes d'exploitation basés sur Unix (normes POSIX - Portable Operating Systems Interface for computing environnement)). ■ Quelques normes POSIX Guide de l'environnement POSIX Spécification indépendantes des langages Interface système et extensions nouvelles à P1003.1 Commandes du shell et utilitaires Extension pour la portabilité au niveau utilisateur Suite de vérifications pour la norme P1003.1 Suite de vérifications pour la norme P1003.2 Extensions temps réel ADA Extension de Sécurité Administration des imprimantes Logiciel d'administration Accès transparents aux fichiers (TFA) Profil des applications sur super calculateurs Transactionnel Support des applications multiprocesseurs Extension pour le traitement par lot Langage C Services des répertoires réseau Profil POSIX Fortran 90 pour la norme P1003.1 Extension temps réel ada pour la norme P1003.1 Interfaces utilisateur dans les environnements multi fenêtres P1003.0 P1003.1 P1003.1a P1003.2 P1003.2a P1003.3.1 P1003.3.2 P1003.4 P1003.5 P1003.6 P1003.7.1 P1003.7.2 P1003.8 P1003.10 P1003.11 P1003.14 P1003.15 P1003.16 P1003.17 P1003.18 P1003.19 P1003.20 P1201.1 16 CHAPITRE I ───────────────────────────────────────────────────────────── ■ Portage On distingue différents types de portages : • portage d'une application dans un autre environnement informatique (programmes, procédures, données), • portage d'une partie de l'application vers une autre s'appuyant sur le même ou un autre environnement graphique, • portage des données vers une autre application dans un même ou un autre environnement. Une condition de réalisation d'applications portables (universellement utilisables) est la disponibilité et la normalisation des outils de développements et des appels systèmes. Ainsi, XWindow (MIT) offre un affichage distribué ou réparti sur des systèmes hétérogènes. ■ Profils X/Open et certification Une fois définies normes et spécifications, il reste à les utiliser pour réaliser un système ouvert. La réalisation de profils a pour objectif de choisir les normes et standards à utiliser. Il est alors possible de définir des suites de validation des profils permettant de tester la conformité d'un produit aux normes. Le consortium X/Open est constitué de constructeurs informatiques, éditeurs de logiciels, utilisateurs, représentants des administrations gouvernementales. Des documents de référence définissent les profils dont le plus important est le Guide de la Portabilité. Un produit du domaine public est gratuit, décrit selon des spécifications accessibles pour tous, par exemple XWindow. ■ Systèmes Ouverts L'IEEE définit un système ouvert comme un ensemble de standards internationaux d'informations technologiques spécifiant les interfaces, les services fournis et les formats d'informations supportés pour réaliser l'interopérabilité et la portabilité des systèmes, des applications et des données. 3. HISTORIQUE D'UNIX 3.1 L'héritage de Multics Trois principes essentiels de conception du système d'exploitation Multics (General Electric, MIT, laboratoires Bell - 1961) sont repris par Unix : Multics est développé dans un langage évolué (PL/1) pour l'affranchir des contraintes liées à l'utilisation de la programmation en assembleur (écriture, maintenance, mise au point, dépendance du matériel). L'organisation des fichiers est arborescente et tout périphérique est géré comme un fichier. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 17 ──────────────────────────────────────────────────────────── 3.2 Unix systems, versions, like, based Unix est le nom générique d'une famille de systèmes d'exploitation à vocation universelle. ■ Les Unix authentiques et dérivés Des laboratoires Bell sont issues les versions (V6, V7...) qui ont donné naissance aux systèmes Unix authentiques distribués par ATT (Unix System III, Unix System V) et par l'Université de Berkeley (Unix Versions 4.x BSD - Berkeley Software Distribution). Les systèmes basés sur Unix (Unix based) s’appuient sur les systèmes authentiques d’ATT (toute distribution nécessite une redevance). Les systèmes similaires à Unix (Unix like) en reprennent la philosophie tout en s'en démarquant suffisamment pour ne pas avoir à payer de redevance (Linux). ■ Les pionniers (1969 - 1979) En 1969, Ken Thompson et Dennis Ritchie réalisent, aux laboratoires Bell la première version d'Unix en assembleur sur PDP7 puis sur PDP9. Le système est monoutilisateur et interactif, le cœur du système (noyau) a une taille de 6 Ko, un processus est limité à 8 Ko et un fichier à 64 Ko. Après plusieurs tentatives d'écriture d'Unix dans un langage évolué (langage A, langage BCPL de Martin Richard, langage B dérivé de BCPL), Brian Kernighan et Dennis Ritchie définissent en 1972 le langage C avec lequel Unix est réécrit en 1973 sur PDP11. Cette première version portable (Unix V6) a les caractéristiques suivantes : multiprogrammation, généralisation de l'interface fichier et des entrée/sorties, gestion des processus, des fichiers et des volumes. ATT n'ayant pas le droit de commercialiser des produits informatiques, les premières licences sont cédées pour un prix symbolique aux universités de Berkeley (USA) et de Galles (Australie). Un premier portage d'Unix est effectué en 1975 en quelques mois. Unix V7 est développé en 1976 quand la disponibilité d'un système d'exploitation portable devient une nécessité dans un marché informatique en pleine révolution technologique. En 1977, Ken Thompson passe une année sabbatique à l'Université de Berkeley où il donne le départ des développements d'Unix par les utilisateurs : sur toutes plates formes matérielles apparaissent des outils du domaine public constituant la plus grande bibliothèque de logiciels gratuits du monde. Parallèlement, le projet DARPA (Defense Advanced Research Project Agency) utilise Unix pour la spécification des protocoles TCP/IP, (le standard mondial actuel), permettant la communication entre différents réseaux propriétaires. Une interface applicative de développement (API) dans des environnements hétérogènes (couche socket) est également définie. 18 CHAPITRE I ───────────────────────────────────────────────────────────── ■ La confusion (1979 - 1984) La déréglementation aux USA permet à ATT de commercialiser Unix System III en 1982, Unix System V en 1983. La société Microsoft distribue Xenix en 1982. Les versions issues par l'Université de Berkeley (symbolisées par un diablotin facétieux emblématique) comportent des améliorations importantes : communications entre processus distants, gestion de la mémoire virtuelle et pagination, système de gestion de fichiers rapide et efficace, outils réseau. De nombreuses variantes basées sur Unix ou similaires à Unix sont implémentées sur toutes les plateformes matérielles (plus de 100 000). ■ L'ère industrielle (1984 - 1988) Dès fin 1984, la normalisation d'Unix provoque la disparition des systèmes dérivés. Adopté par Hewlett Packard (HP-UX), IBM (AIX), etc., Unix est consacré comme système d'exploitation à vocation universelle. Plus de 500 000 systèmes Unix sont installés. En 1988, Unix s'impose dans et avec le monde des stations de travail avec Unix System V en gestion et Unix BSD dans le calcul scientifique. ■ La Normalisation (1988) ATT définit en 1986 des normes de conception et d'utilisation d'Unix (System V Interface Definition - SVID). Un consortium de constructeurs crée l'OSF (Open Software Foundation). Les systèmes OSF/1 et Unix SV R4 convergent vers les normes POSIX imposées en 1988 par le pentagone dans ses appels d'offres. System V POSIX 1003.1 Sunos System V R4 X/OPEN XPG3 BSD 4.3 ANSI X3J11 Xenix Unix est au cœur des systèmes commercialisés par Apple depuis 1999 avec Mac OS X. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 19 ──────────────────────────────────────────────────────────── ■ Universalité d'Unix Les raisons du succès d'Unix sont les suivantes : conception simple et universelle, écriture du système en langage C ce qui facilite compréhension, ouverture, et adaptations aux évolutions technologiques et le rend portable car ne comportant que 5% de code dépendant de la machine. Le nombre d'utilitaires disponibles et gratuits (bureautique, internet, calculs scientifiques, gestion, traitements d'images, etc.) est tel que son environnement est aussi riche que celui des systèmes propriétaires. De nouveaux outils peuvent être créés sans modification du cœur du système (noyau). ■ Récapitulation de l'historique d'Unix ANNEE 1969 1975 1977 1979 1981 1982 1983 1985 1991 1992 1994 1999 Berkeley 1.0 BSD 3.0 BSD 4.0 BSD 4.1 BSD 4.2 BSD Bell-labs Assembleur V6 V7 V8 4.4 BSD ATT System III System V System V R2 System V R4 System V R4.1 System V R4.2 AUTRES IDRIS ONYX SMX SOL AIX OSF/1 Linux Mac OS X 3.3 Linux ■ Caractéristiques Linux est une implémentation d'Unix du domaine public dans le monde Intel. Développé par Linus Torvalds à l'université d'Helsinki à partir de 1991, ce système clone d'Unix ne comporte aucune ligne du code d'origine mais est doté de l'ensemble de ses fonctionnalités ce qui en fait une parfaite machine virtuelle Unix. En 2008, Linux est disponible dans de nombreuses distributions dont les symboles sont un objet magique, un pingouin, un diablotin sympathique, etc. 20 CHAPITRE I ───────────────────────────────────────────────────────────── ■ Droits d'auteur Linux est distribué gratuitement son code source étant protégé par une licence publique générale GNU (logiciels libres) dont les caractéristiques sont les suivantes : • Redistribution libre et gratuite, sans garantie, du code source et de ses composants dont l'auteur conserve les droits d'origine. • Le système est vendable. • Tout modification du code source à vocation commerciale est autorisée, ne donne aucun droit d'auteur et doit être diffusée dans le domaine public. • Les auteurs et développeurs de Linux ne perçoivent pas de royalties ce qui ne freine ni leur augmentation ni la diffusion du système. 3.4 Le marché Unix/Linux ■ Evolution du marché Le parc mondial de systèmes fonctionnant sous Unix/Linux est de l'ordre de 25%. C'est plus que le deuxième constructeur mondial. ■ Constructeurs et portabilité Unix est la référence actuelle pour la portabilité des applications ce qui est justifié dans la mesure où les standards sont respectés (normes POSIX). L'X/Open impose ses normes d'évolution. L'interface homme machine XWindow est généralisée dans l'environnement CDE (Common Development Environment). Les ventes de systèmes Unix/Linux sont dynamiques ce système s'avérant stable, puissant, sécurisé, universel et bon marché. De nombreuses sociétés et administrations utilisent Unix/Linux refusant le tout Microsoft de la même façon qu'historiquement, il y eu un front du refus du tout IBM. ■ Stations de travail Parts de marché SOLARIS (SUN) 30% HP-UX (HP) 30% AIX (IBM) 15% Mac OS X 5% architectures multiprocesseurs multiprocesseurs multiprocesseurs multiprocesseurs Caractéristique Unix standard, parc installé, Unix standard Unix propriétaire Unix standard Compte tenu du nombre de PC dans le monde, le parc installé est très important, même si le nombre de PC sous Unix/Linux n'en représente que 10%. Parts de marché SCO UnixWare 25% Solaris PC 15% Free BSD 5% Linux 55% architectures multiprocesseurs multiprocesseurs monoprocesseur multiprocesseurs Caractéristique gestion, Unix standard universitaire, gratuit, universitaire, gratuit. L'HISTOIRE DU TRAITEMENT DE L'INFORMATION 21 ──────────────────────────────────────────────────────────── 4. QUELQUES APPLICATIONS DES SYSTEMES D'INFORMATIONS ■ Interdépendance du matériel et du logiciel Un système d'informations est constitué d'éléments matériels et logiciels : le matériel (hardware) constitué par le processeur, la mémoire, la carte mère, les périphériques supportés, etc., les logiciels (software) permettant de le programmer et de l'utiliser. Le système matériel et le logiciel sont dépendants car une machine dépourvue de logiciel n'est qu'un ensemble de composants électroniques et des logiciels sans support matériel d'exécution sont inutilisables. ■ Quelques utilisations • Bureautique (traitement de texte, messagerie, Internet, archivage, diffusion, etc.). • Conception assistée par ordinateur (CAO) pour la conception de bâtiments, pièces mécaniques...Existent aussi le dessin assisté par ordinateur (DAO), l'enseignement assisté par ordinateur (EAO), la fabrication assistée par ordinateur (FAO), la conception de maquettes et simulateurs (aéronautique, industrie nucléaire). • Traitement d'images (images satellites, imagerie médicale, prévisions météorologiques, reconnaissance des formes, industrie cinématographique, etc.). • Monétique pour le règlement sécurisé d'achats avec des cartes à puces. • Robotique pour le pilotage automatique de machines à commandes numériques. ■ Internet Dans les années 1980, la télématique a marié les technologies du traitement de l'information et celles des télécommunications pour transporter les informations numérisées ce qui permet de se connecter à un fournisseur de services distants. Une des conséquences de l'utilisation des réseaux est la normalisation des équipements utilisés, l'exigence étant d'interconnecter des systèmes hétérogènes. L'utilisation d'Internet par le grand public à commencé avec les autoroutes de l'information, concepts développés en 1992 par Bill Clinton et Al Gore. ■ Services Divers services sont fournis : messagerie, téléchargement, impression, affichage, fourniture de ressources, accès sécurisés au Web, téléphonie sur IP, routeur multiprotocoles, passerelle, administration de réseaux etc., dans des réseaux hétérogènes. ■ Informatique de gestion et bases de données La gestion des petites et moyennes entreprises est impensable sans ordinateur (facturation, gestion de stocks, aide à la décision). Les systèmes de gestion de bases de données relationnels (SGBDR) tels DB2 (IBM), Oracle, SQL Serveur (Microsoft) permettent de gérer d'énormes quantités d'informations (réseaux bancaires, gestion de stocks, etc.). 22 CHAPITRE I ───────────────────────────────────────────────────────────── ■ Contrôle de processus industriels (GPAO) La gestion de production assistée par ordinateur (GPAO) permet de piloter des unités industrielles (contrôle d'une centrale électrique, gestion des aiguillages d'une gare de chemins de fer, surveillance automatique de grands malades, etc.) ■ Calcul scientifique Les ordinateurs personnels s'adaptent au calcul scientifique (analyse numérique, mécanique, physique, aérodynamique, mécanique des fluides, etc.). Toutefois, l'analyse numérique, mariage des mathématiques appliquées et de l'informatique, requiert des ordinateurs toujours plus puissants (supercalculateurs) pour résoudre des problèmes toujours plus complexes (météorologie, aéronautique, etc.)). Certains phénomènes physiques sont modélisés par les équations aux dérivées partielles que l'on ne sait résoudre mathématiquement que dans quelques cas particuliers. L'ordinateur permet, par des méthodes appropriées (éléments finis, différences finies, etc.) de calculer une solution approchée aussi précise que l'on veut. Exemple On veut résoudre dans le cube unité Ω (donc dans l'espace) le problème de Dirichlet : − ∆u = f dans Ω u = u sur ∂ Ω 0 Les fonctions f et u0 sont des données du problème et supposées suffisamment régulières (conditions aux limites). Une précision de 10 points par côté conduit à la résolution d'un système linéaire de 1000 équations à 1000 inconnues ; 100 points par côté conduisent à un système d'un million d'équations à un million d'inconnues. Dans le premier cas, un ordinateur personnel suffit, dans le deuxième cas, un supercalculateur est nécessaire. ■ Méthodes classiques et intelligence artificielle Les méthodes utilisées dans les applications présentées précédemment sont déterministes l'algorithme de résolution ayant une complexité (nombre d'opérations) déterminée à priori ce qui permet d'évaluer le temps de calcul d'un problème donné. Certains problèmes abordés de façon déterministes n'ont pas de solutions exploitables telle l'exploration de l'univers des possibles aux échecs (plusieurs siècles de calcul). L'intelligence artificielle est basée sur des méthodes probabilistes et logiques. Des règles de déductions logiques à base de faits sont fournies par l'utilisateur. Le but peut être connu ou inconnu. Le moteur d'inférences est un programme gérant faits et règles. Il déclenche les règles par déductions de faits connus (chaînage avant), ou à partir du but vers les faits permettant de l'atteindre (chaînage arrière). CHAPITRE II ARCHITECTURE DES ORDINATEURS PERSONNELS 1. SYSTEMES D'INFORMATIONS 1.1 Traitement de l'information Le vocable informatique, inventé vers 1960, signifie traitement de l'information, le mot information ayant une signification très générale. Un ordinateur est une automate programmable qui, à partir d'une situation représentée par des données, effectue un traitement décrit par un programme stocké dans sa mémoire et fournissant des résultats. Le traitement est effectué par l'unité centrale des traitements (Central Processing Unit - CPU ). On appelle programme les informations traitantes, données les informations traitées. Cette notion est relative un programme pouvant être la donnée d'un autre programme. Exemple Considérons l'addition de deux nombres. Ces derniers sont les données du problème l'addition à exécuter étant le traitement. Les instructions, pour être comprises de la machine, doivent respecter les règles de grammaire du langage de programmation utilisé. Une application est constituée d’un ensemble de programmes. 1.2 Système matériel Un ordinateur est constitué des éléments matériels suivants : Imprimante Disque dur disquettes Ecran Modem Clavier Souris Unité centrale Réseau Bandes Architecture matérielle typique 24 CHAPITRE II ───────────────────────────────────────────────────────────── ■ L'unité centrale L'unité centrale gère le système, effectue les traitements et échange des flux d'informations avec des périphériques. UC Mémoire centrale UAL Unités d'Echanges L'unité de commandes (command unit) gère l'ensemble. L'unité arithmétique (UAL) et logique effectue les calculs arithmétiques et logiques. Les applications actives et les données sont chargées dans la mémoire centrale. Les contrôleurs gèrent les échanges d'informations entre l'unité centrale et les périphériques. ■ Périphériques et fichiers L'information entre dans l'unité centrale pour traitement puis en sort vers des périphériques, les flux d'informations constituant les entrées/sorties (input/output). Un périphérique est donc un élément matériel extérieur à l'unité centrale, contribuant au dialogue homme/machine (clavier, moniteur, etc.) ou au stockage de l'information. Un fichier est un ensemble nommé d'informations stockées sur une mémoire permanente à accès rapide, regroupés dans des dossiers dont l''organisation peut être arborescente. D'autres informations telles la nature du fichier (données, programme, système), sa taille, sa date de création, de mise à jour, ses attributs de propriété et sécurité, dont il faut garantir la pérennité, sont fournies par le système de gestion des fichiers. ■ Interface homme machine (IHM) L'interface homme machine gère le dialogue entre l'utilisateur et l'ordinateur par la saisie d'informations (entrées) pour traitement par l'unité centrale puis affichage du résultat (sorties). Elle est devenue ergonomique (clavier, souris, lecteur de badge, décodeur de code barre, parole, écran tactile, carte à puce, caméra, etc.) car simple d'utilisation. ARCHITECTURE DES ORDINATEURS PERSONNELS 25 ──────────────────────────────────────────────────────────── ■ Système d'exploitation Cet ensemble de programmes assure les fonctionnalités suivantes : • Gestion du système matériel, des travaux à exécuter et des utilisateurs, support des applications. • Fournisseur de l'interface homme machine (mode texte ou mode graphique) • Gestionnaire des fichiers et de leur support physique par le système de gestion des fichiers (SGF - Disk Operating System - DOS). Exemples Les systèmes d'exploitation Windows, Unix, Linux, MVS (IBM) accessibles par l'interprète de commandes (shell dans le monde Unix/Linux, fenêtre de commandes sous Windows, Job Control Langage (JCL) dans le monde MVS, etc.). ■ Modes d'exploitation des systèmes d'information La multiprogrammation est l'exécution simultanée de plusieurs programmes indépendants. Le traitement multitâche est l'exécution simultanée de différentes tâches dont certaines exécutées ultérieurement (traitement par lots - batch). Le temps partagé (time sharing) permet à plusieurs utilisateurs de travailler simultanément de façon interactive, chacun dialoguant avec la machine en ayant l'illusion d'en être l'unique utilisateur. Plus précisément, soient U1, U2 ,..., Un les n usagers du système. U n U1 U2 U3 L'ordinateur partageant ses ressources, soit Ti l'instant à partir duquel l'usager Ui dispose du processeur durant l'intervalle de temps δT. A l'instant Tn, l'usager Un est pris en charge. A l'instant Tn+1, U1 est à nouveau pris en charge puisque les n usagers ont été considérés. Le comportement du système est cyclique de période nδT. Si δT est de l'ordre de la milliseconde, alors les n usagers seront pris en compte en n millisecondes. L'interactivité est donc basée sur le rapport entre la période caractéristique des humains (seconde) et celle de l'ordinateur (nanoseconde). Le traitement en temps réel garantit un temps de réaction réduit (microseconde). Exemple Gestion des arrivées et départs des trains dans une gare (à la gare Saint Lazare (Paris), trois trains peuvent arriver et/ou partir chaque minute et il faut éviter les collisions). 26 CHAPITRE II ───────────────────────────────────────────────────────────── 2. REPRESENTATION NUMERIQUE DE L'INFORMATION 2.1 Codage et interprétation selon le type de l'objet Une suite de n bits représentant 2n informations, le codage digital consiste à représenter des objets de toute nature tels les caractères (8 bits), les entiers (16 ou 32 bits), les réels (32 ou 64 bits), les sons, les images, les instructions, etc. La conversion d'un système de codage en un autre est appelée transcodage. Les informations binaires sont représentables en système hexadécimal avec les chiffres 0 à 9 et les lettres A, B, C, D, E, F selon la correspondance : 0 1 2 3 0000 0001 0010 0011 4 5 6 7 0100 0101 0110 0111 8 9 A B 1000 1001 1010 1011 C D E F 1100 1101 1110 1111 Un octet est alors représenté par deux caractères hexadécimaux. Ainsi l'octet 1011 0010 s'écrit B2. 2.2 Données alphanumériques On appelle donnée alphanumérique un caractère ou une chaîne de caractères. Un caractère (majuscule, minuscule, chiffre, symboles (! ? ; : , . < > = etc.), saut de ligne, saut de page, etc.) est codé sur un octet à partir d'un système de codage tel le code ASCII étendu (American Standard Code For Informations Interchange), utilisé sur les systèmes personnels et le code propriétaire d'IBM EBCDIC (Extended Binary Coded Decimal Information Code), utilisé sur ses gros systèmes. Une police de caractères est une représentation particulière des caractères d'un système de codage. Ainsi, les traitements de texte utilisent une grande variété de polices telles le Times, Arial, etc. Des polices particulières permettent de représenter divers symboles, par exemple mathématiques. 2.3 Nombres entiers relatifs Les nombres relatifs sont représentés par des nombres entiers non signés et signés. On appelle nombre entier non signé tout entier naturel sans signe codé selon l'algorithme d'Euclide. Le nombre entier non signé p s'écrit donc en système binaire : n −1 p= ∑δ 2 i =0 i i où δi représente sur le bit i le reste des divisions successives par 2. Exemple 13 s'écrit sur un octet 0000 1101. Les bits de droite sont appelés bits de poids faible et ceux de gauche bits de poids fort. ARCHITECTURE DES ORDINATEURS PERSONNELS 27 ──────────────────────────────────────────────────────────── On appelle nombre entier signé tout entier relatif. Le bit le plus à gauche, dit bit le plus significatif (most significant bit), code le signe et le nombre est positif quand ce bit est nul, négatif quand il est égal à 1. Sa valeur absolue utilise les n-1 bits restants et les n bits représentent des nombres entiers signés m tels que : −2 n −1 ≤ m ≤ 2 n −1 − 1 2.4 Nombres réels flottants Un nombre réel x est rationnel et représentable exactement en système binaire, ou irrationnel et approximé avec une erreur de troncature. Il s'écrit sous la forme : x = S M bc avec S son signe, M sa mantisse, b la base de numération, c sa caractéristique (sur p bits) liée à l''exposant e par la relation c = e + 2p-1. Soit la représentation numérique du signe, de la mantisse et de l'exposant : signe exposant mantisse Un constructeur choisissant longueur de caractéristique et d'exposant, il n'y a pas unicité de la représentation ce qui peut conduire à des résultats différents pour un calcul donné sur des calculateurs différents. Le bit de signe est nul si le nombre est positif, égal à 1 sinon. La précision de la représentation est déterminée par le nombre de bits de la mantisse dont la forme normalisée permet d'obtenir le maximum de chiffres significatifs. Cette dernière est définie par la relation 1/b ≤ M < 1. Seule la partie fractionnaire de la mantisse est représentée et la base 16 est un compromis entre la valeur absolue maximale et la précision. ■ Norme IEEE 754 Soient n le nombre de bits de la mantisse et p le nombre de chiffres significatifs. Le plus petit nombre réel représentable est 2-n et p est tel que : 2-n = 10-p ⇒ p = n log(2) ≈ 0.3 n La norme IEEE 754 définit une caractéristique sur 8 bits et une mantisse sur 23 bits pour six chiffres significatifs (simple précision), une caractéristique sur 11 bits et une mantisse sur 53 bits pour 15 chiffres significatifs (double précision). 2.5 Objets multimédia Diverses représentations des sons : mono ou stéréo (wav), compressé (mp3), etc. Une image est constituée de lignes de points appelés pixels (picture element), chacun caractérisé par son niveau de gris (un octet) ou sa couleur (deux ou trois octets). Les formats de représentation des images sont de type gif, bitmap, jpg, etc. Les formats MPEG2, MPEG4… sont relatifs à la vidéo. 28 CHAPITRE II ───────────────────────────────────────────────────────────── 3. UNITE CENTRALE DES ORDINATEURS PERSONNELS 3.1 Loi de Moore Gordon Moore, prix Nobel de Physique et un des fondateurs d'Intel a énoncé le postula suivant : "Les évolutions technologiques conduisent à un doublement de la puissance fournie par les microprocesseurs environ tous les 18 mois". Ainsi, la densité d'intégration des composants électroniques, la finesse de la gravure, la taille des puces réalisées ont évolué conformément aux graphes suivants : Le coût des investissements a cru exponentiellement ce qui provoqué la raréfaction des fondeurs. Ces évolutions expliquent l'apparition de l'ordinateur personnel et le monopole d'Intel. 3.2 Microprocesseur Les fonctions logiques d'une unité centrale utilisent les circuits électroniques de base ET, OU, NON. Un microprocesseur est une unité centrale monolithique (un unique boîtier parallélépipédique) ou par tranches s'il est constitué par plusieurs boîtiers. Le boîtier est muni de broches pour communiquer. D'où le nom de puce (chip) munie de pattes (pins) donné à l'ensemble qui peut intégrer différents processeurs spécialisés (unité centrale, graphique, entrées-sorties, etc.). Exemples Céléron, Core 2 Multi Coeurs d'Intel, Athlon d'AMD, processeur graphique. ARCHITECTURE DES ORDINATEURS PERSONNELS 29 ──────────────────────────────────────────────────────────── ■ Mot Toute suite de bits est découpée en mots dont la longueur est une caractéristique physique de la capacité de traitement d'une information par l'unité arithmétique et logique en un ou plusieurs cycles d'horloge. Application Soit un entier sur 32 bits et des mots de 16 bits. Deux accès mémoire sont nécessaires pour son chargement. Si le mot est de 32 bits, un accès suffit. ■ Fréquence d'horloge Les performances d'un microprocesseur dépendent de sa fréquence d'horloge comprise actuellement entre 1.8 et 3.4 GHz. Plus elle est élevée, plus le processeur dissipe de l'énergie ce qui impose une ventilation toujours plus importante pour éviter l'échauffement destructeur de la puce. ■ Architecture interne et externe On appelle architecture interne d'un processeur l'unité arithmétique et logique, les registres, les bus de données et d'adresses et la taille des mots utilisés. L'architecture externe d'un microprocesseur est constituée par les jonctions électriques entre ce dernier et son support sur une carte mère, réalisées au travers de broches et des bus externes dont les tailles ont variés de 8, 16, 32 puis 64 bits en fonction de l'évolution de la densité d'intégration et de la taille des mots. 30 CHAPITRE II ───────────────────────────────────────────────────────────── Pentium Pentium 4 ■ Le brochage (socket) : support physique du microprocesseur Les broches d'un microprocesseur permettent de l'installer sur un support physique appelé brochage (socket). Leur nombre croit avec la taille du bus interne (10 à 300). ARCHITECTURE DES ORDINATEURS PERSONNELS 31 ──────────────────────────────────────────────────────────── 3.3 Mémoires Les techniques d'intégration des transistors ont été utilisées avec les mémoires. ■ Accès à l'information Le contenu d'un mot est accessible à partir de son adresse codée sur n bits. L'espace mémoire adressable ou la capacité de la mémoire est le nombre maximum de mots adressables par un calculateur soit 2n. L'accès à l'information peut être direct, séquentiel (il est nécessaire de lire toutes les informations qui la précèdent (bande magnétique), indirect, ou aléatoire. Le temps d'accès est la durée entre l'instruction de lecture/écriture et son exécution, de l'ordre de la nanoseconde en mémoire centrale et de la milliseconde sur disque. Le cycle d'une mémoire est le temps d'accès entre deux différents mots. Le débit d'une mémoire (ou cadence de transfert) est le nombre d'informations lues ou écrites par unité de temps (bits/s). ■ Mémoires mortes Appelées également mémoires à lecture seule ou mémoires statiques, leur contenu est non volatile car non affecté par une interruption de l'alimentation électrique. Le temps d'accès est variable selon les technologies utilisées (5 à 80 ns). ROM (Read Only Memory) La ROM contient les informations (statiques) nécessaires au démarrage (bootstrap). PROM (Programmable Read Only Memory) Cette mémoire est reprogrammable une fois seulement. EPROM et EEPROM (Electrically and Erasable PROM) Ces PROM sont effaçables puis reprogrammables. 32 CHAPITRE II ───────────────────────────────────────────────────────────── ■ Le BIOS Une carte mère est configurée à partir d'un programme en ROM appelé BIOS (Basic Input Output System), interface entre le système d'exploitation et le système matériel, qui détecte ou contient sa description et dont certaines caractéristiques peuvent être modifiées par un programme de configuration appelé setup. Les cartes mères reconnaissent et configurent automatiquement les interruptions et les canaux DMA associés aux périphériques (installation et reconnaissance automatique - Plug and Play (PnP)). ■ Données accessibles par le programme setup Caractéristiques du processeur (fréquence d'horloge, optimisation des caches, tension d'alimentation, gestion des bus et des états d'attente, type, overclock (déconseillé)). Caractéristiques des périphériques externes (disques dur, lecteurs de disquettes, CDROM, carte vidéo, ordre de démarrage). Caractéristiques des bus et périphériques intégrés (carte vidéo, carte son, carte réseau, port série, port parallèle, etc.), configuration des adresses des ports d'entrées/sortie et des interruptions (interruption request - IRQ). Paramètres par défaut ou optimaux de la carte mère. Gestion des fonctions d'économie d'énergie et de données de températures. Définition d'un mot de passe d'accès et de protection de secteurs vitaux. La technologie des mémoires flash permet de modifier le contenu de la ROM BIOS dont il est indispensable de s'assurer que le rechargement s'effectue correctement. Une sauvegarde est judicieuse en cas de détérioration. Un mauvais paramétrage peut ralentir le système voir provoquer des instabilités. ■ Mémoire centrale Les programmes et données évoluent dynamiquement en mémoire RAM (Random Access Memory) dont la conception est simple (barrettes de 512 Mo à 2 Go, temps d'accès de 5 à 30 ns). Son contenu est rafraîchi périodiquement car elle se décharge en quelques millisecondes. ■ Cache matériel Les cartes mères peuvent intégrer deux niveaux de cache matériel (L1 et L2) comme les processeurs. D'un temps d'accès de l'ordre de 5ns, ils anticipent lectures ou écritures. Les capacités varient de 256 Ko et 1 Mo. ■ Cache logiciel (cache) Le cache logiciel est une zone de la mémoire RAM complétant les caches matériels. ■ Mémoires secondaires Les unités de stockage externes (disques durs, CDROM, DVD, clé USB, etc.) constituent les mémoires secondaires. ARCHITECTURE DES ORDINATEURS PERSONNELS 33 ──────────────────────────────────────────────────────────── 3.4 Cycle d'une instruction ■ Registres généraux Le traitement des données par l'UAL nécessite leur stockage dans un accumulateur ou des registres généraux d'accès plus rapide que celui de la mémoire centrale. Remarque : la base de registres de Windows Les fichiers de configuration des systèmes Windows constituent sa base de registres, sans rapport avec les registres du processeur. ■ Cycle d'une instruction L'unité de commandes (unité d'instructions, unité de contrôle) extrait de la mémoire centrale l'instruction à exécuter et l'analyse. Elle charge ensuite depuis la mémoire les données sur lesquelles porte l'instruction et exécute le traitement de ces données avec l'unité arithmétique et logique. Elle range les résultats dans la mémoire centrale. Le temps de cycle est la durée d'exécution d'une instruction élémentaire. ■ Horloge temps réel L'horloge temps réel est un circuit dont les impulsions périodiques déterminent le cycle d'horloge et interrompent périodiquement le processeur pour redonner la main au système d'exploitation ou stopper un processus bloquant. Un tic d'horloge représente le nombre d'interruptions du processeur par seconde (typiquement 50). ■ Registres fondamentaux Le déroulement du cycle d'une instruction nécessite quatre registres fondamentaux : • le compteur ordinal contenant l'adresse de la prochaine instruction à exécuter, • le registre instruction contenant l'instruction à exécuter. • les registres d'adresse et d'échange pour chargement (load) et rangement (store). Les registres fondamentaux opèrent sur les instructions, les registres généraux sur les données. ■ Registre des indicateurs d'état ("FLAGS") L'arithmétique nécessite certains indicateurs d'état (drapeaux) : C : retenue (carry) Indique les opérations arithmétiques avec retenue. O : débordement (overflow) Test un débordement éventuel. N : négatif (negative) Contenu du bit de signe d'un nombre. Z : zéro (zero) Tests, opérations arithmétiques et opérations logiques. 3.5 Jeu d'instructions L'unité arithmétique et logique est constituée d'instructions élémentaires réalisant les opérations arithmétiques, logiques, et spécialisées, chacune identifiée par son code opération. Les données sur lesquelles elle opère sont appelées opérandes. Le codage d'une instruction dépend du mot et du nombre de bits d'adresse de ses opérandes. 34 CHAPITRE II ───────────────────────────────────────────────────────────── Exemples 6 bits de code opération permettent 26 instructions élémentaires, 4 bits d'adresse d'un opérande offrent un accès à 16 registres, 32 bits d'adresse accèdent à 232 mots. L'addition de deux opérandes entiers nécessite le code opération de l'addition, les adresses des opérandes et du résultat. L'instruction a donc la forme : Code Opération Adresse 1ère Opérande Adresse 2ième Opérande Adresse résultat T rois registres contiennent les opérandes (R1,R2) et le résultat (R3). R1 R2 Commande R3 Diagramme d'une UAL à 3 adresses ■ Modes utilisateur et superviseur Les instructions ordinaires constituent le mode utilisateur. Elles sont accessibles à tout processus et leur exécution ne doit pas mettre en péril une autre tâche Les instructions privilégiées constituent le mode superviseur (mode système, mode noyau). Elles sont activées par l'horloge temps réel et réservées à l'usage exclusif du noyau du système d'exploitation. ■ Compatibilité Les évolutions des jeux d'instructions des microprocesseurs déterminent les performances et programmes supportés par une machine donnée. • Les applications s'exécutant sur d'anciens microprocesseurs fonctionnent sur les microprocesseurs plus récents (compatibilité ascendante). • Les applications s'exécutant sur les microprocesseurs récents ne fonctionnent pas sur des microprocesseurs anciens s'ils utilisent les fonctionnalités les plus récentes. • Les microprocesseurs de différents fondeurs ne sont général pas compatibles. 3.6 Performances Les facteurs d'efficacité des opérations arithmétiques sont les suivants : rapport de la taille des bus de données interne et externe (8, 16, 32 et 64 bits) et de la longueur des mots, opérations avec ou sans retenue. Une unité centrale ne peut donc pas être évaluée uniquement par sa vitesse d'horloge mais aussi par la richesse de son jeu d'instructions, la taille des bus et des mots. ARCHITECTURE DES ORDINATEURS PERSONNELS 35 ──────────────────────────────────────────────────────────── ■ Pipeline Les opérations de chargement et rangement, l'addition entière sur 64 bits nécessitent 2 cycles d'une machine dont la taille des mots et du bus de données est de 32 bits et la fréquence d'horloge de 1 GHz. Leur durée respective de 2 ns détermine le temps d'exécution total de l'instruction en langage évolué c=a+b (8 ns) dont les instructions élémentaires sont : Charger depuis la mémoire l'opérande entier a dans R1 Charger depuis la mémoire l'opérande entier b dans R2 Addition (entière) de R1et R2 et stockage du résultat (entier) dans R3 Ranger le contenu de R3 en mémoire à l'adresse de c Le schéma ci-dessous présente un processeur pipeliné à trois niveaux exécutant simultanément trois instructions différentes ce qui améliore ses performances (4 ns). ■ Mesures Un indice de performance est le temps d'exécution d'une tâche, produit du nombre d'instructions, nombre de cycles par instruction et temps de base du cycle. Une unité élémentaire et vague est le Mips (Million d'instructions par secondes) sa définition ne prenant pas en compte la nature de l'instruction et ne précisant ni la taille du bus, ni l'architecture (scalaire, vectorielle, pipelinée, parallèle, etc.) ni si le temps est celui du cycle ou de l'exécution. Une autre mesure, significative est le nombre d'opération en virgule flottante par seconde (Flops). ■ Indices de performance Des indices de performance (benchmarks) valides pour tous les systèmes sont établis en procédant à des tests dédiés tenant compte de la configuration et de la charge. 36 CHAPITRE II ───────────────────────────────────────────────────────────── Exemples En 2008, le CNRS s’est équipé d'une des plus puissantes plates-formes au monde de 207 Téra Flops conçue par IBM, composée de dix armoires Blue Gene/P (139 TFlops) et d'un groupe de huit modules Power 6 (68 TFlops). L'année 2009 verra la première machine Petaflopique de l'histoire (puissance d'1 PFlops). La SSBA, gratuite, développée par l'AFUU (Association Française des Utilisateurs d'Unix et des Systèmes Ouverts) mesure les performances et la portabilité. La suite SiS Software Sandra est un outil d'analyse des systèmes Windows proposant des modules d'évaluation des performances du processeur, de la carte vidéo, des ports, des imprimantes, de la carte son, de la mémoire, du réseau, des bus, etc. ■ Classification (ordinateur universel, station de travail, ordinateur personnel) Unité Centrale RAM (Go) Rapidité (Mips) Disque (Go) Nombre de disques Nombre de terminaux Main frame 1 à 2048 1-256 10000 5-300 1 à 500 1-2500 Station 1 à 128 1-64 1000 5 à 300 1 à 16 1-6 Ordinateur personnel 1à8 0.25 à 4 100 5 à 300 1à8 1 ARCHITECTURE DES ORDINATEURS PERSONNELS 37 ──────────────────────────────────────────────────────────── 3.7 Bus internes, externes et contrôleurs Une carte mère est constituée de circuits réalisant les fonctions suivantes : support du processeur, gestion de la mémoire, contrôleurs des bus d'entrées/sorties, horloge temps réel, etc. Les transferts entre la mémoire centrale et l'unité arithmétique et logique sont effectués par mots ou demi-mots par des bus internes : le bus des données qui gère les transferts de données, le bus d'adresses qui contient l'adresse de l'information, le bus de contrôle. U n ité d e c o n trô le I n s tru c tio n s M é m o ir e C e n tra le U n ité A r ith m é r iq u e e t lo g iq u e D onnées R é s u lta ts U n ité s d 'é c h a n g e s C o n tr ô le u r s d e s p é r ip h é riq u e s ■ Les circuits spécialisés (Chipset) Des circuits spécialisés pilotent les contrôleurs, les accès aux bus, les accès mémoires et les périphériques intégrés. Le circuit North Bridge P35 gère le bus PCI express x16 et les accès mémoires directs du microprocesseur. Le circuit South Bridge ICH9 gère bus SATA2, ports USB, bus PCI Express x1, bus PCI, bus Ethernet, lecteur de disquette, ports série et parallèle. 38 CHAPITRE II ───────────────────────────────────────────────────────────── Le bus FSB (Front Side Bus) gère les flux RAM/processeur (667 à 1333 MHz). Le bus USB 2.0 est un standard de connexion dynamique des périphériques externes. Le bus PCI Express, spécifié par Intel (2004) dérive du bus PCI (32 bits) et utilise des lignes bidirectionnelles dont chacune permet des échanges à 250Mo/s (version 1.1). Les bus (8 bits - 1981), ISA (16 bits -1984), AGP (32 bits - 1997) sont obsolescents. ARCHITECTURE DES ORDINATEURS PERSONNELS 39 ──────────────────────────────────────────────────────────── ■ Connecteurs Les connecteurs (slots) permettent d'enficher (plug) des contrôleurs de périphériques : connecteurs PCI(3), PCI Express (3+1), DDR (4), ATX (alimentation), ventilateurs. ■ Contrôleurs Un contrôleur est une interface matérielle entre bus interne et externe. Sur le présent schéma, on distingue les contrôleurs suivants : SATA2 (6) et IDE (1) pour des disques durs, USB (12), FDD (disquette), COM (port série), LPT (port parallèle), LAN (connecteur réseau local), PS/2 (clavier, souris), Optical (S/Pdif), Coaxial (S/Pdif). Le contrôleur DMA (Direct Memory Access) effectue des entrées/sorties directes en mémoire sans utiliser le processeur, le contrôleur d'interruptions gère les interruptions matérielles, l'horloge temps réel synchronise le système matériel. ■ Quelques bus externes Le bus Ultra DMA (Parallel ATAPI - PATA) est compatible EIDE avec un taux de transfert théorique de 16, 33, 66, 100, 133 Mo/s (PATA), deux périphériques connectables. Le bus SATA (Serial ATAPI) compatible PATA, d'un débit de 1.5 Go/s, à peine supérieur à la dernière génération de bus PATA ne gère qu’un périphérique. Le bus SATA2, d'un débit de 3 Go/s est disponible. Le bus SCSI est standard sur stations de travail et gros systèmes. On distingue les interfaces SCSI, ultra SCSI, ultra wide SCSI, ultra 640 SCSI, etc., dont les connecteurs diffèrent comme les débits (10 à 640 Mo/s) et le nombre de périphériques connectables : 8 (SCSI), 8 ou 16 (ultra SCSI, ultra wide SCSI, etc.). ■ Périphériques intégrés Carte son, carte réseau RJ45. 40 CHAPITRE II ───────────────────────────────────────────────────────────── Exemple : gestionnaire de périphériques Windows ARCHITECTURE DES ORDINATEURS PERSONNELS 41 ──────────────────────────────────────────────────────────── 3.8 Supports matériels des entrées/sorties Plateau Secteur Vue de dessus Piste Cylindre Partition Vue de face Géométrie d'un disque ■ Volume Un volume est une unité de mémoire secondaire (clé USB, CDROM, etc.), identifié par un nom (label de volume). Le type le plus usuel de volume est le disque dur dont l'unité de transfert est l'enregistrement physique ou bloc d'informations. ■ Fichier Un fichier est une suite d'octets stockée sur un volume accessible uniquement par des opérations spécialisées (lecture, écriture). ■ Temps d'accès Le temps d'accès d'une opération d'entrées/sorties se compose du temps de recherche (déplacement des têtes de lecture/écriture sur le disque), du temps d'attente (attente du passage du bloc en face de la tête), et du temps de chargement ou de rangement du bloc. Sur un disque dur, il varie de 8 à 12ms. ■ Plateau (platter) Un plateau est un disque circulaire et magnétique utilisé pour le stockage de données. 10 12 11 0 13 1 9 2 8 3 7 ■ 14 4 6 5 Piste (track) Une piste est une portion radiale d'un plateau accessible par une tête magnétique constituée de secteurs contigus. 42 CHAPITRE II ───────────────────────────────────────────────────────────── ■ Secteur (sector) Un secteur est une subdivision d'une piste (en octet) constituant l'unité d'enregistrement physique. ■ Cylindre (cylinder) Un cylindre est constitué d'un ensemble de plusieurs pistes d'un groupe de plateaux ayant la même distance radiale au centre du plateau. ■ Vitesse de rotation Les disques les plus lents ont une rapidité de 5400 Tours/mn, les plus rapides de 7200 à 10 000 Tours/mn. ■ Bloc Un bloc (enregistrement physique) est le nombre d'octets lu ou écrit à chaque accès sur le disque. Exemple : caractéristiques d'un disque dur d'un ordinateur personnel PC La capacité d'un disque de 2,4055*107 pistes de 17 secteurs de 512 octets est d'environ 210 Go. ■ Formatage de bas niveau La définition de la taille des secteurs, obligatoire avant une première utilisation, s'appelle sectorisation, formatage, initialisation. Un bloc est identifié par son adresse composée de plusieurs éléments (numéro de cylindre, de piste et de secteur). Lors du formatage, chaque secteur est vérifié. Les éventuels secteurs défectueux sont identifiés et éliminés de la liste des secteurs sains. Le formatage de bas niveau est effectué en usine. Toutefois, il peut être recommandé dès l'installation du disque pour optimiser le taux de transfert entre le disque dur et la station, un formatage de bas niveau inadapté pouvant faire chuter les performances. La capacité formatée d'un disque dur est de 90% de la capacité nominale, avant le formatage de bas niveau. La capacité se mesure en Go. Curieusement, tous les fabricants de disques durs n'utilisent pas les mêmes : chez certains (épiciers), 1Go = 109 Octets. Chez d'autres, 1 Go = 230 Octets. Les capacités en 2008 varient de 150 à 700 Go pour un coût minimal d'environ 50 €. ■ Partition Une partition représente un ensemble de secteurs de stockage des informations. ■ Tables d'allocation Tout bloc est décrit par des informations redondantes gérées par le contrôleur interne du disque. ARCHITECTURE DES ORDINATEURS PERSONNELS 43 ──────────────────────────────────────────────────────────── ■ Débit Le choix du bus externe (SATA, SCSI) est déterminant pour des hautes performances. Le débit (Mo/s) sur le bus permet de mesurer les performances effectives d'un disque. Certains sont dotés de caches matériels internes important (8 Mo). ■ Supports à accès séquentiel Les principaux supports à accès séquentiel sont les cartouches magnétiques fonctionnant en mode analogique (streamer), les cartouches magnétiques fonctionnant en mode digital (DAT - Digital Audio Tape ou DLT - Digital Linear Tape). Ces derniers médias s'utilisent surtout avec des bus SCSI, d'une capacité maximale de 800 Go. ■ Supports à accès direct • Clés USB, d'un coût modique et d'une capacité de stockage de quelques Go, dotées de mémoires flash pouvant conserver en permanence l'information, • Disques durs, fixes ou amovibles, d'un temps accès rapide (10 ms), d'une capacité de stockage toujours plus importante (Go ou To), • CDROM d'une capacité de 700 Mo, DVD d'une capacité de 4 à 8 Go utilisé pour les applications multimédia et les installations de logiciels. L'écriture est exécutée par un rayon laser qui marque le support de façon destructrice. Une fois la zone écrite, celle-ci n'est plus modifiable sauf sur les CD/DVD réinscriptibles. ■ Opérations sur les volumes La préparation du volume pour son utilisation appelée formatage de haut niveau. Le montage est l'intégration physique puis logique d'un volume formaté par le système d'exploitation rendant ce dernier accessible. Le démontage est l'opération inverse du montage, nécessaire par exemple quand on retire une clé USB. Lors de la suppression de fichiers, l'espace disponible est réutilisé, éventuellement de façon fragmentée sur certains systèmes de fichiers (FAT) ce qui est pénalisant (overhead). Il est alors nécessaire de défragmenter périodiquement les fichiers. 44 CHAPITRE II ───────────────────────────────────────────────────────────── 3.9 Interruptions et déroutements Une caractéristique fondamentale des ordinateurs est la faculté d'autoriser ou d'interdire l'interruption d'une action par des mécanismes matériels et logiciels pour éviter les anomalies d'exécution, contrôler l'exécution des travaux et des requêtes émises par les périphériques. On distingue les requêtes d'interruptions (interruption request - IRQ) provoquées par une demande de service d'une entité matérielle et les interruptions logicielles (traps) déclenchées par appel direct ou indirect (erreur d'exécution), provoquant un déroutement de l'application. Un drapeau d'état contient le code du service demandé ou celui de l'erreur cause du déroutement. Interruption Interruption logicielle Système Interruption matérielle Utilisateur Externe Exécutable ■ Application : les interruptions d'un PC Non exécutable Interne ARCHITECTURE DES ORDINATEURS PERSONNELS 45 ──────────────────────────────────────────────────────────── ■ Gestionnaire d'interruptions Le gestionnaire d'interruptions (interrupts handler) gère les interruptions et les déroutements qui sont des événements engendrant une action préemptive : le branchement sur la(es) routine(s) d'interruption. ■ Niveau d'interruption Certains travaux sont plus urgents que d'autres telle une action interactive ou différée. Le niveau d'interruption permet de quantifier la priorité d'une action pour en interrompre l'exécution et en commencer une autre plus prioritaire. ■ Niveau d'exécution L'ensemble des interruptions et des actions qui s'exécutent à un niveau d'interruption donné constituent un niveau d'exécution (run level). ■ Masquage des interruptions L'unité centrale devant quelquefois ignorer certaines requêtes, il existe des instructions d'inhibition et d'activation des interruptions comme la prise en compte de la priorité d'un événement, assurée par un mécanisme de masquage/démasquage. • Le masquage d'un ou de plusieurs niveaux d'exécution retarde la prise en compte d'un événement de ces niveaux et stocke le programme interrompu pour le réactiver ultérieurement. Pour cela, il faut : ◊ empiler le contexte (contenu des registres, de la mémoire, du compteur ordinal) dans la pile des contextes, ◊ identifier la nature de l'interruption, ◊ se brancher sur le module d'interruption chargé de déterminer la source de l'interruption et d'y répondre. • Le démasquage d'un ou de plusieurs niveaux d'exécution permet la prise en compte différée d'événements précédemment masqués. ■ Signaux Une interruption d'origine matérielle ou logicielle est matérialisée par un signal. L'armement d'un signal est la description de l'action à exécuter à réception d'un signal donné. Exemple Soit un ordinateur doté d'un micro commutateur de gestion de tâches hiérarchisées en plusieurs niveaux d'exécution numérotés par ordre de priorité croissante de 0 à 3. A chaque niveau d'exécution correspond une fonction du système : • le niveau 3 est le niveau d'exécution des applications usagers, • le niveau 2 est le niveau d'exécution de gestion des tâches et de la mémoire • le niveau 1 est le niveau d'exécution des entrées/sorties • le niveau 0 est le niveau d'exécution des problèmes matériels. 46 CHAPITRE II ───────────────────────────────────────────────────────────── Processus utilisateur 3 Processus 2 Commutation logicielle par l'ordonnanceur 1 0 Micro-commutateur : commutation matérielle Niveau d'exécution Un événement attendu par un processus B peut intervenir à tout moment, par exemple durant le contexte du processus A. ■ Prise en compte d'une interruption Une interruption est émise puis prise en compte selon l'algorithme suivant : • émission d'un signal électrique caractéristique de l'interruption (unité centrale, périphérique, application, etc.) • interruption après réception du signal par le processeur du travail en cours avec sauvegarde de son contexte d'exécution, • inhibition des interruptions masquables, • exécution de la requête ayant provoquée l'interruption, • restauration des interruptions masquées, • reprise du processus interrompu. ■ Périphériques Plug & Play Les interruptions et les canaux DMA associés à ces périphériques sont gérés dynamiquement par le BIOS et le système d'exploitation. Le périphérique doit être reconnu lors du démarrage de la station. Il faut alors installer son pilote, fourni avec ce dernier. Deux cas se présentent : • le périphérique fonctionne correctement, souvent après un redémarrage du poste de travail. C'est terminé. • Le périphérique ne fonctionne pas. Deux causes : ◊ conflit matériel (interruption, adresse, canal DMA). Il faut alors manuellement adapter le numéro de l'interruption, l'adresse, le canal DMA. Si le problème subsiste, il faut invalider au niveau du BIOS et au niveau du périphérique (cavalier ou logiciel) la gestion Plug&Play. ◊ conflit logiciel : pilote mal configuré, inadapté ou bogué. Une recherche sur Internet peut aider à résoudre le problème. ARCHITECTURE DES ORDINATEURS PERSONNELS 47 ──────────────────────────────────────────────────────────── 4. COMPLEMENTS SUR LE SYSTEME MATERIEL 4.1 Carte mère ■ Durée de vie La durée de vie commerciale d'un système matériel varie de 3 à 12 mois selon le cycle de vie suivant : 1 2 3 Phase 1 : phase de lancement Phase 2 : phase de maturité commerciale Phase 3 : phase d'obsolescence Cette obsolescence rapide peut poser des problèmes pour la maintenance. ■ Evolutivité Conformément à la loi de Moore, un doublement des ressources (mémoire, disque, processeur) tous les 18 mois peut être obtenu en changeant le processeur, le disque dur, en ajoutant de la mémoire. A prix comparable, un système à bon potentiel d'évolution est préférable à un système au maximum de ses possibilités. ■ Configuration manuelle Une des difficultés historiques de l'installation d'un PC est qu'il peut être nécessaire de configurer des cavaliers (jumpers) sur la carte mère ou les cartes d'extension. Leur nombre baisse sur les cartes actuelles, de plus en plus intelligentes et la documentation du constructeur est indispensable. 48 CHAPITRE II ───────────────────────────────────────────────────────────── 4.2 Périphériques sur bus ATAPI Le connecteur UDMA (norme ATAPI - ATA with Packet Interface Extension) gère disques durs, lecteurs et graveurs de CDROM et de DVD. Le respect des règles suivantes est impératif. • Deux périphériques en série (daisy chain) au plus peuvent être gérés sur ce bus. • Une résistance terminale doit être présente sur le périphérique terminal qui fonctionne en mode maître, l'autre devant fonctionner en mode esclave, entre le connecteur de la carte mère et le périphérique maître. • Tout disque de démarrage doit fonctionner en mode maître. Un deuxième périphérique sur le bus doit fonctionner en mode esclave. • Un périphérique unique sur le bus doit fonctionner en mode maître même si la norme autorise un fonctionnement en mode esclave. Les lecteurs/graveurs de CDROM/DVD peuvent être internes ou externes à l'unité centrale. Leur vitesse de lecture est de 56x (56 fois la vitesse de référence). La vitesse de gravure des CDROM va jusqu'à 52x, celle des DVD jusqu'à 24x. 4.3 Périphériques de saisie ■ Clavier Le clavier peut être intégré à l'unité centrale (portable), être connecté par un port PS/2 ou USB, ou sans fil (connecteur infra rouge). Il gère les caractères nationaux (en France, un clavier azerty accentué). Les touches de fonctions sont programmables et permettent d'activer des tâches. Le clavier numérique est constitué de touches permettant la saisie de chiffres, sans avoir à utiliser le mode majuscule. Les touches de gestion du curseur (flèches) permettent des déplacements verticaux ou horizontaux. ■ Souris La souris est un boîtier branché sur le port PS/2 ou USB dont les déplacements sur une surface plane sont reproduits à l'écran par le curseur (interface graphique). Les souris mécaniques utilisent une bille (plastique ou acier) dont les mouvements modifient deux potentiomètres (horizontal et vertical). Les souris électromagnétiques, plus précises, utilisent un repérage sur une tablette. Les souris sans fil sont à connexion infra rouge. ■ Autres périphériques de saisie Les lecteurs optiques (lecteurs de code barre), les tablettes à digitaliser, les convertisseurs analogiques/digitaux, les scanners, les périphériques MIDI (synthétiseurs musicaux), les modems, les cartes réseau, etc. ARCHITECTURE DES ORDINATEURS PERSONNELS 49 ──────────────────────────────────────────────────────────── 4.4 Affichage et acquisition ■ Moniteur Un moniteur utilise des procédés identiques à ceux mis en œuvre dans des postes de télévision dont les écrans cathodiques traditionnels (Cathodic ray tube - CRT) sont remplacés par des écrans plats avec la technologie LCD. • La fréquence de synchronisation verticale est la fréquence de rafraîchissement (de balayage) de l'image et varie jusqu'à 85 Hz. Le balayage est entrelacé quand le faisceau parcourt l'image en deux passes en n'en traçant qu'une ligne sur deux à chaque passe : lignes paires à l'une, lignes impaires à l'autre. La rémanence est alors importante. Le balayage non entrelacé donne de meilleurs résultats. • La stabilité visuelle de l'image impose un balayage du moniteur ligne par ligne 25 fois par seconde au moins et la fréquence de synchronisation horizontale (fréquence ligne) est définie par le temps de balayage d'une ligne complète. • La résolution de l'affichage est le produit du nombre total de lignes par le nombre de pixels par ligne. • La taille du moniteur est mesurée par la longueur de la diagonale et s'exprime généralement en pouces (2.54 cm). Les tailles actuelles varient de 15 à 23 pouces. • La bande passante d'un moniteur (MHz) est le produit de la résolution par la fréquence verticale. Elle peut varier jusqu'à 140 MHz. Exemple Le tracé d'une image 25 fois par seconde avec une définition de 800 lignes impose une fréquence de 20 KHz. Sur les moniteurs actuels, elle varie jusqu'à 85 KHz. 50 CHAPITRE II ───────────────────────────────────────────────────────────── ■ Mode d'utilisation Un moniteur fonctionne en mode texte quand il n'affiche que des caractères, en mode graphique dès que l'on peut visualiser des images. Un écran intelligent est doté de mémoire et d'un processeur graphique. En mode texte, l'écran comporte 25 lignes de 40 ou 80 caractères. Les attributs graphiques sont : vidéo inverse, soulignement, clignotement, sur et sousbrillance, niveaux de gris, nombres de couleurs. En noir et blanc, le niveau de gris d'un pixel est codé sur un ou deux octets. En couleur, les couleurs de base R(ouge)V(ert) B(leu) d'un pixel sont codées sur un, deux, ou trois octets et ce qui permet l'utilisation de 28, 216, 224 couleurs. Une image en couleur d'une résolution de 640*400 pixels nécessite donc 256 Ko, 512 Ko, ou 1 Mo selon le nombre d'octets d'un pixel. ■ Normes d'affichage Les normes des contrôleurs d'écrans ont beaucoup évolué depuis 1987, année où IBM annonce le format VGA (Video Graphic Array) qui est le standard actuel de base. Les cartes vidéo actuelles sont multistandards, dotées d'une capacité mémoire variant de 64 à 512 Mo, de capacité de traitement autonomes en mode 2D ou 3D. ARCHITECTURE DES ORDINATEURS PERSONNELS 51 ──────────────────────────────────────────────────────────── ■ Imprimantes Les paramètres caractéristiques d'une imprimante sont sa rapidité d'impression en pages par minutes et sa technologie. On distingue aujourd'hui deux types d'imprimantes : Imprimante laser La qualité d'impression est parfaite. Dotées de mémoire, elles sont pilotées par un microprocesseur interne. Elles sont robustes et peuvent imprimer tout type de document. Les plus réputées sont fabriquées par HP ou EPSON. Les moins chères sont de l'ordre de 150 € en noir et blanc, 250 € en couleur. Un toner vaut environ 75 €. Imprimante à jet d'encre Moins robustes que les imprimantes laser, les imprimantes à jet d'encre offrent une excellente qualité d'impression pour un prix modique (80 €). Les consommables (cartouches d'encre) sont très onéreux. Il existe trois interfaces : série, parallèle, USB (le standard actuel). ■ Scanner Les scanners digitalisent du texte ou des images. Trois interfaces possibles : parallèle, USB ou SCSI. Un logiciel de reconnaissance de caractères (OCR) reconstitue un texte digitalisé. Le taux de reconnaissance des caractères est de l'ordre de 90% ce qui conduit tout de même à 15 fautes par page. Il est donc judicieux d'utiliser un dictionnaire après la reconnaissance. Des logiciels de retouches d'images sont disponibles (Photoshop (Adobe), Picassa (domaine public), etc.). ■ Multimédia Le PC permet d'effectuer les traitements (acquisition ou restitution) du son et d'images. Ainsi, il permet de connecter des appareils photos numériques, des caméras numériques, de faire des traitements sur des photos, des films, des sons. Tous ces objets utilisent des formats de représentation en pleine évolution. Son Deux classes de formats : wav et mp3 basés sur des techniques d'échantillonnage et de compression sonore pour numériser des sons en mono, ou en stéréo, la fréquence d'échantillonnage déterminant la qualité sonore du résultat et l'espace disque nécessaire. Image Deux classes de formats : les fichiers avi (les plus complets), et les fichiers compressés aux normes MPEG2, MPEG4, MPEG7. Codec L'abréviation codec désigne un procédé de compression/décompression d'un signal (analogique ou numérique). 52 CHAPITRE II ───────────────────────────────────────────────────────────── 4.5 Cartes d'extension On peut étendre la configuration de base d'une station par adjonction de cartes enfichées dans les connecteurs d'accès aux différents bus. ■ Carte vidéo Elle est dotée d'une capacité mémoire vidéo comprise entre 128 Mo et 512 Mo. Elle peut être intégrée à certaines cartes mères. Les cartes actuelles utilisent le bus PCI Express ou le bus AGP (obsolescent). Elles sont dotées d'un processeur graphique (Graphical Processor Unit – GPU) pour gérer des images 3D. ■ Gestion des imprimantes Elles sont interfacées au poste de travail par une interface série, parallèle, USB, intégrée sur la carte mère. ■ Carte de communications Un port série peut aussi être utilisée comme interface de communications pour transformer l'ordinateur personnel en terminal asynchrone d'un ordinateur. Des cartes (interface RJ45) permettent de connecter les ordinateurs sur des réseaux Ethernet. ■ Autres cartes Manettes de jeux (joystick), acquisition de son ou d'images, accès à un périphérique musical (MIDI), etc. ARCHITECTURE DES ORDINATEURS PERSONNELS 53 ──────────────────────────────────────────────────────────── Exemple : le gestionnaire des périphériques Windows 4.6 Protocole d'installation d'un ordinateur personnel Installation d'une station et vérification du fonctionnement de la configuration matérielle, avec ses paramètres par défaut. Vérification des connexions et du sens de connexion des câbles (nappes) asymétriques ou avec détrompeur. Installation un par un des disques durs et des autres périphériques,. 54 CHAPITRE II ───────────────────────────────────────────────────────────── 5. TOLERANCE DE PANNES ET TECHNOLOGIE RAID Le principe de la technologie RAID (Redundant Arrays of Inexpensive Disks) est basé sur la multiplication des disques pour garantir une bonne tolérance aux pannes. On distingue différentes technologies RAID. ■ La technologie RAID 0 Appelé aussi stripping, les données sont réparties sur au moins deux disques sous la forme d'agrégats par bandes (voir la définition avec la technologie RAID 5). Le débit de la grappe de disques (cluster) en technologie RAID 0 est celui de son nombre de disques. Ainsi, une grappe de 4 disques d'un débit unitaire de 33 Mo/ a un débit de 132 Mo/s. Elle n'apporte aucune sécurité des données, la perte d'un disque entraînant la perte des données de tous les disques de la grappe. ■ La technologie RAID 1 Cette technologie utilise deux disques identiques pilotés par un contrôleur unique (mirroring) ou par deux contrôleurs (duplexing). Toute modification d'un disque est immédiatement répercutée sur l'autre qui est donc un disque miroir appelé réplique. Un disque victime d'un incident peut être changé. Le point faible de cette technologie est l'unicité du contrôleur dans la technique du mirroring qui ne dispense en aucun cas d'un dispositif de sauvegarde sur support magnétique. Remarques • Une partition miroir doit être sur un autre disque physique et sa taille au moins égale à celle du disque d'origine. • Les disques (reflété et miroir) sont accessibles par un identificateur unique. • Toute partition est exploitable en miroir. ■ La technologie RAID 2 Identique à la technologie RAID 1 un seul disque étant sollicité lors des lectures. ■ La technologie RAID 3 Technologie RAID 0 complétée (disque de parité) pour détecter les erreurs d'écriture. ARCHITECTURE DES ORDINATEURS PERSONNELS 55 ──────────────────────────────────────────────────────────── ■ La technologie RAID 4 Similaire à la technologie RAID 3, le disque de parité travaillant deux fois plus. ■ La technologie RAID 5 Préférée à la technologie RAID 4, cette technique utilise le concept d'agrégat par bande avec parité : • Trois zones de même taille au moins sont nécessaires sur trois disques physiques différents. • L'agrégat par bande, réparti sur différents disques constitue une partition logique, similaire à l'agrégat de partitions. ◊ L'agrégat est découpé en bandes. ◊ Un fichier d'une taille supérieure à une bande est réparti sur deux bandes. ◊ L'extension d'un agrégat par bande provoque la destruction de ses données. La technologie RAID 5 utilise moins d'espace disque que la technologie RAID 1. Elle impose toutefois de disposer d'au moins trois disques les informations de parité devant être stockées sur un disque externe pour chaque bande de l'agrégat. La gestion de la parité entraîne une dégradation des performances et l'espace nécessaire à cette gestion est inversement proportionnel au nombre de disques utilisés. La parallélisation des entrées/sorties améliore les performances. 6. SYSTEMES DE STOCKAGE DISTRIBUES NAS ET SAN ■ Problématique du stockage ■ Protection contre les catastrophes La concentration des ressources de traitement et de stockage au même endroit rend le système très vulnérable vis-à-vis des catastrophes (inondation, incendie, catastrophes naturelles, etc.). Pour les prévenir, il est indispensable d'éloigner le stockage du traitement et de mettre en place des mécanismes de restauration rapides. Or, le bus 56 CHAPITRE II ───────────────────────────────────────────────────────────── SCSI, un des standards actuels, limite à quelques mètres la distance entre le périphérique et l'unité de contrôle. Lorsque chaque serveur dispose de ses propres ressources de stockage, l'administrateur de système doit intervenir au niveau de chacun des différents systèmes, pas forcément homogène. ■ Optimisation de l'utilisation de l'espace de stockage Les méthodes d'optimisation du stockage distant sont les suivantes : • centralisation du stockage ce qui en simplifie l'administration, • charge du réseau diminuée par utilisation de caches sur postes clients et serveurs, • optimisation des temps de réponse par utilisation de périphériques rapides, • diminution ou masquage des temps de sauvegarde par des logiciels spécifiques. Le principe de la consolidation des serveurs stipule que tous les serveurs de l'entreprise sont regroupés. Les fournisseurs de systèmes de stockage ont été amenés à proposer des architectures permettant le partage l'espace de stockage entre différents systèmes dans un réseau local à très haut débit de type Fiber Channel dédié à la gestion des flots de données.. ■ Architectures NAS Le protocole NAS (Network Attached Storage - stockage attaché au réseau) permet de gérer des ressources de stockage distribuées sur le réseau Intranet et accessibles par des protocoles de haut niveau tels NFS. L'abstraction présentée aux systèmes clients est de type serveur de fichiers distribués. Les clients émettent des requêtes (lecture - écriture) vers les fichiers distants, la seule opération nécessaire au préalable étant la connexion au serveur correspondant. ■ Architectures SAN Un réseau de stockage (Storage Area Network - SAN) à haut débit est constitué d'unités directement connectés accessibles par des systèmes distribués indépendants. ARCHITECTURE DES ORDINATEURS PERSONNELS 57 ──────────────────────────────────────────────────────────── ■ Comparaison des architectures SAN et NAS Réseau NAS SAN Réseau existant (ethernet, FDDI, etc.) Réseau spécialisé Fonction des Unités de Serveur de Stockage hétérogènes 7. fichiers Serveurs de stockage Service de protection et de partage Protocole d'échange Niveau 7 Niveau 1 ou 2 Bande passante réseau Intranet N Gbits/s Administration Serveurs de fichiers Directe EXERCICE 1°) Etablir une cartographie de votre ordinateur (pilotes de périphériques, caractéristiques physiques du processeur, des différents bus internes et externes, de la carte mère, des périphériques externes. Sous Windows, on pourra utiliser un logiciel tel Everest, PC Wizard, Aida, etc. 2°) Evaluer les performances de la machine. 3°) Modifier les paramètres du BIOS pour essayer d’overclocker la machine. CHAPITRE III GENERALITES SUR LES SYSTEMES D'EXPLOITATION 1. ARCHITECTURE ET MODELISATION 1.1 Présentation et rôle du système d'exploitation Dans chaque ordinateur, un ensemble de programmes appelés moniteur (monitor), gestionnaire de travaux (task manager) ou noyau (kernel), contrôlent l'exécution des applications, gèrent les ressources, les flux d'informations et fournissent des services. Nous utilisons le terme plus général de système d'exploitation (operating system). Un système d'exploitation assure les services suivants : • gestion, ordonnancement, partage, contrôle des ressources et de la fiabilité du système entre les travaux et les utilisateurs (temps partagé, multitâche, etc.) • gestion, conservation, et protection des flux d'informations (entrées/sorties), • transformation de la machine réelle en machine virtuelle par l'interface homme machine. ■ Ce que n'est pas un système d'exploitation Le système d'exploitation n'est pas une machine indépendante qui contrôle l'ordinateur. Ce n'est ni un langage de programmation, ni un compilateur, ni un interprète de commandes, ni une bibliothèque. Tous les programmes, y compris le système d'exploitation sont écrits dans un langage de programmation. On perçoit le système d'exploitation de deux manières différentes : ■ Le point de vue de l'utilisateur Le système d'exploitation est un fournisseur de services (téléphonie mobile, accès internet, messagerie électronique, etc.) accessible par une interface homme machine plus ou moins ergonomique. ■ Le point de vue de la machine Le système d'exploitation gère le système : utilisateur, fichiers, programmes. Exemples Windows XP, Linux, Unix, MVS. Nous allons décrire sommairement, avec ce point de vue, le fonctionnement général de la machine. 60 CHAPITRE III ────────────────────────────────────────────────────────────── 1.2 Machine virtuelle Les concepts présentés dans le présent chapitre ont permit de prendre en compte les évolutions permanentes des systèmes matériels. Ainsi, les machines de première génération étaient rudimentaires et chères. Seuls, quelques programmeurs avertis pouvaient les utiliser et peu d'entre eux étaient capables de réaliser un système d'exploitation alors fortement dépendant de l'architecture matérielle. La conception des systèmes d'exploitation a progressé dès que les machines sont devenues multitâches. Les besoins de mécanismes de contrôle du système et la nécessité d'un fonctionnement fiable ont conduit aux définitions des concepts de processus, ressource, etc., dès l'apparition des machines de deuxième génération. La philosophie actuelle est qu'un système d'exploitation doit être indépendant du matériel qui le supporte. Il fournit des services de haut niveau d'une machine abstraite appelée machine virtuelle qui masque la machine réelle (de bas niveau). Le système d'exploitation Unix en est une parfaite illustration car il est implémenté sur toute architecture matérielle dont l'utilisateur a ainsi une vision uniforme. 1.3 Modèle en couches La machine est le support matériel du système d'exploitation. Des couches de logiciels implémentent les fonctionnalités de base qui fournissent chacune un service par exemple la gestion des applications. Le système d'exploitation est donc représenté par un modèle en couches qui en illustre la hiérarchie. Programme d'application Utilisateur Utilitaire système Logiciel de base Système d'exploitation Machine matérielle Au niveau inférieur se trouve le matériel, inutilisable seul. Les deux niveaux supérieurs constituent le logiciel de base sur lequel s'appuie le dernier niveau : les logiciels applicatifs. Toutes les couches sont nécessaires. Exemple Processus utilisateur Appel système Interface noyau Gestion des processus Systèmes de fichiers Ordonnanceur Mode caractère IPC Mode bloc Gestion mémoire Cache Gestion des interruptions Interface matériel et pilotes ARCHITECTURE DU NOYAU UNIX Noyau GENERALITES SUR LES SYSTEMES D'EXPLOITATION 61 ────────────────────────────────────────────────────────────── ■ Applications Une machine virtuelle peut utiliser les services d'une autre machine virtuelle. machine virtuelle MV1 machine virtuelle MV2 machine réelle Exemples La machine virtuelle Linux (ici MV1) peut fonctionner avec le gestionnaire de machine virtuelle VMvare (MV2), encapsulé qui utilise la machine réelle Windows en mode natif. Plusieurs machines virtuelles peuvent coexister (interprète de commande, interface graphique, traitement de texte, etc. 2. PROCESSUS 2.1 Définitions • Un programme est un ensemble d'instructions indivisibles. • Une ressource est un objet informatique (mémoire, disque, compilateur, éditeur de liens...) nécessaire à l'exécution d'un travail. • Une tâche à exécuter est le triplet (programme, données système, ressources). C'est un objet statique. • Un processeur est l'entité matérielle et logicielle nécessaire à l'exécution d'une tâche. • Un processus est une tâche en cours de traitement. C'est un objet dynamique. • Un processus en cours d'exécution est actif, activable s'il dispose de toutes les ressources requises pour s'exécuter à l'exception du processeur, bloqué sinon. • Une ressource est : ◊ locale à un processus si elle ne peut être utilisée que par ce dernier. ◊ commune si elle n'est locale à aucun processus. ◊ partageable avec n points d'accès (n > 1) si elle peut être attribuée au même instant à n processus au plus. Une ressource partageable avec un unique point d'accès est dite critique. • Des processus sont indépendants s'ils n'utilisent que des ressources locales, parallèles pour une ressource s'ils peuvent l'utiliser simultanément et en exclusion mutuelle s'il s'agit d'une ressource critique. 62 CHAPITRE III ────────────────────────────────────────────────────────────── Exemples • L'unité centrale est une ressource critique. • Une application peut être utilisable simultanément par n utilisateurs. • Un fichier en lecture a une infinité de points d'accès contrairement à un fichier en écriture, qui est une ressource critique à un point d'accès tel une imprimante. 2.2 Exclusion mutuelle Le partage d'une ressource critique par plusieurs processus risque d'entraîner une incohérence dans le fonctionnement du système. Exemple L'application distribuée suivante est une transaction. LIRE X ADD 1 ECR X /* additionner 1 à X */ /* écrire X sur un fichier */ On suppose deux transactions concomitantes générées par les processus P1 et P2. X Processus P1 Disque dur Processus P2 Supposons la transaction divisible et l'ordre d'exécution des instructions aléatoire : Processus P1 a) LIRE X b) ADD 1 c) ECR X Processus P2 d) LIRE X e) ADD 1 f) ECR X. L'ordonnancement des processus peut conduire à la séquence S1 = (a,b,c,d,e,f) : X Image de X Disque dur Image de X+1 ou bien à la séquence S2 = (a,b,d,c,e,f). Image de X X Disque dur Les valeurs écrites diffèrent : (X+1)+1 (séquence S1), X+1 (séquence S2) ce qui est évité si une transaction est indivisible et effectuée en exclusion mutuelle d'une l'autre. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 63 ────────────────────────────────────────────────────────────── ■ Section critique Soit une ressource critique R. On appelle section critique d'un processus P pour la ressource R une phase du processus pendant laquelle R est utilisée par P et donc inaccessible à un autre processus demandeur, qui doit obtenir un droit d'accès à la ressource critique avant d'entrer en section critique. Si la ressource est disponible, ce droit est alloué ; le processus demandeur est mis en attente jusqu'à sa libération sinon. Modélisation d'une section critique ETAT(P)=ACTIF requête de la ressource R par le processus P si R est utilisée par un autre processus alors état (P) = bloqué ; mettre P en file d'attente de R dans la file f(R) sinon allouer R à P et en interdire l'accès à tout autre processus P rentre dans la section critique is ■ Verrou mortel Des sections critiques imbriquées conduisent à des situations de blocage mutuel, également appelées interblocage, verrou mortel (dead lock) ou étreinte fatale. Exemples Le processus P détient la ressource R1 et ne la rendra que s'il obtient la ressource R2, le processus Q détient la ressource R2 et ne la rendra que s'il obtient la ressource R1… R1 R2 Soient les processus P et Q comportant deux sections critiques distinctes S1 et S2. Processus P P1 Demander les droits d'accès pour S1 P2 Demander les droits d'accès pour S2 P3 Restituer les droits d'accès pour S2 P4 Restituer les droits d'accès pour S1 Processus Q Q1 Demander les droits d'accès pour S2 Q2 Demander les droits d'accès pour S1 Q3 Restituer les droits d'accès pour S1 Q4 Restituer les droits d'accès pour S2 La séquence (P1,Q1,P2,Q2) conduit à l'interblocage perpétuel des processus P et Q. 64 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Famine La famine est une autre situation à éviter. Soit un processus bloqué dans une file d'attente d'accès à une ressource. Supposons qu'à l'instant de la restitution de la ressource critique apparaisse un autre processus demandeur de cette ressource et que cette dernière lui soit allouée sans vidage de la file d'attente. Tant que le phénomène se reproduit, le processus en attente est privé de l'utilisation de cette ressource. ■ Propriétés de la solution du problème de l'exclusion mutuelle Une solution au problème de l'exclusion mutuelle a été formulée par E. Dijkstra (1975). Elle a les propriétés suivantes : • A tout instant, il y a au plus un processus en section critique. • Si plusieurs processus sont bloqués en attente de la ressource critique alors qu'aucun processus ne s'y trouve, l'un d'eux doit pouvoir y entrer au bout d'un temps fini pour d'éviter un blocage mutuel. • Un processus bloqué en section critique ne doit pas empêcher l'entrée d'un autre processus en section critique. 2.3 Sémaphore Un sémaphore s est la donnée d'un couple (e(s),f(s)) où e(s) ∈Ζ est la valeur courante du sémaphore s et f(s) la file d'attente associée. Soit (e(s),f(s)) un sémaphore. On définit les opérations suivantes : ■ Opération P de mise en attente d'un processus dans f(s) (Puis-je ?) Début e(s) = e(s) - 1 si e(s) < 0 alors état(r) = bloqué P(s) mettre le processus r en attente dans la file f(s) is Fin ■ Opération V de libération d'un processus en attente de f(s) (Vas-y!) Début e(s) = e(s) + 1 si e(s) ≤ 0 alors V(s) recherche puis sélection d ' un processus bloqué dans f (s) état (q ) = actif is Fin ■ Initialisation d'un sémaphore Le sémaphore s est initialisé à partir de la condition {e0(s) ∈ ℵ* ∀ s, f(s) = ∅}. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 65 ────────────────────────────────────────────────────────────── ■ Indivisibilité et ininterruptibilité Une instruction élémentaire est indivisible ainsi que les opérations P et V. Une séquence d'instructions est indivisible si elle ne peut pas être interrompue. Sur un système monoprocesseur, on rend une procédure indivisible en la rendant ininterruptible par masquage d'un niveau d'interruption le processeur étant utilisé comme ressource critique. Sur un système multiprocesseurs, plusieurs processeurs pouvant exécuter simultanément des opérations P ou V, l'instruction spécialisée Test And Set utilise un drapeau indicateur d'accès à la ressource critique avec un verrou : l'opération est autorisée s'il est nul, interdite sinon. ■ Mise en file d'attente et extraction La majorité des files d'attentes associées aux sémaphores sont gérées par un algorithme FIFO ce qui garantit la libération équitable des tous les processus bloqués. ■ Propriétés mathématiques des sémaphores Soient : np(s) le nombre d'opérations P exécutées sur s, nv(s) le nombre d'opérations V exécutées sur s, nf(s) le nombre de processus ayant franchi la primitive P(s). On a toujours les relations e(s) = e0(s)-np(s)+nv(s) nf(s) = min(np(s),e0(s)+nv(s)) nf(s) ≤ np(s) ■ Interprétation des sémaphores Un sémaphore est une barrière dont l'opération P est une requête de passage (Puis-je passer ?) et l'opération V une autorisation de passage (Vas-y). Le nombre total d'autorisations délivrées est e0 + nV. Si nf(s) et np(s) sont égaux, il n'y a pas de processus en attente ou bloqué dans f(s). Si nf(s) est inférieur à np(s), des processus sont bloqués dans f(s). La valeur absolue de e(s) indique le nombre de processus bloqués dans f(s) (e(s) <0), le nombre de processus pouvant franchir s sans se bloquer sinon. ■ Sémaphore d'exclusion mutuelle (admis) Un sémaphore mutex tel que e0(mutex) = 1 est un sémaphore d'exclusion mutuelle. Il a les propriétés suivantes : • Le nombre n de processus en section critique est tel que : n = nf(mutex) - nv(mutex) • A tout instant, un processus au plus se trouve dans sa section critique. • Il n'y a pas de processus bloqué par le sémaphore d'exclusion mutuelle quand aucun processus ne se trouve en section critique. 66 CHAPITRE III ────────────────────────────────────────────────────────────── 2.4 Synchronisation des processus Les mécanismes de synchronisation de processus permettent à un processus actif d'en bloquer un autre ou de se bloquer en attendant un signal d'un autre processus, d'activer un processus bloqué en lui transmettant éventuellement de l'information. ■ Synchronisation par sémaphore (Dijkstra - 1968) Les sémaphores permettent de synchroniser des processus. Un signal d'activation d'un processus libérateur est envoyé par une primitive V, attendu par une primitive P émise par un processus demandeur. Soit un sémaphore s et un processus P. On dit que s est un sémaphore privé de P s'il est l'unique processus pouvant exécuter l'opération P sur s ; les autres processus peuvent agir sur le sémaphore s avec l'opération V. Application : relation d'ordre entre processus Soit un sémaphore signal tel que e0(signal) = 0. processus P Début ... P(signal) ... Fin processus Q Début V(signal) Fin Le processus libérateur effectue des opérations V sur le processus bloqué. P(signal) état(p) actif e(signal) 0 état(q) actif t0 ■ bloqué -1 V(signal) t1 actif 0 V(signal) t2 P(signal) actif actif 1 0 V(signal) t3 t4 Evolution des états d'un processus bloqué L'évolution du processus bloqué est subordonnée à l'émission d'un signal par le processus libérateur. L'émission de n signaux permettent au processus demandeur d'exécuter n+1 opérations P sans se bloquer donc de mémoriser le signal. 2.5 Modèle du producteur et du consommateur Les primitives de synchronisation précédemment étudiées représentent un mode de communication où l'information transmise est réduite à une autorisation ou une interdiction. C'est insuffisant quand les actions exécutées par un processus après son activation dépendent de l'identité du processus activateur et nécessitent la communication d'informations en quantité importante entre ces processus qui devront accéder à un ensemble de variables globales constituant un univers commun. Une application de ce modèle est le tube. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 67 ────────────────────────────────────────────────────────────── ■ Position du problème Le modèle du producteur et du consommateur modélise la situation suivante. Soient deux processus asynchrones : le producteur et le consommateur qui échangent des informations dans une mémoire-tampon, de la façon suivante : • l'information est constituée de messages de taille constante, • la mémoire tampon a une capacité fixe de n messages. ■ Cycle de fonctionnement Leur activité suit le cycle "perpétuel" suivant : Producteur PROD Production d'un message Dépôt du message dans le tampon Aller à PROD ■ Consommateur CONS Prélèvement du message Consommation du message Aller à CONS Règles de fonctionnement Les règles de communication entre les processus producteur et consommateur sont les suivantes : • exclusion mutuelle au niveau des opérations sur un message : le consommateur prélève un message une fois et une seule et ne peut prélever un message en cours d'écriture dans le tampon, • le producteur ne peut placer un nouveau message si le tampon est plein. Mis en attente de tampon plein, il doit être prévenu dès que cette condition n'est plus vraie. Idem pour le consommateur et le tampon vide. Soient les deux variables d'état du système : nplein le nombre de messages attendant d'être prélevés, nvide le nombre d'emplacements disponibles dans le tampon. La variable nplein est utilisée lors de la dépose et du prélèvement du message, la variable nvide lors de la production et de la consommation du message. On a les équivalences : nplein = 0 ⇔ il n'y a pas de message en attente, nvide = 0 ⇔ il n'y a pas d'emplacement disponible dans le tampon. 1 2 3 ... ... Tampon ■ Initialisation npleino = 0; nvideo = n n-1 n 68 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Algorithme Chacune des trois séquences suivantes est indivisible. PRODUCTEUR PROD /* production d'un message */ nvide : = nvide - 1 si nvide = -1 /* pas d'espace disponible*/ alors attendre is CONSOMMATEUR CONS /* prélèvement d'un message */ nplein : = nplein - 1 si nplein = -1 /* pas de message en instance */ alors attendre is /* Dépôt du message */ nplein : = nplein + 1 /* Consommation du message */ nvide : = nvide + 1 /* Réveil du consommateur en attente*/ /* Réveil du producteur en attente*/ si nplein = 0 alors réveil du consommateur is si nvide = 0 alors réveil du producteur is Aller_à PROD Aller_à CONS Remarque nplein = 0 ⇒ nplein ≤ 0 et nplein = -1 ⇒ nplein < 0 Les variables nplein et nvide sont deux sémaphores privés de gestion des processus producteur et consommateur. D'où la formulation : Sémaphores privés nplein, nvide Initialisation : npleino = 0 ; nvideo = n PROD Production d'un message CONS (t1) P(nvide) (t2) Déposer le message (t2) V(nplein) (t1) aller_à PROD ■ Prélèvement d'un message P(nplein) Consommer le message V(nvide) aller_à CONS Analyse du fonctionnement du système Les processus Production - Consommation se décomposent en deux phases : t1) Production t2) Dépôt t2) Retrait t1) Consommation Le producteur et le consommateur ne peuvent être bloqués simultanément. ■ Applications Un spoule (spool) est une mémoire tampon utilisée comme une imprimante virtuelle pour stocker une requête d'impression qui réveille le serveur d'impression (spooler). Un tube (Unix) enchaîne deux commandes le résultat de la première devenant donnée de la seconde. 2.6 Accès concurrents Le modèle des lecteurs et des rédacteurs illustre les problèmes de gestion des accès concurrents quand plusieurs processus font simultanément des requêtes d'accès en lecture ou en écriture à une ressource partageable (fichier, mémoire, etc.). GENERALITES SUR LES SYSTEMES D'EXPLOITATION 69 ────────────────────────────────────────────────────────────── ■ Algorithme LECTEURS REDACTEURS Début Requête de lecture si les conditions d'accès sont satisfaites alors Lecture Fin de lecture sinon Mise en attente is Fin Début Requête d'écriture si les conditions d'accès sont satisfaites alors Ecriture exclusive Fin d'écriture sinon Mise en attente is Fin Les conditions d'accès concurrents sont accès partagé à l'information en lecture pour n lecteurs sans aucun rédacteur, accès exclusif à l'information à un processus rédacteur. ■ Verrouillage d'accès Une solution au problème des accès concurrents est la pose d'un drapeau verrouillant l'accès lors d'une transaction selon l'algorithme : Requête d’accès si le verrou est déposé alors Pause du verrou Exécution complète de la transaction Dépose du verrou Réveil du processus en attente du verrou sinon mise en attente de la requête is La granularité d'un verrou permet de gérer l'accès à la totalité d'un fichier, à un de ses objets, ou l'attribut d'un objet. ■ Verrou consultatif Un verrou est consultatif (advisory locking) s'il n'a pas d'influence sur les primitives d'entrée/sortie. Il n'empêche pas un processus ayant les droits d'accès convenables d'écrire sur un fichier verrouillé par un autre processus. ■ Verrou impératif Un verrou est impératif (mandatory locking) s'il peut modifier le fonctionnement habituel d'une primitive d'entrée/sortie. Par exemple, en contrôlant la phase d'écriture en la rendant bloquante ou en l'empêchant. Ce type de verrou garantit le meilleur niveau de sécurité. Il est plus complexe à gérer. ■ Verrou partagé et verrou exclusif Un verrou partagé en lecture garantit à plusieurs processus lecteurs l'accès à un fichier en empêchant la pose d'un verrou exclusif en écriture. 70 CHAPITRE III ────────────────────────────────────────────────────────────── 2.7 Le diner des philosophes (E. Dijkstra - 1971) Des philosophes discutent autour d'un plat de spaghettis qui nécessitent deux couverts pour être mangés. La table n'étant dressée qu'avec une seule fourchette par convive, les philosophes adoptent le rituel suivant : chacun prend place à un emplacement fixe et un mangeur utilise exclusivement les fourchettes qui sont à sa droite et sa gauche ce qui interdit à deux voisins de manger simultanément. A chaque instant, un philosophe est dans une des situations suivantes : • il mange (état 1) • il a faim (état 2) mais ne peut satisfaire son appétit par manque de fourchette ; il doit attendre que les deux fourchettes soient disponibles. • il pense (état 3) et n'utilise aucune fourchette. Au départ, tous les philosophes pensent. Ce rituel est complété pour éviter les situations conflictuelles suivantes : • tous les philosophes voulant manger saisissent simultanément la fourchette de droite et attendent la fourchette de gauche alors indisponible (verrou mortel), • un philosophe affamé en attente n'est pas averti de la libération des fourchettes droite et gauche (famine), • un philosophe boulimique ne s'arrêtant jamais de manger (boucle infinie) provoque la famine de ses voisins de droite et de gauche, • une coalition de philosophes empêchant leur voisin commun de manger (famine). On suppose donc de plus que : • tout philosophe qui mange doit cesser de manger au bout d'un temps fini pour ne pas monopoliser les fourchettes et risquer d'affamer ses deux proches voisins, • les activités de réflexion et dégustation sont séquentielles, n'ont d'interaction avec les activités des autres philosophes qu'au début de leur exécution, se déroulent à des vitesses non nulles, • le comportement de chacun des convives est cyclique. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 71 ────────────────────────────────────────────────────────────── ■ Une solution On traite le cas de cinq philosophes la solution étant générale pour tout n supérieur à quatre. Soient Pn le nième philosophe et cn son état. Alors cn = 0 s'il pense, cn = 1 lorsqu'il a faim et attend au moins une fourchette, cn = 2 s'il mange. De la méditation au repas Condition de départ (l'indice n est utilisé modulo 5) : aucun des voisins de droite ou de gauche de Pn n'est en train de manger et Pn médite (cn = 0). si (cn-1 ≠ 2 et cn+1 ≠ 2) alors cn = 2 sinon cn = 1 is Le test précédent et ses conséquences constituent une section critique à protéger par un sémaphore d'exclusion mutuelle noté mutex. Le droit de manger du philosophe Pn est gérée par un sémaphore privé sempriv(n) initialisé à 0. Seuls ses voisins Pn-1 et Pn+1 peuvent lui allouer la précieuse ressource qu'est la fourchette en lui donnant cette autorisation. L'action qu'il effectue est : P(mutex) si (cn-1 ≠ 2 et cn+1 ≠ 2) alors cn = 2 V(sempriv(n)) sinon cn = 1 is P(sempriv(n)) V(mutex) /* entrée en section critique */ /* aucun des voisins ne mange */ /* Pn va manger */ /* autorisation de manger (libération du sémaphore privé) */ /* mise en attente de Pn */ /* demande de réveil ultérieur de Pn */ /* sortie de la section critique */ Si les deux voisins Pn-1 et Pn+1 du philosophe Pn ne mangent pas, la première condition est vérifiée et ce dernier peut manger. Sinon, chaque voisin mangeur a l'obligation d'exécuter ultérieurement une opération V sur le sémaphore de Pn. Du repas à la méditation Condition de réveil éventuel du philosophe Pn-1 ou du philosophe Pn+1 cn-1 = 1, cn-2 = 0 ou 1 cn+1 = 1, cn+2 = 0 ou 1 /* Pn-1 a faim, Pn-2 n'utilise pas sa fourchette */ /* Pn+1 a faim, Pn+2 n'utilise pas sa fourchette */ d'où la séquence : P(mutex) cn = 0 /* entrée en section critique */ /* Pn arrête de manger et pense */ /* réveil éventuel de Pn-1 */ si (cn-1 = 1 et cn-2 ≠ 2) alors cn-1 = 2 V(sempriv(n-1) /* autorisation de manger pour Pn-1 par libération de son sémaphore privé */ is /* réveil éventuel de Pn+1*/ si (cn+1 = 1 et cn+2 ≠ 2) alors cn+1 = 2 V(sempriv(n+1) /* autorisation de manger pour Pn+1 par libération de son sémaphore privé*/ is V(mutex) /* sortie de la section critique */ 72 CHAPITRE III ────────────────────────────────────────────────────────────── 2.8 Activités multiples d'un processus Un processus a une activité multiple (multithread) en multipliant ses unités d'exécution (fibre - thread) donc ses jeux de données ce qui permet des gains appréciables (mémoire, performances, etc.) en évitant des commutations de contexte. Processus Espace d'adressage commun Ordonnanceur local au processus Code d'exécution commun Processus pile locale thread pile locale Processus avec1 unité d'exécution thread pile locale thread pile locale thread pile locale Processus avec 4 unités d'exécution Un thread est appelé processus léger, processus poids plume, fibre d'un processus. Les fibres d'un processus ont un même identificateur, partagent un espace d'adresses et les variables globales, peuvent coopérer. Elles consomment peu de ressources et leur utilisation est optimale dans un environnement multiprocesseur (parallélisme d'exécution). Le blocage d'une fibre ne bloque pas le processus. Une fibre n'est pas un processus séparé. Sur certaines implémentations, le système d'exploitation gère le processus comme une entité unique sans voir ses fibres dont l'ordonnancement est réalisé directement par le processus (thread POSIX). 2.9 L'instruction Test And Set L'instruction TAS (Test And Set) réalise en une opération indivisible le test et la modification d'un drapeau dont l'accès est verrouillé en mémoire. TAS(m) Verrouillage d'accès du drapeau m lire(m) si m=0 alors {m =1; …} sinon libérer l'accès à m is Le drapeau vaut 0 si la ressource critique r est disponible, 1 sinon. Les opérations entrée et sortie de la section critique sont les suivantes : entrée_section_critique(m) boucle : TAS(m) aller_à boucle Le processus boucle tant qu'une autorisation de passage n'est pas été délivrée (attente active) et ne franchit la boucle que si (et seulement si) le drapeau vaut 0. sortie_section_critique(m) m=0 Cette solution est valide le test et le positionnement à 1 du drapeau ne pouvant être réalisés que par une instruction TAS à la fois. Le blocage de l'accès au drapeau assure, par câblage, l'exclusion mutuelle de la ressource critique. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 73 ────────────────────────────────────────────────────────────── 2.10 La structure mutex Les fibres (threads) d'un processus partagent une zone de mémoire commune dont l'accès aux sections critiques peut être programmé avec des sémaphores. L'utilisation d'une structure mutex (simplement mutex) est mieux adaptée aux processus légers, surtout dans une architecture multiprocesseurs. ■ Opération sur une structure mutex L'état d'une structure mutex peut être verrouillé (lock) ou déverrouillé (unlock). Opération lock si mutex déverrouillé alors verrouiller mutex accès autorisé au thread sinon blocage du thread is Quand deux threads émettent simultanément une requête de verrou sur une structure mutex (multiprocesseurs), un thread pose le verrou et accède à la section critique, l'autre est bloqué, en attente de déverrouillage. Opération unlock déverrouiller mutex si (threads bloqués) alors en libérer exactement un is Opération trylock Opération similaire à l'opération lock, non bloquante. Quand la structure mutex est déverrouillée, il y a pose du verrou. Dans le cas contraire, le thread émetteur de la requête reçoit un code d'erreur indiquant que l'opération n'a pas pu se dérouler. ■ Problèmes liés à la récursion et aux déverrouillages intempestifs Une procédure récursive peut poser un verrou, s'appeler et se bloquer. La gestion du déverrouillage d'un verrou non verrouillé (mémorisation ou oubli) est non standard donc non portable. ■ Les solutions Les structures mutexes rapides (fast mutexes) gèrent les poses récursives de verrou par un processus sur un enregistrement non verrouillé. Une nouvelle requête de sa part sur ce verrou qui provoquerait son blocage perpétuel (attente d'une libération du verrou qui ne se produirait jamais) est refusée. Les structures mutexes amicales (friendly mutexes) permettent à une fibre de poser récursivement un verrou sur une structure mutex déjà verrouillée. La profondeur de la récursivité est arbitraire si la structure est déverrouillée autant de fois qu'elle est verrouillée. 74 CHAPITRE III ────────────────────────────────────────────────────────────── 2.11 Verrou sur boucle Un verrou sur boucle (spinlock) est une zone de mémoire accessible par plusieurs processeurs dont l'accès est protégé par un verrou. Une requête d'accès d'un processeur, émise en permanence sur le verrou, est rejetée tant que la zone est verrouillée par un autre processeur. C'est donc une boucle d'attente active du processeur demandeur. L'opération de test du verrou est liée à celle de prise du verrou (Test And Set). ■ Conditions d'utilisation des verrous sur boucle Une ressource protégée par un verrou sur boucle doit toujours être atteinte rapidement, sans interaction complexe avec d'autre code. Le code de la section ne doit être ni paginé, ni référencer des données qui le seraient ou des procédures externes. Il ne doit pas générer d'interruptions ou des déroutements. 2.12 Variable de condition Une structure mutex gère les poses courtes de verrou. Une variable de condition gère l'attente de libération d'une ressource. Une structure mutex peut être associée à une variable de condition. ■ Conditions d'utilisation Soit la situation suivante : une fibre verrouille une structure mutex et accède à une section critique où elle constate le manque d'une ressource. Si la fibre verrouille une nouvelle structure mutex associée à cette dernière, la première structure mutex reste bloquée et empêche la fibre d'entrer en section critique pour libérer la deuxième ce qui provoque un verrou mortel. Une solution est l'utilisation de variables de condition où l'opération d'attente exécute atomiquement les opérations d'attente (wait) et déverrouillage (unlock). La libération de la ressource demandée réveille exactement une ou toutes les fibres en attente. L'utilisation de la clause while au lieu de la clause if garantit qu'une fibre ne puisse être réveillée la ressource demandée étant allouée à autre une fibre. ■ Algorithmes de requête et libération d'une ressource lock(mutex) Contrôle des structures de donnée tant que(état (ressource)==occupé) wait(variable de condition) État (ressource)=occupé unlock(mutex) lock(mutex) État (ressource)==libre Réveil (thread(s)_en_attente_de_variable_de_condition) GENERALITES SUR LES SYSTEMES D'EXPLOITATION 75 ────────────────────────────────────────────────────────────── 2.13 Introduction aux réseaux de Pétri L’état d’une ressource est un des suivants : requis infructueusement par un processus demandeur provoquant son blocage, actif car utilisé, restitué après usage. ■ Théorème de caractérisation (admis) Une situation de verrou mortel peut se produire si et seulement si les conditions suivantes sont réalisées : • une ressource au moins est non partageable (exclusion mutuelle), • un processus détenant une ressource est en attente d'au moins une autre ressource détenue par un autre processus (propriété de non réquisition), • une ressource ne peut être restituée qu'à la fin d'une action indivisible, • un ensemble de processus (P0, P1,...,Pn) est tel que (contrainte circulaire) : P0 est en attente d'une ressource détenue par P1 … Pn-1 est en attente d'une ressource détenue par Pn Pn est en attente d'une ressource détenue par P0 ■ Description graphique Le graphe d'allocation des ressources permet une description graphique du verrou mortel. Soient : P = {P1,..., Pn} un ensemble de n processus. R = {R1,..., Rn} un ensemble de n ressources. V est l'ensemble P Х R ∪ R Χ P. Chaque élément du graphe G est un couple ordonné (Pi, Rj) ou (Rj, Pi) où Pi ∈ P ∀ i et Rj ∈ R ∀ j Le couple (P, R) indique que la ressource R est requise par le processus P (P → R). Le couple (R, P) indique que la ressource R est détenue par le processus P (R → Q). Un processus est représenté graphiquement par un cercle, tout ensemble de ressources par un carré dont chacune des occurrences est représentée par un point coloré. Considérons le graphe suivant : R1 R3 P3 P1 P2 R2 R4 Alors P = {P1, P2, P3} R = { R1 , R2 , R3 , R4 } V = {(P1, R1),(P2, R3),(R1, P2),(R3, P3),(R2, P2),(R2, P1)} 76 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Théorème (admis) Quand un graphe d'allocation de ressources est sans cycle, aucun de ses processus n'est en état de verrou mortel. Réciproquement, si ce graphe contient un cycle, un verrou mortel peut exister quand chaque ressource a une occurrence unique. Exemples Considérons le graphe suivant : R1 R3 P3 P1 P2 R4 R2 Les processus P1, P2, P3 sont en état de verrou mortel car il y a deux cycles dans le graphe : P1 → R1 → P2 →R3 → P3 → R2 → P1 P2 → R3 → P3 → R2 → P2 Soit maintenant le graphe suivant : R1 P2 P3 P1 R2 P4 Il n'y a pas de verrou mortel même avec le cycle P1 → R1 → P3 → R2 → P1 puisque R2 → P4 Le processus P4 n'étant pas dans le cycle, la deuxième occurrence de R2 est restituée après usage et allouée au processus P3 ce qui brise le cycle. Une généralisation de cette théorie a été faite avec les Réseaux de Pétri. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 77 ────────────────────────────────────────────────────────────── 3. NOYAU 3.1 Le noyau Unix/Linux Le noyau d'Unix/Linux monolithique assure l'interface matériel/logiciel. Il est composé des entités suivantes : ■ Gestionnaire des processus Il assure la création, la synchronisation, la terminaison, les communications et la gestion des processus. ■ Gestionnaire du processeur Il est assuré par le gestionnaire de travaux ou ordonnanceur (scheduler). ■ Gestionnaires de mémoire On distingue les gestionnaires suivants : allocateur statique ou dynamique, fichiers d'échanges (swap), pages, segments, mémoire virtuelle, mémoire partagée, caches système et réseau, flux de données. ■ Gestionnaire des entrées/sorties et pilotes (device drivers) Le gestionnaire des entrées/sorties gère les flots de données entre le noyau et les périphériques en utilisant les pilotes de périphériques et un système de tampons (mémoire cache ou cache disque). On distingue les périphériques gérés en mode bloc utilisant le cache, et ceux ne l'utilisant pas, nommés périphériques caractères. Processus utilisateur Appel système Interface noyau Gestion des processus Systèmes de fichiers Ordonnanceur Mode caractère IPC Mode bloc Gestion mémoire Cache Noyau Gestion des interruptions Interface matériel et pilotes ARCHITECTURE DU NOYAU UNIX Le noyau monolithique d'Unix est également implémenté sous forme de micronoyaux. L'interface homme machine en mode texte est l'interprète de commandes (shell de Bourne, C shell, ou Korn-shell), langage de programmation puissant. En mode graphique, l'environnement CDE est standard. 3.2 L'exécutif Windows Les services système Windows sont accessibles à travers de l'exécutif (executive), constitué des entités suivantes : • accès au micro-noyau, gestionnaire d'objets, moniteur de référence de sécurité, • gestionnaires de la mémoire virtuelle, des entrées/sorties, du cache logiciel, • gestionnaires de processus et threads, ordonnanceur, appels de procédures locales. 78 CHAPITRE III ────────────────────────────────────────────────────────────── Mode utilisateur Services de l'Exécutif NT Exécutif NT Gestion des Gestion Gestion ou objets des de la mode processus Moniteur mémoire Appel noyau de référence virtuelle de sécurité procédure locale Micronoyau GDI Win32 Windows Gestion Manager des entrées sorties Pilotes couche d'abstraction matérielle Graphics Device Drivers Couche matérielle 4. GESTION DES TRAVAUX ■ Représentation La gestion des processus nécessite une variable d'état par processus (descripteur) où figure son nom, son état (actif, bloqué, activable), son contexte d'exécution (état de la mémoire, des registres et du compteur ordinal). Exemple : descripteur de processus sous Unix Un processus se compose de trois segments de mémoire : • le segment de texte (text segment) contenant son code exécutable, • le segment des données (data segment) contenant ses données, • le segment système (system data segment) contenant les informations système. ■ Ordonnancement L'allocateur de ressources gère l'attribution des ressources requises. Un système d'exploitation préemptif peut interrompre et/ou suspendre l'exécution d'une tâche quand une tâche plus prioritaire doit être exécutée. Le gestionnaire de travaux gère la création, la destruction, l'attribution du processeur à un processus et leur synchronisation. L'utilisation d'un algorithme préemptif garantit un temps de réponse bref au prix d'une légère surcharge système. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 79 ────────────────────────────────────────────────────────────── ■ Graphe d'états Un processus change d'état au cours de son exécution. Création i nconnu p rése nt e n attente d estruction d e str uc tio n p rê t b loq ué s élection s u sp ension actif Term inaison T erminé e rre ur Destruc tio n Un processus est "INCONNU" avant sa création. Il devient "PRESENT" à sa création puis "EN ATTENTE" sans être "ACTIF" les ressources requises ne lui ayant pas encore été attribuées. L'ordonnanceur (scheduler) gère les files d'attente avec deux objectifs : • assurer l'exécution des différents processus dans des délais acceptables. • optimiser l'usage des ressources en évitant les interblocages pour déterminer selon un algorithme approprié le processus élu qui devient "PRET" dès la disponibilité des ressources requises. Le répartiteur (dispatcher) alloue le processeur à l'élu qui devient "ACTIF". Une requête d'entrée/sortie provoque la perte du processeur et le blocage du processus (état BLOQUE) jusqu'à sa satisfaction. Le processus repasse à l'état "PRET". La satisfaction de toutes les requêtes ou une erreur d'exécution provoque sa terminaison (état TERMINE), préalable à sa disparition. 80 CHAPITRE III ────────────────────────────────────────────────────────────── 5. GESTION MEMOIRE 5.1 L'unité de gestion mémoire La mémoire est une ressource critique à partager et à allouer aux différents processus actifs, gérée dynamiquement et qu'il faut protéger. Ces différentes fonctions sont assurées par l'unité de gestion mémoire (Memory Management Unit - MMU). Exemple On suppose qu'à l'instant t, l'espace mémoire est alloué de la façon suivante : P1 P2 P3 P4 P5 P6 . A l'instant t+δt, les processus P2 et P5 s'achèvent libérant des espaces en mémoire non contiguës. Pour réutiliser l'espace, on peut réorganiser les processus de façon à obtenir un espace mémoire disponible unique ou insérer un nouveau processus dans l'espace vacant en le fragmentant. ■ Protection mémoire A tout instant, un processus dispose d'un espace de travail dont un mécanisme matériel garantit qu'il ne puisse être altéré (protection mémoire). Exemple Processus actif Adresse absolue P1 1-1000 P2 1100-3000 P3 3200-3500 P4 3600-6700 Le processus P2 écrivant des informations jusqu'à l'adresse 3400 écrase une partie du processus P3 en l'absence de protection. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 81 ────────────────────────────────────────────────────────────── 5.2 Modes d'adressage ■ Définitions Une instruction se compose en trois champs : le code opération, le mode d'adressage, l'adresse de l'opérande. L'adresse absolue est définie par rapport à l'adresse 0 de la mémoire. Le mode d'adressage est la technique d'accès aux mots en mémoire. L'adresse effective est l'adresse calculée en fonction du mode d'adressage. On distingue les différents modes d'adressage suivants : ■ Adressage direct Appelé également adressage normal, absolu ou réel, l'adresse effective de l'objet est contenue dans l'instruction. Le temps de recherche est d'un cycle mémoire. ■ Adressage immédiat La partie adresse contient la valeur de l'opérande. Exemple : chargement de l'accumulateur par la valeur 10 CHA 10 ■ Adressage indirect La partie adresse est un pointeur sur l'adresse effective de l'objet dont le chargement nécessite de deux cycles mémoire : un pour l'adresse de l'objet, un autre pour l'objet. Le nombre total de cycles est le nombre d'indirections de l'instruction dont le maximum est le niveau d'indirection du calculateur. ■ Adressage relatif L'adresse effective est obtenue par addition ou soustraction d'un déplacement à l'adresse de l'instruction en cours, l'instruction relative, ce qui permet de d'accéder simplement à n'importe instruction du programme. ■ Translation d'adresse et protection mémoire La transformation d'une adresse symbolique en adresse réelle utilise une adresse relative (déplacement) à son adresse initiale d'implantation appelée l'adresse de base. Soient Aa l'adresse absolue, Ab l'adresse de base, D le déplacement. L'adresse effective est la somme du contenu du registre de base et du déplacement. Aa = Ab+D La modification de l'adresse de base permet de déplacer (translater) un processus en mémoire sans recalculer des adresses relatives des instructions. Cette propriété est utilisée à la compilation pour générer des programmes translatables. La valeur maximale du déplacement délimite l'espace de travail d'un processus et son contrôle garantit la protection mémoire. 82 CHAPITRE III ────────────────────────────────────────────────────────────── Exemple Considérons le processus P, implémenté à l'instant T comme suit : Instant T T+δt Ab 3200 1100 D 399 399 Aa 3599 1499 A l'instant T+δt, le processus P est déplacé ce qui libère l'espace mémoire comprit entre les adresses 3200 et 3599. Seule l'adresse de base Ab a été modifiée. ■ Adressage relativement à l'adresse courante L'adresse de référence est contenue dans le compteur ordinal. ■ Adressage par page La mémoire est divisée en pages 2n mots. L'adresse effective est obtenue par juxtaposition du numéro de page et de l'adresse de l'instruction dans la page. ■ Adressage indexé L'indexation permet d'atteindre chaque composante d'un tableau d'objets dont l'adresse de base est connue (celle de la première composante du tableau). L'adresse effective est obtenue par ajout à l'adresse de base d'un index préalablement initialisé puis incrémenté d'un pas à l'exécution de l'instruction de fin de boucle. On appelle pré-indexation l'adressage par addition du déplacement de base, et post indexation l'adressage par addition de l'index. Exemple float a[50]; int i ; for (i=0;i < 50; i++) a[i] = 0; // Un tableau de 50 nombres flottants // L'indice de boucle entier // Boucle d'initialisation à 0 Le déroulement de ce programme est le suivant : Réservation d'une zone de 50 mots commençant à l'adresse du symbole A. Boucle de remplissage de la zone à partir de son adresse initiale indexée. La séquence du programme assembleur équivalent est la suivante : A RES 50 CHA RB 0 COMPTEUR EQU 50 BOUCLE CP RB COMPTEUR BG FIN CHA RB RNG A,RB FIN INC RB B BOUCLE STOP // Réservation du tableau A // Chargement du registre d'index (valeur 0) // Comparaison de RB avec COMPTEUR // Branchement si (COMPTEUR)>(RB) à FIN // Chargement avec le contenu de RB // Rangement du contenu de l'accumulateur à // L'adresse A indexée par le contenu de RB // Incrémenter de 1 le contenu de RB // Fin du programme La longueur maximale d'un tableau est déterminée par le nombre de bits du registre d'index. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 83 ────────────────────────────────────────────────────────────── ■ Récapitulation des modes d'adressage On note (A) le contenu de l'adresse A. Accès immédiat à l'objet Adressage normal (direct, absolu) Adressage indirect Adressage relatif base et déplacement (pré-indexation) relatif à l'adresse courante dans la page courante Adressage indexé (post indexation) opérande=(AD) adresse effective=(AD) adresse effective=((AD)) adresse effective=(B)+(AD) adresse effective=(P)±(AD) adresse effective= adresse de page+(AD) adresse effective=(AD)+(X) 5.3 Hiérarchie des mémoires Le coût d'une mémoire étant inversement proportionnel à son temps d'accès, une hiérarchie de la mémoire selon son type, son temps d'accès et son coût est définie. Registre Cache matériel Mémoire RAM Disque Capacité 1 mot 512 Ko 1 Go 300 Go Temps d'accès 1 ns 5 ns 10 ns 10 ms Coût d'un Go 104 102 1 10-3 L'utilisation du dispositif le moins onéreux pour étendre les ressources fournies par le plus onéreux sans dégradation des performances revient à considérer l'espace disque comme une extension de la mémoire centrale (niveau unique de stockage (1960)). ■ Echanges de processus (swap) La permutation complète d'un processus en mémoire avec un processus sur disque s'appelle l'échange total (swap). Il présente l'inconvénient d'une surcharge temporelle importante vu la granularité de l'opération (le processus complet). Processus 1 Processus 2 Mémoire centrale swap out swap in Processus 1 Processus 2 Disque 84 CHAPITRE III ────────────────────────────────────────────────────────────── L'opération de déchargement (swap out) est le transfert d'un processus en mémoire centrale dans l'espace d'échanges sur le disque, appelé zone de swap (Unix/Linux), ou fichier d'échanges (Windows). Un processus déchargé est rechargé (swap in) en mémoire (chargement) pour reprendre son exécution. L'usage de deux disques avec chacun une zone d'échanges améliore les performances. Exemple ■ Le modèle de l'espace vital Il n'est pas nécessaire qu'un processus soit complètement chargé en mémoire pour s'exécuter. Il suffit que les instructions en cours d'exécution soient présentes, en "quantité suffisante"… A cet effet, un découpage du processus logique (segmentation) et/ou physique (pagination) est mis en œuvre par les gestionnaires de la mémoire. Le degré de multiprogrammation d'un processeur est défini par le nombre de processus résidant simultanément en mémoire. L'expérience a mis en évidence le comportement suivant : Taux d'utilisation du CPU 100% zone a n0 zone b Degré de multiprogrammation Dans la zone a, le degré de multiprogrammation croit linéairement : • Pour n << no, le processeur est peu utilisé. • Au voisinage de no, le processeur est utilisé de façon optimale. . GENERALITES SUR LES SYSTEMES D'EXPLOITATION 85 ────────────────────────────────────────────────────────────── Dans la zone b, les performances s'écroulent brutalement, le nombre trop élevé de processus ne permettant pas à chacun de disposer de suffisamment de mémoire ce qui provoque un excès d'accès disques conduisant à une saturation des bus et un écroulement du système (trashing). Chaque processus a besoin en mémoire centrale d'un nombre réduit d'instructions constituant son espace vital (working set). ■ Pagination La pagination est une organisation physique de la mémoire allouée à un processus divisée en pages dont l'algorithme de gestion détermine la page à transférer en mémoire 2n mots étant accessibles dans 2n-p pages de 2p mots, (p < n). Exemple On considère l'ordinateur suivant : mots de 4 octets, page de 16 Ko soit 212 mots, mémoire centrale de 1 Go soit 256 M mots ou 216 pages réelles, 20 bits adressent une page, 12 bits un mot dans une page. La transformation adresse(page) adresse(mot) est réalisée avec la table des pages. ■ Mémoire virtuelle Le niveau unique de stockage et le modèle de l'espace vital ont une autre application : la définition d'un espace de mémoire virtuelle sur mémoire secondaire d'une capacité supérieure à celle de la mémoire RAM. ■ Segmentation La segmentation est une organisation logique permettant de définir un espace virtuel pour chaque processus : le segment. L'adresse effective est calculée à partir du numéro de segment et du déplacement dans le segment. La segmentation simplifie la manipulation des données de taille dynamique et l'édition de liens la modification d'une procédure n'imposant pas de recompiler les procédures inchangées des autres segments. Les systèmes actuels combinent segmentation et pagination. 86 CHAPITRE III ────────────────────────────────────────────────────────────── 5.4 Optimisation de la mémoire ■ Chargement à la demande La recherche d'une information en mémoire secondaire provoque un défaut de page puis le chargement de la page manquante ce qui surcharge (overhead) le système le temps d'accès moyen d'un disque (10 ms) étant supérieur à celui de la RAM (10 ns) ■ Chargement anticipé L'allocateur détermine les pages qui vont manquer conformément au postulat de Denning (principe de localisation) : "Les références d'un programme tendent à être localisées en des points précis de la mémoire et ne changent que par intermittence". Ce principe ne peut s'appliquer que si programmes et données sont structurés. ■ Caches La surcharge du temps d'exécution est compensée par l'utilisation de caches matériel ou logiciel qui sont différents dispositifs d'accélération des accès entre processeur, mémoire centrale, mémoires secondaires qui contiennent par anticipation 95% des informations. ■ Gestion des systèmes non paginés Les algorithmes de gestion de zones mémoire non paginées sont les suivants : Algorithme du meilleur choix (Best Fit) Les zones sont classées par taille croissante T1 ≤ T2 ------- ≤ Tn. Soit T la taille du segment à insérer, on cherche k tel que Tk-1 < T ≤ Tk. Algorithme du plus mauvais choix (Worst Fit) Les zones sont classées par taille décroissante T1≥ T2 ≥ … ≥ Tn On place le segment dans la zone T1 et la zone résiduelle est insérée dans la liste. Algorithme du premier trouvé (First Fit) Les zones sont classées par adresse croissante. On cherche le plus petit k tel que T ≤ Tk Les stratégies du meilleur choix et du plus mauvais choix sont opposées. La première minimise les zones résiduelles inutilisables. La deuxième suppose qu'il reste après insertion une zone utilisable. Les deux stratégies nécessitent de réorganiser périodiquement la mémoire pour éviter sa fragmentation (ramassage des ordures - garbage collector). La gestion des zones provoque une surcharge. Des simulations de ces algorithmes ont prouvé que l'algorithme du premier trouvé peut être meilleur que celui du meilleur choix. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 87 ────────────────────────────────────────────────────────────── ■ Gestion des systèmes paginés Une page à remplacer en mémoire centrale est appelée victime. Quatre algorithmes sont utilisés : Algorithme LRU (Least Recently Used) Les pages les moins récemment utilisées sont choisies en supposant que le futur ressemble au passé. Algorithme LFU (Least Frequently Used) Les pages les moins fréquemment utilisées sont choisies à l'exception des pages chargées au cours des derniers quantas de temps. Algorithme FIFO (First In First Out) Les pages sont remplacées dans l'ordre où elles ont été attribuées. Cet algorithme ignore le fait que la page la plus ancienne puisse être la plus utilisée. Algorithme RAND (Random) La page à remplacer est déterminée au hasard. Les différences de performances entre les différents algorithmes sont faibles (15%), et l'algorithme FIFO est en général moins bon que les algorithmes LRU, FLU et RAND. 6. GESTION DES ENTREES/SORTIES La gestion des entrées/sorties est réalisée à quatre niveaux : • le niveau physique pour le stockage des informations sur les supports matériels, • le niveau interne pour la gestion des flux entre les entités matérielle, • le niveau d'accès aux informations, • le niveau logique et organisationnel au niveau applicatif. 6.1 Problèmes associés à la gestion des entrées/sorties Il est nécessaire d'adapter le matériel et les logiciels aux contraintes suivantes : ■ Vitesse de transfert Les différences sont considérables entre les différents types de périphériques (3 caractères par seconde (cps) sur un clavier et 109 cps sur un disque). ■ Unités de transfert Selon les périphériques, les données sont transmises par mots, octets, blocs, enregistrements. ■ Représentations des données Elles sont différentes selon les supports utilisés (disque, souris, etc.). 88 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Opérations autorisées Elles sont différentes suivant le type du périphérique : une imprimante n'est utilisable qu'en écriture, une souris en lecture seulement. ■ Erreurs d'exécution Elles sont d'origines diverses : panne matérielle, ressource insuffisante, etc. ■ Objectifs de conception Un périphérique doit fonctionner indépendamment de la représentation interne des données ce qui impose aux processus d'opérer sur des périphériques virtuels, sans faire référence aux unités physiques. Les opérations d'entrées/sorties doivent être performantes sans goulets d'accès aux bus. La gestion des périphériques doit être uniforme. L'indépendance de la codification interne des données nécessite des mécanismes de d'adaptation pour chaque type de périphérique. Exemple Gestion de différentes polices de caractères sur une imprimante, Transcodage de caractères EBCDIC en ASCII. 6.2 Système de gestion de fichiers Le système de gestion de fichiers (Disk Operating System) gère les fonctionnalités liées au stockage : • gestion des périphériques, • organisation logique et physique de l'information, • création, suppression, modification, sauvegarde, identification et gestion des accès, • reprise de défaillance du système. ■ Organisation logique et physique Un enregistrement logique représente un objet, de taille fixe ou variable, accessible en écriture ou en lecture par une application. Un fichier est un ensemble organisé d'enregistrements logiques. Un enregistrement physique est un bloc. Le facteur de groupage est le nombre d'enregistrements logiques d'un bloc. ■ Performances Les performances dépendent du facteur de groupage des enregistrements logiques qui doit être adapté à la taille des blocs. Il est plus judicieux de lire en une seule opération 512 octets que d'effectuer 512 opérations de lecture d'un seul octet. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 89 ────────────────────────────────────────────────────────────── 6.3 Niveaux d'accès à l'information Un accès est réalisé par les couches applicatives au travers desquelles il transite. ■ Couche externe La requête est exprimée au travers d'une interface externe orientée objet. ■ Niveau logique Les traitements induits par la requête (lecture, écriture, etc.) utilisent la structure logique de l'information, encapsulée par l'interface objet. ■ Niveau physique et pilote Les adresses absolues des blocs sur le support physique sont déterminées et transmises au pilote (device driver) du périphérique. En mode synchrone, le processus émetteur de la requête d'entrées/sorties est suspendu jusqu'à sa terminaison (entrées/sorties bloquantes). En mode asynchrone, il poursuit son exécution. 7. ORGANISATION ET ACCES A L'INFORMATION La localisation d'un enregistrement logique dépend de l'organisation du fichier (séquentielle, aléatoire, indexée, etc.). La méthode d'accès est le mode d'exploitation du fichier par l'application pour y sélectionner un enregistrement logique. L'accès séquentiel à un enregistrement nécessite d'accéder à ceux qui le précèdent. L'accès sélectif permet l'accès direct à l'information à partir de sa clé. Pour une organisation donnée, plusieurs modes d'accès peuvent être mis en œuvre. 7.1 Conteneurs d'informations Un répertoire (catalogue, dossier, directory) contient récursivement des fichiers et leur descripteur constitué des informations suivantes : nom, taille, emplacement, type, organisation, identification de son propriétaire seul habilité à lui apporter des modifications, droits d'accès, dates de création, dernière mise à jour, dernier accès. 90 CHAPITRE III ────────────────────────────────────────────────────────────── 7.2 Organisation séquentielle, relative, aléatoire ■ Organisation séquentielle Les enregistrements logiques sont stockés consécutivement et liés par une relation d'ordre. Toute nouvelle information est écrite à la fin du fichier. L'écriture d'un enregistrement au milieu du fichier déplace la fin de fichier et provoque la suppression de tous les enregistrements situés après l'enregistrement écrit. ■ Clé et fichier relatif L'accès sélectif à un enregistrement logique est effectué au travers d'une clé d'accès. Un fichier relatif est constitué d'enregistrements de longueur fixe accessibles par une clé numérique correspondant à son rang dans le fichier. fichier enregistrement 0 1 2 3 n-1 n L'accès à un enregistrement est rapide (une seule requête d'entrées/sorties) et le mode d'affectation de la clé rend la gestion facile. ■ Hash coding Une fonction de hachage effectue une distribution uniforme des enregistrements à partir de leur clé permettant leur accès ultérieur direct. Son utilisation impose une connaissance préalable approximative du nombre d'enregistrements maximum. Ce mode d'organisation est inadapté aux fichiers séquentiels. Les performances chutent lorsque le fichier est saturé et il faut le réorganiser. ■ Organisation aléatoire Les enregistrements (longueur fixe ou variable) d'un fichier aléatoire sont distribués uniformément (fonction de hachage) à partir de leur clé intégrée à l'enregistrement. Paquet ■ 0 1 .... p Organisations indexées Les enregistrements sont accessibles à partir de clés contenues dans l'index du fichier. C0 C1 C2 Ci Cn Clés a a a a a Adresse relative 0 1 2 i n GENERALITES SUR LES SYSTEMES D'EXPLOITATION 91 ────────────────────────────────────────────────────────────── Un index est dense s'il contient autant de clés que d'enregistrements. Un fichier indexé est non trié, son index trié et dense. Un fichier séquentiel indexé est trié, son index trié et non dense. Si l'index est non dense, le fichier est divisé en paquets de taille fixe dont chacun correspond à une entrée de l'index. La clé associée est la plus grande clé du paquet. L'accès et une recherche dans la table d'index permettent l'accès à l'enregistrement. On peut construire une hiérarchie d'index. Exemple Index (taille fixe = 4 éléments) 11 23 35 Niveau 2 8 6 8 3 11 11 9 16 20 23 35 12 14 19 20 21 23 36 35 Paquet Niveau 1 Enregistrements restreints à leur clé Le fichier non trié contient six paquets repérés par deux indexes triés non dense. 7.3 Journaux et point de reprise Un point de reprise est une sauvegarde du contexte d'exécution d'un programme (état des registres, données, fichiers) à partir duquel il peut reprendre son exécution. Le journal des images avant contient les débuts de transactions, les valeurs des d'enregistrement avant mise à jour, les fins de transactions (validées ou interrompues) et permet d'annuler (undo) les mises à jour. Le journal des images après contient les débuts de transactions, les valeurs des enregistrements après mises à jour, les fins de transactions (commit ou abort) et permet de refaire (redo) les mises à jour. Une reprise à froid restaure le système à partir d'une sauvegarde. Une reprise à chaud utilise l'un des deux journaux. 92 CHAPITRE III ────────────────────────────────────────────────────────────── 8. L'IMPLEMENTATION DES SYSTEMES D'EXPLOITATION Le développement d'un système d'exploitation est très complexe et long. Ainsi, le noyau du système Linux contient environ 3 millions de lignes, celui de Windows Vista 30 millions. Nous présentons ici les principales difficultés liées à cet exercice. 8.1 De la programmation empirique à Internet Les méthodes de développement ont évolués avec les générations d'ordinateurs. Génération : 1ère 2ème 3ème 4ème langage machine Assembleur langage évolué SGBD ■ 5ème Internet Programmation, rendement, coûts du développement En 1972, le rendement moyen d'un programmeur professionnel est de 8 lignes par heure (source Pentagone : The high cost of software). L'écriture de "bons" programmes est très longue et difficile. Les mêmes statistiques chiffrent l'écriture d'une instruction à 75 $, celui de sa mise au point à 4000 $. ■ Evolution historique du profil du programmeur 1950 1968 1975 1981 1990 ■ Il est un initié qui utilise exclusivement le langage machine. Il est considéré comme un artiste (D. Knuth). Il respecte une discipline de programmation non empirique (E. Dijkstra). La programmation est devenue une science (D. Gries). L'ingénierie du logiciel est devenue la règle, avec ses méthodes et outils. Erreurs et preuves de programmes Tout développeur doit tenir compte de ce constat d'E. Dijkstra : "Essayer un programme peut seulement indiquer des erreurs mais ne prouve jamais qu'il est juste". ■ Les causes Les tests et branchements conditionnel conduisant à la rupture du déroulement séquentiel du programme (Von Neumann) ont permis l'écriture de la de la première génération des programmes procéduraux. La complexification des applications a conduit : • à la suppression des ruptures de séquence devenues l'ennemie du programmeur car source d'erreurs dues aux branchements erronés, • à la structuration modulaire des applications, conformément à la citation de Boileau "Ce qui se conçoit bien s'énonce clairement et les mots pour le dire arrivent aisément", base des langages structurés (Pascal, C, etc.). GENERALITES SUR LES SYSTEMES D'EXPLOITATION 93 ────────────────────────────────────────────────────────────── 8.2 L'ingénierie du logiciel Le développement du logiciel est une discipline d'ingénierie solidement établie dans ses méthodes et principes. ■ Difficultés de conception des logiciels Plusieurs facteurs rendent difficile la conception et le développement des logiciels : • Ils peuvent être d'une très grande complexité, à la limite de l'ingéniosité humaine. • Aucune loi mathématique ou physique ne délimite l'univers des solutions possibles. • Les causes de certaines erreurs d'exécution peuvent être aléatoires et une erreur d'exécution peut provoquer l'interruption du service fournit. ■ Chaque détail compte Des erreurs d'apparence anodine peuvent se glisser dans des programmes ainsi que l'illustre l'instruction (langage C) suivante : if (i = 0) printf("i est nul\n"); else printf('i n'est pas nul\n"); Contrairement à l'intention du programmeur, ce programme imprime " i est nul" quel que soit i car dans la syntaxe du langage C, le symbole = représente l'affectation, pas la comparaison logique (qui s'écrit ==). L'expression i = 0 étant toujours nulle, le test d'arrêt ne peut être satisfait ce qui provoque un cycle perpétuel indétectable. ■ Une simple question d'argent ? Le logiciel embarqué dans la navette spatiale américaine, développé par la NASA et dont le prix de revient est estimé à 3300 € par ligne de code, contient encore des erreurs dont la suivante : lors de l'utilisation simultanée de deux claviers, tout caractère saisi est modifié par un "ou logique". La solution retenue a été de n'utiliser qu'un clavier à la fois… ■ Le développeur de logiciels On pense souvent que le développement de logiciel est une tâche simple, à confier à des ingénieurs débutants. Pourtant, la conception d'ouvrages d'art importants est toujours confiée à des ingénieurs confirmés. Et on comprend mal pourquoi il faudrait opérer différemment pour la conception des logiciels car c'est une tâche qui requiert une grande expertise pour être menée à bien. ■ Valeur marchande d'un logiciel La valeur marchande d'un logiciel tient autant à son introduction rapide sur le marché qu'à ses qualités propres, le client étant rarement prêt à attendre patiemment qu'un programmeur exceptionnellement doué ait trouvé une solution élégante et gratuite à son problème. Il a tort à long terme, mais il achète le produit du moment. 94 CHAPITRE III ────────────────────────────────────────────────────────────── 8.3 Productivité Les aspects économiques du développement du logiciel sont mal maîtrisés. Le coût du logiciel de fabrication de l'Airbus A320 fut estimé, à partir de celui de l'A310, connu, et de son cahier des charges spécifiques. Les différentes évaluations variaient entre 3 et 12. Une des difficultés de ce type d'exercice prévisionnel est le manque de précision de la mesure de productivité du logiciel que plusieurs techniques permettent, imparfaitement, de mesurer. ■ Le nombre de lignes de code par programmeur et par jour La mesure la plus couramment utilisée de la productivité d'une équipe de développement est le nombre de lignes de programme produites par jour. Elle est mauvaise pour au moins deux raisons : • Un programmeur compétent consacre un temps parfaitement productif à réduire la taille de ses programmes ce qui en diminue la complexité et en augmente la valeur. • Cette mesure ne fait pas la différence entre la productivité d'une équipe qui réalise un logiciel de 10 000 lignes de code en un an, et celle qui réalise en deux ans un logiciel similaire de 20 000 lignes de code. Une mesure empirique de la productivité quotidienne d'un programmeur en fonction de la complexité du logiciel est donnée par la formule : productivité = constante * (taille du programme)1.5 ■ Le coût du développement Une meilleure mesure de la productivité d'une équipe est basée sur le coût du développement d'un logiciel qui prend en compte simultanément sa valeur marchande, son évolution probable, la complexité intrinsèque du problème résolu, le surcoût du au retard éventuel de sa commercialisation, celui de son support et de sa maintenance pendant sa durée de vie, la possibilité de le réutiliser. Le coût est aussi une indication de la difficulté qu'aura la concurrence à reproduire un effort de développement similaire. 8.4 Qualité ■ Critères de qualité Un logiciel doit être doté des qualités suivantes : • Validité : aptitude du logiciel à réaliser exactement les tâches de sa spécification. • Robustesse : aptitude du logiciel à fonctionner dans des conditions anormales. • Extensibilité : facilité de modification des spécifications du logiciel. • Réutilisabilité : aptitude du logiciel à être réutilisé partiellement ou en totalité. • Compatibilité : aptitude du logiciel à pouvoir être combiné avec d'autres. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 95 ────────────────────────────────────────────────────────────── • Efficacité : bonne utilisation des ressources matérielles et logicielles • Portabilité : facilité d'adaptation du logiciel à différents environnements. • Vérifiabilité : présence de procédures de test, de débogage, de recette et de certification. • Intégrité : aptitude du logiciel à protéger ses différentes composantes (programmes, données) contre des accès ou des modifications non autorisées. • Ergonomie du logiciel (fonctionnement, utilisation, interprétation des résultats, fiabilité). ■ L'ergonomie Des défauts peuvent s'avérer fatals comme l'illustre la catastrophe de l'Airbus A320 du Mont Sainte Odile. Cet avion est doté d'un moniteur sur lequel s'affichait alors, selon un mode choisi par le pilote, la vitesse verticale de l'avion en pieds par seconde ou l'inclinaison de sa trajectoire en degrés. Il semble que le pilote ait mal interprété le contenu de l'écran le copilote ayant modifié le mode d'affichage, ou l'inverse. L'avion a ainsi, à leur insu, perdu rapidement de l'altitude ce qui a conduit au crash. Ainsi, un défaut de conception dans l'ergonomie de l'interface homme machine s'est révélé être aussi dangereux qu'un bogue. ■ Le long terme Le manque de vision à long terme des développements de logiciels est aussi la source de nombreux déboires. Le problème le plus fréquent est causé par l'introduction de limites arbitraires d'adressage ou de précision dont voici deux illustrations. • Dans les années cinquante, pour économiser l'espace, seuls, les deux derniers chiffres de l'année calendaire étaient stockés. De nombreux programmes développés à cette époque étant toujours utilisés en l'an 2000, il a fallu dépenser des milliards d'euros pour corriger ce fameux "bogue de l'an 2000". • Le système de défense anti-aérienne Patriot n'a pas intercepté un missile Scud qui a fait 28 victimes au nord de l'Arabie Saoudite durant la première guerre du Golfe à cause d'un décalage de son horloge, le système ayant été initialement conçu pour intercepter des avions, et non des missiles balistiques plus rapides. 8.5 Développement d'un logiciel ■ Analyse L'analyse consiste à déterminer les contraintes d'utilisation et d'exploitation du logiciel et les besoins de l'utilisateur, par exemple : • Type de programme (transactionnel, temps réel, bureautique, etc.)., matériel et système d'exploitation. • Temps de développement et personnel disponible pour développer l'application. • Extensions futures les plus probables. • Destinataires (grand public ou professionnels). 96 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Spécification La spécification, réponse formelle aux besoins identifiés à l'analyse, comprend des données chiffrées résultant des spécifications (temps de développement, configurations matérielles et logicielles requises, nombre d'utilisateurs, temps de réponse, entrées et sorties, version préliminaire de la documentation, etc.). ■ Documentation La documentation fait partie intégrante du développement du logiciel sous la forme d'un document technique normatif de référence formalisant la conception de l'architecture générale, le découpage en modules (fonction, interface d'accès), la description des composants logiciels utilisés (bibliothèques, générateurs d'interface ou de requêtes, composants réutilisables, etc.). 8.6 Méthodologie de programmation ■ La méthode des approximations successives La programmation met en évidence des erreurs de conception nécessitant une modification des modules donc des documents rédigés à l'étape précédente. ■ Programmation et chirurgie Programmer est long et n'est pas une tâche d'exécutant. Ainsi, les éditeurs les plus performants utilisent le modèle de l'équipe chirurgicale, le chirurgien responsable des parties les plus délicates étant supportées par l'équipe chargée des parties plus simples et de la documentation. ■ Preuves de programmes La garantie qu'un programme correspond à ses spécifications et qu'il ne comporte pas d'erreur en est la preuve mathématique par analyse formelle, réalisée uniquement à partir de spécifications non ambiguës et parfaites. Or, la complexité d'une telle preuve peut être très grande et les logiciels d'analyse formelle limités. Ainsi, il n'existe aucun algorithme permettant d'identifier une boucle infinie. L'analyse formelle n'apporte donc que des aides partielles à la preuve, d'application limitée car imposant une méthodologie de développement très rigide. ■ Jeux d'essais On se rabat sur des simulations ou tests de validation d'un logiciel dont il faut vérifier l'intégralité des modules. Deux approches sont utilisées : • des tests ciblés sur les conditions aux limites comme le fonctionnement d'une procédure de tri sur un tableau de taille nulle ou contenant des entrées identiques. • Des tests en utilisation réelle, généralement faits par un client enthousiaste ou impatient, réalisés sur des versions préliminaires du logiciel, appelées alpha ou bêta releases. C'est ce qu'a fait à 500 000 exemplaires Microsoft avant la sortie de Windows 95 ce qui n'a pas suffit à en éliminer les bogues. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 97 ────────────────────────────────────────────────────────────── ■ Maintenance et support La maintenance d'un logiciel consiste à en corriger les bogues, à en étendre les fonctionnalités, et à en assurer le portage sur différentes plateformes matérielles et systèmes d'exploitation. Elle est coûteuse (70% du coût total de développement) et son importance souvent sous-estimée. Ainsi, le logiciel Word, développé par une équipe de quatre personnes, est maintenu par une équipe bien plus nombreuse. Le support d'un logiciel consiste à assurer un service de formation et d'assistance auprès de la clientèle. Son coût n'est pas non plus négligeable. 8.7 Programmation système ■ Du langage humain au langage machine Tout dialogue avec la machine étant basé sur des règles de grammaire (Chomsky), un langage de programmation est constitué de mots clés dont la syntaxe a évolué pour se rapprocher de la langue parlée, plus facile à manipuler pour les humains que les bits ou les octets. Par contre, l'ordinateur travaillant en digital, il est nécessaire de traduire les instructions exprimées dans un langage évolué en langage machine. ■ Traducteurs Un interprète de commandes effectue l'analyse syntaxique d'une instruction qui est comprise puis exécutée ou incomprise et signalée par un message d'erreur. Un interprète permet donc une mise au point rapide de programmes courts. Un compilateur étudie un programme dans son ensemble pour la génération du code exécutable qui en est la traduction en langage machine, stockable, évitant ainsi sa recompilation à chaque exécution. Exemples Interprète shell (Unix/Linux), langage de requêtes SQL, compilateurs Fortran, Pascal, C, C++, Java. ■ Le langage machine A l'aube de l'informatique, seule la programmation en langage machine, spécifique à chacune, était possible. Compte tenu de sa difficulté, les langages d'assemblage (dits de première génération) ont été inventés vers 1950. ■ Les langages de la deuxième génération Apparus dès 1955, les langages de deuxième génération commencent à se rapprocher du langage humain. Les plus connus sont Fortran pour les applications scientifiques, Cobol, Algol pour la gestion, Basic pour l'enseignement. ■ Les langages structurés et les langages orientés objets (LOO) Dans les années 1970 apparaissent les langages structurés de troisième génération (Pascal pour l'enseignement, C pour l'écriture des systèmes Unix/Linux) et les langages de manipulation d'objet (C++, Lisp, Prolog, ADA), utilisés en Intelligence artificielle et dans les technologies de l'Internet (Java). 98 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Programmation des services système Le système Unix fournit des services systèmes encapsulés accessibles par une interface programmatique (Application Programming Interface – API). L'appel système est l'interface d'accès d'un processus utilisateur au mode système ce qui constitue une protection d'accès aux ressources encapsulées. Il est similaire à celui d'une fonction de la bibliothèque C. L'utilisation d'un service système provoque un changement du mode d'exécution dont le traitement est effectué à partir du contexte du processus appelant en trois phases : • Mode utilisateur : transfert des arguments d'appel depuis la pile utilisateur vers la pile système et changement de contexte. • Mode système : détermination de l'appel, contrôle des arguments, exécution. • Retour au mode utilisateur : les informations sont transférées de la pile système à la pile utilisateur ou le code de l'erreur est retourné. Dans le monde Windows, les services système sont fournis, d'une manière similaire, par les bibliothèques liées dynamiquement (Dynamic Linked Library - dll). Application : quelques règles de conception du noyau Unix La philosophie du système Unix est résumée par le dicton : "Small is beautiful", avec les normes de développement suivantes : • Utilisation du langage C normalisé et des bibliothèques standards, non utilisation de fonctionnalités dépendantes d'un compilateur ou du système local pour réaliser du code portable. • Découpage modulaire, procédures localisées dans un fichier regroupant ses différentes fonctions et utilisable dans différents modules, les noms des variables commencent par la première lettre de l'objet structuré défini dans le fichier. • Déclaration des tables système, des structures de données, des variables globales et externes, définitions de constantes et fonctions symboliques dans des fichiers en tête (nom suivi du postfixe .h (header)). Tout programme commence par les instructions d'inclusion des fichiers en tête nécessaires. • Définition des constantes d'adaptation du noyau à une architecture matérielle donnée dans des fichiers séparés. ■ Génération du noyau On distingue trois types de distribution du système Unix : • la mise à disposition de fichiers exécutables et des fichiers de définition des paramètres systèmes ne permettant pas de générer un noyau, • la mise à disposition des fichiers nécessaires à l'édition de liens du noyau permettant de modifier certains paramètres ou certains fichiers et de le régénérer, • la distribution complète avec les fichiers sources à condition d'acquérir la licence. GENERALITES SUR LES SYSTEMES D'EXPLOITATION 99 ────────────────────────────────────────────────────────────── 8.8 Evolutions des services systèmes d'Unix Les services fournis aujourd'hui par les systèmes Unix/Linux sont la résultante des contributions de différents acteurs divers (utilisateurs, développeurs, constructeurs) depuis 1969. Nous présentons dans le présent paragraphe leurs apports successifs qui constituent un excellent rappel des fonctionnalités présentées précédemment. ■ Systèmes de fichiers Les tailles de blocs des fichiers sont variables. Initialement de 512 octets, elles augmentent à 1024, 4096 puis 8192 octets dans les versions BSD, et de 512 à 1024 octets dans les versions ATT. Des algorithmes de plus en plus performants sont implémentés. Plusieurs types de systèmes de fichiers sont supportés : BSD (Fast File System (FFS), Unix File System (UFS)), ATT (SV), Andrew File System (AFS), OSF (Local File System (LFS)), Veritas (1993), fiables, dotés d'un gestionnaire de cache très performant, permettant aux système de redémarrer sans perte de données, même en cas de panne brutale du système garantissant des systèmes à tolérance de pannes pouvant fonctionner plusieurs années sans interruption. La notion de fichier virtuel (SUN) permet de faire des opérations d'entrée/sortie transparentes à l'application dans un environnement distribué hétérogène (Network File System - NFS). IBM introduit, avec AIX, la gestion des volumes logiques ce qui permet de répartir des systèmes de fichiers sur plusieurs disques physiques et de créer des volumes virtuels d'une taille arbitraire que l'on peut redéfinir dynamiquement. Les pilotes peuvent être chargés dynamiquement. ■ Communications entre processus Unix V7 implémente les tubes (pipe), fichiers temporaires où deux processus père/fils sont synchronisés suivant le modèle du producteur et du consommateur. Les tubes sont généralisés à des processus quelconques (modèle des lecteurs et des rédacteurs) dans Unix System III par les tubes nommés. Unix 4.2 BSD propose les prises de communications (sockets), essentielles aux développements des réseaux avec la définition de protocoles TCP/IP. ■ Signaux Les processus sont synchronisés en échangeant des signaux. Unix V7 en propose dixsept, Unix System III dix-neuf, Unix 4.2 BSD vingt-neuf, Linux soixante. ■ Verrouillage d'enregistrement Le système Onix a implémenté un système de verrouillage d'enregistrement pour la gestion des transactions, Unix System III gère des verrous impératifs et consultatifs. 100 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Gestion mémoire Unix BSD 3.0 a une gestion de la mémoire virtuelle par page alors qu'ATT propose la segmentation sans mémoire virtuelle jusqu'à System V R3 qui intègre les mécanismes de communications entre processus (Inter-Process Communication - IPC) : la mémoire partagée, les messages, les sémaphores. Unix V8 intègre les flux (streams) de Dennis Ritchie. ■ Activités multiples d'un processus et architectures multiprocesseur Les versions actuelles prennent en compte l'activité multiple d'un processus (fibres). Le noyau a été modifié pour tenir compte des architectures multiprocesseurs. 9. L4G ET LANGAGES DE L'INTERNET L'intégration d'Internet dans les systèmes d'information a nécessité l'évolution objet. ■ Les langages de quatrième génération Les langages de quatrième génération (années 1980), appelés progiciels, permettent l'accès à l'informatique aux non informaticiens au travers d'interfaces homme/machine (IHM) ergonomiques. Ainsi ont été développées une grande variété d'applications dans des domaines divers tels la bureautique (traitement de texte, courrier électronique, etc.), la gestion, les systèmes gestionnaires de base de données (Oracle, Ingres, Sybase, MySQL, Access, etc.), la publication ou la conception assistée par ordinateur, etc. ■ Les langages de l'Internet Le plus spectaculaire des services fournis par le réseau Internet est appelé World Wide Web (toile). Appelé également le service WWW, il a pour objectif l'organisation et la diffusion d'informations sur des sites accessibles à partir de leur dénomination. Un site Web est visible à partir d'une interface graphique intégrée (browser) dans un navigateur, chacun pouvant contenir des liens vers d'autres sites Web que la souris fait apparaître en surbrillance et qu'il suffit de sélectionner pour y accéder. On peut itérer le procédé à l'infini, rappeler des écrans donc naviguer sur la toile. Les plus connus des navigateurs sont Mozilla Firefox (GNU) et Internet Exploreur (Microsoft). Orientés multimédia, ils permettent l'accès à des fichiers de toute nature (image, son, données, vidéo, etc.). L'ordinateur personnel est donc devenu un système multimédia pouvant être utilisé comme un téléphone ou une télévision interactive (Real Player, Windows Media Player, etc.). Des modules additionnels (plug-in) fournissent des fonctionnalités supplémentaires. Les cookies (douceurs) sont des données d'identification de l'utilisateur, que ce dernier va stocker, souvent à son insu sur son poste de travail, permettant de personnaliser l'affichage du site consulté en fonction de ses consultations antérieures (principe du mouchard). GENERALITES SUR LES SYSTEMES D'EXPLOITATION 101 ────────────────────────────────────────────────────────────── ■ Exécution d'actions (poste client ou serveur) Des langages tels Javascript ou VBscript permettent l'exécution de codes interprétés sur le poste client par l'utilisateur. Ce dernier peut générer l'exécution de scripts sur le serveur à partir des langages Perl, C++, Visual Basic, Java, etc. Le langage PHP permet de générer dynamiquement des pages HTML en fonction des requêtes lancées par l'utilisateur. ■ Les langages à balises Le langage SGML (Standard Generalized Markup Language) a pour objectif de définir des normes de création de documents permettant d'adapter librement la forme selon le support d'édition et d'indexer sémantiquement le contenu. Le langage de représentation HTML (Hyper Text Markup Langage) dérive de ce dernier et est conçu comme un langage de représentation de l'information permettant de dissocier le contenant du contenu par une balise qui délimite une portion de texte auquel elle confère un attribut. Ce langage ne permettant pas de modifier dynamiquement le contenu d'une page, il évolue vers les langages XML (eXtended Markup Langage), DHTML (Dynamic HTML), associé au langage Javascript. Exemples Structure des pages Web HTML, SHTML, … pages statiques CSS, XLS, XML modèles de représentation de données sur la toile ASP, DHTML, PHP pages dynamiques Fichiers images gif, gif animé, jpg, png, bmp Multimédia wav, avi, MPEG2, MPEG4 ■ Typologie des sites Chacun peut créer son propre site Web avec des logiciels comme Page Composer (Netscape), Front Page (Microsoft), Dreamweaver (Macromédia), etc. Il est d'usage de regrouper les millions de sites Web en quatre familles : • Sites personnels des particuliers. • Sites institutionnels présentant une société, un organisme, une administration. • Sites d'informations, dont l'objectif est d'être un vecteur de diffusion similaire aux média traditionnels (télévision, journaux). • Sites de commerce électronique intégrant tous les aspects de la chaîne logistique d'une prise de commande (gestion des stocks, livraison, etc.), nécessitant des techniques fiables de sécurisation des transactions financières. 102 CHAPITRE III ────────────────────────────────────────────────────────────── ■ Moteur de recherche et portail Un moteur de recherche est un robot d'analyse et d'indexation de bases de données qu'il consulte à partir de mots clé ou de rubriques. Il fait une recherche exhaustive, pas toujours très précise. Des doublons peuvent être présents et permet, à partir d'un ou plusieurs mots clé, d'obtenir une liste de sites Web correspondants aux critères de recherche tel Google. Un méta moteur de recherche (Copernic) lance en parallèle plusieurs moteurs de recherche et classe l'ensemble des résultats par ordre de pertinence. Un annuaire contient une liste de sites Web définis à partir de certains critères. Un portail permet d'accéder à d'autres serveurs Web. 10. MARCHE DES SYSTEMES D'EXPLOITATION EN 2007 CHAPITRE IV SESSION SOUS UNIX/LINUX 1. L'UTILISATEUR ■ Ouverture d'une session Un utilisateur est décrit par un identificateur unique, un groupe d'appartenance, un espace de travail réservé. Un applicatif est exécuté à sa connexion. L'utilisateur qui souhaite se connecter doit indiquer, en réponse à l'invitation à se connecter son identificateur, et éventuellement un mot de passe. L'identificateur doit être exact. Il peut comporter des lettres majuscules et minuscules, considérées comme différentes (respect de la casse) et des caractères de contrôle (CTRL C, CTRL U, CTRL W, etc.). ■ Mot de passe L'utilisation du mot de passe suit les règles suivantes : il n'apparaît pas sur l'écran (absence d'écho), il doit être parfaitement exact et doit contenir au moins 6 caractères alphanumériques (chiffres et caractères). Il est indispensable pour la sécurité et il faut le changer régulièrement. Exemple passwd Changing passwd for user philipp new passwd retype new passwd Changing passwd for philipp Si ces informations sont correctes, l'utilisateur dispose en mode graphique d'un environnement de travail par défaut (le bureau) qu'il peut personnaliser. Sous Unix/Linux, en mode texte, l'interprète de commandes indique qu'il est en attente d'une commande en affichant l'invite de saisie d'une commande : le prompt (par défaut le caractère $). 104 CHAPITRE IV ────────────────────────────────────────────────────────────── ■ Caractéristiques d'un utilisateur Un utilisateur est décrit par les informations suivantes (fichier /etc/passwd), séparées par le caractère : Identificateur de connexion (logname). Mot de passe crypté ou x. Identificateur caractéristique de l'utilisateur (uid). Identificateur caractéristique du groupe (groupe principal si l'utilisateur est défini dans plusieurs groupes) le gid. Commentaire. Répertoire de travail dont l'utilisateur est propriétaire (home directory). Applicatif lancé au début de la session (interprète de commandes en mode texte). Exemple root:x:0:1:Superuser:/:/bin/ksh lp:x:71:18:Printer administrator:/usr/spool/lp: audit:x:79:17:Audit administrator:/tcb/files/audit: ingres:x:777:50:Database administrator:/usr/ingres: philipp:F40kjhbg47:85:50::/home/philipp:/bin/ksh user1:x:200:100::/home/user1:/bin/ksh ■ L'administrateur L'administrateur a tous les droits. Dans le monde Unix/Linux, son identificateur est root (super utilisateur), son uid vaut 0 et son gid 1. 2. GESTION DES UTILISATEURS ET DES SESSIONS Pour sécuriser le système, le mot de passe crypté historiquement dans le fichier /etc/passwd y est remplacé par le caractère x et déplacé dans le fichier inaccessible /etc/shadow. Son également présentes dans le fichier shadow des informations de gestion du compte (durée de validité, stratégie de verrouillage, stratégie de gestion du mot de passe, etc. (mécanisme d'aging). ■ Groupe d'utilisateurs Un groupe est constitué d'un ensemble d'utilisateurs dotés de privilèges communs. Il est décrit par 4 champs (fichier /etc/group), séparés par le caractère : nom du groupe passwd (sans effet) gid (identificateur du groupe liste des utilisateurs constituant le groupe. Exemple staff:*:500:philipp,dupond,durand SESSION SOUS UNIX/LINUX 105 ────────────────────────────────────────────────────────────── ■ Syntaxe générale d'une commande L'utilisation d'une commande est décrite par son synopsis. Elle a des options et/ou des arguments optionnels, notés entre []. Synopsis commande [-option(s)] [argument(s)] Les différents mots de la commande sont séparés par un caractère d'espacement. ■ Affichage du nom de l'utilisateur et de son groupe Synopsis id logname Exemple uid=0(root) gid=1(other) ■ Changement d'identité Il est possible dans une session de changer d'identité avec la commande su. Synopsis su [-][nom_de_l'utilisateur_cible] Description su sans argument permet de devenir super utilisateur. Le – indique l'utilisation du contexte d'environnement de l'utilisateur cible. Son absence conserve celui de l'utilisateur d'origine. Exemple su dupond Passwd:xxxx Il faut alors indiquer le mot de passe de l'utilisateur dupond. ■ Changement de groupe La commande groups affiche liste des groupes d'appartenance d'un utilisateur Le groupe courant (groupe par défaut) est défini dans le fichier des utilisateurs. La commande newgrp permet d'en changer. Synopsis groups newgrp nouveau_groupe_ courant ■ Fin de session L'utilisateur se déconnecte et termine sa session (exit, logout, Ctrl D). La session en cours est fermée et l'invitation à se connecter réapparaît. En mode graphique, le gestionnaire des menus effectue cette tâche (KDE, Gnome, Xwindow, etc.) 106 CHAPITRE IV ────────────────────────────────────────────────────────────── 3. DOCUMENTATION EN LIGNE ■ Manuel de références La manuel de références Unix/Linux est accessible en ligne par la commande man ou en mode graphique, par exemple la commande xman &. Chaque élément est référencé par un numéro (sa section) éventuellement suivi d'une lettre précisant son domaine d'utilisation (m pour maintenance ou administration, c pour communication, g pour graphique...). Dans la plupart distributions, la documentation est accessible à partir d'un navigateur. Sous Unix System V, les sections sont regroupées par thèmes. ADM C CMD HW LM LOCAL X Administration. Langage C. Commandes de base. Dépendant du matériel. Lan Manager. Commandes locales. Xwindow (multifenêtrage). Sous BSD, les sections sont classées par ordre alphabétique. Section 1 Section 2 Section 3 Section 4 Section 5 Section 6 Section 7 Section 8 ■ Commandes de base. Appels système. Bibliothèques. Fichiers spéciaux. Format des fichiers systèmes. Jeux. Documentations diverses. Outils de maintenance et utilitaires. Regroupement des sections Manuel de références administrateur (sections 1M-7-8). Manuel de références utilisateur (sections 1-6). Manuel de références programmeur (sections 2-3-4-5). ■ Autres documentations Il existe divers guides (guide du débutant, utilisation de l'assembleur, guide administrateur...). La documentation fournie aux licenciés comprend les manuels de référence, les guides opérateur, administrateur, utilisateur (guide pour débutant sur Unix, le shell, les éditeurs...), programmeur (utilisation des compilateurs, bibliothèques, fonctions graphiques, etc.), manuel de référence des erreurs (messages d'erreurs), guide des outils standards (make, sccs, etc.). Synopsis man [ numéro_de_section ] nom_de_commande Le manuel de référence Unix décrit la syntaxe d'utilisation des commandes accessibles par l'utilisateur. Il fournit les informations suivantes : SESSION SOUS UNIX/LINUX 107 ────────────────────────────────────────────────────────────── ■ NAME SYNOPSIS DESCRIPTION Brève description de la commande. Les syntaxes autorisées. La description complète de la commande. OPTIONS EXEMPLES SEE ALSO La description des (éventuelles) options. Des (rares) exemples d'utilisation. Les liens avec d'autres commandes. FILES DIAGNOSTICS BUGS Les fichiers utilisés par la commande. Le code de retour de la commande. Les restrictions d'utilisation. Localisation de commandes Les commandes publiques sont dans divers répertoires (/usr/etc, /usr/bin, /bin, /etc, /usr/local, etc.). Les commandes permettant de les localiser sont: whereis commande Localisation de fichiers et des sections correspondantes du manuel de référence Unix. which commande Localisation du fichier exécutable ou d'un éventuel alias. apropos commande Affiche une liste de commandes "proches" de la commande indiquée. whatis commande Description très sommaire d'une commande. Exemples whereis who who /bin/who /usr/bin/who /usr/man/who.l which who /bin/who which ll ll: aliased to "clear ; pwd ; ls –l" 4. INFORMATIONS RELATIVES AUX UTILISATEURS ■ who Affichage de la liste des utilisateurs connectés, des identificateurs logiques des terminaux virtuels associés ainsi que des heures de début de session. Exemple philipp root root ttya May 31 19:22 console May 31 12:17 ttyp0 May 31 12:18 108 CHAPITRE IV ────────────────────────────────────────────────────────────── ■ finger Affichage d'informations complémentaires à la commande who. Synopsis finger identificateur_utilisateur Exemple finger root Login name: root In real life: Superuser Directory: / Shell: /bin/ksh On since Jun 30 17:32:14 on ttyp8 2 minutes 59 seconds Idle Time No Plan. ■ w Liste des utilisateurs connectés, des commandes actives, de la charge du système. Exemple 19:10pm up 3 days, 12:17, 2 users, load average:1.04, 1.00, 0.54 User tty login idle JCPU PCPU what philipp ttya 10:41 am 1 2 3:43 3:25 more /etc/termcap ■ rusers, rwho Liste des utilisateurs connectés dans un réseau local. 5. EXERCICES Rappeler les principes de base d'une connexion sous Unix/Linux. Se connecter, se déconnecter, se reconnecter. Changer son mot de passe (commande passwd). Essayer un mot de passe de 2 caractères puis un mot de passe ne contenant aucun caractère alphanumérique. Afficher votre nom de connexion, votre groupe, votre répertoire de travail, la liste des utilisateurs connectés. Rappeler les fonctions des commandes clear, man. A partir de la commande man et de la commande ls, afficher tous les fichiers du répertoire de travail. Si vous travaillez dans un environnement multifenêtres, vous disposez probablement d'une aide contextuelle en hypertexte. Même question à partir de l'exécution de la commande xman & Rappeler le rôle des commandes who, stty. CHAPITRE V GESTION DE FICHIERS SOUS UNIX/LINUX 6. LA GESTION OBJET DES ENTREES/SORTIES 6.1 L'objet fichier La perception d'une entrée sortie est uniforme quel que soit l'objet sur lequel elle est effectuée (fichier, objet de communications interprocessus, périphérique, en local ou distant, etc.). Un fichier représente donc un objet local ou distant dont la sémantique d'utilisation impose de généraliser les opérations sur les fichiers locaux aux réseaux. Les systèmes Unix et Windows distinguent sept classes de fichiers. ■ Fichier ordinaire Un fichier ordinaire (normal, régulier, banalisé) est une suite finie inorganisée d'octets. ■ Répertoire Un répertoire (dossier) est un conteneur de fichiers d'un type quelconque accessibles par un catalogue (directory). dir1 fichier1, fichier2 dir3 fichier4 dir2 fichier3 La racine de l'arborescence est le conteneur racine qui permet d'associer le nom du fichier et sa position que l'on perçoit sous la forme d'un arbre définit récursivement où les nœuds sont des dossiers (répertoires) hiérarchisés et les feuilles des fichiers. Le nœud le plus élevé est la racine (root), notée / (c : sous Windows), à partir de laquelle l'utilisateur désigne un fichier par son chemin d'accès (pathname), de longueur variable (255 caractères), représenté par un arc orienté. / root bin etc dev répertoire racine lib usr home 110 CHAPITRE V ────────────────────────────────────────────────────────────── Description sommaire /bin contient les commandes binaires publiques. /etc contient fichiers et sous dossiers utilisés au démarrage du système. /dev contient les descriptions des périphériques du système. /lib contient les bibliothèques. /usr contient les outils publics destinés aux utilisateurs. /home contient les répertoires de travail (home directories) des utilisateurs. ■ Fichiers standards Trois fichiers standards, accessibles par leur étiquette ou leur descripteur, utilisés par défaut pour la saisie (clavier) et l'affichage (écran), sont définis : • le fichier standard d'entrée dont l'étiquette est stdin et le descripteur 0, • le fichier standard de sortie dont l'étiquette est stdout et le descripteur 1, • le fichier standard d'affichage des messages d'erreurs dont l'étiquette est stderr et le descripteur 2. sortie standard entrée standard Commande messages d'erreur standard Il ne faut pas confondre fichiers ordinaires et fichiers standards. ■ Fichier spécial Un fichier spécial représente un périphérique (device) fonctionnant soit : • en mode b (bloc) : périphériques (disque, bande, etc.) gérés via le cache, • en mode c (caractère) : tous les périphériques y compris les précédents. ■ Tube nommé Les tubes nommés (named pipe) permettent la gestion des accès concurrents. ■ Lien matériel Le descripteur d'un fichier est appelé nœud d'index ou inode. Un lien matériel est une association entre le chemin d'accès d'un fichier et son descripteur dans un système de fichier donné. Un autre lien matériel sur ce dernier définit un deuxième chemin d'accès à ce fichier sans en faire de copie effective car il n'existe qu'une unique occurrence du fichier même si différents chemins d'accès permettent d'y accéder. /usr/local/toto inode 2 liens physiques /usr/local/tutu Le fichier est supprimé si le nombre de liens devient nul. GESTION DE FICHIERS SOUS UNIX/LINUX 111 ────────────────────────────────────────────────────────────── ■ Lien symbolique (raccourci) Le lien symbolique définit un chemin d'accès synonyme de celui du fichier (ordinaire ou répertoire). C'est un fichier contenant un chemin d'accès (absolu ou relatif) d'un nœud d'index d'un système de fichiers quelconque de l'arborescence. On en déduit la représentation suivante : /home/prof/toto /usr/local/toto lien physique lien symbolique inode1 inode 2 Le lien symbolique généralise le lien matériel à un système de fichiers quelconque. Toutefois, le déplacement ou la suppression d'une cible ne modifie pas un lien symbolique qui ne pointe sur rien si la cible n'est pas remplacée. ■ Représentation des types de fichiers Les types de fichiers sont représentés (commande Unix/Linux ls)ainsi : d b c p l s m ■ fichier ordinaire, fichier répertoire, fichier spécial en mode bloc, fichier spécial en mode non bloc, tube nommé lien symbolique, socket, entrée partagée. Liens, réseaux locaux, Internet Le protocole NFS généralise un lien symbolique à un système de fichiers distant ce qui rend transparent les accès à un fichier dans un réseau. Le lien hypertexte est un lien symbolique sur le réseau Internet. ■ Création et suppression La commande ln crée des liens que l'on supprime avec la commande rm. Synopsis ln [-s] fichier_origine lien_destination ■ Les commandes ls et file Synopsis ls [option] [fichier(s)] [répertoire(s)] Description La commande ls affiche la liste des fichiers du répertoire courant. 112 CHAPITRE V ────────────────────────────────────────────────────────────── Quelques options a affichage des fichiers silencieux (nom précédé d'un point (.profile)) l affichage (format long) des informations suivantes : nom, type (fichier ordinaire, répertoire, périphérique, lien, etc.), date de dernière modification, taille (en octets), attributs de sécurité et de propriétés. R affichage (récursif) du contenu des sous-répertoires. Synopsis file nom_de_fichier Description Affichage des informations de type d'un fichier. Exemple ASCII text archive RANDOM library C program text data cpio archive directory empty executable shell script mc68020 executable symbolic link roll nroff or eqn input text 6.2 Gestion des flux GESTION DE FICHIERS SOUS UNIX/LINUX 113 ────────────────────────────────────────────────────────────── ■ Entrées/sorties de haut niveau et bibliothèque C Les opérations d'entrées/sorties de haut niveau, implémentées dans la bibliothèque standard du langage C, assurent les transferts entre processus utilisateur et noyau. ■ Entrées/sorties de bas niveau et appels système Les opérations d'entrées/sorties de bas niveau invoquées par les appels système sont encapsulées dans les pilotes et assurent la gestion des flux entre noyau et périphérique. ■ Entrées/sorties en mode bloc La lecture anticipée (read ahead) et l'écriture différée (delayed write) d'une opération de niveau supérieur ou inférieur est gérée via le cache logiciel, en mode bloc. L'accès au périphérique est indépendant de l'application. ■ Entrées/sorties en mode caractère En mode caractère, le cache logiciel n'est pas utilisé par les entrées/sorties. ■ Entrées/sorties en mode cru (entrées/sorties en mode raw) L'application gère ses tampons et n'utilise pas le cache logiciel. ■ Prise de communication (socket) L'accès au réseau est réalisé via le descripteur de la prise de communication utilisée, accessible comme les fichiers usuels par les appels système adéquats. 6.3 Attributs de propriété et sécurité Les accès à un fichier sont définis par ses attributs de propriété et de sécurité. ■ Propriétaire L'utilisateur propriétaire est celui auquel le fichier est rattaché et dont il peut modifier les caractéristiques de sécurité et d'accès. Son identité peut être modifiée par l'administrateur ou le (futur ex) propriétaire du fichier dont c'est un acte irréversible avec la commande chown. Synopsis chown nouveau_propriétaire fichier(s) ■ Groupe Un groupe est un ensemble d'utilisateurs dotés de privilèges communs dont un membre peut appartenir à plusieurs groupes. Un fichier appartient à un groupe unique modifiable (commande chgrp). Le groupe courant d'une session est modifiable (commande newgrp). Synopsis chgrp nouveau_groupe fichier(s) newgrp nouveau_groupe 114 CHAPITRE V ────────────────────────────────────────────────────────────── ■ Drapeaux de sécurité Les droits accès à un fichier sont définies par des drapeaux de sécurité, répartis en trois champs : un pour l'utilisateur propriétaire, un pour les membres de son groupe et un pour les autres utilisateurs, chacun constitué par trois drapeaux d'accès rwx. Leur signification varie selon le type du fichier (ordinaire ou répertoire). Les 9 drapeaux précédents sont complétés par les 3 drapeaux s, S, t. Fichier ordinaire r lecture Répertoire listable w écriture suppression modification modification création, ajout suppression x script fichier exécutable traversable Exemple Un fichier ordinaire avec les droits rwxr-x—x peut être lu, écrit et exécuté respectivement par le propriétaire, lu et exécuté par les membres de son groupe et exécuté par les autres utilisateurs. ■ Modification des attributs de propriété et de sécurité La commande ls affiche les attributs de sécurité d'un fichier. La commande chmod permet de les modifier. Sur certaines implémentations, la destruction d'un fichier (rm) ne nécessite que le droit d'écriture dans le répertoire où le fichier est enregistré mais pas le droit d'écriture sur le fichier lui-même. Un fichier accessible en lecture seule peut donc être détruit si le répertoire est accessible en écriture. Synopsis chmod modif_autorisations_courantes fichier(s) Cette commande de modification des attributs de sécurité d'un fichier est utilisée sous forme symbolique ou octale. Utilisateur u propriétaire g groupe o autres (others) opérateur + = opération ajout suppression assignation permissions r w x Exemple chmod go-rx archive chmod g+w donnees Les droits d'accès sont définis par le regroupement par 3 des 9 drapeaux en octal. Lecture= 4 (100), écriture = 2 (010) exécution = 1 (001) 644 755 -rw-r—-r-drwxr-xr-x droits par défaut pour fichier droits par défaut pour répertoire GESTION DE FICHIERS SOUS UNIX/LINUX 115 ────────────────────────────────────────────────────────────── ■ Attributs par défaut Le masque de sécurité est utilisé à la création des fichiers et des répertoires pour définir leurs attributs de sécurité par défaut. Les attributs de sécurité par défaut des fichiers ordinaires sont définis selon la règle : attributs_par_defaut=non(masque) et 666 Les attributs de sécurité par défaut des répertoires sont définis selon la règle : attributs _par_defaut=non(masque) L'exécution de la commande umask indique la valeur par défaut du masque de sécurité courant, souvent 022. Ainsi, avec ce masque, on obtient : Fichiers ordinaires Répertoires rw-r—r— rwxr-xr-x ce qui constitue des droits d'accès raisonnables. Le masque de sécurité peut être redéfini par l'utilisateur dans son profil ou défini par l'administrateur qui doit garantir une valeur par défaut acceptable pour tous les utilisateurs (génération système, fichier de démarrage d'une session, etc.). 6.4 Usurpation d'identité Le fichier contenant la liste des utilisateurs et leur mot de passe crypté appartient à l'administrateur avec les droits rw-------. Un utilisateur ne peut donc accéder directement à ce fichier, ni en lecture, ni en écriture. Par contre, il peut y modifier son mot de passe par usurpation temporaire de l'identité du propriétaire de la commande réservée à cet usage dont le propriétaire est l'administrateur et dont le lecteur pourra constater que les droits sont rwsr-xr-x. ■ Le bit suid sur un fichier ordinaire Le bit s est appelé bit suid (set user id). Son positionnement autorise un utilisateur non propriétaire du fichier à usurper temporairement l'identité de son propriétaire pour l'exécuter avec les droits de ce dernier. Le propriétaire réel d'un processus en cours d'exécution est l'utilisateur qui a lancé le processus, le propriétaire effectif étant le propriétaire du fichier exécutable qui en a défini les droits d'accès, autorisant, par le bit s d'autres utilisateurs à l'exécuter. Synopsis chmod 4555 fichier_exécutable Avec la commande précédente, le fichier exécutable a les droits r-sr-xr-x ■ Le bit suid sur un répertoire Tout fichier créé dans ce répertoire hérite du groupe du répertoire si ce dernier a les droits drwxrwsr-x. 116 CHAPITRE V ────────────────────────────────────────────────────────────── ■ Le bit Sgid sur un fichier ordinaire Le bit S, appelé bit SGID, est utilisé avec les fichiers exécutables d'un groupe, permettant à un utilisateur d'exécuter la commande avec les privilèges de ce dernier sans en être membre. Synopsis chmod 2555 fichier_exécutable Avec la commande précédente, le fichier exécutable a les droits r-xr-Sr-x ■ Précautions d'utilisation Les fichiers avec l'un des bits s ou S sont sensibles car ils peuvent devenir des failles de sécurité du système. Il faut donc en minimiser l'utilisation et éviter que leur propriétaire ne soit l'administrateur par la création d'utilisateur dédié avec des droits limités par le bit suid. Un fichier exécutable avec le bit suid ne doit pas être accessible en lecture un pirate pouvant l'utiliser à l'insu de son propriétaire. 6.5 Protection des fichiers d'accès public Le bit d'adhérence (sticky bit), ou encore le bit t, a une signification différente sur un fichier ordinaire ou un répertoire. ■ Fichier Il permet le maintien de l'image du fichier en mémoire à la fin de son exécution, d'où son appellation. Les plus fréquents sont les éditeurs, compilateurs, assembleurs, éditeur de liens. ■ Répertoire Le bit t d'un répertoire d'accès public (rwxrwxrwx) interdit à un utilisateur de détruire des fichiers dont il n'est pas propriétaire. ■ Synopsis chmod 1777 répertoire Avec la commande précédente, le répertoire a les droits drwxrwxrwt 6.6 Listes de contrôles d'accès aux objets Les systèmes sécurisés permettent de définir des listes de contrôle d'accès (Access Control List - ACL) que la norme POSIX P1006.3 définit comme un moyen formel d'exprimer des opérations sur des objets, selon l'identité de l'entité émettrice de la requête. Une liste de contrôles d'accès est une entrée dans un fichier de la forme : :type:principal:permissions GESTION DE FICHIERS SOUS UNIX/LINUX 117 ────────────────────────────────────────────────────────────── Le champ principal est la dénomination de l'entité sur laquelle s'applique les droits. Le champ type spécifie l'interprétation du champ principal (le propriétaire du fichier, un autre utilisateur (local ou distant), un groupe (local ou distant), etc.). Le champ permission est constitué des classiques drapeaux rwx complétés par les drapeaux cid, avec les interprétations : c i d habilitation à modifier les ACL, droit d'insertion de fichier dans un répertoire, droit de destruction de fichier dans un répertoire. Exemples root:/etc:RWXCID Sous AIX, les ACL comportent également les informations suivantes : • permissions de base constituant les attributs traditionnels, • attributs de sécurité complémentaires (bits s, S, t), • permissions étendues, décrites sous la forme d'ACE (Access Control Entry), qui, pour chaque instance décrite, suivent le format : Opération type_d'accès [[info_utilisateur] [info_groupe] Trois opérations sont supportées : deny interdiction du type d'accès spécifié permit autorisation du type d'accès spécifié specify spécification du type d'accès L'utilisateur (groupe) auquel s'applique les droits décrits est précédé du suffixe u: (g:). Une entrée est crée pour chaque utilisateur ou groupe. Plusieurs utilisateurs ou groupes peuvent être combinés dans une entrée. Exemple attributes base permissions owner(philipp): rwx group(root): r-x other: r-extended permissions: enabled deny rwx g:staff permit rwx u:root, g:staff permit r-x g:sysadm ■ Commandes associées aclget aclput acledit affichage d'une liste de contrôle d'accès, définition d'une liste de contrôle d'accès, modification d'une liste de contrôle d'accès. 118 CHAPITRE V ────────────────────────────────────────────────────────────── 7. NOMMAGE DES FICHIERS 7.1 Règles Sous Unix/Linux, l'identificateur d'un fichier est une chaîne de caractères alphanumériques significatifs (lettre majuscule, minuscule, chiffre, certains caractères spéciaux du shell). Les lettres majuscules et minuscules sont différentes (respect de la casse). Les caractères (spéciaux) suivants sont d'usage réservé : (,[,),],{,},/, \,*, ','', ^, $, `. La longueur du nom est limitée à 256 caractères. ■ Les fichiers silencieux Leur nom commence par un point. Utilisés pour personnaliser l'environnement utilisateur, on visualise leurs caractéristiques avec la commande ls -a. Exemple .profile 7.2 Caractères d'expansion de l'interprète de commandes Certains caractères spéciaux du shell, également appelés méta caractères, remplacent des caractères dans les scripts, les commandes des éditeurs de textes ou du shell. Le caractère spécial * remplace un nombre quelconque de caractères donc toute chaîne de caractères, à l'exception du caractère point. Le caractère spécial ? se substitue à un caractère quelconque. Le caractère spécial qui suit le caractère \ (backslash) perd sa signification et est considéré comme un caractère ordinaire. Ainsi, le caractère \ précédant un caractère CR permet de poursuive l'instruction sur la ligne suivante. Les opérateurs crochets [ ] délimitent une liste de caractères et permettent de compléter une chaîne de caractères par une de ses occurences. Exemple nom[abc] nom[123] nom[ab1] noma, nomb ou nomc nom1, nom2 ou nom3 noma, nomb ou nom1 L'expression [f-j] représente un des caractères de l'intervalle (ordre lexicographique) défini entre les deux caractères. Exemples nom[a-z] nom[0-9] L'expression [! délimite le début du complément d'un ensemble. L'expression ] délimite la fin de l'ensemble. Exemple ls [!d-z] GESTION DE FICHIERS SOUS UNIX/LINUX 119 ────────────────────────────────────────────────────────────── 7.3 Chemins d'accès ■ Chemin absolu Le chemin d'accès (pathname) d'un ficher peut être absolu ou relatif. Les différents répertoires traversés sont décrits dans l'ordre décroissant de l'arborescence de la gauche vers la droite et séparés par le caractère spécial /. Le chemin d'accès absolu décrit la liste des répertoires depuis la racine (root) notée / jusqu'au répertoire courant. Exemple /home/philipp/f1 ■ Chemin relatif Le chemin d'accès est relatif aux fichiers et répertoires du répertoire courant. Exemple philipp/f1 ■ Commandes associées Synopsis basename chemin_absolu affichage du nom relatif du fichier à partir du chemin absolu, dirname chemin_absolu affichage du répertoire d'appartenance du fichier. ■ Répertoires courant et répertoire père Le répertoire courant est noté . Le répertoire parent est noté .. 8. OPERATIONS SUR LES FICHIERS STANDARDS 8.1 Redirection ■ Définition La redirection d'un fichier est une modification de son descripteur de telle sorte que l'inode cible par défaut soit modifiée. ■ Redirection des fichiers standards La redirection d'un fichier standard sur un fichier ordinaire (saisie ou résultat) n'est valable que pour la commande courante. ■ Redirection de la sortie standard Le caractère spécial de redirection de la sortie standard est le caractère > suivi de l'identificateur du fichier (ordinaire ou spécial) sur lequel on souhaite l'effectuer. 120 CHAPITRE V ────────────────────────────────────────────────────────────── Exemples ls affichage sur la sortie standard de la liste des fichiers du répertoire courant, ls > liste stockage de la liste des fichiers du répertoire courant dans le fichier liste. ls > /dev/tty12 la liste des fichiers du répertoire courant est redirigée sur le terminal virtuel associé au périphérique /dev/tty12. ■ Remarque La redirection permet de créer un fichier vide avec la commande : cp /dev/null > fic ■ Ordre d'exécution des opérateurs Le fichier cible de la redirection est détruit (s'il existe) puis recrée lors de son exécution ce qui peut entraîner des conséquences inattendues. Soit la commande : cat f1 f2 > f1 utilisée pour concaténer les fichiers f1 et f2 en appelant f1 le fichier résultat. Le fichier f1 d'origine est détruit puis recréé, identique à f2. ■ Redirection en mode ajout Cette destruction est évitée en utilisant le symbole >> au lieu du symbole > qui s'exécute selon le principe suivant : si le fichier existe, l'information est ajoutée à sa fin. Il est créé sinon. Exemple ls > liste date >> liste cat f2 >> f1 ■ création du fichier liste, ajout de la date courante en fin du fichier liste, ajout de f2 après f1. Redirection du fichier standard d'affichage des messages d'erreur Les opérateurs de redirection des messages d'erreurs sont précédés de l'étiquette 2. Exemple cc pg.c 2> pg.e ■ compilation du fichier pg.c avec redirection des messages d'erreur dans le fichier pg.e Redirection de l'entrée standard Le caractère de redirection est le caractère < suivi du nom du fichier à partir duquel on souhaite faire la redirection. Exemple crypt cle < clair Le fichier clair est redirigé sur l'entrée standard. Il est crypté (ou décrypté). ■ Redirections simultanées On peut exécuter simultanément des redirections sur des fichiers d'entrée et de sortie. Exemple crypt cle < clair > code GESTION DE FICHIERS SOUS UNIX/LINUX 121 ────────────────────────────────────────────────────────────── ■ Autre forme de la redirection de l'entrée standard Une deuxième forme de redirection de l'entrée standard, surtout utilisée dans les scripts, est le symbole <<. L'entrée est le texte qui suit immédiatement le symbole, encadré par un terminateur (un caractère ou une chaîne de caractère n'apparaissant pas dans le texte, séparé ou non par des caractères d'espacement). Dans l'exemple ci-après, le terminateur est le caractère !. Il doit apparaître à la fois après le symbole << et à la fin du texte saisi, au début d'une ligne. Exemple ed fic << ! appel de l'éditeur sur le fichier fic On saisit alors des directives d'édition de l'éditeur ed : /mot/ d w q ! recherche de la chaîne mot, suppression de la ligne, écriture du fichier, sortie de l'éditeur, fin de la redirection. Exemple debut << EOT ed fic 1,4p q EOT Description Appel de ed pour opérer sur le fichier fic avec double redirection (en sortie, le fichier debut contient les 4 premières lignes), EOT est le séparateur. 8.2 Tube Un tube (pipe) symbolisé par l'opérateur | redirige la sortie standard d'une commande sur l'entrée standard d'une autre. Exemple ls –l | wc –l ■ comptage du nombre de lignes affichées par la commande ls –l donc du nombre de fichiers du répertoire courant. Tubes et redirection Plusieurs tubes peuvent s'enchaîner. L'utilisation simultanée des redirections est possible. Exemples ls -l | wc -l > nbfic ls | tee inter | wc -1 le résultat apparaît dans le fichier nbfic le résultat de la commande ls est transmis à la commande tee qui transmet son résultat à la commande wc (inter est une copie du résultat de ls). 122 CHAPITRE V ────────────────────────────────────────────────────────────── 9. OPERATIONS SUR LES REPERTOIRES ■ Affichage du chemin absolu (courant) pwd ■ Création de répertoire(s) Syntaxe mkdir repertoire1 [repertoire2...] Les chemins d'accès peuvent être absolus ou relatifs. ■ Renommage ou déplacement d'un répertoire mv ou mvdir Syntaxe mv nom_répertoire nouveau_nom_du_répertoire Les chemins d'accès peuvent être absolus ou relatifs. Le déplacement d'un fichier n'est possible que dans un même système de fichiers. ■ Suppression de répertoire(s) Syntaxe rmdir dir1 [dir2...] La commande rmdir ne peut supprimer qu'un répertoire vide. La commande rm utilisée avec l'option -r (récursif) permet de supprimer un répertoire non vide. ■ Déplacement dans l'arborescence La commande interne cd (change directory) permet de se déplacer dans les répertoires de l'arborescence. Synopsis cd [nom_répertoire_cible] cd ~[nom_de_connexion] Description Modification du répertoire courant. La commande cd sans argument ramène l'utilisateur dans son répertoire de travail (home directory) comme la commande cd ~. La commande cd ~user déplace l'utilisateur émetteur de la requête sur le répertoire de travail de l'utilisateur indiqué. ■ Taille (nombre de blocs) d'une arborescence La commande du affiche récursivement le nombre de blocs utilisé par un répertoire. Synopsis du [-as][répertoire(s)] GESTION DE FICHIERS SOUS UNIX/LINUX 123 ────────────────────────────────────────────────────────────── Description Affichage (récursif) du nombre de blocs d'un répertoire. Options -a (all) tous les fichiers y compris les fichiers cachés, -s (summary) chacun des arguments. Exemple du -a /etc/vtoc 2 /etc/vtoc/m2333k 4 /etc/vtoc/m2344k 10. OPERATIONS SUR LES FICHIERS ORDINAIRES 10.1 Commandes de base ■ Copie Synopsis cp [options] fichier_origine fichier_cible cp [options] fichier_origine(s) répertoire_cible Description Recopie d'un fichier dans un autre, écrasé s'il existe déjà. Recopie des fichiers vers le répertoire cible (préexistant). La commande a toujours au moins deux arguments. ■ Renommage ou déplacement Synopsis mv [options] fichier_origine fichier_cible mv [options] fichier_origine(s) répertoire_cible Description Renommage d'un fichier ou déplacement dans un répertoire. Un fichier cible existant est écrasé sauf avec l'option -l ■ Suppression Synopsis rm [-option(s)] fichier(s) Description Cette commande opère sur tout type de fichier. Ses principales options sont : i demande (interactive) de confirmation avant destruction, f destruction sans prise en compte des attributs du fichier (forçage), r destruction de tous les sous-répertoires et de leur contenu (récursif). 124 CHAPITRE V ────────────────────────────────────────────────────────────── ■ Concaténation Affichage du contenu ASCII d'un ou plusieurs fichiers sur la sortie standard. Synopsis cat fichier(s) La redirection de la sortie standard permet de concaténer plusieurs fichiers. Exemple La commande : cat f1 f2 > f1 provoque l'écrasement de f1 puis son remplacement par f2. ■ Affichage par page Synopsis more [ options ] fichier Description Affichage du contenu par ligne (< cr >), par page (<caractère d'espacement >), recherche d'une chaîne de caractères (/chaîne < cr > ). La sortie de la commande s'exécute avec l'un des caractères q ou CTRL C (^C). ■ Affichage des lignes en tête du fichier Synopsis head [options] fichier Description Affichage par défaut des 10 premières lignes d'un fichier. ■ Affichage des lignes à la fin du fichier Synopsis tail [options] fichier Description Affichage par défaut des 10 dernières lignes d'un fichier. ■ Affichage du contenu d'un fichier Synopsis od [ options ] fichier Cette commande affiche les caractères non imprimables d'un fichier. Quatre options : c o d x caractère octal décimal hexadécimal. GESTION DE FICHIERS SOUS UNIX/LINUX 125 ────────────────────────────────────────────────────────────── ■ Comparaison de fichier texte Synopsis diff [ option(s) ] fichier1 fichier2 Description Affichage des lignes différentes de fichiers textes. Les options sont : B ignore les caractères d'espacement ou tabulations, e mise en forme du résultat pour rendre les 2 fichiers identiques ■ Comparaison de fichier binaire Synopsis cmp [ -ls ] fichier1 fichier2 Description Comparaison de fichiers binaires avec affichage de l'octet et du numéro de la ligne où se trouve la première différence. L'option -l affiche la valeur des octets en octal et le numéro de la ligne en décimal. L'option -s permet de récupérer un code de retour sans affichage (0 : fichiers identiques, 1 : fichiers différents, 2 : erreur d'exécution de la commande). ■ Comparaison de fichiers triés Synopsis comm [-123] fichier1 fichier2 Description Comparaison de deux fichiers triés et affichage sur 3 colonnes : des lignes différentes dans fichier1 uniquement. des lignes différentes dans fichier2 uniquement. des lignes différentes dans fichier1 et dans fichier2. L'option 123 permet de supprimer l'affichage de la ou des colonnes indiquées. ■ Cryptage Synopsis crypt clef < source > cible crypt clef < fichier Description Création du fichier crypté cible, image cryptée du fichier source à partir d'une clé de chiffrement. Affichage du fichier décrypté par la clé de chiffrement clef. 126 CHAPITRE V ────────────────────────────────────────────────────────────── ■ L'heure de dernière modification La commande touch s'utilise pour créer un fichier vide ou changer la date de dernière modification d'un fichier (souvent utile pour l'utilitaire make). Synopsis touch fichier ■ Tri Synopsis sort [-option(s)] [-o resultat] [+pos1 [-pos2]].. fichier(s) Description La commande sort tri des fichiers dans l'ordre lexicographique. Un champ par défaut est un ensemble de caractères séparés par un caractère d'espacement ou de tabulation. Les options +posl et -pos2 limitent le tri à un champ précis au lieu de la ligne entière (défaut). Elles sont définies sous le format m,n où m est le nombre de champs à ignorer depuis le début de la ligne et n le nombre de caractères à ignorer depuis le début du champ. resulat est un nom de fichier résultat (par défaut la sortie standard). Les principales options sont : b ignore les caractères d'espacement et tabulations en fin de champ, d tri par ordre alphabétique (lettres, chiffres et caractères d'espacement), f conversion des lettres majuscules en lettres minuscules, i ignore les caractères de contrôle, n tri d'un champ numérique de la forme -n ou n, r inverse l'ordre des comparaisons, tx le caractère x est séparateur de champ au lieu du caractère d'espacement, c vérification que le fichier est trié, m fusionne les fichiers préalablement triés. ■ La commande fuser La commande fuser affiche la liste des processus utilisant un fichier donné. Syntaxe fuser [-v] répertoire Description Affichage de la liste des fichiers utilisés d'un système de fichier ou d'un répertoire donné et des processus les utilisant. Exemple fuser –v /home /home USER pid user1 881 user1 2647 ACCESS ..c.. ..c.. COMMAND bash startx GESTION DE FICHIERS SOUS UNIX/LINUX 127 ────────────────────────────────────────────────────────────── 10.2 Recherche récursive avec condition et traitement La commande find effectue des recherches récursives de fichiers conformément à certains critères tels des fichiers d'une taille inférieure ou supérieure à une taille donnée, inutilisés pendant une certaine période, appartenant à un utilisateur ou à un groupe donné, etc. Synopsis find chemin_rech condition(s)_recherche action ■ Chemin de recherche Répertoire (absolu ou relatif) à partir duquel s'effectue récursivement la recherche. ■ Quelques critères de recherche Ils sont définis à partir des mots clés suivants : user name group size atime ctime mtime type u perm cpio newer f depth ■ Liste des actions print exec ■ utilisateur propriétaire du fichier défini par la variable user, chemin d'accès relatif du fichier, groupe d'appartenance donné du fichier, taille du fichier (blocs de 512 octets ou caractères), date du dernier accès, date de création, date de la dernière modification, type du fichier (b (bloc), c (caractère), d (dossier), P (tube nommé), f (fichier ordinaire), nombre de liens matériels, attributs de sécurité (en octal), recherche pour sauvegarde (commande cpio), fichiers modifiés plus récemment que le fichier f, recherche dans l'arborescence de telle sorte que les entrées d'un répertoire soient prises en compte avant le répertoire ce qui permet d'écrire des fichiers dans des répertoires sans avoir les droits convenables (administrateur seulement). affichage de la liste des fichiers trouvés (action par défaut), exécution de la commande qui suit et qui doit être terminée par le caractère spécial ; précédé du caractère \. Les accolades {} représentent l'ensemble des fichiers satisfaisant au critère de recherche sur lesquels la commande doit s'exécuter. Opérateurs logiques et caractères spéciaux de la commande Les conditions de recherche peuvent être combinées à l'aide des opérateurs logiques : a o ! (...) et logique, ou logique, non logique, parenthèses de regroupement de critères devant être précédés du caractère \ (escape sequence) pour les différencier des parenthèses de l'interprète. 128 CHAPITRE V ────────────────────────────────────────────────────────────── Exemples Recherche depuis le répertoire courant du fichier prog.c. find . -name prog.c -print Recherche (répertoire courant) de fichiers non modifiés depuis plus de 15 jours. find . -mtime +15 -print Recherche depuis le répertoire /home les fichiers de l'utilisateur jean. find /home -user jean -print Recherche (répertoire courant) de fichiers modifiés plus récemment que /etc/motd. find . -newer /etc/motd -print Recherche depuis le répertoire / des fichiers auxquels personne n'a accédé depuis plus de 30 jours et résultat dans le fichier /tmp/liste. find / -atime +30 -print > /tmp/liste Recherche depuis le répertoire /etc des fichiers d'une taille comprise entre 10000 et 20000 caractères. find /etc -size +10000c -size -20000c -print Recherche pour suppression depuis le répertoire / des fichiers de l'utilisateur betty. find / -user betty -exec rm -f {} \; Recherche pour suppression depuis le répertoire /home des fichiers core et des fichiers suffixés par .o auxquels personne n'a accédé depuis plus de 2 jours. find /home -type f \( -name core -o -name '*.o' \) -atime +2 -exec rm {} \; Recherche depuis le répertoire /usr de fichiers dont le numéro d'inode est 4156. find /usr -inum 4156 -print ■ Nettoyage Tout système d'exploitation crée de nombreux fichiers temporaires qu'il faut purger régulièrement comme les fichiers core, image de la mémoire résultant d'une exception ou les fichiers crées dans les dossiers publics (/tmp, /usr/tmp) par les utilitaires gcc, lint, vi, etc. Il suffit pour cela de lancer périodiquement un script de nettoyage avec le service d'ordonnancement (service cron). 10.3 Expression régulière Les caractères spéciaux dans une expression régulière ont la signification suivante : . un caractère quelconque, [...] un ensemble de caractères, [^..] caractère(s) n'appartenant pas à l'ensemble indiqué, [a-e] les caractères entre a et e (ordre alphabétique), exp* répétition de l'expression exp n fois (n ≥ 0), exp+ idem avec n > 1, exp ?. idem avec n=0 ou 1, ^exp expression exp en début de ligne, exp$ expression exp en fin de ligne, e1 | e2 l'expression e1 ou l'expression e2. GESTION DE FICHIERS SOUS UNIX/LINUX 129 ────────────────────────────────────────────────────────────── ■ Recherche d'une chaîne de caractères dans un fichier La commande grep recherche les instances d'une chaîne de caractères d'un fichier décrite par une expression régulière. Ses variantes sont egrep (interprète d'autres caractères spéciaux) et fgrep, plus rapide mais ne recherchant que des chaînes de fixes. Synopsis grep [option(s)] expression_régulière fichier(s) Les principales options sont: v c l n b s h i e exp affichage des lignes ne contenant pas l'occurrence recherchée, affichage du nombre de lignes contenant l'occurrence recherchée, affichage du nom des fichiers, affichage pour chaque ligne de son numéro, affichage pour chaque ligne du numéro du bloc la contenant, suppression des messages d'erreur, pas d'affichage du nom des fichiers, pas de distinction entre lettres majuscules et minuscules, une expression régulière à rechercher. 11. CYCLE DE VIE D'UN FICHIER ■ Création L'identificateur d'un fichier est son chemin d'accès externe (pathname). Ses attributs de propriété et de sécurité permettent d'y accéder. Sa structure, composé d'un emplacement initial et d'extensions, est dynamique sa taille pouvant croître ou décroître. Chacune de ses entités est décrite par son nœud d'index, quelquefois de manière redondante par sécurité (FAT, journalisation, etc.). ■ Ouverture L'ouverture crée un canal de gestion des flux entre noyau et applicatif accessible par son descripteur. Les droits d'accès sont vérifiés, le canal est ouvert, le descripteur du fichier est mis à jour, le comportement des opérations de lecture/écriture est défini : lecture seule, écriture et lecture, mode ajout, mode synchrone, etc. 130 CHAPITRE V ────────────────────────────────────────────────────────────── ■ Lecture Algorithme simplifié si absence de verrou en lecture alors si la fin du fichier n'est pas atteinte alors lecture depuis la position courante is sinon blocage du processus jusqu'à la suppression du verrou is Déroulement de l'appel système read Synopsis int read(int fd, char *buf, unsigned nbyte); Description fd est le descripteur de fichier, buf est l'adresse du tampon en mémoire contenant les données à transférer, nbyte est le nombre de bytes à transférer. Mode utilisateur fd, buf, nbyte Mode Noyau Stockage des arguments dans des registres Sauvegarde du contexte utilisateur dans la pile utililisateur Recopie des paramètres d'appel dans la pile système Appel de la primitive de bas niveau read(fd, buf, nbyte) Exécution de la primitive de bas niveau Rangement des résultats dans la pile utilisateur Retour en mode utilisateur : restauration du contexte utilisateur Structure U résultat erreur fd, buf, nbyte Suite du programme ■ Ecriture Algorithme simplifié si absence de verrou en écriture alors écriture (asynchrone ou synchrone) sinon le processus est bloqué jusqu'à la suppression du verrou is ■ Fermeture La fermeture garantit que l'information en mémoire a été effectivement recopiée sur le fichier en vidant les caches et en libérant les canaux d'accès aux données. En cas de plantage, les fichiers en cours d'utilisation ne sont pas toujours mis à jour. ■ Destruction La suppression d'un fichier est effective quand tous ses chemins d'accès sont détruits. Son descripteur est alors supprimé libérant l'espace alloué sur le disque sans destruction du contenu qu'il est possible de récupérer tant qu'il n'a pas été altéré. GESTION DE FICHIERS SOUS UNIX/LINUX 131 ────────────────────────────────────────────────────────────── ■ Cycle de vie d'un fichier Les appels système associés aux opérations précédentes sont : creat open write read lseek close chmod stat access création d'un fichier et gestion de ses modes d'accès ouverture d'un fichier (lecture, écriture, mis à jour) écriture lecture déplacement dans un fichier fermeture d'un fichier modification des droits d'accès informations sur l'état d'un fichier contrôle des droits d'accès. creat link open write read lseek close unlink Exemple : copie d'un fichier #define BUFSIZE 1024 #define PMODE 644 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main (int argc, char *argv[]) {int f1,f2,n; char buf[BUFSIZE]; void erreur( char *, char *); /* prototypes */ int open(char *, int, mode_t); if(argc != 3) erreur ("Usage : copie depuis vers", (char *) NULL); if((f1=open(argv[1],O_RDONLY,444))==-1)erreur("ouverture impossible %s",argv[1]); if((f2 = creat(argv[2],PMODE)) == -1) erreur("création impossible %s",argv[2]); while ((n = read(f1, buf, BUFSIZE)) > 0) { if (n== -1) exit(-1); if (write(f2, buf, n) != n) erreur("erreur en écriture", (char *) NULL); } return(1); } void erreur(char *s1, char *s2) {fprintf(stderr,s1,s2); printf("\n"); exit(-1); } 132 CHAPITRE V ────────────────────────────────────────────────────────────── 12. L'ARBORESCENCE TRADITIONNELLE D'UNIX ■ Racine Au sommet de l'arborescence se trouve le répertoire racine (root) noté / qui défini l'origine des chemins d'accès absolus aux fichiers. L'interprétation du caractère / dépend de sa position dans le chemin d'accès du fichier : à gauche, il représente la racine ; ailleurs il est le séparateur des répertoires traversés. Tout répertoire contient au moins deux entrées symbolisées par . qui représente le répertoire courant et par .. qui représente le répertoire parent. Le répertoire racine est tel que . = .. ■ Montage des périphériques externes Le répertoire /mnt, est réservé au montage de systèmes de fichiers de supports amovibles externes (clé USB, disquette, etc.). ■ Dossiers de récupération Chaque système de fichiers contient un dossier lost+found dans lequel sont transférés les blocs récupérés lors de l'exécution de la commande fsck. GESTION DE FICHIERS SOUS UNIX/LINUX 133 ────────────────────────────────────────────────────────────── ■ Noyau Le fichier /unix (vmunix, vmlinuz, etc.) est le noyau du système. Quelquefois stocké dans le dossier /boot. ■ Commandes publiques Les répertoires /bin , /usr/bin, /sbin contiennent les commandes publiques. ■ Fichiers temporaires Le répertoire /tmp, d'accès public, doit avoir les droits rwx pour tous les utilisateurs car utilisé pour y créer des fichiers temporaires. Par convention, leur nom comporte souvent une partie littérale identifiant la fonction assurée et une partie numérique garantissant l'unicité du nom (souvent le pid du processus associé). Au démarrage, le répertoire /tmp doit être purgé. Le dossier /usr/tmp l'administration. ■ contient certains fichiers temporaires utilisés pour Bibliothèques Les bibliothèques standards d'Unix sont stockés dans les répertoires /lib et /usr/lib. Une bibliothèque à édition statique de liens a pour nom libxxx.a (archive) où xxx indique sa nature (c pour le langage C, f77 pour le langage Fortran, C pour le langage C++, pa pour le langage Pascal , etc.),. Les bibliothèques à édition dynamique de liens sont suffixées par.so (shared objects) ou .sl (shared library). Exemples libc.so libf77.a libC.sl 134 CHAPITRE V ────────────────────────────────────────────────────────────── 13. EXERCICES ■ Commandes de base du SGF 1°) Rappeler le rôle des commandes pwd, cd, mkdir, cp, ls, mv. 2°) Créer le répertoire tempo dans votre répertoire de travail, puis s'y déplacer. Y copier en une seule commande le fichier /etc/hosts dont on affichera la taille et le contenu. 3°) Supprimer le répertoire tempo à partir de la commande rmdir. 4°) Refaire le 2° puis déplacer la copie du fichier /etc/hosts dans le répertoire parent. Supprimer en une seule commande différente de la précédente le répertoire tempo. 5°) Déplacez vous dans l'arborescence d'Unix pour étudier les répertoires /, /etc, /usr, /home et essayer d'y détruire des fichiers au hasard (vous n'êtes pas root!!). 6°) Y a-t-il une différence entre les commandes : rm *.o et rm * .o N.B. : ne faîtes pas l'essai. ■ Commandes d'affichage 1°) Rappeler les fonctions des commandes clear, tail, head, more, man. 2°) Afficher les 10 premières lignes du fichier /etc/profile ou du fichier /etc/termcap. 3°) Afficher les 10 dernières lignes du fichier /etc/profile ou du fichier /etc/termcap. ■ Tube A partir des commandes who et wc, calculer le nombre d'utilisateurs connectés. who | wc -l A partir des commandes ls, more ou de la commande pg, afficher de façon lisible le contenu détaillé du répertoire /dev. ■ Liens et redirections 1°) A partir de l'opérateur de redirection et de la commande ls, créer un fichier liste contenant la liste de tous les fichiers du répertoire courant. 2°) A partir de la commande ln, créer un lien matériel sur le fichier liste appelé liste2. 3°) Avec l'éditeur de votre choix, modifier le fichier liste2 et constater que cette modification est prise en compte dans le fichier liste. 4°) A partir de la commande ls -l, constater l'existence de deux liens matériels. 5°) Supprimer le fichier liste et constater que le contenu du fichier liste2 est toujours accessible. 6°) A partir de la commande ln, créer le lien symbolique liste3 sur le fichier liste2. GESTION DE FICHIERS SOUS UNIX/LINUX 135 ────────────────────────────────────────────────────────────── 7°) Avec l'éditeur de votre choix, modifier le fichier liste2 et constater que cette modification est prise en compte dans le fichier liste3. 8°) A partir de la commande ls -l, constater l'existence du lien symbolique. 9°) Supprimer le fichier liste2 et constater que le fichier liste3 existe toujours mais que son contenu n'est plus accessible. 10°) Recréer un nouveau fichier liste2 et constater qu'il est à nouveau accessible par liste3. ■ Attributs de sécurité 1°) Déplacez vous dans l'arborescence d'Unix pour étudier les répertoires /, /etc, /usr, /home et essayer d'y détruire des fichiers au hasard (vous n'êtes pas root quand vous exécutez cette commande!!). 2°) Rappeler les fonctions des commandes chmod, chgrp, umask, basename, file, du, size, od. 3°) Utiliser la commande umask pour définir le masque de création de fichiers 777. Créer un fichier liste à partir de la commande ls -l > liste Quels sont ses droits ? Créer un répertoire tempo et constater ses droits. Conclusion. 4°) Refaire la question précédente avec le masque 000. Conclusion. 5°) Aller chez votre voisin et essayer de lui détruire un de ses fichiers ou répertoires (de préférence inutile). Conclusion ? 6°) Que pensez vous du masque 022 ? 7°) A partir de la commande od, afficher un dump du fichier .bash_profile 8°) Quels sont les droits du répertoire /tmp. Essayer d'y détruire un fichier au hasard. Conclusion ? 9°) Comment positionner le bit t sur le répertoire /tmp ? ■ Expressions régulières, recherches, tri 1°) Rechercher dans le répertoire /dev, tous les fichiers qui ne sont ni de type bloc ni de type caractère. find /dev ! -type b ! -type c -print 2°) Rechercher dans le répertoire /usr les fichiers non modifiés depuis 48 H. find /usr -mtime +2 -print 3°) Rechercher dans le répertoire /etc, les fichiers ayant une taille comprise entre 10000 et 20000 octets pour afficher leurs attributs. find /etc -size +10000c -size -20000c -exec ls -l {} \; 136 CHAPITRE V ────────────────────────────────────────────────────────────── 4°) Rechercher dans tous les fichiers du répertoire courant ceux qui contiennent la lettre a, puis ceux qui contiennent la lettre a en premier caractère d'une ligne. grep a * grep "^a" * 5°) Rechercher, quand c'est possible en local, dans le fichier /etc/passwd ou dans le fichier /etc/shadow les utilisateurs sans mot de passe. Même question dans un environnement réseau géré avec le service NIS. grep "^[^:]*::" /etc/shadow ypcat passwd | grep "^[^:]*::" 6°) Afficher le fichier /etc/passwd trié selon l'ordre lexicographique inverse puis selon le champ GID. sort -r /etc/passwd sort -t: +3n -4 /etc/passwd 7°) Afficher le fichier /etc/passwd trié selon le champ GID et en cas d'égalité sur le numéro décroissant du champ uid. sort -t: +3n -4 +2nr -3 /etc/passwd CHAPITRE VI GESTION DES TRAVAUX SOUS UNIX/LINUX 1. DEFINITIONS ■ Processus sous Unix L'image d'un processus en mémoire est l'ensemble des instructions et données exécutables par un ordinateur dont un processus est l'exécution dynamique. Toutes les processus s'exécutent en multiplexage temporel sur le processeur fonctionnant en mode système (noyau, kernel) ou en mode utilisateur. ■ Mode système Un processus en mode système exécute du code du noyau. Plusieurs processus en mode système sont activables simultanément. La solution adoptée par le système Unix pour respecter l'intégrité du noyau, résoudre le problème de l'exclusion mutuelle et garantir le franchissement des sections critiques lorsque certaines interruptions sont masquées est d'interdire la préemption d'un processus en mode système par un autre. La durée d'utilisation du mode système est donc limitée et sa terminaison normale se traduit par un retour aussi rapide que possible au processus appelant. ■ Unix et le temps réel L'exécution d'un processus en mode système étant non préemptive, la reprise d'un traitement suite à une interruption est différée jusqu'à la fin de l'appel système (aléatoire) en cours. Deux conséquences essentielles : • le traitement d'une interruption pouvant être différé donc non déterministe, le système Unix traditionnel n'a aucune vocation temps réel. • Toute fonctionnalité du noyau d'un système d'exploitation doit être la plus courte possible. ■ Mode utilisateur Un processus en mode utilisateur exécute une application dans un mode non privilégié. Il accède sous contrôle aux ressources par des appels système (principe de l'encapsulation). 138 CHAPITRE VI ────────────────────────────────────────────────────────────── Exemple Comme nous le verrons dans l'étude d'un interprète de commandes simplifié, la création d'un processus par une commande se déroule comme suit : • contrôle et analyse de la commande, • création du processus fils • exécution de la commande, • terminaison de la commande et retour au processus appelant (l'interprète). shell 1 2 essai Exécution de la commande shell essai Depuis l'interprète, on peut lancer l'exécution de plusieurs processus en parallèle qui par définition sont ses fils. Le niveau de priorité d'un processus utilisateur baisse selon le temps CPU consommé. Remarque Il ne faut pas confondre : • mode d'exécution (système ou utilisateur), • priorité d'exécution, • autorisations d'exécution. Exemples Un processus serveur peut s'exécuter en mode non privilégié, avec des privilèges d'administration restreints. Un gestionnaire de mémoire est prioritaire et s'exécute en mode privilégié. ■ Changement de mode d'exécution Trois situations provoquent la commutation du mode utilisateur au mode système : • un appel système d'un processus utilisateur fait un appel explicite à des services système, • une anomalie (trap) d'exécution du processus provoque un déroutement, • une interruption provoque l'exécution d'un traitement par le noyau. Le passage en mode système s'effectue par une commutation matérielle de l'espace d'adressage avec des instructions privilégiées. GESTION DES TRAVAUX SOUS UNIX/LINUX 139 ────────────────────────────────────────────────────────────── 1.1 Etats et transitions Les transitions des modes d'exécution des processus sont les suivantes : actif en mode utilisateur Appel système ou interruption Retour d'AS ou d'interruption actif en mode noyau endormi, permutation de contexte autorisée réveil prêt Graphe des transitions des modes des Processus Les nœuds du graphe orienté des transitions des modes d'exécution d'un processus représentent les états qu'il peut prendre et les arcs représentent les événements qui provoquent son changement d'état. Ceux-ci sont définis quand il existe un arc d'un état vers un autre. Plusieurs transitions sont possibles à partir d'un état donné. Au cours de son exécution, l'état d'un processus évolue selon son degré d'avancement ou son mode de fonctionnement. Les principaux états sont les suivants : SIDL SRUN SWAIT SSLEEP SUNPROC SZOMB SSTOP SXBRK le processus en cours de création est dans un état inconsistant donc inexécutable. le processus est en attente de sélection par l'ordonnanceur (scheduler) donc activable. le processus est en attente de terminaison d'un processus fils. le processus est en attente d'événement (par exemple une attente de fin d'entrées/sorties). Quand ce dernier se produit, le processus endormi est rendu activable. le processus est actif et détient la ressource processeur. le processus est zombi car son exécution est terminée (appel système exit). Les ressources attribuées (mémoire, disque, etc..) sont restituées., Avant de disparaître complètement, il transmet le contenu de certaines variables de gestion interne (état au moment de sa terminaison, temps CPU consommé, temps de résidence, etc.) pour information au processus père. Il occupe encore un point d'entrée de la table des processus (table proc), restitué dès la transmission de ces informations. le processus est arrêté, son exécution étant contrôlée par un débogueur. le processus est en cours de commutation de contexte. 140 CHAPITRE VI ────────────────────────────────────────────────────────────── fork Processus père SIDL en création wait SZOMB Terminé exit SRUN activable SUNPROC actif wakeprocs sleep SSLEEP endormi Graphe des états d'un processus 1.2 Statut et transitions Le statut d'un processus représente sa localisation dans la mémoire (virtuelle). Il évolue et peut être l'un des suivants : SLOAD SSYS SLOCK SSWAP STRC SULOCK SPAGE SWEXIT SPHYSIO chargé en mémoire, swappable, processus système prioritaire (swapper ou démon), chargé en mémoire centrale avant une opération de déchargement, chargé en mémoire centrale après une opération de chargement, processus en mode trace (sous contrôle du débogueur), chargé en mémoire centrale, non swappable, en attente de page, en cours de terminaison, opération d'entrée/sortie physique en cours. Le couple (état, statut), caractérisant un processus à un instant donné, peut être l'un des suivants : 1 le processus s'exécute en mode utilisateur. 2 le processus s'exécute en mode système. 3 le processus est chargé en mémoire, inactif, prêt devenir actif dès sa sélection par le ordonnanceur. 4 le processus est endormi en mémoire. 5 le processus est déchargé, prêt à être activé. Il doit être préalablement chargé en mémoire. 6 le processus est déchargé, endormi. 7 le processus préempté passe du mode système au mode usager. 8 le processus vient d'être crée et son état est transitoire : il n'est ni prêt ni endormi. 9 le processus se termine (appel système exit) et devient zombi (état SZOMB). GESTION DES TRAVAUX SOUS UNIX/LINUX 141 ────────────────────────────────────────────────────────────── 1 Actif en mode utilisateur Appel système ou interruption 9 zombie exit Retour AS ou d'interruption 7 préempté 2 Mode noyau fin sleep 4 endormi en mémoire swapout wakeup 3 prêt en mémoire 8 en cours de création swapout swapin 6 endormi swappé wakeup 5 prêt swappé mémoire insuffisante Graphe des transitions d'un processus 2. DESCRIPTEURS ASSOCIES A UN PROCESSUS Un processus est décrit par les structures de données essentielles ci-dessous. 2.1 Identificateur Un processus a deux identifiants : son pid (process id), représenté par un nombre entier positif borné et un index dans la liste des processus. Exemples L'ordonnanceur (swapper) est souvent le processus 0. Le processus init (l'ancêtre de tous les processus) est le processus 1. A l'exception du processus 0, tous les processus sont crées à partir de l'appel système fork. 142 CHAPITRE VI ────────────────────────────────────────────────────────────── 2.2 Liste des processus Deux tables systèmes sont utilisées pour la gestion des processus : la table proc, résidente en mémoire centrale, et la structure U, swappable avec le processus. La table proc[], résidente, contient la liste de tous les processus ainsi que les informations (vecteurs d'état) nécessaires pour en assurer la gestion. Elle est décrite dans le fichier /usr/include/sys/proc.h. Pour chacun, on y trouve son état et son statut, ses temps d'exécution en mode utilisateur et en mode système, son identité (pid), sa priorité, les signaux reçus, en attente, masqués, son propriétaire, sa localisation en mémoire, sa taille, etc. En voici quelques extraits : ■ Champs et structures utilisées par l'ordonnanceur, addr usrpri pri cpu stat time nice ■ Gestion des signaux reçus sig sigmask sigignore sigcatch ■ adresse de la table des pages, priorité de l'utilisateur propriétaire du processus f(cpu, nice), priorité courante du processus, durée de dernière utilisation du processeur central par le processus, utilisé par l'appel système stat, temps de résidence en mémoire pour le calcul de la priorité , utilisé pour les requêtes d'ordonnancement de l'utilisateur. signaux suspendus en attente d'émission, masque de comportement des signaux, signaux ignorés, signaux captés. Informations statistiques pgrp pid ppid xstat wchan nom du processus leader de la session, identificateur (pid) du processus, identificateur (pid) du processus père, exit status (appel système wait), événement attendu par le processus. 2.3 Structure U La structure U est l'extension de la table proc contenant les informations swappables du processus nécessaires à son exécution. Les informations qu'elle contient sont : • le mode d'exécution (noyau ou utilisateur), • l'état de retour des appels systèmes, • la table des descripteurs, • les informations comptables et de contrôle des ressources, • la pile d'exécution du processus. GESTION DES TRAVAUX SOUS UNIX/LINUX 143 ────────────────────────────────────────────────────────────── 2.4 La commande ps La commande ps fournit l'état et le statut des processus actifs. Synopsis ps [options] Les principales options, quelquefois différentes selon l'environnement sont : ■ BSD a l u x System V e l f tous les utilisateurs, forme longue, sortie orientée utilisateur, détache les terminaux. Selon les options, les informations affichées sont : ■ F, indicateur du statut 01 02 04 10 20 ■ STAT, indicateur d'état 0 D S I W R Z T ■ en mémoire, processus système, entrée-sortie en cours, processus en zone d'échanges (swappé), processus fonctionnant en mode pas à pas (trace). inexistant, en zone d'échanges, en sommeil (sleep) depuis moins de 20 secondes, en sommeil (interrupt) depuis plus de 20 secondes, en attente de la fin d'un processus fils (wait), en cours d'exécution (run), terminé (zombi), arrêté (stop). Autres champs uid pid ppid STIME PRI uid de l'utilisateur propriétaire du processus, identificateur (entier) du processus, identificateur (entier) du processus père (créateur), heure de démarrage du processus, priorité courante du processus (plus ce nombre est élevé, plus la priorité est faible), ADDR adresse en mémoire ou sur disque si le processus est swappé, SZ nombre de blocs en mémoire de l'image du processus, WCHAN événement attendu par le processus quand son état est S(sleep) ou W(wait), ou <espace>, TTY adresse logique du terminal associé à l'exécution du processus, TIME temps d'exécution CPU, COMMAND nom de la commande exécutée. 144 CHAPITRE VI ────────────────────────────────────────────────────────────── Exemple F 31 20 31 31 20 20 3. S S S S S S S uid root root root root root root pid 0 1 2 3 449 224 ppid 0 0 0 0 1 1 C 0 0 0 0 0 0 PRI 0 39 0 20 28 26 NI 20 20 20 20 20 20 ADDR1 SZ ded 0 254 36 256 0 258 0 275 48 3e4 88 WCHAN STIME f0219534 Jun 30 e0000000 Jun 30 f00c215c Jun 30 f00b9074 Jun 30 f01000cc 17:43:41 f01cd8d6 17:43:14 TTY ? ? ? ? ? ? TIME CMD 0:00 sched 0:00 init 0:00 vhand 0:00 bdflush 0:00 -ksh 0:00 /etc/cron CREATION ET TERMINAISON DE PROCESSUS 3.1 L'appel système fork : présentation externe La création d'un processus est réalisée par le clonage : l'image du processus fils crée est identique à celle de son créateur, le processus père. Les différences sont le pid et certains champs de la table proc (time, etc.) Synopsis pid_t fork(void); Dans le processus père, le pid du processus fils est retourné par l'appel fork. Dans le ce dernier, il est nul ce qui permet d'écrire la séquence traditionnelle : n=fork(); if (n <0) if (n==0) else { /* n contient le code de retour */ {/* échec de l'appel système fork */} {/* exécution du code du processus fils */} {/* exécution du code du processus père */} Cette séquence de code a la particularité de permettre l'exécution des deux alternatives par deux processus différents : une dans le processus père et une dans le processus fils. Son effet est le suivant : • le processus père crée un processus fils, son clone parfait, qui a les mêmes programmes, données, descripteurs de fichiers, et signaux (héritage) et poursuit son exécution (cas n>0). • le processus fils peut être modifié (code, données, etc.) sans que son créateur en soit affecté (cas n=0). Chacun reprend son exécution à l'instruction de retour de l'appel fork. Pour le processus fils, c'est une illusion puisqu'il n'existait pas avant l'appel. Si la table (statique) des processus est saturée (cas n<0), l'appel système fork ne peut s'exécuter. Il faut alors attendre la terminaison d'un processus pour le réitérer. Quand elle dynamique, le problème ne se pose plus. GESTION DES TRAVAUX SOUS UNIX/LINUX 145 ────────────────────────────────────────────────────────────── 3.2 L'appel système canonique exec* Le processus fils n'ayant aucune raison de rester un clone de son créateur, le code du père est modifié par des primitives de recouvrement (overlay) du programme désiré. La terminaison d'un processus décrémente le nombre de liens associés au code exécutable (text segment). Quand ce nombre est nul, la mémoire est libérée sauf en cas d'utilisation du bit d'adhérence. Les appels système de la forme générique exec* permettent le chargement du texte, des données statiques et dynamiques, et de la pile d'un processus. Il en existe plusieurs versions (execl, execv...) dont la forme canonique d'utilisation est la suivante : if ((n = fork()) == 0) /* processus fils */ { exec*("/.../application",...);} Le code de retour de l'appel système fork étant nul dans le processus fils, il est seul à exécuter l'appel système exec*. Synopsis (forme canonique) exec* (char *path, char *argv[], char *envp[]); avec : path argv envp le chemin d'accès du fichier exécutable à charger. le tableau de pointeurs sur les éventuels arguments. l'environnement d'exécution du processus père transmit à chaque processus fils. L'appel système exec* recouvrant le programme appelant, il est nécessaire d'enchaîner les appels fork et exec*, d'où la séquence : code du processus père int main() ... /* création du processus fils */ if ((n = fork())==0) exec*(...); ■ Données limites d'exécution d'un processus Les paramètres limites sont accessibles avec la commande ulimit. Exemple ulimit -a core file size (blocks) data seg size (kbytes) file size (blocks) max memory size (kbytes) stack size (kbytes) CPU time (seconds) max user processes pipe size (512 bytes) open files virtual memory (kbytes) 1000000 unlimited unlimited unlimited 8192 unlimited 256 8 256 2105343 146 CHAPITRE VI ────────────────────────────────────────────────────────────── 3.3 L'appel système exit Appel système de terminaison d'un processus (explicite ou implicite) quand il se termine. Il n'a jamais de retour. Le noyau peut aussi l'invoquer à la réception d'un signal inattendu. La valeur retournée par la variable exit_status alors est le numéro du signal correspondant. Synopsis void exit(int exit_status); Description La variable d'état exit_status est retournée au processus père. Proc essus p ère Proc ess us fil s ZO MBI p _c pu . .. p _time . .. pid ppid p_ cp u p_time p_xstat Transmission des variables d'état entre processus père/fils 4. SYNCHRONISATION DE PROCESSUS ■ Exécution synchrone ou asynchrone des processus père/fils Plusieurs choix d'exécution sont possibles au lancement d'une nouvelle tâche : cette dernière peut être exécutée en mode interactif (les processus père et fils s'exécutant en mode synchrone) ou en mode différé (le processus fils est une tâche de fond s'exécutant en mode asynchrone). Dans les environnements Unix/Linux, le mode interactif est appelé mode foreground (tâche de devant), le mode différé mode background (tâche de derrière). ■ Appel système et primitives Le programmeur gère la prise en compte d'événements dans ses applications par les appels systèmes présentés ci-après, la synchronisation des processus par le système d'exploitation étant effectuée par des primitives de bas niveau du noyau (par exemple sleep et wakeprocs), encapsulées dans ce dernier. GESTION DES TRAVAUX SOUS UNIX/LINUX 147 ────────────────────────────────────────────────────────────── ■ L'appel système wait • Suspend à sa demande l'exécution d'un processus jusqu'à la terminaison d'un processus fils. • Le processus père appelle l'ordonnanceur avant de s'endormir. Il ne reprend son exécution que lorsqu'un processus fils exécute une primitive exit. • Ce mode de fonctionnement définit un processus interactif. Exemple : création d'un processus applicatif if ((n = fork()) == 0) {/* processus fils */ exec*("/bin/application",...); exit(1); } /* processus père */ while (wait(&status) != pid); ■ La commande wait La commande wait permet de synchroniser deux processus, le processus l'exécutant attendant la terminaison de tous les processus fils pour poursuivre son exécution. Synopsis wait [pid] ■ La commande sleep Suspend l'exécution d'un processus pendant une durée définie en seconde. Synopsis sleep durée_en_secondes 5. SIGNAUX ■ Définition Un signal représente un événement d'origine matérielle (interruption) ou logicielle (déroutement ou exception) notifié au processus pouvant provoquer l'exécution d'une procédure prédéfinie dans le système d'exploitation ou le processus lui-même. Ainsi, le noyau peut communiquer avec les processus en cas d'erreur (violation protection mémoire, erreur d'entrées/sorties, etc.) ou des processus utilisateurs peuvent communiquer entre eux. Voici la liste des signaux les plus usuels, chacun étant associé à un identificateur symbolique (quelquefois précédé des lettres SIG) et un nombre (Id) : 148 CHAPITRE VI ────────────────────────────────────────────────────────────── Nom HUP Id Rôle 1 Signal de fin de session, émis à tous les processus associés à un terminal, lorsque celui-ci est déconnecté. INT 2 Signal d'interruption de l'exécution d'un processus (Ctrl C). QUIT 3* Identique au signal INT avec la génération d'un fichier core. ILL 4* Instruction illégale. TRAP 5* Emis après l'exécution de chaque instruction, quand le processus fonctionne sous le contrôle d'un débogueur (mode trace). IOT 6* Problème matériel. EMT 7 Emulateur trap. FPE 8* Erreur d'exécution d'une instruction sur des nombres flottants. KILL 9 Meurtre d'un processus dont on est propriétaire. BUS 10* Erreur matérielle sur le bus. SEGV 11* Violation de la protection mémoire (segmentation ou pagination). SYS 12* Appel système invalide. PIPE 13 Ecriture sur un tube sans lecteur ou erreur sur une prise de communication. ALRM 14 Signal généré par l'horloge temps réel, utilisé par les primitives sleep, alarm, setitimer pour définir des temporisations. TERM 15 Terminaison normale d'un processus. USR1 16 Signal à la disposition des utilisateurs. USR2 17 Signal à la disposition des utilisateurs. CCHLD 18 Terminaison d'un processus un fils. PWR 19 Coupure de l'alimentation électrique. WINCH 20 Modification de la taille d'une fenêtre. URG 21 Information urgente sur une prise de communication (socket). POLL 22 Entrée/sortie asynchrone sur un périphérique de type stream. STOP 23 Suspension d'un processus. TSTP 24 Suspension d'un processus depuis le terminal. CONT 25 Redémarrage d'un processus suspendu. TTIN 26 Lecture d'un terminal en mode background. TOU 27 Ecriture d'un terminal en mode background. XCPU 30 Limite de temps CPU dépassée. XFSZ 31 Limite de taille de fichier atteinte. • La liste des signaux implémentés est accessible à partir de la commande kill -l • Les signaux dont le numéro est suivi par * génèrent un fichier image du processus (core), image de sa mémoire à l'émission du signal. • Le signal de meurtre (KILL), émis par le propriétaire du processus ou l'administrateur, est le seul qu'on ne puisse ni ignorer, ni traiter par une fonction. ■ Application : signal de fin d'une session Tous les processus d'un utilisateur qui se déconnecte sont tués (signal HUP). Ce choix assure la bonne gestion du système en l'empêchant d'être une poubelle. La commande nohup lance un travail différé (background) avec requête explicite de non prise en compte du signal HUP à la déconnexion. GESTION DES TRAVAUX SOUS UNIX/LINUX 149 ────────────────────────────────────────────────────────────── 5.1 Emission de signaux ■ Commande kill La commande kill émet un signal donné à un processus. Synopsis kill -identificateur_signal pid_du_processus_destinataire kill -num_signal pid_du_processus_destinataire Exemple L'une des commandes : kill -KILL 2383 kill -9 2383 #normalisé #dépend de l'implémentation provoque la mort du processus dont le pid est 2383. ■ Appel système kill Emission d'un signal vers un processus. Synopsis int kill(int pid, int signum) Description Emission du signal signum au (groupe de) processus identifié par pid et à tous ses fils. 5.2 Réception de signaux ■ Comportement par défaut des processus à réception d'un signal donné Le comportement d'un signal non masquable tel KILL ne peut être ni ignoré ni modifié par le processus destinataire. Celui d'un signal masquable peut l'être (commande interne trap). Synopsis trap [argument] identificateur_du_signal Description "" • 'commande' signal reçu ignoré, comportement par défaut du signal à redéfinir, commande ou fonction à exécuter à réception du signal. Exemple trap 'rm /tmp/fichier; exit' INT QUIT 150 CHAPITRE VI ────────────────────────────────────────────────────────────── 6. ORDONNANCEMENT 6.1 L'algorithme du tourniquet La priorité d'un processus est recalculée chaque seconde par un algorithme de type tourniquet (round robin) à plusieurs niveaux de recyclage : un processus d'une classe de priorité donnée est dans une file d'attente gérée en mode FIFO, le processus le plus prioritaire étant le premier de la file. L'unité centrale lui est allouée pour une tranche de temps (slice) au plus. Il passe en queue de file après. ■ Classes de priorité Le groupe temps réel Les processus temps réel sont les plus prioritaires. Le temps de réponse est garanti par des points de préemption dans le noyau. Les priorités restent fixes. Un processus temps réel en cours d'exécution est ininterruptible. Le groupe système Les processus systèmes sont moins prioritaires que les processus temps réel et plus prioritaires que les processus en temps partagé. Le groupe temps partagé Ce groupe correspond au mode de fonctionnement traditionnel d'Unix/Linux. 6.2 Calcul de la priorité (Unix BSD) La priorité du processus est une fonction décroissante du temps. ■ Priorité d'un processus actif Les champs p_usrpri, p_nice, p_cpu (table proc) sont utilisés de la façon suivante : le champ p_usrpri, borné par 127, est recalculé tous les quatre quantas par la formule : p_usrpri = PUSER + 0.25 p_cpu + 2 p_nice PUSER est le niveau de priorité du processus. La variable p_cpu est un estimateur de l'utilisation récente du CPU par le processus. Incrémenté à chaque tic d'horloge, il tient compte du nombre moyen de travaux en attente par la formule : p _ cpu = 2load p _ cpu + p _ nice 2load + 1 La variable p_nice est nulle par défaut. L'administrateur peut la modifier (valeur comprise entre -20 et +19). Un utilisateur ne peut la modifier que pour ses processus avec la condition p_nice ≥ 0 ce qui les rend moins prioritaires. GESTION DES TRAVAUX SOUS UNIX/LINUX 151 ────────────────────────────────────────────────────────────── ■ Réveil La priorité au réveil est recalculée par la formule : p _ cpu = p _ cpu ■ 2load p _ spltime 2load + 1 Niveaux de priorité Les niveaux de priorité suivants sont prédéfinis : Niveaux PSWP PINOD PRIBIO PZERO PPIPE PWAIT PLOCK PSLEEP PUSER PIDLE valeur 0 10 20 25 26 30 35 40 50 127 description priorité au cours d'un swap, attente d'informations pour lecture et écriture d'inode, attente d'une fin d'entrées/sorties bloc sur le disque, priorité de base de prise en compte des signaux, utilisé pour la gestion du tube, priorité de base d'attente de ressources, priorité de base attente de ressources verrouillées, priorité de base d'attente d'événement, priorité minimale d'un processus en mode usager, priorité d'un processus oisif. Un processus dont la priorité est inférieure à PZERO peut être indifférent à certains signaux qu'il peut masquer ou ignorer. Un processus dont la priorité est comprise entre PZERO et PUSER est sensible aux signaux. ■ L'horloge temps réel Le temps CPU est comptabilisé à partir de l'horloge temps réel de très haute priorité. La primitive associée a pour fonction de : • réveiller périodiquement l'ordonnanceur (processus swapper ou sched) pour éviter qu'un processus ne bloque indéfiniment le processeur central, • gérer la table d'activation des processus, • incrémenter les compteurs de gestion du temps, • réveiller les gestionnaires de la mémoire, • émettre des signaux en instance aux processus destinataires, • réveiller le dispatcher. 152 CHAPITRE VI ────────────────────────────────────────────────────────────── 6.3 Sections critiques Le masquage des interruptions est réalisé par les primitives de bas niveau gpl (get priority level) et spl* (set priority level). L'écriture d'une section critique s'effectue comme suit : it = gpl(); spl*(CLIN); ... spl*(it); it stocke le niveau d'exécution courant masquage des interruptions entrées/sorties exécution des instructions en section critique restauration du niveau d'interruption initial Il existe plusieurs primitives de masquage d'interruptions, dont le comportement est fonction de l'implémentation. spl0 spl1 spl6 spl7 spltty splstr toutes les interruptions sont valides masquage des interruptions horloge logicielles masquage des interruptions d'ordonnancement masquage de toutes les interruptions masquage des interruptions issues d'un terminal masquage de protection du mode stream. La primitive splx restaure le niveau masqué par une des primitives précédentes. Dans l'exemple suivant, CLIN est le niveau d'interruption immédiatement supérieur aux interruptions caractères issues d'une console de type TTY. it = gpl(); spl*(CLIN); ... it stocke le niveau d'exécution courant Déroulement de la section critique du pilote mode caractère ... spl*(it); retour au niveau d'interruption initial 6.4 Commutation de processus ■ Situations La commutation de processus s'effectue lors des situations suivantes : • dépassement de la tranche de temps, • déroutement, • mise en sommeil suite à une requête non satisfaite, • commutation quand un processus plus prioritaire est éligible. Un processus exécutant un appel système en finit néanmoins l'exécution ce qui est non déterministe. GESTION DES TRAVAUX SOUS UNIX/LINUX 153 ────────────────────────────────────────────────────────────── Exemple Les lignes épaisses indiquent le mode d'exécution courant. Les lignes fines indiquent le processus concerné par la séquence temporelle. MODE UTILISATEUR Processus A Processus B MODE NOYAU Appel système Interruption plus prioritaire que A Appel système Commutation de contexte sleep(événement_à_attendre) Appel système dans le processus A Interruption vers le processus B Indéterminé Commutation de contexte Fin de l'appel système de A Prise en compte de l'interruption Fin de l'appel système de B La table proc, la table des segments constituant le contexte système d'un processus, pour changer de processus actif, il suffit de changer le pointeur sur le processus courant et le pointeur sur le segment de code (table text). La pile d'exécution est sauvegardée à chaque commutation en mode noyau. Elle contient la structure U, les registres généraux, le compteur ordinal, les registres de base, les registres pointeur de piles (système et usager) et les registres d'état. 154 CHAPITRE VI ────────────────────────────────────────────────────────────── ■ Sauvegarde et restauration de contextes Les primitives de sauvegarde (save) et de restauration du contexte (resume) sont utilisées ainsi : continue(p) save resume return p : processus montant sauvegarde du contexte du processus descendant restauration du contexte du processus montant dans le contexte du processus montant Trois cas d'utilisation du couple (save, resume) : • réception de signaux : le processus conserve le processeur la réception du signal étant suivie d'une restauration de contexte. • le contexte du processus est sauvegardé avant la perte du processeur. • le processus libère explicitement le processeur. Le champ p_swaddr (table proc) est l'adresse sur le fichier d'échanges de la structure U du processus montant et précise le contexte à restaurer. La visibilité change le programme montant s'exécutant comme un retour de procédure. Les primitives save et resume sont implémentées quelquefois par les primitives de bas niveau setjmp, longjmp. Le chargement d'un processus dans un segment de la mémoire autre que celui sauvegardé nécessite la modification de son domaine de visibilité (section critique). ■ Commutation de processus Une commutation de processus commence son exécution dans le processus qui s'endort et la termine dans le processus qui se réveille. Algorithme sauvegarde du contexte du processus courant Tant que (aucun processus sélectionné) pour (tous les processus activables) sélection du processus le plus prioritaire Fin tant que suppression du processus élu de la file d'attente restauration du contexte du processus élu ■ Commutation de contexte de thread Les appels système getcontext et setcontext ont été implémentés pour permettre la commutation de contexte entre deux unités d'exécutions (thread) d'un processus. GESTION DES TRAVAUX SOUS UNIX/LINUX 155 ────────────────────────────────────────────────────────────── 7. CONTROLE DE L'EXECUTION DES PROCESSUS 7.1 Changement du mode d'exécution d'un processus ■ Modes d'exécution Un processus peut être exécuté : • en mode interactif ou mode foreground (tâche d'avant plan). C'est le mode par défaut, • en mode différé ou mode background (tâche d'arrière plan), avec l'opérateur &. • être suspendu pour être relancé. ■ Référence aux processus Un processus peut être référencé : • à partir du caractère % (numéro relatif obtenu à partir de la commande jobs), • par son identificateur (pid) dans la liste des processus, • par son nom. ■ Changements de mode d'exécution Les interprètes bash, C shell et Korn-shell permettent de contrôler le mode d'exécution d'un processus dont les changements d'état sont : • sa suspension, • sa mise en mode foreground, • sa mise en mode background, • sa terminaison. ■ Suspension d'un processus L'arrêt immédiat d'un processus s'exécutant en mode foreground s'effectue par la commande ^Z (CTRL Z). ■ Passage en mode interactif Le passage de l'arrière plan à l'avant plan d'un processus s'effectue par la commande interne fg (foreground). Synopsis sur le processus courant à partir du pid de processus à partir du numéro de processus à partir du nom du processus fg fg pid_processus, fg %numéro_relatif_processus, fg %identificateur_du_processus 156 CHAPITRE VI ────────────────────────────────────────────────────────────── ■ Passage en tâche de fond Le passage de l'avant plan à l'arrière plan d'un processus s'effectue : sur le processus courant bg à partir du numéro de processus bg %numéro_relatif_processus à partir du nom de processus bg %nom_du_processus ■ Terminaison d'un processus La terminaison d'un processus est forcée avec la commande kill. Synopsis kill [-identificateur_du_signal] pid_du_processus kill [-identificateur _du_signal] %numéro_du_processus kill [-identificateur _du_signal] %nom_du_processus Le signal de meurtre est celui par défaut. Exemples kill 345 kill -INT 346 kill %1 kill %boucle ■ Graphe de changement d'état Les changements d'état évoluent selon le graphe suivant : jobs Mode foreground CTRL Z fg fg jobs Mode suspendu jobs bg Mode background 7.2 Commandes de contrôle d'exécution ■ Commande nohup • Ignore certains événements associés à la gestion des terminaux (coupure de ligne, fin de session). • Exécution d'une commande pouvant se poursuivre après une déconnection. Synopsis nohup commande [option(s)][argument(s)] & GESTION DES TRAVAUX SOUS UNIX/LINUX 157 ────────────────────────────────────────────────────────────── ■ Commande killall Termine tous les occurences de la commande lancée par l'utilisateur qui l'exécute. Synopsis killall identificateur_commande_à_supprimer ■ Commande lastcomm Affichage de toutes les commandes exécutées dans leur ordre inverse d'exécution. Ne peut être utilisée que si la comptabilité (système) est active. Synopsis lastcomm [commande] ■ Commande nice Modification de la priorité d'un processus. Le nombre n positif rend un processus moins prioritaire. Négatif, il le rend plus prioritaire (réservé à l'administrateur). Synopsis nice -n commande Exemple nice –20 ./boucle& ■ Commande renice La commande renice permet de modifier la priorité d'un processus déjà démarré avec les mêmes règles que celles de la commande nice. Exemple renice 20 23561 8. GESTIONNAIRES DE MEMOIRE 8.1 Echanges, pagination, segmentation ■ Gestion de la mémoire centrale Le noyau et la table des processus résident en mémoire RAM, le reste de la mémoire étant alloué aux processus actifs. Différents processus de gestion mémoire : • assurent la conversion de l'adresse virtuelle en adresse réelle et la synchronisation de la gestion des pages, • définissent les limites de l'espace mémoire utilisable par un processus et le nombre maximum de processus. Tout processus dispose de ses tables des pages. 158 CHAPITRE VI ────────────────────────────────────────────────────────────── ■ Echanges de processus (swap) Les opérations de chargement et déchargement s'effectuent à la demande du processus ou du noyau par le fournisseur du service (swapper). Le fichier d'échanges est géré par groupement de blocs et sans cache et n'est pas structuré en système de fichiers. La stratégie d'échanges est définie par l'ordonnanceur : sélection en mémoire du processus le moins prioritaire, si possible endormi pour déchargement, sélection en zone d'échanges du processus le plus prioritaire (statut non(SLOAD) et état SRUN) pour chargement. L'opération de déchargement transfère table des pages, pages de données et segments de pile du processus élu de la mémoire centrale en zone d'échanges (un segment partagé reste en mémoire). Elle se produit dans les situations suivantes : • clonage d'un processus, • extension de la taille des données ou de la pile d'un processus, • requête du noyau pour charger un processus plus prioritaire, • saturation du gestionnaire de pages, • fragmentation de la table des pages empêchant l'allocation éventuelle de pages, • inactivité d'un processus actif pendant plus de vingt secondes. La priorité du processus rechargé est calculée à partir de la durée pendant laquelle il a été échangé, sa taille, sa valeur nice. Après sélection du processus, le noyau vérifie qu'il y a suffisamment de mémoire pour charger structure U, table des pages et pages constituant son espace vital. L'allocation d'espace sur le fichier d'échanges est réalisée par blocs contigus par un algorithme de type First Fit, compacté pour éviter la fragmentation à sa libération. L'augmentation de la taille et du nombre des processus nécessite d'augmenter les zones d'échanges ce qui est possible dynamiquement (commandes swap, swapon, et swapoff). La pagination et la gestion des fichiers d'échanges de stations sans disque étant effectuées sur le réseau, une mémoire centrale importante en minimise la charge. ■ Pagination La pagination est assurée par le gestionnaire de pages (pagedaemon). Différentes tables sont nécessaires : • Les tables des pages virtuelles décrivent les pages, en zone d'échanges ou en mémoire, utilisées par un processus. • Les tables du cadre de pages ou encore table des pages inversées décrivent les pages de la mémoire réelle, en assurant la correspondance entre les pages virtuelles et la table du cadre des pages réelles. Sur certains systèmes, un cache associatif (Translation Lookaside Buffer - TLB) accélère la recherche des pages réelles. GESTION DES TRAVAUX SOUS UNIX/LINUX 159 ────────────────────────────────────────────────────────────── Le principe de localisation est utilisé pour le chargement des grappes de pages (clusters) par anticipation. Le choix des victimes est déterminé selon l'algorithme du voleur de cycles ou celui de la double chance (clock et double clock). Un nombre de pages disponibles inférieur à un certain seuil active le gestionnaire de changement de pages (algorithme LRU). Dès que le défaut de pages est trop élevé, le processus d'échanges est activé. ■ Segmentation L'espace d'adressage virtuel d'un processus est divisé en régions (segment), une région étant une zone continue de l'espace d'adressage virtuel. Des accès simultanés à une région permettent d'exécuter un code unique ou de partager des données communes. La table des régions, gérée à partir des listes des régions disponibles et actives, contient un point d'entrée pour chaque région active. Le code (text segment), les données (data segment), et la pile d'un processus (stack segment) constituent trois régions distinctes. Il y a en outre les régions associées aux fichiers projetés en mémoire, les régions de mémoire partagée, les régions associées aux bibliothèques partagées. La protection et le partage d'une région de code par plusieurs processus (accès uniquement en lecture) sont réalisés par des mécanismes matériels. ■ Fichiers projetés en mémoire L'inclusion totale ou partielle d'un fichier dans l'espace adressable d'un processus (appel système mmap) permet d'effectuer les entrées/sorties directement en mémoire. 8.2 Communications en mémoire Des processus peuvent partager des informations dans une zone de mémoire commune (mémoire partagée) ou échanger des messages en mode asynchrone, les accès aux informations étant gérés par des sémaphores. Ces outils basés sur l'architecture client/serveur constituent les mécanismes de communications entre processus (Inter-Process Communication - IPC). ■ Propriétés communes des IPC Un type d'IPC est décrit par une structure dont les champs en décrivent les propriétés. Tout point d'entrée d'une table contient les identifiants (uid, gid) des processus créateur et propriétaire, des drapeaux d'accès (lecture, écriture, exécution) similaires à ceux des fichiers, des informations sur l'état de l'IPC telles les identifiants du dernier processus à y avoir accédé ainsi que les heures du dernier accès et de la dernière mise à jour. Les processus créateur et propriétaire peuvent modifier les droits. Le processus créateur est inamovible. Un appel système de contrôle spécifique à chaque IPC permet de faire des requêtes d'état d'une information ou de supprimer une entrée de la table. Les appels systèmes relatifs aux différents IPC ont une forme d'utilisation voisine. 160 CHAPITRE VI ────────────────────────────────────────────────────────────── Exemple Création Contrôle message msgget msgctl mémoire partagée shmget shmctl sémaphore semget semctl. Les processus serveur et client utilisent un chemin d'accès et un descripteur numérique de l'IPC uniques pour que la clé d'accès à l'IPC soit unique. Il y a une analogie entre les descripteurs numériques de chaque IPC et les descripteurs logiques de fichiers. ■ Mémoire partagée Plusieurs processus peuvent communiquer directement en lisant ou en écrivant des données dans une région de mémoire partagée, zone commune de leur espace d'adressage virtuel respectif. Une clé d'accès lui est associée à sa création lui permettant d'être ensuite attachée au processus utilisateur et intégrée à son espace d'adressage virtuel. Après utilisation, le processus la détache de son espace d'adressage. Il ne peut la détruire que s'il est le dernier processus à lui être attaché et s'il en a le privilège. La gestion des sections critiques en écriture dans les zones de mémoire partagée doit être faite au niveau applicatif (sémaphores). Le mécanisme de mémoire partagé est très performant car il ne nécessite pas la recopie des données partagées entre processus. ■ Sémaphores Un processus peut créer un ensemble de sémaphores, accessibles par leur identificateur et une clé d'accès et réaliser les opérations P et V. ■ Messages Les queues (files) de messages permettent la communication indirecte de processus asynchrones par une gestion de boites à lettres suivant le modèle des lecteurs et des rédacteurs. Quand un processus crée une file de messages, il en définit la clé d'accès dont la connaissance est nécessaire pour l'émission ou la réception de messages. Chaque message est typé par l'utilisateur de façon à éviter les conflits d'accès. Un processus ne peut accéder à une file que s'il en possède les droits d'accès, identiques à ceux des fichiers. ■ Quelques processus et commandes de gestion de la mémoire swapper, swap (ordonnanceur), update, sync (gestionnaire du cache-logiciel) pagedaemon, vpage (gestionnaire de page), ramdisk (disque virtuel en mémoire) ipcs affichage des IPCs utilisés. Les options q (message queues), m (shared memory), s (semaphores) affichent la table correspondante. Les options b,c,p,t,a consultent la structure ipc_perm, utilisée pour supprimer des canaux d'IPC. GESTION DES TRAVAUX SOUS UNIX/LINUX 161 ────────────────────────────────────────────────────────────── 9. EXERCICES 9.1 Commande ps 1°) Afficher la liste des processus de la fenêtre courante. 2°) Afficher la liste de tous les processus actifs. 3°) Afficher la liste des processus d'un utilisateur donné (par exemple root). 4°) Afficher la liste des processus actifs avec le maximum de renseignements. 9.2 Gestion des modes d'exécution (commandes bg &fg) Exécuter le § 1a) ou le §1b) selon les outils dont vous disposez. 1a) Avec l'éditeur de votre choix, écrire le script glouton suivant : #!/bin/bash # remplacer éventuellement bash par ksh while [ vrai ] do : done Rendre le script exécutable avec la commande : chmod +x glouton 1b) Avec l'éditeur de votre choix, éditer le programme glouton.c suivant : int main() {for(;;);} Créer le fichier exécutable glouton par la commande : make glouton 2°) Exécuter le processus ./glouton en mode interactif (foreground) puis, dans une autre fenêtre, l'identifier à partir de la commande ps. 3°) Gérer le processus associé à la commande glouton à partir de la commande kill par émission des signaux de fin de session HUP, d'interruption QUIT, d'assassinat KILL, d'erreur d'exécution BUS. Conclusions. 4°) Même question avec la commande xeyes& dont les yeux suivent la souris dans son mouvement. 5°) Lancer l'exécutable ./glouton puis modifier son mode d'exécution en mode différé à partir des signaux de contrôle ou à partir des commandes fg, bg, jobs. 6°) Même question en mode graphique avec l'applicatif xeyes&. On s'attachera à contrôler finement le mouvement des yeux. 7°) Lancer plusieurs occurences du shell-script ./glouton, certaines précédées de la commande nohup. Se déconnecter et se connecter à nouveau. A partir des commandes ps et grep, rechercher les éventuelles occurences de la commande glouton. Conclusion ? 162 CHAPITRE VI ────────────────────────────────────────────────────────────── 8°) Soit le script signal #!/bin/bash trap "" INT QUIT while [ vrai ] do : done Lancer ce script pour interpréter le comportement des signaux INT, QUIT sur ce dernier. 9°) Lancer plusieurs occurences du programme glouton (ou de la commande xeyes) puis, après vérification de sa syntaxe dans le manuel, la commande killall opérant sur ces dernières. Conclusion. 9.3 Gestion des priorités Modifier les priorités d'exécution d'un processus glouton à partir des commandes nice puis renice. CHAPITRE VII LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 1. GENERALITES SUR LES INTERPRETES DE COMMANDES 1.1 Fonctionnalités ■ Rôle d'un interprète Un interprète de commandes fournit une interface d'accès en mode caractère au noyau du système Unix. Il effectue l'analyse syntaxique d'une commande par examen des mots et caractères la constituant pour en déterminer les options, les arguments et les caractères spéciaux. En cas de succès, il charge ladite commande pour exécution avec ses arguments et variables d'environnement dans un processus fils. ■ Conception L'interprète Korn shell a été conçu et développé par David Korn. C'est un langage de programmation complet, puissant, complexe d'utilisation Il intègre les fonctionnalités des interprètes historiques standards d'Unix, le shell de Bourne (Steve Bourne) et le C shell (Bill Joy). L'interprète bash (Bourne Again shell) est le frère jumeau du Korn shell. C'est le standard actuel, compatible ascendant avec le shell de Bourne et intégrant les fonctionnalités conviviales du C shell. 164 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Alias L'utilisateur peut personnaliser ses commandes avec des noms abrégés appelés alias. ■ Historique de la pile de commandes La pile de commandes permet de rappeler et modifier une commande. L'interprète gère un journal historique dans le répertoire de travail. ■ Gestion des travaux Changement du mode d'exécution d'un processus (interactif et différé). Affichage d'un message quand un travail d'arrière plan s'achève. Exemple Un interprète simplifié en langage C est présenté à la fin du présent chapitre. 1.2 Le shell, langage de programmation Le shell est procédural et offre les fonctionnalités suivantes : • Opérations arithmétiques sur des nombres entiers. • Opérateurs logiques et relationnels. • Opérations sur les chaînes de caractères : gestion des sous chaînes, concaténation, conversion majuscules/minuscules, etc. • Variables entières typées et tableaux (commande typeset). • Structures de contrôle (boucles et tests). • Sélection par menus (commande select). • Fonctions et procédures (récursives). • Gestion de variables locales et exportées. • Gestion de travaux en avant et arrière plan. • Facilité de mise au point (mode trace) • Gestion de plusieurs niveaux de sécurité : ◊ Lancement et désactivation de scripts privilégiés. ◊ Exécution de script sans permission de lecture. • Gestion des claviers nationaux avec des alphabets constitués éventuellement de plus de 256 caractères (gestion des caractères multilingues sur 24 bits). LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 165 ────────────────────────────────────────────────────────────── 2. GESTION DES PROFILS 2.1 Profil Après la connexion (login), l'interprète exécute successivement les scripts /etc/profile puis .profile (répertoire de travail). ■ Le script /etc/profile Maintenu par l'administrateur pour y définir des opérations de connexions communes à l'ensemble des utilisateurs, il permet en particulier : • d'afficher le message du jour (fichier /etc/motd (message of the day)), • de notifier à l'utilisateur qu'il a du courrier en instance, • de définir un environnement commun à l'ensemble des utilisateurs, • de définir un masque de protection par défaut pour l'ensemble des utilisateurs. ■ Le script .profile (répertoire de travail) Ce script permet à chacun de personnaliser son environnement (lecture du courriel, gestion du bureau, etc.). Il contient des variables prédéfinies, utilisées implicitement ou explicitement pendant une session. 2.2 Alias ■ Principe L'alias est un identificateur abrégé d'une commande. ■ Création Synopsis alias identificateur_alias='texte_de_l'alias' Sans argument, la commande affiche la liste des alias disponibles. Exemple alias ll='ls -l' ■ Exportation aux scripts fils (Korn shell) Un alias peut être local au processus courant (défaut) ou exportable aux processus fils. Synopsis alias –x nom_de_l'alias='texte_de_l'alias' ■ Suppression Synopsis unalias identificateur_alias 166 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Alias internes Les alias internes de l'interprète sont les suivants (Korn shell) : alias autoload=typeset -fu alias functions=typeset -f alias history=fc -l alias integer=typeset -i alias r=fc -e alias stop=kill -STOP alias suspend=kill -STOP $$ En bash, on trouve les alias suivants : alias cp='cp -i' alias d='ls' alias l='ls' alias la='ls -A -k' alias ll='ls -l' alias ls='ls --color=auto -F' alias lsd='ls -d */' alias md='mkdir' alias mv='mv -i' alias p='cd -' alias rd='rmdir' alias rm='rm -i' alias s='cd ..' ■ Alias communs en Korn shell et bash alias history unalias ■ ■ Affichage de la liste des alias courants. Affichage de la liste des 14 dernières commandes précédemment exécutées. Suppression d'un alias. Rappel d'une commande (Korn shell puis bash) r r 378 rv r -2 Rappel puis exécution de la dernière commande. Rappel puis exécution de la commande 378. Rappel puis exécution de la première commande commençant par v. Rappel puis exécution de l'avant dernière commande. !! !378 !v !-2 Rappel puis exécution de la dernière commande. Rappel puis exécution de la commande 378. Rappel puis exécution de la première commande commençant par v. Rappel puis exécution de l'avant dernière commande. Edition d'une commande antérieure (Korn shell) Les éditeurs de textes (emacs, vi, etc.) sont accessibles en mode commande en définissant la variable d'environnement correspondante (commande set) : set -o vi set -o emacs ■ pour l'appel de l'éditeur vi, pour l'appel de l'éditeur emacs. Commande echo La commande echo affiche ses arguments sur la sortie standard. L'option n les imprime sans le caractère de fin de ligne. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 167 ────────────────────────────────────────────────────────────── 2.3 Complément sur les caractères spéciaux De nouveaux caractères spéciaux sont utilisés dans les situations suivantes : • commentaires dans les scripts : le caractère # introduit un commentaire jusqu'à la fin de la ligne, sauf quand il est suivi d'un point d'exclamation. Dans ce cas, il indique l'interprète de commande à utiliser dans le shell script. • délimiteurs de chaînes de caractères " ' ` • séparateur dans une liste de commandes ; • opérateurs de redirection et tube < << > >> | • séparateur des mots d'une commande (caractère d'espacement par défaut, défini dans la variable IFS) • définition du mode d'exécution différé d'un processus & (mode background), etc. ■ La macro $ Synopsis $variable Description Affichage du contenu de la variable. Exemple a=bonjour echo $a bonjour ■ Quotes simples Le (couple de) caractères quotes simples ' utilise les règles suivantes : • Toute chaîne de caractères (y compris les caractères d'espacement) entre deux quotes simples est considérée comme un argument de la commande. • Le mécanisme d'expansion des caractères spéciaux entre les quotes simples est inopérant. • Il n'y a de substitution ni des variables ni des commandes. La substitution de la pile de commande s'y effectue. ■ Doubles quotes Le (couple de) caractères double quotes " utilise les règles suivantes : • Toute chaîne de caractères (y compris les caractères d'espacement) entre deux doubles quotes est considérée comme un argument de la commande. • Le mécanisme d'expansion des caractères spéciaux entre les doubles quotes est inopérant. • Les substitutions de variables, de commandes et de substitution d'historique s'effectuent. 168 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Backquote Le (couple de) caractères `(backquote) utilise les règles suivantes : • Les commandes entre deux backquotes sont exécutées. • Il y a substitution des commandes exécutées par leur résultat. Exemple Exécuter les commandes suivantes : echo date echo "date" echo 'date' echo `date` echo "`date`" echo "La date d'aujourd'hui est `date`" echo "toto* r" echo "toto* !!" echo $(date) echo "$(date)" echo '$(date)' Conclusion ? ■ #ksh #bash Point-virgule Le point-virgule sépare une liste de commandes d'une ligne. ■ Parenthèses Une liste de commandes entre parenthèses est exécutée dans un processus fils dans lequel les affectations de variables et les commandes internes qui affectent l'environnement de l'interprète sont sans effet la commande terminée. Synopsis (Liste_de_commandes) Exemple (ps ; ls) ■ Accolades Une liste de commandes entre accolades est exécutée dans le processus courant. L'accolade ouvrante est suivie d'un caractère d'espacement. L'accolade fermante est précédée d'un ; Synopsis { liste_de_commandes;} Exemple { pwd ; cd ;} ■ Le caractère ~ Le caractère ~ représente le répertoire de travail (home directory) d'un utilisateur. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 169 ────────────────────────────────────────────────────────────── 3. VARIABLE LOCALE, VARIABLE EXPORTEE La portée d'une variable locale est le contexte d'exécution de son script de définition. Par défaut, elle n'est pas accessible par ses fils. La création et l'affectation sont effectuées avec l'opérateur = Les caractères d'espacement sont significatifs. Exemple a="bonjour" et non a = "bonjour" a= "bonjour" a ="bonjour" Une variable est exportée quand elle devient transmissible aux processus fils. Synopsis export variable(s) Exemple a=bon b=jour echo $a$b bonjour bash echo $a$b exit echo $a$b bonjour export b bash echo $a$b jour bash echo $b jour b=demain echo $b demain bash echo $b demain exit exit exit echo $a$b bonjour # shell courant # shell fils # chaîne vide : a,b locales # retour au shell initial # b exportée # shell fils # shell petit-fils # shell arrière petit fils # retour au shell initial La modification par le processus fils d'une variable importée n'est pas répercutée dans le processus père. 170 CHAPITRE VII ────────────────────────────────────────────────────────────── 4. VARIABLES D'ENVIRONNEMENT PREDEFINIES ■ Quelques variables d'environnement initialisées par le Korn shell _ ERRNO LINENO OLDPWD PID PPID PWD RANDOM REPLY SECONDS ■ Quelques variables d'environnement utilisées par le Korn shell CDPATH COLUMNS EDITOR ENV FCEDIT HISTFILE HISTSIZE HOME IFS LINES MAIL MAILCHECK MAILPATH PATH PS1 PS2 PS3 PS4 SHELL TERM ■ Variable volatile contenant le dernier mot de la dernière commande exécutée. Code d'erreur retourné par la commande. Numéro de la commande courante. Avant dernier répertoire de travail. Identificateur du script courant. Identificateur de processus père. Répertoire de travail courant. Pseudo générateur de nombre pseudo aléatoire. Variable réponse (utilisée avec la structure de contrôle select). Durée écoulée depuis le début de la session (secondes). Dossiers de recherche pour la commande cd. Nombre de colonnes du terminal. Chemin de l'éditeur. Script d'environnement exécuté en ouverture de session. Editeur associé à la commande interne fc. Fichier contenant l'historique de la pile de commandes. Nombre de commandes mémorisées dans la pile de commandes (dynamique). Répertoire de travail de l'utilisateur. Séparateur de mots de l'interprète de commandes (par défaut le caractère d'espacement). Nombre de lignes du terminal. Adresse de la boite aux lettres publiques de l'utilisateur. Fréquence de scrutation de la boite aux lettres publiques. Chemin d'accès à la boite aux lettres publiques. Liste ordonnée (gauche-droite) des répertoires (séparés par :) consultés pour le chargement des commandes et applications. Invitation à saisir (prompt) primaire, par défaut $ ou # (root). Invitation à saisir secondaire, utilisée quand l'interprète considère une ligne de commande comme incomplète, par défaut >. Invitation à saisir utilisée par la clause select. Invitation à saisir du mode mise au point d'un script (défaut +). Chemin d’accès absolu à l'interprète. Type de terminal associé au processus en cours, essentiel pour les éditeurs de texte pleine page tels vi. Commandes d'affichage set printenv env Variables locales et exportées, Variables exportées, Variables d'environnement exportées. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 171 ────────────────────────────────────────────────────────────── 5. SCRIPTS ■ Définition d'un script Un shell script ou script est un fichier de commandes à interpréter. ■ Création d'un script Un fichier texte devient un script quand il reçoit l'attribut x avec la commande chmod. Synopsis chmod +x script ■ Exécution d'un script Fichier avec l'attribut x : Il suffit de le nommer pour l'exécuter. Fichier sans l'attribut x Il suffit de lancer l'interprète avec comme argument l'identificateur du script. Synopsis ksh script [argl... argn] bash script [argl... argn] ■ Opérateur point Un script s'exécute par défaut dans un processus fils. Il s'exécute sans création d'un fils par utilisation de l'opérateur . (point) ce qui lui donne accès à son contexte d'exécution (environnement et fonctions). Synopsis . nom_de_script Un caractère d'espacement est nécessaire entre le point et le nom du shell script. 5.1 Mise au point d'un script Les options d'exécution xv permettent la mise au point des scripts (mode trace). Synopsis ksh [-option(s)] script bash [-option(s)] script Les options les plus courantes sont les suivantes : e n u v x Arrêt de l'exécution du script à la première erreur, Lecture et analyse sans exécution, utile pour vérifier la syntaxe, L'utilisation d'une variable non initialisée provoque une erreur, Les lignes correctement exécutées du script sont affichées précédées du symbole +, Les commandes du script et leurs arguments sont affichés à de l'exécution, après les substitutions. 172 CHAPITRE VII ────────────────────────────────────────────────────────────── 5.2 Macros L'interprète utilise des variables appelées macros, notées ?, #, *, $ ,!, etc. dont le contenu est accessible par utilisation du caractère spécial $. Les arguments d'un script (variables de position) sont accessibles par des macros notées 0, 1,...n. Ainsi : $? $# $* $! $$ $0 $n retourne le statut d'exécution de la dernière commande exécutée, retourne le nombre d'arguments dans la ligne de commande, retourne l'ensemble des arguments de la ligne de commande, retourne le pid du dernier processus lancé en tâche de fond du script courant, retourne le pid du script courant. retourne l'identificateur du script, retourne le n-ième argument du script. Exemple #!/bin/bash echo "Liste des arguments du présent script : $*" echo "Nombre total d'arguments :$#" echo "Nom du script : $0" echo "Premier argument :$1" echo "pid du processus courant : $$" date& echo "pid du dernier processus lancé en mode background : $!" Le script essai ci-après présente la syntaxe d'accès aux macros de position. #!/bin/bash for i in 1 2 10 11 12 do echo $i echo ${i} #nécessaire si variable constituée de plusieurs chiffres echo ${!i} #affichage du contenu de la variable de position echo `${!i}` # exécution de la variable de position done // Résultat essai a z e r t y u i o P date 1 1 a erreur 2 2 z erreur … 10 10 p erreur 11 11 date 10 jui 2002… #exécution de la commande date LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 173 ────────────────────────────────────────────────────────────── ■ Commentaire et commande what Les commentaires, précédés en tête de ligne par les caractères #@(#) sont affichés avec la commande Unix what. Exemple Soit le script essai #@(#)Ceci est un test La commande what essai indique : Ceci est un test 5.3 Contexte d'exécution des scripts Il faut être vigilant quand on lance un script car il peut avoir été écrit pour un autre interprète. Les règles suivantes s'appliquent : • L'interprète par défaut est le shell de Bourne, • L'utilisation d'un interprète différent du shell par défaut est spécifiée par l'utilisation consécutive des caractères spéciaux # et ! selon la syntaxe suivante : #!/bin/sh #!/bin/csh #!/bin/bash #!/bin/ksh ■ # shell de Bourne # C shell # Bourne Again shell # Korn shell Règles de programmation et d'utilisation des scripts Il faut toujours indiquer l'interprète à utiliser comme première instruction du script et l'exécuter dans le contexte pour lequel il a été développé. 6. PROGRAMMATION STRUCTUREE EN KORN SHELL 6.1 Opérateur test L'opérateur test, également noté [] (et appelé opérateur crochets), permet : • de tester le type d'un fichier et ses attributs de sécurité, • de tester la valeur d'une expression numérique ou alphanumérique. • d'évaluer des expressions conditionnelles (chaînes de caractères, valeurs numériques, etc.). Synopsis test expression ou [ expression ] Une expression nulle est vraie; vide ou non nulle, elle est fausse. 174 CHAPITRE VII ────────────────────────────────────────────────────────────── L'opérateur test s'utilise sous une des formes suivantes : ■ Test du type et de l'existence d'un fichier a identificateur b identificateur c identificateur d identificateur f identificateur p identificateur s identificateur L identificateur ■ Test sur les attributs de sécurité d'un fichier r identificateur w identificateur x identificateur g identificateur k identificateur u identificateur O identificateur G identificateur ■ Egalité. Inégalité. Plus grand. Plus grand ou égal. Plus petit. Plus petit ou égal. Résultat d'opérations sur les chaînes de caractères chaîne n chaîne z chaîne chaine1 = chaine2 chaine1 != chaine2 chaine1 > chaine2 chaine1 < chaine2 ■ Expression vraie si identificateur est accessible en lecture. Expression vraie si identificateur est accessible en écriture. Expression vraie si identificateur est un shell script. Expression vraie si identificateur a le bit guid (bit S) positionné. Expression vraie si identificateur a le sticky (bit t) positionné. Expression vraie si identificateur a le bit s positionné. Expression vraie si identificateur a comme propriétaire le propriétaire effectif du fichier. Expression vraie si identificateur a comme propriétaire le groupe effectif du fichier. Test du résultat d'opérations sur des nombres entiers nombre1 -eq nombre2 nombre1 -ne nombre2 nombre1 -gt nombre2 nombre1 -ge nombre2 nombre1 -lt nombre2 nombre1 -le nombre2 ■ Expression vraie si identificateur est un fichier existant. Expression vraie si identificateur est un fichier accessible en mode b (bloc). Expression vraie si identificateur est un fichier accessible en mode c. Expression vraie si identificateur est un (fichier) répertoire. Expression vraie si identificateur est un fichier ordinaire. Expression vraie si identificateur est un fichier tube nommé. Expression vraie si identificateur est un fichier d'une taille non nulle. Expression vraie si identificateur est un lien symbolique. Expression vraie si chaîne n'est pas vide. Expression vraie si chaîne est de longueur non nulle. Expression vraie si chaîne est de longueur nulle. Identité. Différence. Postérieure selon l'ordre lexicographique. Antérieure selon l'ordre lexicographique. Opérateurs logiques o a ! opérateur OU. opérateur ET. opérateur NON. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 175 ────────────────────────────────────────────────────────────── 6.2 La clause if Le shell implémente les structures de contrôle traditionnelles d'exécution de la programmation structurée. Un bloc est une liste de commandes (notée commande(s)) représentée sous la forme : • d'une suite de commandes d'une même ligne, séparées par un ; • d'une suite de commandes sur plusieurs lignes. La clause if a plusieurs syntaxes. Synopsis if [ expression ] then commande(s) fi La liste de commandes est exécutée si l'expression est vraie. Exemple if test -d /home/philipp then echo "Le répertoire /home/philipp existe" fi Autre synopsis if [ expression ] then commande(s) else commande(s) fi Si l'expression est vraie, les commandes entre les clauses if et then sont exécutées, celles entre les clauses else et fi sinon. Exemple 1 if [ -d .kshrc ] then echo ".kshrc répertoire" else echo ".kshrc fichier"; echo "Au revoir" fi Exemple 2 read chaine if [ "$chaine" = "" ] then echo "chaine vide" else echo "chaîne non vide" fi # saisie interactive de chaine # test chaîne vide 176 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Tests imbriqués Synopsis if [ expression ] then commande(s) else if [ expression ] then commande(s) else if [ expression ] then … fi fi fi que l'on écrit sous forme abrégée : if [ expression ] then commande(s) elif [ expression ] then commande(s) elif [ expression ] then … fi Il y a une clause fi et une clause if même si plusieurs clauses elif sont imbriquées. 6.3 Alternatives multiples : la clause case La structure de contrôle case gère des branchements multiples. Synopsis case $mot in chaine1) commande(s);; chaine2) commande(s);; … *) défaut;; esac # pas une faute de frappe ! ! # facultatif mais recommandé Description La variable mot est comparée aux différentes chaines. Si une des conditions est vraie, les commandes entre la chaîne et les caractères ;; sont exécutées. Si aucune égalité n'est trouvée, sortie de la structure de contrôle par exécution de la clause esac. Plusieurs alternatives sont autorisées pour un cas donné (opérateur | ). LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 177 ────────────────────────────────────────────────────────────── Exemple read mot case $mot in o|O|y|Y) echo "Oui";; n|N) echo "Non";; *) echo "Ni oui ni non";; esac 6.4 Itérations bornées : la clause for Synopsis for variable in liste_de_mots do commande(s) done Description La variable prend successivement toutes les valeurs de la liste de mots (de la gauche vers la droite) et exécute pour chacune la liste de commandes entre do et done. Exemple #!/bin/bash # Copie d'un fichier dans plusieurs répertoires for n in _un _deux _trois do cp fichier /home/repertoire$n done 6.5 Itérations non bornées : la clause while Synopsis while expression_logique do commande(s) done Description • Le test est effectué en début de boucle. • Le bloc des commandes entre les clauses while et done est exécuté tant que l'expression est vraie (code de retour nul). Exemple 1 #!/bin/bash # Affichage de tous les arguments un par un while [ $# -gt 0 ] do echo " Paramètre : $l" shift #décalage d'un paramètre vers la gauche done 178 CHAPITRE VII ────────────────────────────────────────────────────────────── Exemple 2 : boucle avec compteur #!/bin/bash j=0 while [ $j -lt 20 ] do j=`expr $j + 1` echo $j done Exemple 3 : boucle avec compteur et pas #!/bin/bash j=0; pas=1 while [ $j -lt $# ] do echo "macro de position $j : ${!j}" j=`expr $j + $pas` # on peut aussi écrire : j=`expr $j + 1` done 6.6 Itérations non bornées : la clause until Cette boucle est exécutée au moins une fois même si la condition n'est pas réalisée. Synopsis until expression_logique do commande(s) done Exemple until who | grep jacques > /dev/null do sleep 60 done echo "jacques est connecté" 6.7 Branchements inconditionnels ■ Itération suivante L'instruction continue permet de faire un branchement inconditionnel à la première instruction de l'itération suivante de la boucle. Synopsis continue ■ Sortie inconditionnelle d'une boucle La clause break permet de sortir d'un (défaut) ou de n niveaux de boucle (branchement inconditionnel). Synopsis break [n] LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 179 ────────────────────────────────────────────────────────────── 6.8 Saisie interactive et menu ■ Saisie interactive La commande read saisit interactivement une variable. Synopsis read variable ■ La clause select • La commande select est spécifique au Korn-Shell ou au Bourne Again Shell. • Lors de son exécution, la liste des valeurs autorisées de la variable de contrôle est affichée, chacune étant précédée d'un nombre permettant de la sélectionner. • Une invite (la variable prédéfinie PS3) est affichée et une attente active déclenchée. La saisie : • d'un entier de la liste provoque l'initialisation de la variable associée à l'entier et l'exécution de la commande correspondante. • d'une chaîne vide provoque l'affichage des sélections possibles, • du caractère EOF (Ctrl D) provoque la sortie de la boucle. Exemple #!/bin/bash select commande in sortie date liste_processus do echo Réponse lue : "$REPLY" case $commande in sortie) echo "fin de la commande" break ;; date) echo `date` ;; liste_processus) echo "Liste des processus actifs : `ps -ealf | more`" ;; *) echo "erreur" ;; esac done // Résultat 1) sortie 2) date 3) liste_processus #? 2 Reponse lue : 2 Jeu 06 Juil 14:11:10 MESZ 1995 #? 1) sortie 2) date 3) liste_processus #? 1 Réponse lue : 1 fin de la commande 180 CHAPITRE VII ────────────────────────────────────────────────────────────── 6.9 Fonctions Une fonction exécute une action à chaque appel sans duplication de son code. En shell, l'action est interprétée dans le contexte du processus courant et non dans celui d'un processus fils. Une fonction peut avoir des arguments, comme un script. Il existe des fonctions prédéfinies. Synopsis identificateur_fonction() { commande(s) } Exemple # Effacement de l'écran, affichage du nom de l'utilisateur et de la date avant déconnexion logout() { tput clear echo " Déconnexion de $USER le `date`" } ■ Appel de fonction Il suffit d'utiliser son nom éventuellement suivi de ses arguments accessibles dans le corps de la fonction comme les macros d'un script (l, 2, …, n, # et *). Exemple La fonction cwd permet un déplacement dans l'arborescence et positionne le prompt d'affichage sur le répertoire courant. cwd() { cd $1 PS1="'pwd'>" } ■ Retour d'une fonction Une fonction se termine après l'exécution de la commande précédant l'accolade fermante. La fonction return permet d'en sortir directement. Synopsis return ou return code ■ #code est un entier Code de retour La macro ? contient le code de retour de la fonction ou l'argument de la clause return. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 181 ────────────────────────────────────────────────────────────── 6.10 Opérations sur les chaînes de caractères ■ Concaténation a=bon b=jour echo $a$b bonjour echo $b$a jourbon ■ Longueur d'une chaîne : l'opérateur expr L'opérateur expr opère sur des expressions arithmétiques, des chaînes de caractères ou des nombres entiers. L'option length fournit la longueur de la chaîne : m=`expr length "$b"` echo $m 4 ■ Extraction d'une chaîne : expr substr Description Extraction de P caractères à partir du n-ième : expr substr "chaîne" n p a="Il fait beau" b=`expr substr "$a" 9 4` echo $b beau ■ Première position d'un caractère dans une chaîne : expr index a=`expr index "$a" a` echo $a 5 6.11 Affectation des variables de position La commande set permet d'affecter globalement les variables de position. Synopsis set mot1 mot2 … motn Description Affectation de mot1 à la 1ière variable de position, mot2 à la 2ième, etc. ■ Décalage Synopsis shift [n] Les variables de position sont décalées d'une (de n) position(s) vers la gauche, renumérotées et leur contenu antérieur perdu. 182 CHAPITRE VII ────────────────────────────────────────────────────────────── 6.12 Déclaration de type (commande typeset) Synopsis typeset [+][-]HLRZilrtux[n]][nom[ =valeur]]… Cette commande permet de définir, initialiser, et affecter des valeurs à des variables typées, de définir et modifier leurs attributs et protection, d'afficher les variables et leurs attributs. Les attributs que l'on peut spécifier sont les suivants : u l in Ln LZn Rn RZn Zn r x Lettres minuscules transformées en lettres majuscules, Lettres majuscules transformées en lettres minuscules, Type entier ; n spécifie la base de calcul, Justification à gauche ; n spécifie la longueur du champ, Justification à gauche et remplissage par des zéros ; n spécifie la Longueur du champ, Justification à droite ; n spécifie la longueur du champ, Justification à droite et remplissage par des zéros ; n spécifie la longueur du champ, Remplissage par des zéros ; n spécifie la longueur du champ. Equivalent à -RZ, Variable accessible en lecture seulement, Variable exportée. Exemple typeset Affichage des noms et attributs de toutes variables. typeset -xi Affichage des noms et attributs de toutes variables avec les attributs export et entier. typeset +xi Idem avec visualisation des noms uniquement. typeset a b Définit les variables locales a et b sans attribut particulier. typeset -i8 x x est une variable entière octale. typeset -u x Conversion de toutes les occurrences du caractère x en lettre majuscule. typeset -r x=abc Définition de la variable x et affectation de la valeur (constante) abc. typeset -L4 z Troncature de z par 4 caractères d'espacement vers la droite. typeset -RZ4 z Idem avec élimination des zéros à gauche. typeset -R4 z La variable z est remplie par des caractères d'espacement à droite si elle a plus de 4 caractères. Elle est tronquée à gauche de 4 caractères sinon. typeset -RZ4 z Idem mais des zéros remplacent le caractère d'espacement. typeset -H fichier Sur des systèmes autres qu'Unix, transforme un chemin d'accès Unix en chemin d'accès spécifique au système d'exploitation du système hôte. typeset -f Affichage de toutes les fonctions et de leur valeur si elle est connue. typeset -fx Affichage des fonctions avec l'attribut x et de leur valeur si elle est connue. typeset -fu "toto" La fonction toto est spécifiée indéfinie. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 183 ────────────────────────────────────────────────────────────── 6.13 Exemple de fichier .profile : # .profile if [ `hostname` = hpserv ]; then PATH=$PATH:/etc:/usr/etc:/usr/lib:/usr/bin/X11:/usr/contrib/bin:/usr/contrib/mitX11R5/bin: else PATH=$PATH:/etc:/usr/etc:/usr/lib:/lib:/usr/bin/X11:. fi export PATH if [ -z "$LOGNAME" ]; then LOGNAME=`logname` # nom de l'utilisateur export LOGNAME fi MAIL=/usr/spool/mail/$LOGNAME # boite aux lettres publiques export MAIL if [ -z "$PWD" ]; then PWD=$HOME export PWD fi if [ -f $HOME/.kshrc -a -r $HOME/.kshrc ]; then ENV=$HOME/.kshrc export ENV fi # affichage eval `tset -m ansi:ansi -m $TERM:\?${TERM:-ansi} -r -s -Q` export TERM # si le contrôle de travaux est actif, invalidation du caractère ^Z case $- in m) stty susp '^z' ;; esac set -o ignoreeof #invalidation du ^D pour sortir #démarrage selon la machine if [ `uname` = soc ]; then Oracle_BASE=/home/dba/Oracle;export Oracle_BASE Oracle_HOME=$Oracle_BASE/product/7.0.16;export Oracle_HOME Oracle_SID=V7016 export Oracle_SID Oracle_LINK=$Oracle_HOME/cd_link export Oracle_LINK Oracle_TERM=ansi;export Oracle_TERM PATH=$PATH:$Oracle_HOME/bin:$Oracle_BASE/dbtools/bin MANPATH=$MANPATH:/home/dba/Oracle/product/7.0.16/SQLplus/man #environnement contextuel d'Oracle . oraenv # gestion du jeu de caractères français (spécifique SCO) LANG=french_france.8859 export LANG fi 184 CHAPITRE VII ────────────────────────────────────────────────────────────── # gestion du prompt PS1="<`uname -n`:`echo $LOGNAME`:\$PWD:\!>" export PS1 # autorisation pour les collègues (commande talk) mesg y # affichage X11 selon les machines case $logname in user1) DISPLAY=client1:0.0;; user2) DISPLAY=client2:0.0;; user3) DISPLAY=client3:0.0;; user4) DISPLAY=client4:0.0;; user5) DISPLAY=client5:0.0;; user6) DISPLAY=soc:0.0;; user8) DISPLAY=hpserv:0.0;; esac export DISPLAY # démarrage X11 selon les utilisateurs if [ `uname` = soc ]; then case $ logname in user6) startx;; esac fi # particularités Hewlett Packard if [ `uname` = hpserv ]; then # masque de protection umask 022 fi 6.14 Exemple de fichier .kshrc : # .kshrc Commandes exécutées à l'initialisation d'un script # EDITOR=vi FCEDIT=vi VISUAL=vi #choix de vi comme éditeur ligne par défaut if [ -z "$VISUAL" -a -z "$EDITOR" ]; then set -o vi fi #modification des variables k-shell HISTSIZE=64 export EDITOR FCEDIT HISTSIZE VISUAL #alias exportables alias -x a='alias -x' a la='ls -al | m' a cu='cu -s 9600 -l tty2A -oe 0149143517' a ll='ls -l | m' a root='cd /' a md='mkdir' a lp='lp -o nobanner' a su='/bin/su' LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 185 ────────────────────────────────────────────────────────────── 7. PRESENTATION SOMMAIRE DU C SHELL Bill Joy a développé l'interprète C shell avec une syntaxe proche de celle du langage C. L'interprète de commandes tcsh s'en inspire très fortement. Le C Shell exécute les scripts suivants du répertoire de travail : .login (connexion), .logout (déconnexion), .cshrc (chaque script). La syntaxe des structures de contrôle, des fonctions et des variables est différente. ■ ■ Principales équivalences entre le Shell de Bourne et le C Shell Shell de Bourne for nom in liste do ... done C Shell foreach nom liste ... end case mot in cas) ... ;; esac switch (mot) case cas ... breaksw endsw if exp then ... fi if (exp) ... if exp then elif exp1 then ... else ... fi if (exp) then ... elseif (exp1) then ... else ... endif while exp do ... done while(exp) ... end . fichier source fichier break [n] break [break [...]] exit [exp] exit [(exp)] export setenv read a a=$< times time trap onintr Quelques alias et variables du C Shell limit logout notify stop unxxx argv cwd ignoreeof path status Définition des limites d'une commande (temps CPU. mémoire ..). Sortie de l’interprète C shell (CTRL D). Notification de la fin d'un processus. Arrêt d'un processus en mode background. Opération inverse de xxx (avec xxx = alias, limit ou set). Equivalent aux variables $1, $2.... (utilisation : $argv[i])). Répertoire courant. Le signal CTRL D est ignoré par l’interprète (exécution du script logout). Equivalent de la variable shell PATH. Etat de la dernière commande exécutée. 186 CHAPITRE VII ────────────────────────────────────────────────────────────── 8. EXERCICES (SCRIPTS) ■ Gestion de l'environnement Ajouter puis supprimer un alias, par exemple llm pour la commande ls -l | more. On traitera le cas particulier où l'alias est exporté à des fils (Korn Shell seulement). Rappeler puis éditer une commande. Utiliser les fonctions set et printenv (shell) et setenv (C shell). Selon l'interprète de commandes utilisé, analyser les fichiers : .profile, .kshrc (ksh) .login, .cshrc (csh) .logout (les deux). ■ Macro Ecrire un script qui affiche la liste de ses arguments d'appel (une commande pour cette action), quel que soit leur nombre. Afficher ses 3 premiers arguments quand ils existent et un message d'erreur sinon. Afficher tous ses arguments un par un (utiliser une boucle et la commande shift). ■ Changement de la langue de l'affichage de la date La commande date affiche la date et l'heure (en anglais en général, quelquefois en français). Ecrire un script qui, à partir du résultat d'exécution de la commande date affiche la date dans un format similaire dans l'autre langue. Indications : utiliser la commande set ainsi que la clause case. Pour l'affichage séparé des heures, minutes et secondes, utiliser la commande set en redéfinissant le séparateur des mots par défaut du shell (variable IFS). ■ Renommage interactif de fichiers d'un répertoire Utiliser la boucle for pour afficher, un par un tous les fichiers du répertoire courant. Poser la question "Nouveau nom (ou ) ?" et lire la réponse (echo et read). Renommer le fichier selon la réponse ou traiter le fichier suivant (réponse "Return"). Compléter le script pour opérer dans le répertoire de travail de l'utilisateur (script sans argument) ou dans un répertoire quelconque transmis comme unique argument. Le script vérifie la validité des arguments en effectuant les tests suivants : • test de la syntaxe d'appel (message si le nombre d'arguments d'appel est incorrect), • test de l'existence et de la lisibilité des objets transmis en arguments, • test de la préexistence d'une entrée cible (fichier ou répertoire). Ainsi, la commande mv f1 f2 peut écraser l'élément f2 si celui-ci existe. On peut donc refuser et traiter l'élément suivant ou demander un autre nom et confirmation avant d'écraser l'élément. LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 187 ────────────────────────────────────────────────────────────── ■ Sauvegarde d'un répertoire avec reconstruction de la même arborescence Cet exercice fait intervenir la récursivité. L'utilisateur ne dispose pas toujours d'une commande permettant de copier une arborescence complète. Deux méthodes sont proposées : se déplacer éventuellement ou non dans l'arborescence cible. On pourra procéder par étapes : • copie du répertoire courant sur un répertoire donné, par exemple /tmp/p), • transmission des noms du répertoire source et de sauvegarde à l'appel de la commande, • test de l'existence des répertoires (si le répertoire de sauvegarde existe, prévoir une demande de confirmation ou un refus d'exécution de la commande). ■ Impression de fichiers encadrés par une bannière Une bannière peut comporter la date, le nom de l'utilisateur et le nom du fichier (chemin absolu ou relatif). On procédera en 2 étapes : traiter d'abord un seul fichier, puis un ensemble de fichiers (utiliser alors une boucle for). • La commande a un ou plusieurs arguments représentant les fichiers à visualiser. • On utilisera la commande écrite au § précédent pour obtenir la date en français et utiliser la commande Unix sort pour ne conserver que le jour, le mois et l'année. ■ Recherche du jour de la semaine On souhaite connaître le jour de la semaine d'une date donnée transmise comme argument à la commande sous la forme "jour mois année." (exemple 14 7 1789). Indications : utiliser la commande cal et traiter à part la première ligne (le 3 correspond au même jour que le 10 ...). ■ Recherche du nom d'un périphérique Lorsqu'une anomalie survient sur un périphérique, un message est affiché sur la console système avec comme indication : err on dev m,n où m et n représentent respectivement le majeur et le mineur du périphérique. Il s'agit d'écrire une commande qui à partir de ces 2 éléments affiche le nom du périphérique concerné donc le nom du périphérique dans le répertoire /dev. Utilisation : les 2 éléments sont transmis comme arguments à la commande et ils sont accessibles avec la commande ls -l qui les affiche. Remarques Il faut retrouver le format m,n selon la valeur de n. On constate que les formats des entrées du répertoire /dev varient en fonction du numéro du mineur. Selon la méthode utilisée, il faut distinguer 7,x de 17,x. Il peut y avoir plusieurs entrées pour une valeur donnée de m et n (cas des liens). 188 CHAPITRE VII ────────────────────────────────────────────────────────────── 9. INTRODUCTION A LA PROGRAMMATION SYSTEME L'objectif de cet exercice (P. Feautrier) est l'écriture d'un interprète de commandes simplifié restreint à quelques aspects significatifs : lancement d'une commande, gestion des arguments, redirections et signaux. Cet interprète dérivé du shell de Bourne est conçu comme une suite d'adjonctions de fonctions courtes au programme fondamental mettant en évidence sa structure modulaire. Enfin, on résistera à la tentation d'utiliser des fonctions de la bibliothèque ce qui est louable pour un programmeur d'applications mais ici non pédagogique. ■ La boucle fondamentale La boucle fondamentale de l'interprète exécute les actions suivantes : • Ecriture d'un "prompt", symbole d'invitation à la saisie ($ par exemple). • Lecture d'une ligne sur l'entrée standard. On suppose que la commande se réduit à un fichier exécutable exécuté avec les appels système fork et execv. Prévoir le cas d'un chemin d'accès erroné ou inaccessible. Attendre la fin du processus fils (appel système wait), et boucler. ■ Amélioration au choix de la commande Le programme précédent impose l'utilisation du chemin d'accès absolu aux commandes (il faut écrire /bin/ls et pas ls). On demande de reproduire le mécanisme d'utilisation de la variable d'environnement PATH rappelé ci-après. PATH La variable PATH contient des répertoires séparés par le signe : dont on peut lire et analyser la valeur (fonction getenv). Créer un tableau des différents répertoires à explorer (tableau des chemins). Reprendre ensuite l'interprète du § précédent ; le fichier dont le nom est indiqué sur l'entrée standard est recherché en séquence dans ces répertoires (primitive access) sauf si le chemin d'accès indiqué est absolu. Commandes internes Essayez d'exécuter la commande cd. Que se passe-t-il et pourquoi ? Réalisez le mécanisme d'exécution des commandes internes (build in commands) traitées directement par l'interprète sans chargement d'un programme externe. Pour être modulaire, il faut prévoir une table des commandes externes (réduite pour les besoins de l'exercice) et une table des procédures exécutives associées. ■ Analyse de la ligne de commande On considère maintenant que la ligne de commande contient, outre le nom du programme à exécuter, des indications diverses, arguments, redirections, etc., à traiter. Une ligne saisie est donc découpée en mots stockés dans un tableau de pointeurs vers des mots (chaînes de caractères) séparés par des espaces ou des caractères spéciaux ('<, >, &, etc.). Cette table doit pouvoir évoluer ultérieurement. Réfléchir à son implantation (allocation dynamique, allocation dans un tableau statique ?). . LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 189 ────────────────────────────────────────────────────────────── Ecrire la fonction d'analyse et l'incorporer à l'interprète. Noter que le nom de la commande à exécuter est le premier mot de la ligne lue. Ajouter le traitement du caractère & qui indique que la fin de la commande lancée ne doit pas être attendue (mode différé ou mode d'arrière plan). Si la programmation est modulaire, l'interprète commence à être un programme complexe : plusieurs fichiers de fonctions, déclarations et données (table des commandes internes, table des séparateurs, tableau des mots, tableau des chemins, etc.). Organiser la gestion de cet ensemble au moyen de l'utilitaire make. ■ Redirections Le mot qui suit l'un des séparateurs > < est un chemin qui remplace, selon le cas l'entrée et/ou la sortie standard du processus fils. Introduisez dans son code une procédure qui exécute les redirections. Attention : si le fichier indiqué n'existe pas, la redirection > entraîne une création. ■ Transmission des arguments Les arguments sont transmis à la commande exécutée par le tableau qui les contient (appel système execv). Modifier l'interprète en conséquence sans oublier que par convention, le premier argument transmis au processus fils (l'argument 0) est le premier mot de la commande à savoir son nom. ■ Contrôle des travaux L'interprète gère un travail d'avant-plan (dont la terminaison est attendue par l'appel système wait) et N travaux d'arrière-plan dont la terminaison n'est pas attendue. Tous ces travaux sont connus par leur identificateur. Amélioration du traitement du caractère & (perluette) Dans l'état actuel de l'interprète, si un travail d'avant-plan et un autre d'arrière-plan sont lancés et que ce dernier se termine le premier, l'interprète considère que c'est celui d'avant plan qui se termine et demande la commande suivante. Améliorez la situation en notant dans une table l'identité des processus lancés et en contrôlant celle du processus qui se termine. Commandes foreground et jobs Ecrire les commandes internes foreground (modification de l'état d'un travail d'arrièreplan en avant-plan) et jobs (liste des travaux d'arrière plan en cours). Gestion du signal SIGINT Quand un travail s'exécute en avant-plan, l'interprète est en attente du signal de terminaison (souvent le signal INT). Il est donc impossible d'utiliser directement une commande background. La primitive longjump permet de sortir de l'appel système wait sans terminer le processus d'avant plan passant en arrière plan. La mise à jour de son état devient alors nécessaire. Penser à protéger le processus fils contre les effets du signal. 190 CHAPITRE VII ────────────────────────────────────────────────────────────── 10. CORRIGES DES EXERCICES (SCRIPTS) ■ Affichage de la date en francais #!/bin/bash # Affichage de la date en français set `date` # Récupération des mots de la commande date dans $1, $2, ... case $1 in # conversion du jour Mon) jour=Lundi;; Tue) jour=Mardi;; Wed) jour=Mercredi;; Thu) jour=Jeudi;; Fri) jour=Vendredi;; Sat) jour=Samedi;; Sun) jour=Dimanche;; esac case $2 in # conversion du mois Jan) mois=Janvier;; Feb) mois=Fevrier;; Mar) mois=Mars;; Apr) mois=Avril;; May) mois=Mai;; Jun) mois=Juin;; Jul) mois=Juillet;; Aug) mois=Aout;; Sep) mois=Septembre;; Oct) mois=Octobre;; Nov) mois=Novembre;; Dec) mois=Decembre;; esac quant=$3 # Sauvegarde du jour du mois IFS=: # Modification du séparateur par défaut du shell set $4 # récupération des champs de l'heure dans $1, $2, $3 # affichage du résultat echo "Nous sommes le $jour $quant $mois à $1 H $2 mn $3s" LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 191 ────────────────────────────────────────────────────────────── ■ Renommage interactif des fichiers d'un répertoire #!/bin/bash # Renommage interactif des fichiers d'un répertoire # Syntaxe : rename [repertoire] # test du nombre d'arguments : # 0 argument : utilisation du répertoire courant # 1 argument : nom du répertoire dont les fichiers # sont à renommer # n arguments : erreur de syntaxe case $# in 0) Dir=`pwd`;; 1) if [ -d $1 ] # test si argument répertoire then Dir=$1 else echo "$1 n'est par un répertoire";exit fi;; *) echo "Usage : $0 [répertoire]";exit;; esac # test d'accessibilité du répertoire if [ ! -w $Dir -o ! -r $Dir ] then echo "Accès interdit sur le répertoire $Dir"; exit fi # boucle de lecture des entrées for i in `ls $Dir` do echo -n "$i : nouveau nom ou RETURN : " # question read X # lecture reponse case $X in # test reponse "") continue;; # possible avec if [ "! X" ] *) if [ -f $X -o -d $X ] # test existence réponse then echo "$X existe déjà, renommage refusé" else mv $Dir/$i $Dir/$X # renommage effectif fi;; esac done 192 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Sauvegarde d'un répertoire avec reconstruction de la même arborescence #!/bin/bash # Sauvegarde d'un répertoire avec reconstruction de la même arborescence # Le fichier s'appelle svgdir # pas de déplacement dans l'arborescence # test de la syntaxe # 2 arguments : répertoire à sauvegarder # répertoire cible case $# in 2) orig=$1;dest=$2;; *) echo "Usage : $0 rép_orig rep_dest";exit esac # test d'existence du répertoire à sauvegarder if [ ! -d $orig ] then echo "$orig n'est pas un répertoire "; exit fi # test d'existence du répertoire d'arrivé if [ -d $dest ] then echo "$dest existe déjà " ; exit fi # création du répertoire cible mkdir $dest # boucle de lecture for i in ` ls $1` do if [ -d $1/$i ] # test s'il s'agit d'un répertoire then dest=$2/$i # concaténation des noms des répertoires orig=$1/$i # (arguments de la commande) svgdir $orig $dest # si oui appel récursif else cp $1/$i $2 # sinon copie simple de fichiers # (fin de récursivité) fi done LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 193 ────────────────────────────────────────────────────────────── ■ Affichage de fichiers en ajoutant une bannière #!/bin/bash # Affichage de fichiers en ajoutant une bannière # en tête : date, nom de l'utilisateur, nom fichier # affichage de la syntaxe et de la sortie usage() { echo "Usage: basename $0 fichier1 [...]" exit } # fonction d'affichage de l'en tête # j, q et m sont positionnées par la commande Unix # set datefr. # USER est une variable standard du shell. # La commande basename permet de ne prendre en # compte que le nom relatif d'un fichier. entete() { echo " ------------- $j $q $m ------ $USER-----------`basename $f ` ------" } # test du nombre de paramètres if [ $# -eq 0 ] then usage fi #sauvegarde des arguments file=$* # récupération de la date en français set `datefr` j=$4;q=$5;m=$6 # boucle d'affichage des fichiers for f in $file do entete #test d'accessibilité des fichiers if [ ! -f $f -o ! -r $f ] then echo "Le fichier $f est inaccessible" else cat $f fi entete done 194 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Recherche du jour de la semaine pour une date donnée #!/bin/bash # Recherche du jour de la semaine d'une date donnée # test de la syntaxe : arguments : jour mois année case $# in 3) ji=$1;m=$2;a=$3;; *) echo "erreur de syntaxe : `basename $0` jour mois année" exit;; esac # traitement particulier pour les 7 premiers jours # cas des semaines incomplètes # ji : sauvegarde de l'argument de la commande # (pour l'affichage du resultat) if [ $1 -lt 8 ] then j=`expr $1 + 7` else j=$1 fi # décalage de trois champs pour éliminer ceux # contenant les paramètres d'appel de la commande # ce qui est utile si la commande ci-dessous a un # résultat nul (date incorrecte) shift 3 # récupération de la ligne contenant le jour # la commande tail élimine les 2 premières lignes # affichées par la commande Unix cal (mois an et # les jours S M ...) # la redirection >/dev/null élimine de l'écran le # resultat de la commande set # (affichage des paramètres) dans le cas d'une # date incorrecte set `cal $m $a | tail +2 | grep $j ` >/dev/null # conversion du jour case $j in $1) J=Dimanche;; $2) J=Lundi;; $3) J=Mardi;; $4) J=Mercredi;; $5) J=Jeudi;; $5) J=Vendredi;; $7) J=Samedi;; *) echo "Date incorrecte $ji $a $a" ;exit;; esac # affichage du résultat echo "Le $ji $m $a est un $J" LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 195 ────────────────────────────────────────────────────────────── ■ Recherche d'un périphérique à partir du majeur et du mineur #!/bin/bash # Recherche d'un périphérique à partir des # Majeur et du Mineur # 2 arguments transmis a la commande. # test de la syntaxe : 2 paramètres obligatoires if [ $# -ne 2 ] then echo"Usage $0 majeur mineur" exit fi # affichage du message initial echo "Recherche du périphérique ayant pour Majeur : $1 et pour Mineur : $2" # test de la valeur du mineur # recherche de la chaine "M, m" # 3 espaces si Mineur <10 # recherche de la chaine "M, m" # 2 espaces si Mineur >9 et <100 # recherche de la chaine "M, m" # 1 espace si Mineur > 99 if [ $2 -gt 99 ] then a=" $1,$2 " elif [ $2 -gt 9 ] then a=" $1, $2" else a=" $1, $2" fi mineur=$2 # récupération dans le répertoire /dev # des entrées contenant la chaîne recherchée i=`ls -l /dev|grep "$a"` # test de l'existence de telles entrées if [ "$i" ] then set `echo "$i"` # si oui récupération de toutes les entrées if [ $mineur -gt 99 ] then while [ $# -gt 0 ] do Dev="$9 $Dev" # $9 est le 9ième champ correspondant au nom if [ $# -gt 9 ] then shift 9 # entree suivante else break fi done else while [ $# -gt 0 ] do 196 CHAPITRE VII ────────────────────────────────────────────────────────────── Dev="${10} $Dev" # ${10} est le 10ième champ correspondant au nom if [ $# -gt 10 ] then shift 10 # entree suivante else break fi done fi echo "Il s'agit de $Dev" # affichage des résultats echo else echo "Pas de périphérique concerné" fi Exemple d'exécution Recherche du périphérique ayant pour Majeur : 2 et pour Mineur : 52 Il s'agit de sctfdm0 rfd096ds15 rfd096 rfd0 fd096ds15 fd096 fd0 Recherche du périphérique ayant pour Majeur : 52 et pour Mineur : 4 Il s'agit de ega Recherche du périphérique ayant pour Majeur : 11 et pour Mineur : 255 Il s'agit de ev_mrg LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 197 ────────────────────────────────────────────────────────────── 11. CORRIGE (INTERPRETE DE COMMANDES SIMPLIFIE) ■ La boucle fondamentale On ne donne ici que l'état définitif du programme. La réponse à la question suivante est obtenue en faisant abstraction de la plupart des appels de fonctions. Les mots clés du langage C, les appels systèmes, les fonctions de la bibliothèque apparaissent en italique. /* shell.c */ #define DEBUG 1 #include <stdio.h> #include <signal.h> #include <setjmp.h> #define EXTERN #include "statics.h" static jmp_buf env; /* PROTOTYPES */ extern char *Index(char *, char ) ; extern void analyse(char *) ; extern int no_perluette(void) ; extern void argument (char **) ; extern void change_dir(void) ; extern void foreground(void) ; extern void job_list(void) ; extern int exec_intern(char *) ; extern void init_job_tb(void) ; extern int get_job_num(void) ; extern int change_job(int , int ) ; extern void get_path(void) ; extern void get_repere(char []) ; extern void redirect (void) ; extern void attendre(void) ; extern void nada(int) ; extern void exit(int) ; void attendre(void) {int qid, etat, state; if(setjmp(env) == 0) for(;;) { qid = wait(&etat); #ifdef DEBUG printf("Fin de %d\n",qid); #endif state = change_job(qid, 0); if(state == FOREGROUND) break; } } 198 CHAPITRE VII ────────────────────────────────────────────────────────────── static int pid; void nada(int signum) {change_job(pid, BACKGROUND); longjmp(env, signum); } int no_perluette(void) { int iw; for(iw = 0; word_tb[iw] ; iw++) if(*word_tb[iw] == '&') return(0); /* arrière plan */ return(1); /* avant plan */ } int main(void) {int jn, iw; char *arg_tb[11]; get_path(); init_job_tb(); signal(SIGINT, nada); for(;;) {printf("$"); if(gets(ligne) == NULL) break; analyse(ligne); #ifdef DEBUG for(iw=0; word_tb[iw]; iw++) printf ("\n\n %d -> %s \n", iw, word_tb[0]) ; #endif if(word_tb[0] == (char *) NULL) continue; if(exec_intern(word_tb[0])) continue; if((jn = get_job_num()) < 0) {printf("Trop de travaux en train\n"); continue; } if((pid = fork()) ==0) {redirect(); /* processus fils */ argument(arg_tb); get_repere(word_tb[0]); signal(SIGINT, SIG_IGN); execv(repere,arg_tb); perror("shell"); exit(1); } #ifdef DEBUG printf("lancement de %d\n",pid); #endif job_tb[jn].id = pid; if(no_perluette()) { job_tb[jn].status = FOREGROUND; attendre(); } else { job_tb[jn].status = BACKGROUND; printf("%d\n",pid); } } } LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 199 ────────────────────────────────────────────────────────────── ■ Variables communes Les variables communes à l'ensemble des fichiers sources sont définies dans le fichier à inclure "statics.h". La constante EXTERN est utilisée pour obtenir une véritable déclaration dans le fichier "shell.c" et des déclarations externes dans tous les autres. C'est un artifice de présentation. /* fichier statics.h */ #define NR 10 EXTERN char *repertoires[NR+1]; #define PL 256 EXTERN char pathtext[PL]; #define LL 80 EXTERN char ligne[LL]; #define NW 30 EXTERN char wordtext[LL+10]; EXTERN char *word_tb[NW+1]; #define RL 35 EXTERN char repere[RL]; extern struct internals { char *verb; void (* foo) (void); } intern_tb[]; /* gestion des travaux */ #define FOREGROUND 1 #define BACKGROUND 2 #define NJ 5 EXTERN struct job {int id; int status; } job_tb[NJ]; 200 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Amélioration du choix de la commande PATH /* path.c */ #include <stdlib.h> #include <string.h> #include <unistd.h> #define EXTERN extern #include <stdio.h> #include "statics.h" #define SEPAR ':' #define LINK '/' #define EXEC 1 void get_path(void) {char *p , *q; char *getenv( const char*); int irep; p = getenv("PATH"); #ifdef DEBUG printf(".. %s\n", p); #endif if(p == (char *) NULL) repertoires[0] = (char *) NULL; else {irep = 0; q = pathtext; do {repertoires[irep++] = q; while(*p) if (*p != SEPAR) *q++ = *p++; else break; *q++ = LINK; *q++ = '\0'; } while ((irep < NR) && *p++); repertoires[irep] = (char *) NULL; } #ifdef DEBUG for(irep = 0; repertoires[irep]; irep++) printf("-- %s\n", repertoires[irep]); #endif } void get_repere(char verbe[]) { char *stpcpy(char *, const char *); char * strcat(char *, const char *); int access(const char *, int); int irep; if(verbe[0] == LINK) {strcpy(repere, verbe); return; } for (irep=0; repertoires[irep]; irep++) {strcpy(repere, repertoires[irep]); strcat(repere, verbe); #ifdef DEBUG printf("?? %s\n", repere); #endif if(access(repere, EXEC) == 0) return; } strcpy(repere, verbe); } LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 201 ────────────────────────────────────────────────────────────── ■ Commandes externes Toute commande externe est implémentée sous la forme d'une procédure accessible par deux entrées dans la structure internals (son nom et son adresse) ce qui est efficace et très élégant. /* internal.c */ #include<stdio.h> #define EXTERN extern #include"statics.h" void change_dir(void) { #ifdef DEBUG printf("cd vers %s\n", word_tb[1]); #endif chdir(word_tb[1]); } void foreground(void) {int atoi(const char *); int pid; pid = atoi(word_tb[1]); if(change_job(pid, FOREGROUND)) attendre(); } void job_list(void) {int jn; for(jn= 0; jn <NJ; jn++) if(job_tb[jn].status!=0) printf("%d\n", job_tb[jn].id); } struct internals intern_tb[] = { {"cd", &change_dir }, {"foreground", &foreground }, {"jobs" ,&job_list}, {NULL, NULL} }; int exec_intern(char *c) { int i; int strcmp(const char *, const char *); for(i=0; intern_tb[i].verb; i++) if(strcmp(c, intern_tb[i].verb )== 0) break; if(intern_tb[i].verb) {(* intern_tb[i].foo)(); return(1); } return(0); } 202 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Analyse de la ligne de commande /* analyse.c */ #include <stdio.h> #define EXTERN extern #include "statics.h" static char delim_string[] = " <>|&"; char *Index(char *s, char c) /* pour la différentier de la fonction de bibliothèque index */ {for(;*s;s++) if(*s == c) return(s); return((char *) NULL); } void analyse(char *c) {char *p, *q; int iw=0; p = c; q = wordtext; while(iw < NW) {while(*p == ' ') p++; if(*p == '\0') break; word_tb[iw++] = q; while(*p) if(Index(delim_string,*p) == 0) *q++ = *p++; else break; if(q == word_tb[iw-1]) iw--; else *q++ = '\0'; if(*p && *p != ' ') {word_tb[iw++] = q; *q++ = *p++; *q++ = '\0'; } } word_tb[iw] = NULL; #ifdef DEBUG for(iw = 0; word_tb[iw]; iw++) printf("// %s\n",word_tb[iw]); #endif } LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 203 ────────────────────────────────────────────────────────────── ■ Transmission des arguments /* argument.c */ #define EXTERN extern #include "statics.h" void argument (char *Table[]) {int iw , iarg = 0; for (iw = 0 ; word_tb[iw] ; iw++ ) {switch (*word_tb[iw]) {case '>' : case '<' : iw++ ; break ; case '&' : case '|' : break ; default : Table[iarg++] = word_tb[iw] ; break ; } if (iarg > 9) break ; } Table[iarg] = (char *) NULL ; } ■ Redirection /* redirect.c */ #include <stdio.h> #define EXTERN extern #include "statics.h" #define O_READ 0 #define O_WRITE 1 void redirect (void) {int iw, c, mode, fd; for (iw=1 ; word_tb[iw] ; iw++) {c = *word_tb[iw]; #ifdef DEBUG printf("<> %c\n",c); #endif if(c == '<' || c=='>') {mode=c == '<' ? O_READ : O_WRITE; iw++; if((fd=open(word_tb[iw],mode))<0) {perror(">>"); if(mode) fd = creat(word_tb[iw],0777);}; if(fd >=0) { #ifdef DEBUG printf("redirection de %s vers %s\n", mode?"sortie":"entrée", word_tb[iw]); #endif dup2(fd,mode); close(fd); } else perror("<>"); } } } 204 CHAPITRE VII ────────────────────────────────────────────────────────────── ■ Contrôle des travaux La fonction no_perluette est implémentée dans le fichier shell.c. Elle permet de programmer l'éventuelle attente d'une tâche (procédure attendre) à partir de son état (avant ou arrière plan). Amélioration de la prise en compte du caractère & La version présentée offre déjà l'amélioration demandée. Gestion du signal sigint Elle est implémentée dans le fichier shell.c. Le principe en est le suivant : • le processus fils est lancé, protégé contre les effets du signal INT. • Le processus shell récupère ce signal dans la fonction nada, qui modifie le mode d'exécution du processus interrompu à l'état background. On suppose que ce signal n'est émis que pendant l'attente de la fin du travail. • La fonction attente a préparé un point de retour avec la primitive setjump. Quand le signal se produit, tout se passe comme si la primitive setjump retournait une deuxième fois une valeur non nulle ce qui provoque la sortie de la fonction attendre. Commande foreground Elle est implémentée dans le fichier "internal.c" Commande jobs /* jobs.c */ #include <stdio.h> #define EXTERN extern #include "statics.h" void init_job_tb(void) {int jn; for(jn=0; jn<NJ; jn++) job_tb[jn].status = 0; } int get_job_num(void) {int jn; for(jn=0; jn<NJ; jn++) if(job_tb[jn].status == 0) return(jn); return(-1); } int change_job(int job_id, int ns) {int jn,st; for(jn=0; jn<NJ; jn++) if(job_tb[jn].id == job_id) {st = job_tb[jn].status; job_tb[jn].status = ns; return(st); } printf("Travail inconnu\n"); return(-1); } LES INTERPRETES DE COMMANDES KORN SHELL ET BASH 205 ────────────────────────────────────────────────────────────── ■ Fichier makefile CC=gcc analyse.o: analyse.c statics.h path.o :path.c statics.h argument.o : argument.c statics.h internal.o: internal.c statics.h redirect.o :redirect.c statics.h jobs.o : jobs.c statics.h shell.o: shell.c statics.h shell: analyse.o path.o argument.o internal.o redirect.o jobs.o shell.o $CC analyse.o path.o argument.o internal.o redirect.o jobs.o shell.o -o shell CHAPITRE VIII GESTION DES ENTREES/SORTIES 1. PARTITIONNEMENT D'UN VOLUME Pour pouvoir stocker l'information, un disque dur est divisé en parties disjointes appelées partitions, chacune constituant un disque logique. Partition 0 Partition 1 Partition 2 Exemple ■ Partitionnement Le partitionnement d'un volume n'est pas normalisé et est délicat : une trop grande taille de partition pénalise le temps de recherche, une trop petite taille conduit à une probable saturation. Il faut en particulier correctement dimensionner les partitions racines de l'arborescence et les fichiers d'échanges. ■ Systèmes de fichiers Un système de fichiers (file system) est un conteneur de fichiers d'une partition structurée logiquement à cet effet. Différents types de systèmes de fichiers existent (NTFS, FAT, REISER, etc.). Toute distribution standard de Linux en propose plus de 300. ■ Volume physique Un volume physique est une entité matérielle pouvant contenir plusieurs systèmes de fichiers d'une taille fixée dont la modification n'est pas possible sans destruction des données contenues. 208 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ Volume logique (IBM) Un volume logique peut être constitué de plusieurs volumes physiques. Le gestionnaire de volumes logiques (Logical Volume Manager) gère les associations entre volumes logiques et physiques pour créer des disques miroirs, des disques logiques d'une taille extensible dynamiquement ou des systèmes de fichiers répartis sur plusieurs volumes physiques. ■ Avantages La répartition des fichiers sur plusieurs disques physiques et/ou logiques améliore les performances des entrées/sorties. Les fichiers d'échanges sont localisés dans une partition. ■ Partitionnement Windows L'administrateur de disques est l'interface graphique de Windows de gestion des volumes : état des disques et volumes (taille des partitions, espace disponible, lettre associée au volume logique, nom, type de système de fichiers), modification des lettres de lecteur, création de partitions, formatage, vérification des systèmes de fichiers, etc. La partition principale permet de démarrer le système matériel et il y en a une au moins sur un disque dur. Il peut y en avoir quatre au plus pour démarrer avec différents systèmes d'exploitation (Unix, OS/2, Linux, etc.). Une partition étendue contient des disques logiques. • Il y en a une au plus sur un disque dur, cette dernière contenant le(s) disque(s) logique(s). • Elle peut aussi contenir le système d'exploitation Linux, accessible par un chargeur (LILO, GRUB (GNU)), etc. Le premier partitionnement d'un disque dur est effectué à son installation. L'administrateur de disques permet de modifier et/ou partitionner un disque dur. Il n'est accessible qu'aux membres du groupe Administrateurs. ■ Partitionnement Unix Sous Unix, la table VTOC (Virtual Table Of Contents) contient les informations du partitionnement (octets, cylindres, secteurs). Il peut y avoir au plus 255 partitions. GESTION DES ENTREES/SORTIES 209 ────────────────────────────────────────────────────────────── Synopsis mkvtoc [options] fichier_spécial_en_mode_raw Options p affichage de la table VTOC (sortie standard) u partitionnement d'un disque utilisateur s fichier partitionnement à partir d'un fichier VTOC (recommandée). Exemple *#ident "Header: hp97548 12.4 1991/05/21 $" * Dimensions * 512 bytes/sector * 56 sectors/tracks * 16 tracks/cylinder * 896 user accessible sectors/cylinder * 1447 cylinders 1445 user accessibles cylinders * Types 00 No partition 01 Regular Partition 02 Boot Block 03 Reserved Disk Area 04 Firmware (not used on SCED SCSI disk) Partition Type Start Sector Size in Sectors 0 1 520576 57176 1 1 577752 198184 2 1 775936 518784 3 1 4480 516096 12 4 32 4448 13 3 1294720 1792 14 2 0 16 15 3 16 16 2. Block Sz 8182 8192 8192 8192 0 0 0 0 Frag Sz 1024 1024 1024 1024 0 0 0 0 SYSTEME DE FICHIERS 2.1 Structure d'un système de fichiers Un système de fichiers est constitué de quatre unités fonctionnelles. Bloc de boot Super bloc I-list des inodes Adresses des blocs de données bloc 0 bloc 1 bloc 2 .... 210 CHAPITRE VIII ────────────────────────────────────────────────────────────── Le bloc 0 est utilisé au démarrage. Le bloc 1 (super bloc) décrit l'organisation du système de fichiers. Les blocs suivants contiennent la liste des descripteurs des fichiers. Viennent ensuite les données, les blocs de chaînages entre les blocs de données, la liste des blocs libres. Un système de fichier est géré par un pilote. Le nombre maximum des fichiers qu'il peut contenir est imposé par sa taille et calculé à sa création. Pour l'augmenter, il est nécessaire de reformater le disque après sauvegarde. ■ Descripteur d'un fichier L'inode (abréviation de index-node (nœud d'index)) est le descripteur d'un fichier : identificateur, taille, position sur le disque, attributs de propriété et de sécurité. L'index d'un fichier dans la table des inodes est appelé i-number (index number). La première entrée de la liste des inodes (i-liste) est la racine du système de fichiers. La nature et les droits d'accès d'un inode sont définis dans le fichier inode.h : /* liens matériels, propriétaire */ u_short mode; short nlink; short uid; short gid; quad size; struct timeval struct timeval struct timeval atime; mtime; ctime; /* attributs et type du fichier */ /* nombre de liens matériels */ /* identificateur du propriétaire */ /* identificateur du groupe */ /* nombre d'octets du fichier */ /* date de dernier accès */ /* date de dernière modification */ /* date de création */ #define IFMT 0170000 /* type du fichier */ #define IFCHR 0020000 /* fichier spécial en mode caractère */ #define IFDIR 0040000 /* répertoire */ #define IFBLK 0060000 /* fichier spécial en mode bloc */ #define IFLNK 0120000 /* lien matériel */ #define IFSOCK 0140000 /* prise de communication (socket) */ #define IFIFO 0010000 /* tube nommé */ #define ISUID 04000 /* user id à l'exécution */ #define ISGID 02000 /* group id à l'exécution */ #define ISVTX 01000 /* sauvegarde du texte swappé */ /* droits d'accès en lecture, écriture, exécution */ #define IREAD 0400 #define IWRITE 0200 #define IEXEC 0100 Soit Tb la taille d'un bloc (octets). Le nombre d'adresses de n octets d'un bloc est Tb/n. Les 12 premiers blocs d'un fichier sont atteints directement, les (Tb/n) blocs suivants par indirection simple, les (Tb/n)2 blocs suivants par indirection double, les (Tb/n)3 derniers blocs par indirection triple. La taille T maximum d'un fichier est obtenue par la formule : T = Tb * (12+(Tb/n)+(Tb/n)2+(Tb/n)3) GESTION DES ENTREES/SORTIES 211 ────────────────────────────────────────────────────────────── Les blocs sont alloués par fragments (8 dans 1 bloc) pour minimiser l'espace perdu. accès direct Super bloc Liste des inodes Adresse des blocs En tête 0 ... accès indirect 11 13 14 indirection double Données Données Indirection simple 12 indirection triple adresses adresse des blocs 0 1 2 3 ........ 2046 2047 adresses adresses Données Données Données Données Données Données Recherche des blocs (BSD) 2.2 Création d'un système de fichiers Sous Unix/Linux, la création d'un système de fichiers (commande mkfs ou newfs (interface BSD vers mkfs)) est exécutée en mode cru (raw), avant tout montage. Sa nature (AFS, EXT3, NTFS...) est importante. Le répertoire lost+found est crée sur tout système de fichiers pour contenir des fichiers ou des blocs récupérés. Synopsis mkfs [-y|-n][-f type_fs] fspecial blocs [:inodes][gap bloc/cylindre][fs_options] newfs [-nNv][options_de_mkfs] fichier_spécial Description Création d'un système de fichiers sur un fichier spécial dont la taille est déterminée par le nombre de blocs ou d'inodes et le type par l'option f. Quelques options (newfs) n partition non "bootable" N affichage des paramètres courants du système de fichiers. Options transmises à la commande mkfs b taille des blocs en octets c#cylindre/group nombre de cylindres dans un groupe. f taille d'un fragment ibytes/inode densité m pourcentage d'espace réservé aux utilisateurs. t#pistes/cylindre le nombre de pistes par cylindre. 212 CHAPITRE VIII ────────────────────────────────────────────────────────────── L'option m module le pourcentage par défaut du système de fichiers affecté aux utilisateurs défini ainsi : tout système de fichiers compte 110 % d'occupation potentielle ; 10% pour le système, 100 % pour les utilisateurs. 2.3 Systèmes de fichiers virtuels et fichier virtuel Le montage d'un système de fichiers dans un réseau généralise le montage local. Un système de fichiers virtuel (Virtual File System - VFS) est une interface commune aux différents systèmes de fichiers qui masque leur nature (SUN) ce qui permet l'accès à des systèmes de fichiers répartis ou distribués (Network File System - NFS). Virtual File System table fsswitch SV UFS(BSD) MS/DOS NFS... Un système de fichiers virtuel est constitué de fichiers virtuels. 2.4 Tables systèmes de gestion des fichiers ■ Descripteurs des fichiers ouverts par un processus La création ou l'ouverture d'un fichier génère un descripteur dans la table u_ofile[] (structure U), 0 pour le fichier standard d'entrée (clavier), 1 pour le fichier standard de sortie (écran) 2 pour le fichier standard d'affichage des messages d'erreurs. ■ Table des fichiers ouverts La table file[] contient la liste de tous les fichiers ouverts à un instant donné. struct struct int short short short file { file *f_next; flag; type; count; msgcount; /* pointeur de chaînage structure suivante ou freelist */ /* drapeaux d'accès */ /* descripteur du type du fichier */ /* compteur des appels open */ /* références des files de messages */ /* opérations sur la structure file */ struct fileops { int (*rw)(); int (*ioctl)(); int (*select)(); int (*close)(); } *f_ops; caddr_t data; /* inode */ off_t offset; /* déplacement */ }; GESTION DES ENTREES/SORTIES 213 ────────────────────────────────────────────────────────────── /* drapeaux utilisés par l'appel système fcntl */ #define FOPEN (-1) #define FREAD 00001 /* habilité en lecture/réception */ #define FWRITE 00002 /* habilité en écriture/émission */ #define FNDELAY 00004 /* entrée/sortie synchrone */ #define FAPPEND 00010 /* mise à jour à chaque écriture */ #define FSHLOCK 00200 /* verrou de partage présent */ #define FEXLOCK 00400 /* verrou d'exclusion mutuelle */ /* mode de création */ #define FCREAT #define FTRUNC #define FEXCL 01000 02000 04000 /* création si fichier inexistant */ /* troncature à une longueur nulle */ /* erreur si le fichier existe déjà */ /* drapeaux pour l'appel système open */ #define O_RDONLY 000 #define O_WRONLY 001 #define O_RDWR 002 #define O_NDELAY FNDELAY #define O_APPEND FAPPEND #define O_CREAT FCREAT #define O_TRUNC FTRUNC #define O_EXCL FEXCL /* ouverture en lecture seulement */ /* ouverture en écriture seulement */ /* ouverture en lecture écriture */ /* ouverture non bloquante asynchrone */ /* mise à jour à chaque écriture */ /* ouverture avec la création */ /* ouverture avec troncature */ /* erreur en création si existence */ /* drapeaux de verrou (appel lockf) */ #define LOCK_SH 1 #define LOCK_EX 2 #define LOCK_NB 4 #define LOCK_UN 8 /* verrou partagé */ /* verrou exclusif */ /* non blocage au verrouillage */ /* déverrouillage */ /* drapeaux des droits d'accès */ #define F_OK 0 #define X_OK 1 #define W_OK 2 #define R_OK 4 /* drapeau d'existence */ /* exécutable */ /* écriture autorisée */ /* lecture autorisée */ /* appel lseek : définition des déplacements autorisés */ #define L_SET 0 /* absolu */ #define L_INCR 1 /* par rapport à l'adresse courante */ #define L_XTND 2 /* relatif à la fin du fichier */ La variable offset est le pointeur de déplacement dans le fichier (lecture et écriture). Lors de la création d'un processus, le fils partage les attributs des fichiers ouverts par son père et la modification du champ offset par l'un est répercutée dans l'autre. Pour l'éviter, le fils doit exécuter l'appel système open pour disposer de son propre pointeur de déplacement. La variable count représente le nombre d'ouvertures simultanées d'un fichier dans un ou plusieurs processus. Sous Unix/Linux, la gestion des accès concurrents est reléguée au niveau de l'application. 214 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ Table des descripteurs La table inode[] contient la liste des fichiers chargés en mémoire. struct inode { struct vnode vnode; struct vnode *devvp; u_long flag; dev_t dev; ino_t number; int diroff; struct fs *fs; struct inode *inode; struct inode *inode NINODE; int ninode; struct dquot *dquot; } /* opérations sur les inodes */ extern struct inode *ialloc(); extern struct inode *iget(); /* drapeaux */ #define ILOCKED 0x1 #define IUPD 0x2 #define IACC 0x4 #define IMOUNT 0x8 #define IWANT 0x10 #define ITEXT 0x20 #define ICHG 0x40 #define ISHLOCK 0x80 #define IEXLOCK 0x100 #define ILWAIT 0x200 #define IREF 0x400 #define IFIR 0x500 #define IFIW 0x600 /* vnode associée à l'inode */ /* vnode pour e/s mode bloc */ /* drapeaux d'état */ /* volume associé à l'inode */ /* i_number associée */ /* dernière entrée du répertoire */ /* système de fichiers associé */ /* pointeur sur la table des inodes */ /* fin de la table des inodes */ /* nombre d'inodes dans la table */ /* quotas associés à ce fichier */ /* inode verrouillé */ /* fichier modifié */ /* heure d'accès à l'inode modifiée */ /* système de fichiers monté sur l'inode */ /* processus en attente de verrouillage */ /* inode exclusivement texte */ /* modification de l'inode */ /* fichier avec verrou de partage */ /* fichier avec verrou exclusif */ /* processus en attente fichier verrouillé */ /* inode référencé */ /* lecteur (tube nommé) endormi */ /* rédacteur endormi (tube nommé) */ Les drapeaux indiquent : • l'accès du fichier par un ou plusieurs processus, • la modification du fichier en mémoire pour un éventuel vidage du cache disque, • la modification de l'inode pour réécriture, • le montage éventuel du système de fichier, • si le fichier est en cours d'exécution ce qui interdit son écriture mais non sa lecture. Chaque ouverture du fichier incrémente le champ count et chaque fermeture le décrémente jusqu'à la restitution de l'entrée dans la table. De la même façon, la suppression d'un fichier (appel système unlink) décrémente le nombre de liens matériels (compteur unlink). L'inode correspondante est restituée à la liste des inodes libres quand il devient nul. GESTION DES ENTREES/SORTIES 215 ────────────────────────────────────────────────────────────── Exemple On suppose que les processus Pi et Pj ont ouvert le même fichier. Le processus Pj en a ouvert un deuxième. D'où le schéma d'accès suivant : u_ofile[] file[] inode[] mémoire centrale Pi bmap Pj User Noyau La table u_ofile[] est locale au processus. La table file[] des fichiers ouverts en mémoire centrale est résidente. La table inode[] est la table des inodes actives en mémoire. La lecture est immédiate quand le fichier est chargé en mémoire centrale. Dans le cas contraire, la primitive bmap permet l'accès au fichier sur le disque. 3. MONTAGE Le montage d'un système de fichiers permet l'intégration de son contenu dans l'arborescence. Sous Windows, il consiste à associer une lettre à un volume logique. Exemple ■ La commande mount Synopsis mount [-r][-f[NFS]][rhost:]système_de_fichier repertoire_de_montage Quelques options r système de fichiers local monté en lecture seule f type du système de fichiers monté, NFS système de fichiers distant d'un type quelconque (protocole NFS) 216 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ Montage au démarrage Les systèmes de fichiers à monter au démarrage sont décris dans un des fichiers du dossier /etc (vfstab, fstab, filesys, etc.) dont le format (simplifié) d'une entrée est : système_de_fichiers point_ de_montage options, type Description Le champ système_de_fichier est le chemin d'accès du fichier spécial à intégrer dans l'arborescence au point de montage (un répertoire existant). Le mot clé swap indique un fichier d'échanges. Le champ type indique le type du système de fichiers qui peut être masqué (protocole NFS). Pour un fichier d'échanges, il faut utiliser le mot clé ignore. Le champ options indique le type de montage : rw (lecture et écriture) ou ro (lecture seule). Le mot clé quota définit un système de fichiers avec quotas. Le montage dynamique est également possible (automonteur). Exemple1 /dev/dsk/c2d0s0 /dev/dsk/c2d0s1 /dev/dsk/c2d1s0 /dev/dsk/c2d1s1 /dev/dsk/c2d1s2 antinea:/usr2 / swap /usr swap /home /usr2 4.2 rw ignore . 4.2 rw ignore . 4.2 rw nfs, soft Exemple 2 : montage manuel d'un périphérique amovible Une clé USB (fichier spécial /dev/usb0) doit être préalablement formatée. Le point de montage (répertoire /mnt) est utilisé de la façon suivante : mount /dev/usb0 /mnt ■ Table des systèmes de fichiers montés La commande mount exécutée sans argument affiche les systèmes de fichiers montés (fichier /etc/mnttab ou /etc/mtab). Le champ System indique si le système de fichier est local ou distant. Exemple System [local] [local] [local] ■ Device name /dev/dsk/c2d0s0 /dev/dsk/c2d0s2 /dev/dsk/c2d1s2 Mount Directory Description / /usr /home user home directories Failles de sécurité et privilège de montage Le droit banalisé d'effectuer des montages est une faille de sécurité car certaines options permettent le montage local de fichiers distants avec conservation de leurs privilèges. GESTION DES ENTREES/SORTIES 217 ────────────────────────────────────────────────────────────── Supposons le répertoire /user non vide avant montage. Après montage, tous les fichiers présents avant montage deviennent invisibles et inaccessibles. Ils redeviennent accessibles après démontage. Le droit d'écriture ou lecture sur les systèmes de fichiers est déterminé au montage. En mode lecture, toute écriture est interdite, quels que soient les droits des fichiers ou des répertoires qui y sont contenus. Il faut toujours redémarrer le poste de travail, après avoir modifié la table des systèmes de fichiers, pour pouvoir remonter un fichier en écriture. C'est donc une protection absolue très contraignante. ■ Démontage Le démontage d'un système de fichiers (commande umount) le rend inaccessible et invisible. Le système de fichier racine ou un système de fichiers en cours d'utilisation ne peut être démonté (device busy). Le système de fichiers contenant /usr ne peut être démonté qu'en mode mono-utilisateur. 4. COHERENCE DES SYSTEMES DE FICHIERS La cohérence des systèmes de fichiers est essentielle à l'intégrité du système matériel. Elle doit être contrôlée périodiquement. 4.1 Algorithme de contrôle de cohérence La cohérence d'un système de fichiers est vérifiée par le contrôleur de système de fichiers (file system checker – fsck sous Unix/Linux, chkdsck ou scandisk sous Windows). Cet utilitaire doit être exécuté sur un système de fichiers démonté, sans utilisation du cache (mode raw). Les inconsistances recherchées sont les suivantes : • blocs associés à plusieurs descripteurs de fichiers dans la liste des blocs libres, • bloc associé à un descripteur de fichiers disponible accessible hors du système de fichiers, • nombre de liens matériel incorrect, • contrôles de la taille : nombre de blocs incorrect, taille de répertoire incorrecte, • descripteurs de fichiers incohérents, blocs perdu, contrôle de répertoires, fichiers pointant sur un descripteur de fichiers non alloué, nombre de blocs alloués supérieur au nombre de blocs disponibles, mauvais format de la liste de blocs disponibles, incohérences des nombres de blocs libres et des inodes non alloués. ■ Démarrage Il est judicieux d'exécuter le contrôle de cohérence à chaque démarrage ou périodiquement même si cette opération est longue et que le système est toujours arrêté correctement. On peut le paramétrer pour qu'il ne s'exécute au démarrage qu'en cas d'arrêt incorrect (système dirty). 218 CHAPITRE VIII ────────────────────────────────────────────────────────────── 4.2 Mode opératoire ■ Initialisation Contrôle des options de la commande et de la validité du super bloc par comparaison de la liste des nœuds d'index avec la taille du système de fichiers. Si la taille de la liste des nœuds d'index est supérieure à celle du système de fichiers, le super bloc est modifié. ■ Phase 1 et 1B : contrôle de la taille des blocs et des nœuds d'index Ces contrôles sont effectués pour les types de fichiers, leur taille, le nombre de liens matériels, les adresses des blocs, ainsi que la liste des nœuds d'index (fsck –p). L'identification d'un bloc dupliqué provoque une nouvelle analyse du système de fichiers pour retrouver le descripteur de fichiers correspondant (Phase 1B). ■ Phase 2 : contrôle des chemins d'accès et des répertoires non référencés Suppression des descripteurs de fichiers défectueux détectés dans les phases 1 et 1B. ■ Phase 3 : contrôle de la connectivité des répertoires non référencés Si le nœud d'index associé à un sous-répertoire n'existe pas, il est crée, éventuellement dans le répertoire lost+found. ■ Phase 4 : contrôle du nombre de liens matériels Recherche de fichiers non référencés, du nombre erroné de liens matériels, des blocs défectueux ou dupliqués et du nombre incorrect de nœuds d'index. Les compteurs de contrôle des références permettent la correction de problèmes associés à un nombre de liens matériels incorrect, détectés dans les phases précédentes. ■ Phase 5 : contrôle des listes Recherche des blocs défectueux, dupliqués, inutilisés ou en nombre incorrect dans la liste des blocs libres ou alloués. ■ Phase 6 : reconstruction éventuelle de la free-liste Quand tout semble correct, la commande affiche les différentes phases et le nombre de fichiers, les nombres de blocs occupés et libres. Elle corrige certaines erreurs (fichiers vides non référencés détruits...) et interroge l'opérateur (clear pour détruire un fichier à problème, reconnect pour sauvegarder l'information dans le répertoire lost+found avec comme nom le numéro du nœud d'index...). L'image d'un système de fichiers modifié étant incorrecte dans le cache, le message "Boot Unix (No Sync!)" indique qu'il faut redémarrer le système sans vider le cache. ■ Cohérence et tolérance de pannes Un système de fichiers retrouve une cohérence après l'exécution d'une commande fsck. Toutefois, il peut y avoir perte d'informations que l'on peut éventuellement récupérer (sauvegarde ou répertoire lost+found). GESTION DES ENTREES/SORTIES 219 ────────────────────────────────────────────────────────────── Synopsis fsck [-option(s)] système_de_fichiers_en_mode_raw ■ Quelques options y D f suppose une réponse positive à toutes les questions posées par fsck contrôle des répertoires (à utiliser après un crash) contrôle rapide. La phase 6 est exécutée si nécessaire seulement. Exemple fsck -y /dev/rroot 5. QUOTAS Le comportement du système se détériore dès qu'un système de fichier est plein. Il faut donc disposer d'espace disque et surveiller leur taux d'utilisation. On peut définir des quotas par utilisateur (nombre de blocs et nombre maximal de fichiers). Chaque limite est définie par deux paramètres : • la limite dure (hard limit) est une limite absolue impossible de dépasser, • la limite douce (soft limit), à partir de laquelle des messages sont émis pour prévenir l'utilisateur qu'il risque d'atteindre ou dépasser la limite dure. La limite douce peut être dépassée en cours de session. Le service de quotas s'installe sur un système de fichiers donné en plusieurs étapes. • Une modification du noyau peut être nécessaire. • Il faut déterminer les systèmes de fichiers sur lesquels l'administrateur souhaite installer le service de quotas par une modification de l'entrée du système de fichiers concerné dans le fichier vfstab (option quota ou noquota) et par la création d'un fichier quota sur chacun des systèmes de fichiers concernés, par exemple par la commande cp /dev/null quota. • Le fichier quota est modifié lors de la définition d'utilisateurs avec des quotas (commande edquota). • Les commandes quotaon et quotaoff gèrent respectivement le démarrage et l'arrêt du service de quotas dont le contrôle est assuré par la commande quotacheck. ■ Installation permanente Le service des quotas est initialisé de la façon suivante : #contrôle des quota echo -n 'checking quotas : ' > /dev/console /etc/quotacheck -a -p > /dev/console 2 > &1 echo 'done.' > /dev/console #mise en route du service des quotas /etc/quotaon -a 220 CHAPITRE VIII ────────────────────────────────────────────────────────────── 6. OUTILS AVANCES (UNIX/LINUX) 6.1 Débugger L'utilitaire fsdb (file system debugger) permet de modifier un système de fichiers par octet, par inode ou par bloc. Seul, l'administrateur peut l'utiliser. Synopsis fsdb chaîne_de_caractères La chaîne de caractère représente un fichier spécial ou le nom d'un volume monté. ■ Format d'une directive adresse[format d'impression] adresse[opération d'affectation] Il est judicieux de séparer les différents champs d'une commande par des points. ■ Directives q DEL ! 0 B,W,D ■ Sortie de fsdb, Arrêt d'une impression, Echappement vers l'interprète de commandes, Mode vérification de la commande, Sélection du type de données consultées (mode octet, mot, double mot). Format des adresses nombre[mode] [+]|[-]nombre nombre[i] nombre[b] nombre[d] Adresse absolue, Déplacement relatif avant ou arrière, Sélection d'un inode, Sélection d'un bloc, Sélection d'un répertoire. Exemple 40b.d4.p8d ■ Format d'impression C'est le dernier argument d'une directive de la forme : i d b,c o,e ■ Format inode, Format répertoire, Octet affiché en format octal ou caractère, Format octal ou décimal. Modification Toute écriture étant immédiatement exécutée, il faut être en mode mono-utilisateur. GESTION DES ENTREES/SORTIES 221 ────────────────────────────────────────────────────────────── ■ Affectation = =+ =="chaîne_de_caractères" ■ Affectation numérique, Affectation incrémentielle, Affectation décrémentielle, Affectation d'une chaîne de caractères. Modification d'un inode L'instruction d'affectation est constituée de 4 champs : l'adresse, le mnémonique à utiliser caractérisant la nature de l'information à modifier, l'opérateur = la valeur. ■ Mnémoniques autorisés ln at mt maj min sz i# md a[i] Nombre de liens matériels, Dernier accès, Dernière modification, Le majeur, Le mineur, La taille en octet, Le numéro d'inode, Les droits d'accès, L'adresse en bloc du bloc i. Exemple 12i.ln=4 ■ Visualisation du contenu d'un répertoire numéro_d'inode.i.fd ■ Modification du contenu d'un répertoire Changement du numéro d'inode selon le format numéro_d'inodei.anuméro_de_blocbdnuméro_d'entrée Exemple 54i.a2b.d18=23 222 CHAPITRE VIII ────────────────────────────────────────────────────────────── 6.2 Commandes ■ Nettoyage Une recherche périodique (planificateur de travaux) s'impose pour purger les fichiers temporaires inutilisés (fichiers core, nettoyage des dossiers /tmp, /usr/tmp, etc.). ■ Fichier d'échanges (swap) L'ajout d'un fichier d'échanges (quelques Go) peut s'effectuer dynamiquement et il est recommandé de l'installer sur un autre disque. Pour l'installer, il faut : • créer le fichier d'échanges en définissant sa taille, • activer la zone (commande swapon) qu'il est possible de désactiver (commande swapoff) Les commande swap –l et sar -r affichent des statistiques d'utilisation des fichiers d'échanges (état, espace utilisé et disponible). Sous Windows, il suffit d'accéder à la fenêtre gestion de la mémoire virtuelle. ■ ncheck Affichage de la correspondance entre le numéro d'inode et le nom du fichier. Synopsis ncheck fichier_special_en_mode_raw inumber(s) Exemple ncheck /dev/rdsk/c2d0s0 8913 7498 /dev/rdsk/c2d0s0: 8913 /command.com 7498 /config.sys GESTION DES ENTREES/SORTIES 223 ────────────────────────────────────────────────────────────── ■ Taux d'occupation des disques Affichage récursif du taux d'occupation des systèmes de fichiers montés et du nombre de blocs d'un répertoire. Synopsis df -[t] -[f]-[i]-[v] [système_de_fichiers] du [-as][-nom...] Exemples df -vi /dev/root mount Dir Filesystem / /dev/root df -t /usr / /usr blocks used free %used iused ifree %iused 684730 641786 42944 93% 25465 40023 38% (dev/dsk/c2d0s0): 9610 blocks 12389 i-nodes total: 49896 blocks 13340 i-nodes (dev/dsk/c2d1s0): 25305 blocks 73840 i-nodes total: 328016 blocks 81920 i-nodes du -a /etc/vtoc 2 /etc/vtoc/m2333k 4 /etc/vtoc/m2344k ■ clri La commande clri permet la suppression directe d'un lien matériel sur un système de fichier démonté. Il est nécessaire ensuite d'en restaurer la cohérence. Synopsis clri système_de_fichier inumber ■ ff La commande ff affiche par ordre croissant les fichiers d'un système de fichiers donné. Synopsis ff fichier_spécial ■ bdbclk Cette commande permet de modifier la liste des blocs défectueux d'un disque. Synopsis bdbclk option fichier_spécial Les options sont : p i u r affichage de la table des secteurs défectueux, vérification et initialisation de la table des secteurs défectueux, vérification et mise à jour de la table des secteurs défectueux, écriture de la table des secteurs défectueux transmis en argument. 224 CHAPITRE VIII ────────────────────────────────────────────────────────────── 7. VOLUMES LOGIQUES (IBM-AIX) ■ Généralités Le gestionnaire de volume logique (Logical Volume Manager - LVM) masque la structure matérielle des disques durs considérés comme des disques logiques. log lv01 / lv02 /usr lv03 /tmp lv04 Volumes logiques ■ Disques Avantages Un système de fichiers peut être réparti sur plusieurs disques durs et sa taille peut croître dynamiquement. Il est possible de créer des disques miroirs et des systèmes à tolérance de pannes. ■ Groupes de volumes physiques Un volume physique est un périphérique réel formaté pour être utilisable par le LVM. Un groupe de volumes physiques regroupe plusieurs volumes physiques tel le groupe racine (root volume group) qui contient les volumes physiques de démarrage. ■ Partition physique Une partition physique est une zone d'espace contiguë d'un volume physique. Sa taille variable est définie au moment de l'ajout au groupe de volumes. ■ Gestion des groupes de volumes physiques et logiques Un groupe de volumes physiques est organisé en volume(s) logique(s) sur le(s)quel(s) les systèmes de fichiers sont définis. GESTION DES ENTREES/SORTIES 225 ────────────────────────────────────────────────────────────── Groupe de volumes physiques Volumes Physiques mkvg redefinevg mkvg lsvg chvg reorgvg Groupe de volumes physiques désactivé exportvg Groupe de Volumes extendvg reducevg varyoffvg importvg Groupe de Volumes varyonvg Groupe de volumes physiques activé Volumes logiques ■ Graphe de création d'une arborescence Volume physique 226 CHAPITRE VIII ────────────────────────────────────────────────────────────── 8. CACHE DISQUE ■ Tampons Une zone de mémoire tampon (buffer) contient des blocs lus par anticipation sur le disque. Le cache disque (cache logiciel ou cache) est l'ensemble des mémoires tampons. ■ Principes Les lectures et les écritures sur disque sont réalisées par blocs. Une opération d'entrée-sortie n'affectant que la copie en mémoire d'un bloc est logique. Une entrée-sortie physique est l'écriture ou la lecture effective du bloc sur le périphérique correspondant. Une entrée/sortie logique n'entraînant pas d'accès disque, un bloc modifié n'est écrit sur le disque que lorsque le cache est saturé (write behind) ce qui entraine des incohérences en cas d'incidents sauf si les entrées/sorties sont journalisées. Pour y remédier, un processus vide périodiquement le cache sur disque (sync). ■ Avantages Réduction du nombre des accès disques. Amélioration des performances par anticipation des lectures (read ahead). Mise en commun des blocs d'entrées/sorties un bloc étant consultable plusieurs fois. Désynchronisation des opérations logiques et physiques : l'accès à un octet s'effectuant sans pénalisation en mémoire, un accès physique d'un bloc de 512 octets permet 512 accès logiques d'un octet. Le processus utilisateur perçoit des d'entrées/sorties synchrones gérées en mode asynchrone par le système d'exploitation. GESTION DES ENTREES/SORTIES 227 ────────────────────────────────────────────────────────────── 9. PILOTES 9.1 Généralités sur les pilotes ■ Définition Un pilote est un ensemble de fonctions constituant le niveau logiciel le plus "bas" du sous système d'entrées/sorties, permettant au noyau de dialoguer avec un périphérique de type donné. Il est invoqué à partir d'une requête utilisateur ou à partir d'une interruption émise par un contrôleur. Il s'interface avec le noyau par des tables dont il doit respecter les normes ce qui se traduit par le respect impératif de la définition d'une liste de fonctions dont les noms, arguments, valeurs de retour, et structures de données internes sont figés. Le principe d'interface entre le noyau et les pilotes est identique sur toutes les implémentations même si le détail des tables d'interface varie. Leur utilisation ne nécessite que la connaissance des structures de données, des fonctions utilisées par le noyau et le pilote, et des méthodes permettant de les intégrer dans le noyau. Les pilotes fonctionnent en mode bloc ou en mode caractère. ■ Mode caractère C'est le mode de fonctionnement par défaut de tous les périphériques. ■ Mode bloc Un volume fonctionnant en mode bloc utilise des tampons du cache d'accès aléatoire. Le cache est donc l'interface entre une requête d'un processus exprimée en octets et une requête vers un périphérique exprimée dans l'unité de transfert de ce dernier. Dans certains cas, le pilote gère en mode caractère un périphérique géré habituellement en mode bloc ce qui constitue la définition d'une interface en mode cru (raw device interface). Le flux des données vers le périphérique est alors géré comme une suite (brute) d'octets non structurée. Une entrée/sortie prend donc toujours comme unité de référence celle qui est imposée par le périphérique. L'obtention d'une information absente du cache nécessite trois phases : • lecture de l'information sur le disque, • chargement du cache, • transfert du cache vers le processus. 228 CHAPITRE VIII ────────────────────────────────────────────────────────────── 9.2 Architecture Le schéma ci-dessous représente l'architecture de l'interface noyau/pilote. Appel système read Mode utilisateur interface pilote de niveau supérieur (top half) en mode synchrone Mode bloc (cache disque) Mode c Mode noyau Table bdevsw Table cdevsw Bus d'entrées/sorties interface pilote de niveau inférieur (bottom half) en mode asynchrone ■ Tables Le niveau haut d'un pilote (top half) est constitué de fonctions dont l'adresse est définie par la structure bdevsw (mode bloc) ou la structure cdevsw (mode caractère). struct bdevsw /* mode bloc */ {int (*open)(); /* ouverture */ int (*close)(); /* fermeture */ int (*strategy)(); /* initialisation ou terminaison */ int (*dump)(); /* écriture d'un dump mémoire */ int (*psize)(); /* taille d'une partition */ int flags; }; struct cdevsw /* mode caractère */ {int (*open)(); /* ouverture */ int (*close)(); /* fermeture */ int (*read)(); /* lecture */ int (*write)(); /* écriture */ int (*ioctl)(); /* contrôle */ int (*stop)(); /* arrêt */ int (*reset)(); /* réinitialisation */ struct tty * ttys; int (*select)(); /* contrôle */ int (*mmap)(); /* adressage en mémoire */ }; Les tables bdevsw et cdevsw sont constituées de pointeurs vers les fonctions du pilote de nom générique xxopen, xxclose, xxread, xxwrite, …, pour le pilote de nom xx. Le niveau bas (bottom half) du pilote est constitué de primitives qui pilotent directement le contrôleur du périphérique (interruption, émission d'une requête, etc.). GESTION DES ENTREES/SORTIES 229 ────────────────────────────────────────────────────────────── Exemple struct bdevsw bdevsw[] = { /* point d'entrée 0 : procédures associées au pilote md */ 0, 8, DT_DEV, 0, mdopen, mdclose, mdstrategy, mddump, mdprint /* point d'entrée 1 : procédures associées au pilote mt */ 0, 1, DT_DEV, 0, mtopen, mtclose, mtstrategy, nulldev, mtprint, /* point d'entrée 2 : procédures associées au pilote nfsd */ 0, 1, DT_SW, 0, nulldev, nulldev, nfsdstrategy, nulldev, nfsdprint, }; struct cdevsw cdevsw[] = { /* point d'entrée 0 : pilote vide */ 0, 0, 0, 0, 0, 0, nodev, nodev, nodev, nodev, nodev, nodev, nodev, /* point d'entrée 1 : procédures associées au pilote nfs */ 0, 1, DT_SW, 0, 0, 0, nulldev, nulldev, nodev, nodev, nfsdioctl, seltrue , seltrue, /* point d'entrée 2 : procédures associées au pilote nm */ 0, 1, DT_SW, 0, 0, 0, nulldev, nulldev, mmread, mmwrite, nodev, seltrue, seltrue, }; Chaque entrée de la table a le même nombre de pointeurs et le nombre de primitives accessibles à partir d'un appel système est le même quel que soit le périphérique. C'est une contrainte car le pilote de chaque périphérique est un cas spécifique et une aide car l'interface de conception est universelle. Remarque La primitive nodev retourne un message d'erreur et la primitive nulldev provoque l'interruption du processus appelant. ■ Majeur, mineur Chaque périphérique est accessible à partir d'une entrée du répertoire /dev réalisée par la commande mknod. Synopsis mknod entree [b | c] majeur mineur Le majeur est l'index du périphérique dans la table bdevsw ou cdevsw. Il en détermine le type et permet l'accès à une ligne donnée donc aux primitives du pilote associé. Le mineur permet l'identification de l'unité logique du périphérique sur laquelle le pilote doit opérer comme une partition d'un disque ou un circuit virtuel d'une interface réseau. Exemple mknod /dev/dka1 b 10 0 Cette commande définit le fichier en mode bloc /dev/dka1 dont les fonctions d'accès sont à la dixième ligne de la table bdevsw. 230 CHAPITRE VIII ────────────────────────────────────────────────────────────── 9.3 Pseudo pilotes On distingue trois méthodes d'intégration d'un nouveau service au système d'exploitation : • modification du noyau : c'est toujours délicat à mettre en œuvre, • utilisation de l'architecture des pilotes et intégration au noyau : c'est la notion de pseudo pilote (pseudo driver), • utilisation de l'architecture des pilotes sans modification du noyau : c'est la notion de pseudo périphérique (pseudo device). Exemple Un pseudo pilote de verrouillage et de déverrouillage d'accès d'un fichier peut être défini à partir des trois procédures suivantes : • Initialisation de la ressource (procédure lck_open). • Gestion de l'accès exclusif en lecture à la ressource et de la file d'attente associée (procédure lck_read). • Libération de la ressource et réveil des travaux en attente (procédure lck_close). void lck_open(void) {lock = 0;} void lck_read(void) { while (lock == 1) sleep(&lock); lock = 1; } /* accès interdit si la ressource est utilisée */ /* entrée en section critique */ void lck_write(void) {lock = 0; wakeup(&lock,PRIO); } /* libération de la ressource */ /* réveil des processus en attente */ Après intégration de ce pseudo-pilote dans le noyau, on obtient l'accès exclusif à un fichier par la séquence : Processus actif fd = open("/dev/lock", drapeau_d'accès,..) read(fd,...); … write(fd,..); /* création d'un verrou */ /* entrée en section critique */ /* sortie de la section critique */ /* déblocage de la ressource */ /* réveil éventuel des processus endormis */ Exercice Ecrire une implémentation des opérations P et V sur des sémaphores binaires. GESTION DES ENTREES/SORTIES 231 ────────────────────────────────────────────────────────────── 9.4 Pseudo périphérique ■ Définition Un pseudo périphérique est un fichier spécial de gestion d'un périphérique virtuel tels les terminaux virtuels associés aux connexions dans un réseau local ou aux environnements multi fenêtres. ■ Implémentation Un pseudo terminal est représenté par deux entrées du répertoires /dev : ptyxy et ttyxy, ou x est une lettre de l'intervalle [p,t] et y un numéro de l'ensemble [0-9a-f]. Les pseudos périphériques maîtres (ptyxy) et esclaves (ttyxy) coopèrent selon le modèle serveur/client ce qui permet à une application lisant et écrivant sur un pseudo périphérique esclave de travailler comme sur un périphérique réel. Le pseudo périphérique esclave réachemine les requêtes vers le pseudo périphérique maître qui appelle un processus d'exécution d'un traitement spécifique puis appelle le pilote réel associé au périphérique. Exemple : multi-fenêtrage Dans le schéma qui suit, chaque processus shell utilise un couple (ttypy/ptypy). Un serveur traite les requêtes de l'ensemble des couples (ttypy, ptypy) et s'interface avec le pilote du périphérique. sh1 sh2 ttyp1 ttyp2 ptyp1 Mode utilisateur démon pilote ptyp2 Mode Noyau contrôleur Multifenêtrage ■ Quelques pseudo périphériques L'entrée /dev/tty représente le périphérique virtuel d'affichage associé à un processus. L'entrée /dev/null sert de poubelle chaque information qui y est redirigée étant perdue. L'entrée /dev/mem est l'image mémoire d'un processus actif, accessible par un débogueur (adb, sdb, dbx...). L'entrée /dev/kmem est l'image mémoire du noyau. Elle doit être protégée par les attributs convenables. 232 CHAPITRE VIII ────────────────────────────────────────────────────────────── 10. GESTION DES FLUX 10.1 Objectifs Les flux (streams) de Dennis Ritchie gèrent modulairement les flux d'informations avec les objectifs suivants : • Structuration modulaire et en couches dans le noyau. • Masquage des couches de niveau inférieur. • Souplesse d'utilisation grâce à l'évolution dynamique des différents modules. • Transparence des média. • Partage possible d'un module par plusieurs contrôleurs de communication. • Portage aisé des applications. L'ensemble des outils de communications entre processus (tubes, tubes nommés, IPC, etc.) est donc implémenté sous la forme d'un empilement de protocoles. 10.2 Streams et flux Dans le présent paragraphe sont définis les termes associés aux flux de données. Le terme stream est employé également dans la couche socket. Pour éviter toute ambiguïté, dans tout ce qui suit, les streams de Dennis Ritchie sont nommés streams, flux d'entrées/sortie ou simplement flux. ■ Flux Un flux est un gestionnaire de périphériques constitué d'une chaîne de procédures de traitement (stream module) opérant sur deux flux de données bidirectionnels entre un processus et un pilote en mode full duplex (stream message). ■ Extrémités Les deux extrémités d'un flux sont nécessaires. Elles sont définies du côté processus en mode utilisateur, du coté pilote en mode noyau. ■ Flux de données On distingue le flux des données descendantes du processus utilisateur vers le pilote, et celui des données montantes du pilote vers le processus utilisateur. Les variables d'état de chacun des flux ainsi que les files de messages associées sont gérées par une file (stream queue). • La file des messages montants (upstream queue) est aussi appelée file de lecture (read queue) ou file des messages entrants. • La file des messages descendants (downstream queue) est aussi appelée file d'écriture ou file des messages sortants. GESTION DES ENTREES/SORTIES 233 ────────────────────────────────────────────────────────────── Pr o ce ssus Utilisateu r M o d e u tilisateu r St r e a m He a d M o d u le Stre am Mo d e N o yau Pilo te St ream TT Y 10.3 Modules ■ Module stream Un module stream ou module assure un traitement, éventuellement optionnel sur les flux de données. Il est constitué d'un allocateur de mémoire privé, des deux flux de données, de procédures internes, appelées services stream ou services, lui permettant d'exécuter des opérations sur ces files. Les services, implémentés dans le noyau, constituent un filtre bidirectionnel. Les traitements peuvent être simultanés. Chaque module s'exécute dans son propre contexte d'exécution. ■ Module de tête Le module de tête du flux (stream head) constitue l'interface de dialogue entre le processus utilisateur et les modules du noyau. ■ Module terminal Le module terminal du flux (stream end) est le pilote-stream (stream driver), interface du périphérique entre la chaîne des modules et le noyau. ■ Tables systèmes Tout pilote est accessible par l'une des tables bdevsw ou cdevsw. Tout module est identifiable par la table système fmodsw accessible à partir de l'appel système ioctl, compatible avec les tables cdevsw et bdevsw. Les concepts classiques (inode, utilisation des appels système d'entrée/sortie) restent vrais. Le pilote stream a un point d'entrée dans le répertoire /dev ce que n'a pas un module. 234 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ Chaîne de modules Un flux est une chaîne de modules, composée d'un module de tête et d'un module terminal au moins. Tous les modules ont une interface standard permettant leur empilement. La chaîne des modules permet de constituer deux chemins de données où circulent des messages. Exemple Les caractères saisis à partir d'un clavier sont transmis au processus destinataire (par exemple getty) à partir de files de caractères, traitées par un pilote caractère. ■ Evolution dynamique d'une chaîne Une chaîne de modules pouvant évoluer dynamiquement par empilement ou dépilement de module, les pilotes deviennent donc chargeables dynamiquement s'ils sont implémentés sous cette forme . La prise en compte d'une modification du code d'un module peut nécessiter la recompilation du noyau. ■ Services d'un module Les opérations réalisées par un module sur un flot sont des services. Ils sont optionnels et ne sont pas d'exécution immédiate car régulés par un gestionnaire interne des priorités. Le sous-système d'entrée/sortie est autonome dans le noyau car muni de ses appels système propres, de son allocateur mémoire, de ses propres gestionnaires de travaux (ordonnanceur, multiplexeur). Exemples Module-pilote d'un clavier de 102 touches gérant un clavier de 80 touches. Module de chiffrement de données d'un disque. ■ Multiplexage de modules Le multiplexage amont ou aval de files issues de différents modules est possible, l'implémentation étant réalisée sous la forme d'un pseudo-pilote. ■ Application aux systèmes de communications Le système de communications utilise les flux : la couche socket s'appuie donc sur des modules streams même si l'interface utilisateur n'a pas changée. GESTION DES ENTREES/SORTIES 235 ────────────────────────────────────────────────────────────── démon USER user1 user2 Module TCP (multiplexeur) NOYAU Module IP Module 8802.4 Module 8802.3 Module X25 10.4 Message ■ Définitions et propriétés Le stream message ou message est l'unité de communication entre les modules. Il est doté des propriétés suivantes : • Typé (donnée ou contrôle). • Géré dans l'espace mémoire propre de chaque module. • La taille d'un message de données, constitué de listes chaînées de blocs de données, peut varier dynamiquement au cours du transfert. • Toute requête d'allocation de message est soumise à l'ordonnanceur local du module. • Le message doit traverser la chaîne des modules pour le traitement complet. • Une file de messages est une liste chaînée de messages. 10.5 Appels système La plupart des appels systèmes utilisés sont classiques (open, close, read, write, ioctl). D'autres sont spécifiques (getmsg, putmsg, poll). ■ Appels système classiques La sémantique et la syntaxe des appels systèmes classiques sont conservées ce qui permet de réutiliser les programmes classiques avec les flux. open close read write ouverture d'un flot, fermeture d'un flot, lecture en mode flot de données dans un module, écriture en mode flot vers un module. 236 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ ioctl L'appel système ioctl effectue des opérations sur les modules : • insertion ou suppression dynamique d'un module dans une chaîne de modules à partir du pilote stream seulement, • multiplexage de messages entrants ou sortants, • opérations de contrôle. ■ getmsg et putmsg Les appels système putmsg et getmsg permettent des échanges de messages entre modules. ■ poll L'appel système poll permet de programmer des attentes multiples sur plusieurs flux pour réceptionner les données, la gestion des codes d'erreur, ou le contrôle de flux. Il permet la synchronisation entre modules distants : il scrute l'événement attendu sur chaque descripteur de fichier. Le processus est bloqué si l'événement ne s'est pas produit pendant une certaine durée ou jusqu'à ce qu'il apparaisse. Il émet alors un signal de notification d'événement se produisant dans un module au processus concerné. Son mode de fonctionnement est synchrone. 10.6 Ordonnancement L'ordonnancement des messages dans un module est indépendant et différent de celui du système d'exploitation. L'ordonnanceur du module traite simultanément ses files des messages en mode FIFO par activation des procédures de service associées. Les attentes sont aléatoires. L'ordonnanceur du module est plus prioritaire que celui des processus utilisateurs et est seulement interruptible par des traitements sur interruption de haut niveau. Les transferts de messages entre modules étant très rapides, le routage est accéléré par intégration au module. Une procédure de service n'est pas obligatoire. Elle complète une procédure par écriture du message dans la file locale. Synopsis int putq(); Description Transmission du message entrant dans la file d'attente, Sortie immédiate du niveau d'interruption courant, Traitement ultérieur par l'ordonnanceur local. GESTION DES ENTREES/SORTIES 237 ────────────────────────────────────────────────────────────── ■ Contrôle de flux Deux niveaux de contrôle de flux : • global, au niveau de l'allocation du message pour la chaîne des modules, • local, dans les modules dotés d'une procédure de type "service". Soit Q la quantité de messages bloqués dans une file d'un module. Le contrôle de flux local est réalisé à partir des constantes HIGHWATERMARK et LOWWATERMARK selon l'algorithme : si Q > HIGHWATERMARK alors attendre is si Q < LOWWATERMARK alors redémarrer is La primitive de bas niveau canput permet, au niveau de chaque module, la prise en compte des variables de gestion du contrôle de flux. Put Service Module Q1 IW HW 3 Appel de l'ordonnanceur local Put Service Module Q2 IW Put Service Module Q3 IW 2 Rétropropagation de l'arrêt 1 Arrêt du remplissage HW 4 Le service Q3 vide la file HW 5 L'ordonnanceur autorise nouveau le remplissage de la file à Exemple if canput() putq; else (remise en attente); Cette primitive doit être utilisée pour éviter un blocage du processus, avec une valeur maximale impérative à ne pas dépasser (valeur HIGHWATERMARK). On remédie à un blocage du flot par sa diminution. 238 CHAPITRE VIII ────────────────────────────────────────────────────────────── 11. CHARGEMENT DYNAMIQUE DES PILOTES ■ Pilotes et noyau traditionnels Pour optimiser le noyau, il est judicieux de n'y intégrer que les pilotes nécessaires à la génération puis tout ajout d'un pilote nécessite sa compilation et un redémarrage. La configuration dynamique des pilotes y remédie depuis Unix SVR4. ■ Chargement dynamique Les pilotes, systèmes de fichiers, modules streams, protocoles sont chargeables ou de déchargeables dynamiquement. • La partie basse du pilote (bottom half) s'interface donc dynamiquement avec le contrôleur et le gestionnaire d'interruptions. • La partie supérieure du pilote (top half) s'interface donc avec le noyau. Les entrées complémentaires dans les tables bdevsw et cdevsw sont réalisées par les primitives cdevsw_add, bdevsw_add. Exemple Sous Linux, un module est fichier objet (.o) qui peut être chargé et déchargé dynamiquement en mémoire avec les commandes insmod et rmmod. La commande lsmod affiche la liste des modules chargés. Le serveur kerneld charge les modules au démarrage. 12. LE FONCTIONNEMENT DU PILOTE TTY Le pilote tty gère les périphériques (terminaux, modem) sur liaison série en mode asynchrone. Son architecture est représentée sur la figure suivante : sortie série Pilote TTY BUS CPU Périphérique d'affichage getty NOYAU getty clist cblocs getty outq ttyxx ttyaa ttybb rawq, canonq GESTION DES ENTREES/SORTIES 239 ────────────────────────────────────────────────────────────── Il existe deux modes de fonctionnement des terminaux. ■ Mode caractère Les caractères sont transmis individuellement. On distingue : • le mode cru (mode raw) : tout caractère saisi est immédiatement transféré sans interprétation des caractères spéciaux. • le mode cbreak : chaque caractère est transféré après filtrage des caractères spéciaux définis dans une structure TTYCHARS. ■ Mode ligne Appelé mode canonique ou mode cooked, c'est le mode usuel de transmission des caractères avec interprétation des caractères spéciaux. Les caractères reçus sont saisis ligne par ligne (ne ligne étant une suite de caractères interprétée seulement lorsque le caractère de fin ligne est reconnu). Dans ce mode, les erreurs de frappe sont corrigées par utilisation des caractères spéciaux : • destruction de caractères (erase character), • de mots (word erase character), • de lignes (kill character). Au cours des transferts, les caractères sont stockés dans trois listes différentes : • la rawq contient les caractères saisis en mode raw, • la canonq (canonalized queue) contient les caractères après filtrage de la rawq, • l'outq stocke les caractères à la sortie du pilote. Les structures de données utilisées sont : • les c_listes, utilisées pour décrire une liste de caractères (mode caractère), de longueur variable, en entrée ou en sortie. Elle est constituée de deux pointeurs sur son premier et son dernier caractère ainsi que le nombre de caractères qu'elle contient. Ces variables sont modifiées quand un caractère est ajouté ou supprimé de la liste. Quand la structure c_liste est pleine, une nouvelle structure c_liste est allouée. • les c_bloc,utilisés par les pilotes fonctionnant en mode bloc. La discipline de ligne est intégrée au noyau pour décrire le comportement de l'interface et transformer le flot des données en mode raw en mode canonique. 240 CHAPITRE VIII ────────────────────────────────────────────────────────────── 13. ADAPTATION DU NOYAU UNIX/LINUX L’intégration d’un service peut nécessiter une modification du noyau. Cette adaptation peut être réalisée avec des fichiers de commandes (makefile) ou à partir d'une interface graphique (SMIT (AIX), SAM (HP-UX), xconfig (Linux sous licence GNU), etc.). Un noyau générique, d'une taille importante et pouvant gérer un grand nombre de périphériques est utilisé à la première installation. La génération d'un noyau s'effectue de la façon suivante : • création des fichiers de configuration du nouveau noyau et modification (éditeur de texte, interface graphique…) • exécution du fichier de génération (makefile). • transfert du nouveau noyau dans son répertoire du démarrage. • test du démarrage de la station avec son nouveau noyau : il faut vérifier que la génération du noyau se déroule sans erreur et impérativement conserver le noyau initial comme noyau de secours. ■ Le noyau Linux Linus Torvalds, créateur du noyau Linux, le maintient officiellement depuis le début (1991). Il fait donc autorité. Les différentes versions du noyau s'appellent mainline ou vanilla. Ces dernières sont intégrées par les distributeurs, avec quelques modifications (patches) ainsi que des corrections de bogues, des failles de sécurité ou des optimisations. Numérotation Les numéros de version du noyau sont composés de trois chiffres dont le premier est le majeur, le second le mineur. Le troisième chiffre indique une révision (corrections de bogues, de failles de sécurité, ajout de fonctionnalité), par exemple 2.4.30. Antérieurement aux versions 2.6.x, les mineurs pairs indiquaient une version stable (par exemple 2.2) et les mineurs impairs (par exemple 2.5) une version de développement. Depuis la version 2.6, cette interprétation a été abandonnée. Depuis 2005, Greg Kroah-Hartman et Chris Wright maintiennent une branche stabilisée du noyau vanilla par intégration de correctifs (bogues, failles de sécurité) et ajout d'optimisations répondant à des critères stricts, sans nouvelles fonctionnalités. Leurs publications sont indiquées par un quatrième chiffre, par exemple 2.6.11.1. Patches Il existe une multitude de correctifs au sein de la communauté de développement du noyau Linux dont les plus connus (Andrew Morton) intègrent des noyaux surchargés fonctionnels (Working Over Loaded Kernel - WOLK). Ceux d'Ingo Molnar sont utilisés par les distributions multimédia avec des fonctionnalités temps réel. Ingo Molnar est aussi l'auteur du débogueur du noyau kgdb. GESTION DES ENTREES/SORTIES 241 ────────────────────────────────────────────────────────────── Le code source du noyau Linux est disponible sur le site kernel.org. La compilation d'un nouveau noyau impose d'exécuter dans l'ordre les commandes suivantes : • make mrproper • make xconfig ou make menuconfig ou make config ou make oldconfig • make dep • make clean • make bzImage • make modules • make modules_install 242 CHAPITRE VIII ────────────────────────────────────────────────────────────── 14. ARCHIVAGE ET SAUVEGARDES DANS LE MONDE UNIX/LINUX Il faut impérativement prévoir une sauvegarde périodique des données et du système sur des supports amovibles. On distingue plusieurs types de sauvegardes : sauvegarde complète d'un système de fichiers ou sélective des seuls fichiers modifiés, sauvegarde d'un disque, sauvegarde incrémentale, etc. 14.1 Arborescence et commande tar La commande tar permet de faire des sauvegardes, des restaurations, ou des transferts entre différents postes de travail en copiant récursivement un répertoire et ses fichiers en créant un unique fichier image tar (tarfile). Elle peut créer un fichier d'archivage (option c) pouvant être relu avec la commande tar (option x), ou transférer une arborescence (voir l'exemple ci-dessous)). Elle transfère les liens symboliques sans résolution du nom. Plusieurs fichiers images tar peuvent être stockées séquentiellement sur un même média. Dans ce cas, il ne faut pas rembobiner la bande après une écriture (option n). L'utilitaires mt (BSD) permet de s'y déplacer. Synopsis simplifié tar action [modificateur_action] [fichier_tar(source/cible)] [bloc] f1 [... fn] Les action possibles sont c(création), t(liste), x(extraction). Les modificateurs bfv ont la signification suivante : b : définition de la taille des blocs f : définition du fichier spécial, utilisé en mode raw, associé au périphérique origine ou destinataire du fichier image tar. v : affichage verbeux. Le caractère - désigne, selon le contexte d'utilisation, l'entrée ou la sortie standard. Le rembobinage de la bande après l'opération (sauvegarde ou restauration) peut être spécifié. GESTION DES ENTREES/SORTIES 243 ────────────────────────────────────────────────────────────── Exemples #sauvegarde du répertoire courant sans rembobinage (nrst0)de la bande tar cvf /dev/ nrst0 . # idem avec rembobinage tar cvf /dev/rst0 . #sauvegarde du répertoire norbert avec chemin relatif tar cvf /tmp/norbert ./norbert #contenu du fichier image tar /tmp/norbert tar tvf /tmp/norbert #restauration du fichier image_tar /tmp/norbert dans le home directory cd tar xvf /tmp/norbert ■ Problèmes de sécurité Une arborescence sauvegardée avec un chemin d'accès absolu de répertoire est restaurée de façon identique, et risque d'écraser des fichiers de la machine destinataire, sauf dans le cas où l'option A (System V) existe. D'une façon générale, il faut éviter d'utiliser la commande tar sous l'identité de l'administrateur. Une restauration sans précaution peut créer des incohérences (fichiers sans propriétaire) car par défaut, les fichiers sont restaurés avec celui d'origine même s'il n'existe pas sur le système cible. La commande tar peut être utilisée dans un réseau local. Exemples Recopie de l'arborescence d'un répertoire vers le média /dev/ntape tar cvf /dev/ntape identificateur_répertoire Affichage du contenu de la bande tar tvf /dev/ntape Restauration sur le répertoire courant tar Axvf /dev/ntape Copie d'une arborescence d'un répertoire vers un autre cd rep_source tar cvf - . | (cd rep_cible; tar xvf - ) ■ Description tar cvf - . Le fichier image tar du répertoire courant (répertoire source) est dirigée sur la sortie standard (-). (cd rep_cible; tar xvf - ) Déplacement dans le répertoire cible et utilisation de l'entrée standard comme fichier image_tar source duquel l'arborescence est extraite. 244 CHAPITRE VIII ────────────────────────────────────────────────────────────── 14.2 La commande cpio La commande cpio permet la sauvegarde et la restauration de fichiers de n'importe quel type y compris les fichiers spéciaux. De nombreuses options sont disponibles (o archivage (output), i extraction (input), d création des répertoires...). Elle est performante et multi-volumes. ■ Utilisation La commande cpio lit ou écrit ses données sur les fichiers standard ce qui permet de l'utiliser sur des fichiers redirigés localement ou dans un réseau avec des commandes telles ls ou find. Synopsis cpio clé option(s) chemin_d'accès source_ou_cible La destination est définie par la clé i ou o ■ Clés d'utilisation o archivage sur la sortie standard des fichiers lus sur l'entrée standard, i extraction depuis l'entrée standard de fichiers préalablement sauvegardés par la commande cpio -o. Des critères de sélection peuvent être définis après les options par utilisation des caractères spéciaux de l'interprète de commandes shell. p copie sur un répertoire des fichiers indiqués sur l'entrée standard. Options a remise des dates d'accès des fichiers (clés o et p), B bloc de 5120 octets au lieu de 512, d création des sous répertoires si nécessaire (clés o et i), c sauvegarde ou restauration de fichiers dont l'en tête est en ASCII (clés o et i), r nommage interactif des fichiers restaurés (clés i et p), t affichage du contenu de la sauvegarde (clé i), u copie inconditionnelle (clés i et p), v affichage de tous les fichiers traités (clés p, o et i), l création de lien matériel au lieu de copie (clé p), m maintien des dates (création, accès, modification) des fichiers restaurés (clés i et p), f copie des fichiers ne satisfaisant pas un critère. ■ Règles d'utilisation Le chemin relatif (défaut) ou absolu utilisé pour la sauvegarde doit l'être pour la restauration. Un message d'avertissement est affiché pour les sauvegardes multi-volumes. Le caractère spécial "*" est nécessaire pour restaurer un répertoire complet. Exemple /usr/home/* GESTION DES ENTREES/SORTIES 245 ────────────────────────────────────────────────────────────── ■ Procédure de restauration Les sauvegardes complètes les plus récentes doivent être restaurées en premier. Les sauvegardes incrémentales, si elles existent, le sont ensuite. Il faut laisser vide le dernier champ (caractère d'espacement) pour restaurer l'intégralité de la bande et utiliser les caractères spéciaux "*" et "?". Exemple 1 #sauvegarde du répertoire courant dans une image find . –name* *.* -print | cpio –ocvB > /tmp/copie #affichage du contenu de la sauvegarde cpio –tvf < /tmp/copie #restauration sur le répertoire courant cpio –ivf < /tmp/copie Exemple 2 #sauvegarde du répertoire courant ls | cpio -o > /dev/mt0 #restauration sur le répertoire courant (relatif) cd /rep; cpio -imBdl < /dev/rmt8 #restauration sélective cd rep; cpio -iBmdlv f1 f2 ...fn < /dev/rmt0 #restauration sélective cpio -icvdumB ./tina/budget < /dev/rmt/tm0 ■ Sauvegarde de fichier ou répertoire avec les commandes find et cpio Sauvegarde Répertoire courant et sous répertoires Fichiers Répertoire différent du répertoire courant Identificateur correspondant . identificateur_fichier(s) chemin absolu du répertoire Exemples #sauvegarde de rep1 sur rep2 cd rep1; find . -depth -print | cpio -pdl rep2 #sauvegarde des fichiers modifiés depuis 24 h find . -mtime -1 -cpio /dev/rmt8 find /home/joe -depth -newer time -print | (cpio -ocvB > /dev/rmt0) 14.3 Copie physique La commande dd exécute une copie physique entre deux supports en précisant la taille des blocs transférés. On peut ainsi avec des grands blocs optimiser l'utilisation d'une bande en diminuant l'espace résiduel. L'inconvénient de cette commande concerne les blocs défectueux qui peuvent poser des problèmes. 246 CHAPITRE VIII ────────────────────────────────────────────────────────────── ■ Synopsis dd option=valeur [option=valeur ] [option=valeur] ■ Options if=nom of=nom ibs=n obs=n bs=n cbs=n skip=n count=n conv=ASCII conv=EBCDIC conv=lcase conv=ucase conv=noerror nom du fichier d'entrée, entrée standard par défaut nom du fichier de sortie, sortie standard par défaut nombre d'octets des blocs du fichier d'entrée nombre d'octets des blocs du fichier de sortie nombre d'octets des blocs des fichiers d'entrée et de sortie taille du tampon de conversion copie de n fichiers d'entrée avant la terminaison seek=n saut de n fichiers sur le périphérique de sortie avant écriture effective copie de n enregistrements en entrée seulement conversion EBCDIC vers ASCII conversion ASCII vers EBCDIC conversion de touts les caractères en lettre minuscule conversion de touts les caractères en lettre majuscule conv=bloc conversion d'enregistrement d'un format variable au format fixe pas d'arrêt du processus en cas d'erreur Exemple tar cvfb 20 - . | rsh host_distant dd of=/dev/rmt0 obs=20b ■ Interprétation tar cvfb 20 - . création d'un fichier image tar du répertoire courant, d'une taille de bloc de 20 sur la sortie standard. rsh host_distant dd of=/dev/rmt0 obs=20b exécution distante sur la machine host_distant de la commande dd dont les données seront sur la sortie standard et dont le résultat sera sur le périphérique /dev/rmt0 avec une taille de bloc de 20. La lecture distante de cette bande est réalisée de la façon suivante : rsh -n host_distant dd if=/dev/rmt0 bs=20b | tar xvBfb 20 - 14.4 Autres utilitaires De nombreux autres utilitaires existent tels dcopy (copie d'un système de fichiers avec réorganisation), volcopy (copie d'un volume avec test des labels), backup, filesave ... (utilitaires de sauvegardes adaptables)... Les commandes dump et restore effectuent la sauvegarde d'un système de fichiers et sa restauration à différents niveaux (total, partiel, incrémental...). ■ Label de périphérique La commande labelit effectue la création d'un label de disque. GESTION DES ENTREES/SORTIES 247 ────────────────────────────────────────────────────────────── Synopsis labelit fichier_spécial [système_de_fichiers [volume]] Elle associe le fichier spécial contenant le système de fichiers à un périphérique externe. Le label, utilisé comme identificateur, est constitué de deux parties : • le nom du système de fichier est le label primaire, par exemple le point de montage. • le nom de volume est le label secondaire, par exemple le nom du périphérique. La commande labelit affiche les informations suivantes : fsname volname Blocks Inodes FS units premier champ du label (label primaire), deuxième champ du label (label secondaire), nombre total de blocs (de 512 octets) du système de fichiers, nombre total d'inodes du système de fichiers, nombre de bytes par unité d'allocation (blocs de 8K par exemple). Exemple labelit /dev/rdsk/c2d2s4 home mt0 Current fsname:,home, Current volname:/dev/dsk/c2d2s4, Blocks: 684730, Inodes: 65488 FS Units: 1Kb, Date last modified: Mon Sep 6 17:48:49 1993 14.5 Compression La technique de compression est basée sur l'algorithme de Lempel-Ziv. ■ Commandes disponibles compress (compression), uncompress (décompression), zcat (visualisation d'un fichier compressé), gzip (monde Unix/Linux). Le fichier compressé est suffixé par .Z. ■ Application : fichier image_tar compressé. On peut compresser chaque fichier puis d'exécuter la commande tar (méthode peu performante la compression d'un petit fichier étant peu efficace). L'autre solution est de compresser un fichier image tar unique selon l'algorithme suivant : • création d'un fichier image tar puis compression, • recopie de ce fichier sur le périphérique de sauvegarde. 248 CHAPITRE VIII ────────────────────────────────────────────────────────────── Exemple (tar cvf - . | compress cv) > resu.Z tar cvf /dev/ntape resu.Z ou encore : tar cvf - . | compress cv | tar cvf /dev/ntape La restauration s'effectue de la façon suivante : • restauration du fichier image tar, • décompression et restauration de l'arborescence sur le répertoire courant. Exemple tar xvf /dev/ntape | uncompress cv | tar xvf - ■ Fichier .tar Il est possible de créer un fichier image tar, lui-même image tar de plusieurs fichiers image tar, conventionnellement, suffixés par .tar. Exemple tar cvf /tmp/image1 repertoire_source1 tar cvf /tmp/image2 repertoire_source2 tar cvf image.tar /tmp ■ Gestion des fichiers séquentiels sur support magnétique La commande mt permet de se positionner après l'enregistrement courant. Synopsis : mt [-f fichier] option [compteur] Les options suivantes sont disponibles : eof,weof fsf fsr bsf bsr rewind offline,rewoffl status retension écriture de compteur marques de fin de fichiers sur la bande, avance de n fichiers, avance de n enregistrements, retour de n fichiers, retour de n enregistrements, rembobinage de la bande, rembobinage de la bande et mise hors service, affichage de l'état de la bande, tension de la bande. GESTION DES ENTREES/SORTIES 249 ────────────────────────────────────────────────────────────── 14.6 Exercices ■ Gestion du SGF 1°) Analyser le fichier des descriptions des systèmes des fichiers à monter sur votre système. Analyser en détail les attributs de sécurité (ro, rw, bit s, etc.). 2°) Vous n'êtes pas administrateur. Essayer de démonter ou de monter des systèmes de fichiers au hasard. Idem si vous êtes administrateur. ■ Commande fsck et mkfs 1°) Vous n'êtes pas administrateur. Essayer d'utiliser fsck sur un système de fichiers au hasard, avec le système de fichier monté ou démonté. 2°) Idem quand vous êtes administrateur. 3°) Idem avec la commande mkfs (faites tout de même attention…). ■ Gestion des périphériques et pseudo périphériques 1°) Visualiser les systèmes de fichiers "montés" (commande /etc/mount). 2°) Visualiser les fichiers de paramétrages, par exemple /etc/vfstab, /etc/checklist, /etc/ttys, /etc/gettytab et /etc/termcap. 3°) Ecrire un script utilisant le pseudo-périphérique /dev/tty : ce programme doit afficher une question sur l'écran ("Donner le nom du répertoire ?"), lire la réponse au clavier, puis afficher le résultat de la commande ls dir où dir est la réponse lue. L'objectif est d'utiliser ce programme avec une redirection de la sortie sur un fichier liste tout en conservant sur l'écran l'affichage de la question initiale. ■ Commande tar 1°) Effectuer une sauvegarde de votre répertoire sous /tmp.`logname` où `logname` est votre identificateur de connexion. 2°) Restaurer la sauvegarde d'un de vos voisins dans le dossier tempo (à créer) dans votre répertoire de travail. 3°) A partir de 2 fichiers image_tar, faire un fichier *.tar puis le compresser avec la commande compress (fichier *.tar.Z). 4°) Compresser les 2 fichiers image_tar de la question précédente et fabriquer un fichier *.Z.tar. Comparer sa taille à celui de la question précédente. Conclusion. ■ Commande cpio 1°) Effectuer une sauvegarde sélective (tous les fichiers plus récents qu'un fichier donné) sous /tmp/nom1 en utilisant la commande cpio. 2°) Analyser le contenu de la sauvegarde. 3°) Essayer de sauvegarder des fichiers spéciaux (répertoire /dev). Idem avec la commande tar. Conclusion. CHAPITRE IX QUELQUES MECANISMES INTERNES DE WINDOWS 1. PRESENTATION DU SYSTEME WINDOWS Windows est un système d'exploitation 32 ou 64 bits multitâches, multithreads, multiprocesseurs, commercialisé sur stations (XP, Vista) et serveurs, supportant les architectures matérielles sur 32 ou 64 bits des mondes Intel et AMD, robuste et sécurisé, compatible ascendant avec des applications des systèmes historiques Microsoft (sur 16 ou 32 bits). ■ Particularités de Windows serveur • Services et outils d'administration de réseau. • Administration de domaines (ordinateur, utilisateurs, ressources distribuées, active directory, clients Windows). • Serveur d'applications distribuées et d'applications orientées Internet (Web, etc.). • Intégration avec les environnements LAN Manager, Netware, Unix, Apple, IBM, compatibilité POSIX. • Gestion de l'accès distant. • Fonctionnalités de tolérance de pannes et de sécurité. 2. ARCHITECTURE EN COUCHES FONCTIONNELLES Les couches fonctionnelles du système Windows sont les suivantes : Processus de support système Processus serveur Mode utilisateur Applications utilisateur dll des sous systèmes Exécutif NT Pilotes de périphériques Noyau Couche d'abstraction matérielle (HAL) Mode Noyau Sous systèmes d'environnement Interface graphique Fenêtrage 252 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Processus utilisateur On distingue quatre types de processus utilisateur : • les processus de support système tels le gestionnaire d'ouverture de session, • les processus démarrés par le contrôleur de services tel l'ordonnanceur, • les sous systèmes d'environnement associés à un environnement applicatif donné (OS/2, POSIX, Windows 16 bits, MS/DOS, etc.), • les applicatifs fonctionnant dans un sous système d'environnement donné. ■ Liens dynamiques Une bibliothèque liée dynamiquement (Dynamic Linked Library - dll) est une interface programmatique d'appel (Application Programming Interface - API) d'un service système. 3. MODE UTILISATEUR 3.1 Sous systèmes d'environnement Le mode utilisateur intègre plusieurs environnements applicatifs constitués par différentes machines virtuelles : les sous systèmes d'environnement. Le système Windows gère donc plusieurs familles d'API : • API 64 bits sur Vista et XP, • API 32 bits (interface Win32), 16 bits Windows 3.1x avec l'interface Win16 et MS/DOS , • API OS/2 version 1.2 et POSIX, • L'interface graphique (Graphical Device Interface - GDI). QUELQUES MECANISMES INTERNES DE WINDOWS 253 ────────────────────────────────────────────────────────────── Application Windows 16 bits Process de connexion Application OS/2 Application Windows 32 bits Application POSIX Application DOS Windows sur Win32 Mode utilisateur Sous système sécurité Sous système OS/2 Sous système Posix Machine DOS virtuelle Machine DOS virtuelle Sous système Win32 Exécutif NT ■ Mode Noyau Le sous système Win32 L'identificateur Win32 représente à la fois le nom des API et du sous-système. Serveur commun des différentes API supportées par tous les autres sous-systèmes qui lui sous traitent leur requêtes, il gère les entrées/sorties du mode utilisateur (affichage (interface GDI), clavier, souris). Les applications 32 bits développées pour Windows 9x peuvent ainsi être compatibles. Il est constitué des objets suivants : • le processus csrss.exe (client/server runtime subsystem) assure la gestion de la fenêtre console, la création et la suppression des processus et des threads. • Le pilote win32k.sys, intégré dans l'exécutif, assure la gestion des fenêtres (écran, clavier, souris) et est interfacé avec l'interface graphique. • Des bibliothèques dynamiques essentielles (USER32.dll, GDI32.dll, kernel32.dll). 3.2 Machines virtuelles ■ Win64 Win32 pour 64 bits (précédemment appelée Win64) permet l'exécution d'applications 32 bits dans des environnements Windows 64 bits avec les processeurs Intel Itanium. ■ La machine virtuelle OS/2 Seules, les applications OS/2 16 bits peuvent fonctionner. ■ La machine virtuelle POSIX Des applications de la norme POSIX P1003.1, intégrées pour respecter la conformité du FIPS (Federal Information Processing Standard), appellent des API du soussystème Win32, après lancement du sous-système POSIX (psxss.exe). 254 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ La machine virtuelle MS/DOS Le module NTVDM (NT Virtual DOS Machine) émule une machine virtuelle MS/DOS . Par défaut, le processus NTVDM est multifibres. M achine Dos virtuelle NT (Ntvdm.exe) Ntio.sys Application M S/DOS ■ Pilote de périphériques virtuels Ntdos.sys Pilotes de périphérique 32 bits W indows NT Périphériques La machine virtuelle Windows 16 bits Le module Windows on Win32 (wow) assure la compatibilité d'applications 16 bits. Processus Windows on Win32 (Wow) Sous système Win32 4. Application Windows 16 Noyau 16 bits GDI 16bits USER 16 bits Couche Thunk Couche Thunk Couche Thunk Kernel32.dll GDI32.dll USER32.dll L'EXECUTIF WINDOWS M o d e u tilis ateu r S erv ice s d e l'E x éc utif N T E x é cu tif N T G es tio n d es G es tio n G es tio n ou o b jets d es d e la m ode p roc ess u s M o n iteu r m ém o ire A p p el n o y au d e référe n ce v irtu elle de sé cu rité p roc éd u re lo cale M icro n o y au co u ch e d 'ab stractio n m até rielle C o u ch e m atérielle GDI W in 3 2 W in d o w s G es tio n M an a g er d es en trées so rties P ilo tes G rap h ics D ev ice D riv e rs QUELQUES MECANISMES INTERNES DE WINDOWS 255 ────────────────────────────────────────────────────────────── ■ Gestionnaire d'objets Un gestionnaire d'objets (port d'entrée/sortie, processus, thread, fichier, répertoire, etc.) gère un type de ressources dont l'accès est réalisé au travers : • d'informations de contrôle fournies par le sous système de sécurité, • d'un descripteur d'accès à l'objet (handle) et d'un récepteur d'informations (handler) dans l'objet lui même. ■ Gestionnaire de tâches (ordonnanceur) Le gestionnaire de tâches crée, synchronise, supprime des processus et threads. Il accède donc à la table des processus et peut afficher la liste des applications actives, • la liste des processus actifs et des threads, • certains graphes de performances du système (temps CPU, gestion mémoire, etc.). 256 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Appel de procédure locale L'appel de procédure locale (Local Procedure Call - LPC) est un élément du système de communications (architecture client/serveur) entre processus et threads. Exemple Un processus émet une requête au sous système Win32 par l'intermédiaire d'une bibliothèque liée dynamiquement. Cette dernière utilise le sous système LPC pour la transmettre puis retourner le résultat au processus appelant. ■ Moniteur de sécurité Le moniteur de sécurité (Security Reference Monitor - SRM) gère les accès au système (processus winlogon et lsass) par allocation puis contrôle de jetons d'accès sécurisés (Security Access Token - SAT). ■ Gestionnaire d'entrées/sorties D'architecture modulaire, il gère les opérations d'entrées/sorties, le cache logiciel, les systèmes de fichiers, les pilotes. ■ Micro-noyau Le micro-noyau gère les interruptions et déroutements, les reprises en cas de rupture de l'alimentation électrique, les processus et threads selon un algorithme de multitâches préemptif. Sur les systèmes multiprocesseurs symétriques, une instance du noyau s'exécute en parallèle sur chaque processeur (de 2 à 32). ■ Couche d'abstraction matérielle La couche d'abstraction matérielle (Hardware Abstraction Layer - HAL) est encapsulée dans l'exécutif et implémentée sous forme de bibliothèques liées dynamiquement, constituées des interfaces processeur (Intel, AMD, etc.) et multiprocesseur symétrique (Symmetric Multi Processing - SMP). Le système matériel est ainsi masqué pour rendre le système Windows portable. QUELQUES MECANISMES INTERNES DE WINDOWS 257 ────────────────────────────────────────────────────────────── Architecture de Windows 258 CHAPITRE IX ────────────────────────────────────────────────────────────── 5. SERVICES SYSTEME La table de répartition des services système (System Service Dispatch Table) permet d'y accéder. On distingue les services de l'exécutif implémentés dans le fichier ntoskrnl.exe et les autres services accessibles au travers des bibliothèques dynamiques USER32.dll, GDI32.dll. API du noyau Win32 Application Win32 Application WriteFile WriteFile dans KERNEL32.dll Appel NtWriteFile Retour à la fonction appelante NtWriteFile dans ntdll.dll Int 2E retour à la fonction appelante API USER et GDI Win32 Application Appel USER ou service GDI spécifique Win32 utilisée par tous les sous-systèmes GDI32.dll ou USER32.dll Mode utilisateur Int 2E retour à la fonction appelante spécifique Win32 Mode Noyau Interruption logicielle 6. Interruption logicielle KiSystemService dans ntoskrnl.exe Appel NtWriteFile rejet de l'interruption KiSystemService dans ntoskrnl.exe Appel de routine Win32 rejet de l'interruption NtWriteFile dans ntoskrnl.exe Effectue l'opération Retour à la fonction appelante Point d'entrée de Service dans WIN32K.SYS Réalise l'opération Retour à la fonction appelante ORDONNANCEMENT ■ Généralités sur l'ordonnanceur L'algorithme d'ordonnancement des processus et threads est préemptif. Le thread le plus prioritaire, exécuté éventuellement sur un processeur donné (mécanisme d'affinité du processeur), est celui dont la priorité est la plus élevée. Un quantum est la durée maximale allouée à un thread avant interruption par l'ordonnanceur. Une requête d'interruption d'un thread actif par un thread plus prioritaire est satisfaite immédiatement (principe de préemption). QUELQUES MECANISMES INTERNES DE WINDOWS 259 ────────────────────────────────────────────────────────────── Le répartiteur (dispatcher) gère l'ordonnancement des processus et thread. Il est déclenché par un des événements suivants : • un thread devient activable, • un thread se termine, se met en attente d'un événement, a consommé son quantum de temps, • la priorité d'un thread change, • l'affinité d'un thread actif est modifiée. ■ Niveaux de priorité L'exécutif utilise 32 niveaux de priorité avec la répartition suivante : • 16 niveaux temps réel (16 à 31), • 15 niveaux variables (1 à 15), • le niveau système (0) réservé pour le thread de la page 0. Les priorités sont allouées par l'API Win32 puis par l'exécutif. L'API Win32 ordonnance les processus en fonction de leur priorité initiale (temps réel, haute, normale, oisif (idle) puis selon la priorité respective des threads (time critical, highest, above-normal, normal, below normal, lowest, idle). La priorité des threads (mode noyau) est définie à partir du tableau à double entrée suivant : priorité Win32 des threads time critical highest above normal normal below normal lowest idle priorité des processus (Win32) temps réel haute normale/base 31 15 15 26 15 10 25 14 9 24 13 8 23 12 7 22 11 6 16 1 1 oisif 15 6 5 4 3 2 1 La priorité de base d'un processus commençant son exécution est définie à la ligne normal selon son niveau d'exécution pour chaque classe de priorité. ■ Priorités temps réel Il faut disposer du privilège accroître la priorité d'ordonnancement pour entrer dans la plage temps réel où les interruptions matérielles les plus prioritaires ne peuvent être ni masquées ni bloquées. Toutefois, Windows n'est pas un véritable système temps réel car il ne fournit pas de mécanisme de temps d'attente maximum d'interruption garanti. 260 CHAPITRE IX ────────────────────────────────────────────────────────────── 7. PROCESSUS ET FIBRES 7.1 Processus Un processus est un programme exécutable nommé doté d'un identificateur numérique (process user id - pid), d'un espace d'adressage privé, de ressources (sémaphores, ports de communication, fichiers, fibres (thread), etc.) et des données associées. Il peut gérer plusieurs piles d'exécution et est implémenté sous la forme d’objets accessibles par utilisation des services associés. Il n'y a pas nécessairement de relation de filiation entre processus. QUELQUES MECANISMES INTERNES DE WINDOWS 261 ────────────────────────────────────────────────────────────── ■ Structure de données d'un processus Un espace d'adressage privé (232 ou 264 octets) accessible par des descripteurs d'adressage virtuels (Virtual Address space Descriptor - VAD). Un thread au moins, les descripteurs d'accès aux objets utilisés (fichiers, sémaphores, etc.) ainsi qu'un identificateur de sécurité, un jeton (token) d'accès au processus le contenant et les références des objets utilisés. VAD Objet processus VAD VAD Table des descripteurs objet objet objet Thread En mode utilisateur, le processus Win32 maintient une structure pour chaque processus en complément du bloc d'environnement du processus (Process Environment Bloc - PEB), dans son espace propre. Bloc d'environnement du processus Bloc processus Bloc d'environnement du thread Bloc du processus Win32 Table des canaux d'accès Bloc du thread Dans l'exécutif, le bloc processus (EPROCESS) a la structure suivante : Bloc de processus du noyau (PC B) PID du processus PID du processus créateur Exit status He ure de création et de term inaison Lien vers le processus actif Bloc de quota Inform ations de gestion m ém oire Port d'exception Port de débogueur En tête de répartiteur table des pages E PRO CE SS Temps du noyau Temps utilisateur KTHREAD Spinlock du processus Priorité de base du processus Quantum des threads Etat du processus Valeur initiale du thread Jeton d'accès prim aire T ables des canaux d'accès Liste des périphériques Bloc d'environnem ent du processus Nom du fichier im age Classe de priorité du processus Bloc de processus W in32 262 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Compléments sur les principaux champs Bloc de processus du noyau En tête commune des répartiteurs d'objets, liste des threads du noyau dédiés au processus, priorité de base, quantum, temps cumulé des threads du processus. Bloc de quota Réserves non paginées et paginées du fichier d'échange du processus. Ports d'appel local des procédures d'exception Canal de communication utilisé quand un thread provoque une exception. Port LPC pour débogage Canal de communication utilisé quand un thread provoque l'appel d'un débogueur. Jeton d'accès Objet de l'exécutif décrivant le profil de sécurité du processus. 7.2 Création d'un processus La création d'un processus se déroule selon le schéma suivant : Ouverture du fichier .exe (étape 1) Création de l'objet processus de l'exécutif (étape 2) Création de l'objet thread (étape 3) Notification au sous système Win32 (étape 4) Configuration du nouveau processus et des threads associés Démarrage de l'exécution du thread initial (étape 5) Initialisation de l'image Retour au processus créateur ■ Etape 6 Démarrage de l'exécution Etape 1 : ouverture du processus image La primitive CreateProcess lance le sous système d'environnement associé au contexte d'exécution de l'applicatif à exécuter. c m d .e x e N T V D M .ex e M S - D O S ( * .b a t ) * .c m d W in 1 6 la n c e m e n t d ir e c t W in 3 2 c h a r g e m e n t d e la m a c h in e v ir t u e lle s e l o n le t y p e d 'a p p lic a t io n O S /2 O S 2 .e x e P O S IX p o s ix .e x e M S-D O S ( .c o m , .e x e , .p if ) N T V D M .ex e QUELQUES MECANISMES INTERNES DE WINDOWS 263 ────────────────────────────────────────────────────────────── ■ Etape 2 : création de l'objet processus Configuration du bloc EPROCESS Allocation et initialisation du bloc EPROCESS. Définition des quotas, incrémentation du compteur de références du processus créateur et stockage de son identificateur. Etat du nouveau processus défini par le drapeau STATUS_PENDING. Création d'un jeton d'accès primaire pour le nouveau processus. Allocation mémoire Création des différentes tables des pages. Création du bloc noyau Le bloc KPROCESS contenant des pointeurs vers le répertoire de la table des pages du processus, le temps CPU cumulé des différents threads, la priorité initiale et le quantum par défaut du processus, est initialisé. Configuration du PEB du processus Le bloc d'environnement du processus suivants (interprétation évidente) : est initialisé avec les champs ImageBaseAdresse, NumberOffProcessors, NTGlobalFlag, CriticalSectionTimeout Configuration finale de l'objet processus de l'exécutif Initialisation des canaux d'accès du processus crée (héritage du processus créateur). Positionnement des drapeaux d'exécution et activation éventuelle du débogueur et de l'audit du processus. Commutation en mode utilisateur. ■ Etape 3 : création du thread initial Création du thread initial, de sa pile et de son contexte d'exécution. ■ Etape 4 : notification au sous-système Win32 de la création du processus Notification (kernel32.dll) au sous-système Win32 de la création du nouveau processus avec transmission des canaux d'accès du processus, drapeaux de création, identificateur du processus créateur. Le sous-système Win32 duplique les descripteurs de sécurité, définit la priorité du processus, alloue puis initialise le bloc processus csrss.exe, définit le port d'exception et l'éventuel port de débogage. ■ Etape 5 Démarrage du thread initial. 264 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Etape 6 : initialisation du contexte du processus Modification du niveau d'exécution du processus au niveau APC (Asynchronus Procedure Call). Activation de l'espace de travail (WorkingSpace). Mise en attente d'un APC en mode utilisateur vers le nouveau thread à exécuter en mode utilisateur. Modification du niveau d'exécution du processus au niveau 0 par déclenchement de l'APC. Initialisation du chargeur, du gestionnaire de pages, des tables systèmes et des sections critiques, chargement des bibliothèques liées dynamiquement. Début de l'exécution du processus utilisateur. ■ Priorité La classe de priorité du processus crée est définie selon la stratégie suivante : • La classe par défaut est normal sauf si le processus créateur est oisif ; le processus créé est alors oisif. • Quand une classe de niveau real-time est requise et que le processus ne dispose que de la priorité Increase Scheduling Priority, la priorité effective est high. 7.3 Fibre L'implémentation est statique quand le nombre de threads est déterminé à priori et borné, dynamique si les unités d'exécution sont crées à la demande. La gestion des fibres (appelées processus de poids faible, processus léger, processus poids plume, thread) est intégrée dans l'API Win32 pour supporter les applications (Unix/POSIX) qui les gèrent directement. ■ Implémentation des fibres Le contexte d'exécution d'un thread est constitué des éléments suivants : • registres d'état du processeur et piles d'exécution (noyau et utilisateur), • un segment privé, des bibliothèques (d'exécution et dynamiques), • un identificateur appelé thread id ou client id. Un thread est propriétaire de son contexte d'exécution et peut accéder à la totalité de l'espace mémoire du processus associé. Il ne peut accéder à celui d'un autre processus sauf si la mémoire est partagée (file mapping object). Un thread est représenté par un bloc de thread (ETHREAD) de l'exécutif. Le bloc d'environnement du thread (TEB) est décrit dans l'espace propre du processus associé. Le sous-système Win32 (csrss.exe) maintient aussi une structure parallèle pour chaque thread créé. QUELQUES MECANISMES INTERNES DE WINDOWS 265 ────────────────────────────────────────────────────────────── Bloc de du noyau (KTHREAD) En tête du répartiteur Heure de création du thread Temps cumulé utilisateur PID du processus associé au thread Temps cumulé du noyau structure EPROCESS Adresse de début d'exécution du thread jeton d'accès Information d'usurpation d'identité Information du message LPC attendu par le thread Pile du noyau Table des services système Information d'ordonnancement du thread Cadre de déroutement Tableau de stockage local du thread Information du timer Information de synbchronisation Pointeur vers les requêtes d'entrées/sorties en attente Liste des APC en attente Bloc du timer et bloc d'attente Liste des objets attendu par le thread TEB Structure du bloc de thread de l'exécutif NT Structure du bloc de thread du noyau La structure du TEB (Thread Environment Block) est la suivante : Liste des exceptions Base de la pile Limite de la pile TIB du sous système Information des fibres Identificateur du thread Handle RPC actif PEB (Process Environment Bloc) Champ LastError Liste des sections critiques associées Informations client User32 Informations GDI32 Informations OpenGL Tableau TSL Données WinSock ■ API de gestion des threads CreateThread CreateRemoteThread ExitThread TerminateThread GetExitCodeStatusThread GetThreadTimes Get/SetThreadContext ■ création d'un thread local, création d'un thread dans un autre processus, terminaison normale d'un thread, terminaison simple d'un thread, requête du code de terminaison d'un thread, requête des informations d'ordonnancement d'un autre thread, accès ou modification des registres d'un thread. Graphe d'état des threads Le cycle d'un thread commence à sa création. La requête est transmise à l'exécutif quand le gestionnaire de travaux alloue de l'espace pour un thread et appelle le noyau pour l'initialiser. Après initialisation, le thread passe par les états suivants : 266 CHAPITRE IX ────────────────────────────────────────────────────────────── Prêt Standby Actif thread en attente de sélection par l'ordonnanceur. unique thread en attente d'un processeur donné. thread en cours d'exécution jusqu'à la fin du quantum alloué, sa terminaison, ou jusqu'à préemption pour un thread plus prioritaire. En attente thread en attente d'un objet, système d'exploitation en attente du thread, sous système d'environnement mettant le thread en attente. Quand l'attente se termine, le thread redevient prêt. En transition thread prêt en attente de la disponibilité d'une ressource. Terminé thread ayant terminé son exécution pouvant être détruit ou réinitialisé. Initialisé R éin itia lisa tio n m ise en a tten te d a n s la file "th rea d s p rêts" T e rm in é P rêt o bjet à l'éta t sig n alé resso u rce d isp o n ib le th rea d en a tte nte su r un d escrip teu r d 'o b jet (ha n d le) E x écu tio n term in ée E n a tten te R essource non d ispo n ib le S élec tio nn é p ou r e xécutio n E n tran sitio n p réem pté A ctif p réem pté ou fin d u q ua n tu m d e tem ps M o d e sta nd b y C o m m u ta tio n d e con tex te vers ce thread e t d ém arrag e d e so n exécutio n (a p p el d u disp a tch er) ■ API d'ordonnancement des threads Suspend/ResumeThread Get/SetPriorityClass suspension et reprise de l'exécution d'un thread. demande ou modification de la classe de priorité d'un processus. Get/SetThreadPriority demande ou modification de la priorité d'un thread. Ge/SetProcessAffinityMask demande/modification du masque d'affinité d'un processus. SetThreadAffinityMask définition du masque d'affinité d'un processus. Get/SetThreadPriorityBoost demande/définition de la capacité à rendre un thread plus prioritaire. SetThreadIdealProcessor définition d'un processeur préféré (donc non impératif). SwitchToThread commutation vers un autre thread du processus courant. Sleep requête de mise en sommeil du thread courant. SleepEx requête de mise en attente sur événement (fin d'E/S, attente d'APC, fin du quantum, etc.). QUELQUES MECANISMES INTERNES DE WINDOWS 267 ────────────────────────────────────────────────────────────── 8. OBJETS Un objet de l'exécutif est une instance d'une classe de données typées (attributs) et de services tels l'objet processus. Utilisés pour accomplir les tâches systèmes telles la gestion de l'interface homme machine, le partage des ressources et la protection de leur accès, les objets sont implémentés avec les règles et objectifs suivants : • mécanisme uniforme d'utilisation des ressources système, • isolation des objets pour que certains impératifs de sécurité de niveau C2 soient respectés, • définition d'un schéma d'objet intégrant les objets existants tels les périphériques, les fichiers, les répertoires, etc. • création d'un mode d'utilisation des objets dont un administrateur puisse limiter l'usage, • définition de règles universelles de conservation des objets, • support des API des divers environnements. ■ Utilisation d'un objet L'exécutif utilise deux classes d'objets : • les objets exécutifs, implémentés par divers composants de l'exécutif, accessibles en mode utilisateur. • Les objets du noyau, invisibles en mode utilisateur, habilités à réaliser des tâches essentielles comme l'ordonnancement des travaux. Un objet exécutif peut encapsuler des objets du noyau Exemple d'objets de l'exécutif Identificateur Processus Thread Section Fichier Port Jeton Evénement Paire d'événements Gestionnaire gestionnaire de processus gestionnaire de processus gestionnaire de la mémoire gestionnaire d'entrées/sorties facilités LPC système de sécurité services support de l'exécutif services support de l'exécutif Sémaphore services support de l'exécutif Mutant services support de l'exécutif Horloge Répertoire Lien symbolique Profile Clé services support de l'exécutif gestionnaire d'objet gestionnaire d'objet noyau gestion des configurations Objet représenté appel de programme, ressources associées une entité d'un processus une région de mémoire partagée une instance d'un fichier ouvert processus destinataire d'un message données de sécurité d'un utilisateur connecté notification, synchronisation d'un événement notification d'un envoi de message par un thread au serveur Win32 et vice versa régulation de ressources critiques utilisées par les threads mécanisme d'exclusion mutuelle pour les sous systèmes Win32 et OS/2. horloge interne de gestion des threads conteneur d'objets référence indirecte à un objet fichier mesure des temps d'exécution dans un code clé d'index de référence des enregistrements dans la base interne de Windows 268 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Service d'objet Le sous-système Win32 est également le serveur d'applications Win32. Quand une application appelle une API pour créer (directement ou indirectement) un objet, il appelle le gestionnaire d'objets dont le rôle est le suivant : • allocation mémoire d'un objet donné, • définition et attachement d'un descripteur de sécurité de l'objet qui en spécifie la liste de contrôle d'accès, • création et maintien d'une structure de répertoire stockant les noms des objets, • création d'un canal d'accès à l'objet (handle) et retour au processus demandeur. ■ Canal d'accès à un objet Une requête d'accès à un objet par un thread provoque la création par le processus associé d'un canal d'accès qui en représente l'unique chemin d'accès. Ce concept d'étiquette associée à un descripteur en permet l'accès indirect (encapsulation). Dans l'exécutif, les canaux d'accès aux objets apportent les avantages suivants : • la sémantique d'accès à un objet est universelle, que l'on considère un fichier, un événement, ou un processus. • le gestionnaire d'objets a le droit exclusif de créer puis d'accéder aux canaux d'accès ce qui garantit : ◊ le contrôle d'accès du mode utilisateur, ◊ le suivi permanent de l'accès aux objets. Un canal d'accès à un objet est un index dans la table des objets d'un processus, constituée de pointeurs vers les objets ouverts par ce dernier. Un canal d'accès est crée dans les situations suivantes : • création d'un objet ou ouverture d'un canal vers un objet existant, • héritage d'un canal d'accès, • réception d'un canal dupliqué depuis celui d'un autre processus. La figure suivante illustre la relation entre un processus et sa table d'objets. P r o ce ssu s A ttr ib u ts H é r ita g e T h rea d A canal 1 canal 2 T h rea d B canal 3 F ic h ie r T a b le d e s o b j e t s QUELQUES MECANISMES INTERNES DE WINDOWS 269 ────────────────────────────────────────────────────────────── ■ Structure d'un objet Un objet est caractérisé par son type qui en détermine les données (champs) et les services (méthodes). Il est défini par son en-tête et son corps. Identificateur de l'objet Répertoire d'objets Descripteur de sécurité Liste des quotas Nombre de canaux d'accès ouverts Références à l'objet Objet temporaire/permanent Mode d'utilisation (noyau/user) Pointeur vers les attributs spéciques selon le type d'objet Corps de l'objet ■ En tête de l'objet Attribut Identificateur Répertoire d'objet Descripteur de sécurité Quotas Nombre de canaux ouverts Références à l'objet Objet temporaire/permanent Mode d'utilisation Pointeur d'accès ■ Attributs spécifiques de l'objet type de la classe Nom du type d'objet Types d'accès Drapeau de synchronisation Drapeaux de gestion mémoire Méthodes ouverture, fermeture, suppression parse, sécurité droit de s'enquérir du nom Rôle Accès à l'objet. Structure hiérarchique de stockage d'objets. Liste de contrôle d'accès à l'objet. Quotas d'accès à l'objet. Compteur de canaux d'accès ouverts sur l'objet. Processus ayant ouverts des canaux d'accès à l'objet. Drapeau indiquant si l'identificateur de l'objet et les ressources peuvent être détruit après utilisation. Mode d'utilisation de l'objet. Pointeur vers le type d'objet. Services génériques Le gestionnaire de l'objet offre un ensemble de services génériques (méthodes) opérant sur ses attributs : Services génériques Fermeture Duplication Requête d'objet Requête de sécurité Définition de sécurité Attente d'objet unique Attente sur plusieurs objets ■ Rôle Fermeture d'un canal d'accès. Partage d'un objet par duplication du canal d'accès. Requête d'information sur les attributs de l'objet. Requête d'accès au descripteur de sécurité. Modifications des protections de l'objet. Synchronisation d'exécution d'un thread avec un unique objet. Synchronisation d'exécution d'un thread avec plusieurs objets. Corps de l'objet Le corps et le contenu d'un objet donné sont uniques ce qui permet aux services de l'exécutif d'en contrôler toutes les opérations. 270 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Attributs d'un objet type L'en tête de l'objet contient des données d'un type commun à chaque instance, initialisées avec ses valeurs spécifiques. Les données statiques communes à toutes les instances d'une classe d'objet type sont regroupées dans le champ attributs. Attribut Nom de l'objet type Types d'accès Synchronisation Drapeau de gestion mémoire Méthodes Rôle Identificateur pour les objets de ce type. Type d'accès demandé par un thread lors de l'ouverture d'un canal. Type de synchronisation d'un thread sur ce type d'objet. Autorisation de pagination du thread. méthodes utilisées par le gestionnaire d'objet. Chaque objet est chaîné à l'objet type associé. A ttr ib uts de l'objet type p roce ssu s Processu s Instan ce 1 Processus Instance 2 Processus Instance 3 Les objets types ne sont pas directement accessibles en mode utilisateur. Certains de leurs attributs stockés dans le corps des objets types, décrits ci-dessous, le sont par l'API Win32. Attribut Nom du type d'objet Type de réserve Rôle Identificateur des objets de ce type. drapeau d'allocation de ce type d'objet par le gestionnaire de mémoire paginée. Quota par défaut des réserves Valeur des réserves de pages pour le chargement des processus. Type d'accès Type d'accès autorisé pour un thread lors de la requête d'ouverture d'un canal d'accès à un objet. Association générique/spécifique Association entre les droits d'accès génériques et les droits d'accès spécifiques. Synchronisation Drapeau de synchronisation d'un thread sur cet objet. Méthode(s) Méthode(s) autorisée(s) au gestionnaire d'objet. ■ Identificateur de l'objet Tout objet est nommé et accessible à partir de son identificateur. L'espace de nommage de l'exécutif est global ce qui permet à tout processus d'ouvrir un canal d'accès vers un objet donné pourvu qu'ils soient dotés des droits convenables. QUELQUES MECANISMES INTERNES DE WINDOWS 271 ────────────────────────────────────────────────────────────── ■ Objet "répertoire d'objets" L'objet "répertoire d'objets" permet au gestionnaire d'objets de supporter une structure de nommage hiérarchique analogue au répertoire des systèmes de fichiers POSIX. La figure ci-dessous décrit les caractéristiques de l'objet répertoire d'objets. T y p e d e l' o b j e t O b j e t R é p e r t o ir e A t t r ib u t s L i s t e d e s i d e n t if i c a te u r s d 'o b je ts S e rv ices C r é a t i o n d 'u n r é p e r t o ir e d 'o b j e t s O u v e r t u r e d 'u n r é p e r t o i r e d 'o b j e t s I n f o r m a t i o n s d 'u n r é p e r to i r e d 'o b je ts Exemple 1 : le conteneur \ Répertoire d'objets Type d'objets contenu \NLS \BaseNamedObjects \?? \FileSystem \ObjetTypes \Security \KnownDlls \RPC control \Windows Support du langage national. mutex, événements, sémaphores, horloge. Identificateur des périphériques MS/DOS . Pilotes du système de fichiers et identificateurs associés. Noms de types d'objets. Objets spécifiques au sous système de sécurité. Chemins et dll connues. Objets ports utilisés par les procédures d'appel distante. Ports du sous système Win32 et position des fenêtres. Exemple 2 : le dossier BaseNamedObjets 272 CHAPITRE IX ────────────────────────────────────────────────────────────── ■ Lien symbolique Un lien symbolique (Unix) référence un fichier ou répertoire sans le dupliquer. L'objet lien symbolique, qui réalise une fonction similaire pour les identificateurs d'objets dans leur espace de nommage, a la structure suivante : Type de l'objet Lien symbolique Attributs Chaîne de substitution Date de création Services 9. Création d'un lien symbolique Ouverture d'un lien symbolique Informations d'un lien symbolique MECANISMES DE SYNCHRONISATION 9.1 Système de gestion des déroutements Sous Windows, le gestionnaire des déroutements fonctionne selon le schéma suivant : R é p a r t i te u r d 'i n te r r u p ti o n s R é p a r t i te u r d e s e rv ic e s s y stè m e In te rru p tio n s m a t é r i e l le s e t lo g ic ie lle s In te rru p tio n s d 'a d r e s s e s v i r tu e ll e s ■ G e s t io n d e s i n te r r u p ti o n s S e r v ic e s sy stèm e R é p a r t i te u r d 'e x c e p ti o n s G e s t io n n a i r e d 'e x c e p ti o n s G e s t io n n a i r e d e m é m o i r e v ir tu e l l e Répartiteur des interruptions Le répartiteur d'interruptions détermine son origine et transfère le contrôle à la routine la prenant en compte, externe (Interrupt Service Routine - ISR) ou interne (Noyau). ■ Primitives de traitement La table de répartition des interruptions (Interrupt Dispatch Table - IDT) permet l'accès au programme de traitement de l'interruption, l'IRQL (Interruption Request Level) étant utilisée comme vecteur d'interruption. QUELQUES MECANISMES INTERNES DE WINDOWS 273 ────────────────────────────────────────────────────────────── ■ Priorité Le niveau d'interruption (Interruption Request Level-IRQL) définit la priorité de chaque interruption (0 à 31). Plus il est élevé, plus l'interruption est prioritaire. Alimentation électrique Interruption interprocesseur Horloge Profil Périphériquep ..... Périphérique1 DPC APC ■ Algorithme de prise en compte d'une interruption Emission de l'interruption. Sauvegarde du contexte. Appel du répartiteur d'interruption. Entrée en section critique. Masquage des interruptions de niveau égal ou inférieur. Prise en charge effective de l'interruption. Sortie de la section critique. Restauration du contexte. Démasquage des interruptions masquées. Une interruption de niveau supérieure peut être prise en compte dans cet algorithme ce qui peut entraîner l'apparition de sections critiques imbriquées (mutex). ■ Interruptions logicielles Les interruptions logicielles sont les suivantes : initialisation des threads, gestion de l'ordonnanceur, exécution asynchrone d'une procédure dans un thread, support des entrées/sorties asynchrones. 274 CHAPITRE IX ────────────────────────────────────────────────────────────── 9.2 Synchronisation par appel de procédure ■ Appel différé de procédure Un appel différé de procédure (Differed Procedure Call - DPC) permet la prise en compte différée de situations moins prioritaires que la situation courante comme le réordonnancement des threads ou l'appel d'une procédure par un pilote. Les DPC sont gérés dans une file d'attente par les objets DPC. ■ Appel asynchrone de procédure L'appel asynchrone de procédure (Asynchronous Procedure Call - APC) permet d'exécuter un thread donné dans son contexte d'exécution. Deux classes d'APC sont définies : APC en mode noyau et APC en mode utilisateur. • En mode noyau, un APC est utilisé par les sous systèmes d'environnement ou les pilotes pour interrompre l'exécution du thread et exécuter la procédure demandée. • En mode utilisateur, un APC est utilisé par les API Win32 pour indiquer l'exécution d'une routine à la fin d'une entrée/sortie. Elle est prise en compte lors de la sélection du thread par l'ordonnanceur et mise en attente dans une file spécifique. 9.3 Exceptions Le répartiteur d'exceptions prend en compte les déroutements et exceptions suivants : Violation d'accès mémoire Division par zéro pour les nombres flottants Instruction illégale Erreur de lecture sur une page mémoire Dépassement de capacité pour des flottants Alignement de données incorrect Violation de la page de garde Dépassement de capacité pour les nombres entiers Point d'arrêt du débogueur Mode pas à pas du débogueur Entier divisé par zéro Opérateur réservé aux nombres flottants Instruction privilégiée Quota de fichiers de pagination dépassé Les divers comportements de ces exceptions sont les suivants : • traitement transparent pour le programme applicatif, • retour d'un code à la fonction appelante, • retour au mode utilisateur après filtrage par le noyau pour une prise en compte par un gestionnaire d'exception basé sur le cadre (frame based exception handler). Le terme basé sur le cadre fait référence à l'empilement d'un cadre de pile, associé à un ou plusieurs gestionnaires d'exception, chaque cadre étant associé à un bloc déterminé du programme. Quand une exception se produit, le noyau recherche le gestionnaire associé dans le cadre de pile courant. Une recherche infructueuse provoque l'appel du gestionnaire par défaut. ■ Conséquence d'une exception Une exception, implicite (matériel) ou explicite (logiciel), provoque l'exécution d'une chaîne d'événements dans le noyau, en particulier le transfert du contrôle vers le gestionnaire d'exceptions qui enregistre les causes du déroutement et crée un cadre d'interruption lui permettant de reprendre ultérieurement son exécution. QUELQUES MECANISMES INTERNES DE WINDOWS 275 ────────────────────────────────────────────────────────────── 9.4 Section critique ■ Système monoprocesseur : Les interruptions sont masquées et l'IRQL modifiée. La section critique est exécutée. Les interruptions sont démasquées et l'IRQL modifiée à nouveau. ■ Architecture multiprocesseurs Un verrou sur boucle gère l'accès à une ressource critique et toute autre activité est préemptée pendant l'exécution de la section critique. 9.5 Synchronisations dans l'exécutif ■ Ressources de l'exécutif Ces objets disposent de leurs propres services pour initialiser, verrouiller, libérer les ressources qu'ils contrôlent. Leur accès, uniquement par le noyau, est exclusif en écriture ou partagé en lecture. ■ Répartiteurs d'objets Les (objets) répartiteurs d'objets associés aux processus ou aux threads utilisateurs permettent de synchroniser un thread sur un objet de type processus, événement, sémaphore, structure mutex, etc., et de définir les actions correspondantes. Ils sont accessibles par les primitives de bas niveau WaitForSingleObject et WaitForMultiplesObjects et n'ont pas les limitations des verrous sur boucle. ■ Graphe d'état des threads et des objets associés par un répartiteur d'objets Pour synchroniser l'objet sur les processus et threads, le répartiteur utilise deux drapeaux d'état : celui du thread et celui de l'objet à synchroniser avec ce dernier. Le graphe d'évolution des états du thread selon l'état de l'objet associé est le suivant : Initialisé Terminé Prêt Objet signalé En attente Attente par le thread du descripteur d'objet En cours d'exécution Transition Etats d'attente 276 CHAPITRE IX ────────────────────────────────────────────────────────────── Un thread ne peut poursuivre son exécution tant que son état n'est pas "Prêt". Le changement d'état s'effectue quand l'(es) objet(s) attendu(s) est (sont) signalé(s) (notification de disponibilité) ce qui libère d'éventuels threads en attente. Exemples Requête d'un objet par un thread en mode utilisateur, modification de l'état du thread et mise en attente, déroulement de l'événement, parcourt de la file des threads pour réveil d'un candidat puis réordonnancement. ■ Classes de répartiteur Une classe de répartiteur d'objet gère un type de synchronisation spécifique. Ainsi, la structure mutex gère l'exclusion mutuelle, un sémaphore agit comme une porte de contrôle vers une ressource utilisée par un nombre défini de threads. Les événements sont donc utilisés pour notifier l'exécution d'une action donnée. Type d'objet Processus Thread Notification d'événement Synchronisation d'événement état signalé terminaison du dernier thread terminaison du thread définition de l'événement par le thread définition de l'événement par le thread Sémaphore Compteur Structure mutex Fichier file d'attente vide fin du quantum mutex libéré par le thread fin d'E/S Objets du répartiteur Etat initial Mutex (mode noyau) Mutex (mode user) Sémaphore Effets du changement d'état Etat modifié Effet du chgt d'état Libération du mutex par le thread propriétaire Non signalé Le thread libéré prend possession du mutex Libération du mutex par un thread Non signalé Signalé Le noyau relance un thread en attente Signalé Le noyau relance un thread en attente Le thread libéré prend possession du mutex Libération du sémaphore par un thread Non signalé Un thread prend possession du sémaphore Définition de l'événement par un thread Evénement effet sur threads en attente tous libérés tous libérés tous libérés libération d'un thread ; événement redéfini tous libérés tous libérés libération d'un thread tous libérés Non signalé Signalé Le noyau relance un ou plusieurs threads en attente. Signalé Le noyau relance un ou plusieurs threads en attente. Le noyau relance un ou plusieurs threads Un thread dédié définit un des événements d'une paire. Paire d'événements Non signalé Le noyau relance l'autre thread dédié Signalé Le noyau réveille le thread dédié Signalé Le noyau réveille tous les threads en attente. Terminaison d'un thread Compteur Non signalé . Un thread réinitialise un objet thread. Thread Non signalé Signalé Le noyau réveille tous les threads en attente QUELQUES MECANISMES INTERNES DE WINDOWS 277 ────────────────────────────────────────────────────────────── 9.6 Appel de procédure locale L'appel de procédure locale (Local Procedure Call - LPC) permet à deux processus système d'échanger des messages en mode client-serveur. Exemples Appel de LPC par les RPC, communications entre processus winlogon et serveur d'authentification, ou serveur d'authentification et moniteur de sécurité. Trois modes d'échanges de messages sont implémentés : • Un message d'une taille inférieure à 256 octets utilise un LPC associé à un tampon contenant le message, transféré depuis l'espace privé du processus expéditeur dans l'espace système, puis vers le processus utilisateur destinataire après traitement. • Les messages d'une taille supérieure à 256 octets utilisent une zone de mémoire partagée par les processus émetteur et destinataire qui reçoit une notification d'écriture une fois celle-ci réalisée. • Un serveur peut écrire dans une zone de mémoire partagée par plusieurs clients. Les processus utilisent un unique objet port pour dialoguer et quatre types de ports : • port de connexion serveur nommé : port nommé point de requête de connexion sur lequel les processus clients peuvent se connecter pour dialoguer avec le serveur. • port de communication serveur : port non nommé permettant au processus serveur de dialoguer avec un processus client donné. • port de communication client : port non nommé utilisé par un processus client pour communiquer avec un processus serveur donné. • port de communication non nommé : port non nommé utilisé par deux threads d'un même processus pour communiquer. ■ Algorithme d'allocation d'un port LPC • Requête de création par le serveur d'un objet port de connexion serveur nommé. • Si requête satisfaite, création d'un port de communication client et d'un port de communication serveur puis transmission des canaux d'accès correspondants. File d'attente de messages Processus client Processus serveur Handle Vue de la section (côté client) Handle Port de communication serveur Port de communication client Handle Vue de la section (coté serveur) Section partagée 278 CHAPITRE IX ────────────────────────────────────────────────────────────── Exercice A partir de l'analyseur de performances, afficher et interpréter les courbes suivantes : Système/Temps total partagé, Système/Temps total de l'utilisateur, Processeur/Temps privilégié Processeur/Temps utilisateur, Processus/Temps utilisateur, Thread/temps utilisateur. 10. SECURITE Windows est doté de mécanismes de sécurité qui le rendent beaucoup plus stable et sécurisé que ses ancêtres MS/DOS ou Windows 9x. Les principaux constituants du mécanisme de sécurité de Windows sont les suivants : • système d'exploitation multitâches et multiprocesseurs, • gestion de fichiers fiable et robuste, • gestion sécurisé des utilisateurs et des groupes, • gestion d'attributs de sécurité sur les fichiers. 10.1 Services généraux ■ Ouverture de session Toute ouverture de session nécessite l'authentification de l'utilisateur : identificateur, mot de passe. L'administrateur peut définir une stratégie de gestion des mots de passe (mécanisme d'aging). ■ Contrôle d'accès discrétionnaire Tout propriétaire d'une ressource peut définir des droits d'accès à cette dernière. ■ Audit Un mécanisme d'audit de sécurité permet de définir des événements à auditer. ■ Protection mémoire Le gestionnaire de la mémoire définit des accès privés à la mémoire. 10.2 Composants du système de sécurité ■ Moniteur de référence de sécurité (Security Reference Monitor - SRM) Ce sous système de l'exécutif (ntoskrnl.exe) assure la vérification de l'accès de sécurité sur les objets par définition ou modification des privilèges associés. QUELQUES MECANISMES INTERNES DE WINDOWS 279 ────────────────────────────────────────────────────────────── ■ Serveur d'autorité de la sécurité locale (Local Security Authority server - LSA) Le processus lsass gère la stratégie locale de sécurité du système à savoir : • la liste des utilisateurs et la stratégie des mots de passe, • la liste des privilèges accordés aux utilisateurs et aux groupes, • la configuration de l'audit de sécurité. ■ Base de données de la stratégie Cette base de données est définie dans la base de registres à la clé : HKEY_LOCAL_MACHINES\Security. Elle contient les paramètres de la stratégie du système de sécurité : • liste des domaines sécurisés permettant de réaliser les ouvertures de session, • liste des utilisateurs autorisés et mode d'accès (local, réseau, ou services), • liste des utilisateurs ayant reçu des privilèges et les audits à réaliser. ■ Serveur du gestionnaire des comptes de sécurité (SAM server) Le système de gestion des utilisateurs est accessible dans la base de registres : HKEY_LOCAL_MACHINE\SAM La bibliothèque de liens dynamiques MSV1_0.dll, qui vérifie le nom de l'utilisateur et son mot de passe, est appelée par le processus lsass. ■ Processus d'ouverture de session Le processus (client) winlogon.exe saisie nom et mot de passe pour transmission au service LSA qui les vérifie puis crée le processus initial d'ouverture de session. Le service d'ouverture de session sur le réseau est appelé par le processus services. L'authentification est ensuite gérée par le processus lsass. lsass.exe Enregistreur du journal d'événements winlogon.exe Stratégie LSA Mode utilisateur Serveur LSA Serveur SAM SAM MSV1_0.DLL Mode Noyau Exécutif NT Gestionnaire d'E/S Gestionnaire de cache Système de fichiers Pilotes de périphériques Moniteur de référence de sécurité (SRM) Processus et thread Mémoire virtuelle Gestionnaire d'objets / RTL de l'Exécutif Couche HAL (abstraction matérielle) Noyau 280 CHAPITRE IX ────────────────────────────────────────────────────────────── 10.3 Protection des objets ■ Objets Les objets suivants ont des attributs de protection : fichiers, périphériques, tubes nommés et anonymes, processus et threads, événements, mutex et sémaphores, compteurs, jetons d'accès, bureaux, partages en réseau, services, clés de la base de registres, imprimantes. Le gestionnaire d'objets assure donc les contrôles de sécurité, en liaison avec le moniteur de sécurité. ■ Descripteurs de sécurité et contrôle d'accès Un descripteur de sécurité comporte les attributs suivants : • SIDs du propriétaire et du groupe principal d'appartenance à l'objet, • liste de contrôle d'accès discrétionnaire (Discretionary Access Control List - DACL) qui définit les opérations et la liste des utilisateurs autorisés et liste de contrôle d'accès système (System Access Control List - SACL) qui spécifie les opérations pour lesquelles les utilisateurs doivent être connectés. 10.4 Jetons d'accès et usurpation d'identité Un jeton d'accès est une structure de données contenant l'identification de sécurité d'un processus ou d'un thread à savoir son identificateur de sécurité SID, ses groupes d'appartenance, la liste des privilèges (activés ou désactivés). Le gestionnaire d'objet alloue le jeton d'accès en mode noyau, sur lequel pointe le bloc de processus de l'exécutif ou le bloc de threads comme l'illustre l'exemple ci-dessous. Exemple Les boutons Token et Thread sont désactivés le thread sélectionné n'ayant pas de jeton à cet effet. QUELQUES MECANISMES INTERNES DE WINDOWS 281 ────────────────────────────────────────────────────────────── ■ Jeton d'accès d'un processus et d'un thread Tout processus a un jeton d'accès hérité de son créateur le jeton initial étant délivré par le processus winlogon.exe. Par défaut, un thread utilise le jeton d'accès du processus associé. Un thread serveur s'exécute donc avec les droits de l'administrateur. Quand il exécute des requêtes d'un client, il utilise les droits de ce dernier dont il usurpe l'identité. Un client peut limiter cette usurpation en spécifiant la qualité de sécurité du service à sa connexion. ■ Graphe de l'audit de sécurité Sous système protégé Authentification SAM LSA Enregistreur du journal d'événements Journal Audit LSA Serveur Win32 Appel au services système d'audit LPC stratégie d'audit LPC Enregistrement d'audit Moniteur de référence de sécurité (SRM) Gestionnaire d'Objets NTFS Base de registres Gestionnaire de processus etc. 11. SYSTEME DE GESTION DES ENTREES/SORTIES Le système de gestion des entrées/sorties, composant de l'exécutif, utilise les concepts de fichier virtuel, flot d'entrées/sorties, API de haut niveau (utilisateur), API de bas niveau (noyau). Il est architecturé en couches selon le modèle suivant : API du sous système Gestionnaire d'entrées/sorties Primitives de support du pilote Pilote de périphérique en mode noyau Primitives de bas niveau d'E/S d'accès à la HAL Ports et registres d'entrées/sorties 282 CHAPITRE IX ────────────────────────────────────────────────────────────── Les couches ont les fonctions suivantes : • L'API du système d'entrées/sorties constitue les services système internes de l'exécutif, appelé par les bibliothèques dynamiques. • Le gestionnaire d'entrées/sorties assure le traitement des services requis par le gestionnaire d'entrées/sorties. • Les pilotes traduisent les requêtes d'entrées/sorties sur les périphériques virtuels sur des requêtes d'entrées/sorties sur des périphériques réels. • Les primitives de support de périphérique sont appelées par les pilotes pour exécuter l'entrée/sortie. • Les primitives d'accès à la couche d'abstraction matérielle en masquent les variations aux pilotes. ■ Fonction du gestionnaire d'entrées/sorties Les requêtes d'entrées/sorties sont pour la plupart présentées sous forme de paquets d'entrées/sorties (Input Output Request Packet - IRP) pour contrôler leur exécution. Le gestionnaire d'entrées/sorties fournit aussi des services flexibles permettant aux sous systèmes d'environnement tels POSIX d'implémenter leurs primitives spécifiques. Il gère également : • les entrées/sorties asynchrones pour désynchroniser les opérations d'entrées/sorties logiques des opérations d'entrées/sorties physiques et les entrées/sorties de type disperser/rassembler (scatter/gather) qui réalisent une opération unique à partir de différents tampons du cache, • les entrées/sorties rapides, gérées directement sans utilisation d'IRP, • la gestion directe des fichiers en mémoire. 11.1 Système de fichiers Deux types de systèmes de fichiers sont supportés sous Windows : FAT et NTFS. ■ Systèmes de fichiers FAT (file allocation table) Compatibilité historique (MS/DOS , Windows 3.x, Windows 9x (FAT16 et FAT32)), performances médiocres, taille maximale d'un fichier de 2 Go, identificateur de fichiers conforme au standard 8.3 (suffixe conventionnel sur 3 caractères), pas de protection sérieuse. Equivalence entre noms traditionnels MS/DOS et format long maintenue. Lettres majuscules et minuscules considérées comme différentes (norme POSIX). Toutefois, toto.txt et TOTO.txt sont identiques. QUELQUES MECANISMES INTERNES DE WINDOWS 283 ────────────────────────────────────────────────────────────── ■ Systèmes de fichiers NTFS Les systèmes de fichiers NTFS sont robustes et sécurisés : • Identificateurs de fichiers d'au plus 255 caractères alphanumériques. • Prise en charge de la correction de blocs défectueux, gestion des attributs de sécurité, audit et journalisation. • Gestion de la fragmentation et bonnes performances. La commande convert transforme un système de fichiers FAT en un système de fichiers NTFS. Cette transformation est irréversible. ■ Architecture de NTFS L'architecture du système de fichiers NTFS est modulaire. Le pilote NTFS utilise le pilote des systèmes à tolérance de panne qui appelle le pilote du disque (principe de l'encapsulation). Il interagit avec le service de journalisation, qui maintient le journal des écritures sur le disque, le gestionnaire du cache et le gestionnaire de la mémoire virtuelle. Service de journalisation Vidage du journal Ecriture dans le cache Rapport de la transaction dans un journal Gestionnaire d'E/S Pilote NTFS Pilote à tolérance de panne Lecture/écriture du fichier Chargement des données en mémoire Gestionnaire du cache Pilote de disque Accès au fichier en mémoire ou vidage du cache Gestionnaire de mémoire virtuelle Les tables systèmes sont utilisées pour un accès disque selon le schéma suivant : Processus Table des canaux d'accès (handles) Table des fichiers Objet fichier Bloc de contrôle du fichier Objet fichier Attribut des données Attributs définis par l'utilisateur 284 CHAPITRE IX ────────────────────────────────────────────────────────────── 11.2 Pilotes On distingue les pilotes suivants : ■ Pilotes de périphériques virtuels Ils sont utilisés pour émuler les applications 16 bits MS/DOS et appellent les pilotes de périphérique réels en mode noyau. ■ Pilotes d'affichage et d'impression Ces pilotes traduisent les requêtes de l'interface GDI en requête spécifique du périphérique. Les pilotes d'affichage appellent les pilotes miniports vidéo. ■ Pilotes en mode noyau On distingue les pilotes suivants : • Pilote de périphériques matériels de bas niveau. • Pilote d'une classe de périphérique donnée (lecteurs de CDROM, disques IDE ou SCSI, Dat, etc.). • Pilote de port d'entrées/sorties (ports SCSI). • Pilote de miniport qui transfèrent une requête d'entrées/sorties à un type de port vers un adaptateur donné (SCSI, Ultra SCSI, etc.). • Pilote des systèmes de fichiers qui convertissent les requêtes d'entrées/sorties en appels de pilotes. • Pilote filtrant d'interception de certaines requêtes pour effectuer un traitement particulier. Application MS/DOS ou Win16 Appel GDI Application Win32 VDM Pilote de périphérique virtuel DLL de l'API Win32 Mode utilisateur Mode noyau Services de l'exécutif NT GDI (moteur graphique) Appels ReadFile WriteFile Sous-système Win32 (Win32K.SYS) Pilote Pilote d'affichage d'imprimante Spooler Exécutif et noyau Pilote de port vidéo Pilote de périphérique en mode noyau éventuellement spécifique à l'application Pilote de périphérique en mode noyau KDD Miniport vidéo KDD Port parallèle QUELQUES MECANISMES INTERNES DE WINDOWS 285 ────────────────────────────────────────────────────────────── ■ Schéma de l'architecture des pilotes Interface du système d'entrées/sorties Système de fichier des CDROM Pilote de la classe des CDROM FAT NTFS Pilote de la classe des lecteurs de bande Pilote de la classe des disques miroirs Pilote de port ■ Pilote de la classe des disques Pilote miniport Primitives d'un pilote • Initialisation du pilote à son chargement et création des objets nécessaires à l'exécution de l'entrée/sortie. • Choix des primitives : ouverture, lecture, fermeture d'un fichier, etc. • Initialisation du transfert de données entre le périphérique et l'unité centrale. • Prise en charge d'interruption (Interrupt Service Routine - ISR) par mise en attente d'un appel différé de procédure. • Notification au système de fichiers du succès ou de l'échec d'une entrée/sortie. • Annulation d'opération. • Déchargement du pilote et restitution des ressources utilisées. • Action à exécuter lors de l'arrêt du système. • Gestion des erreurs. • Synchronisation. • Gestion des sections critiques en écriture ou en lecture (verrous sur les architectures monoprocesseurs et spinlock sur les architectures multiprocesseurs.). 286 CHAPITRE IX ────────────────────────────────────────────────────────────── 11.3 L'administrateur de disques ■ Partitionnement Une partition principale permet le démarrage (boot). Limitées à 4 sur un disque dur. Une partition étendue est destinée à contenir des disques logiques ou d'autres systèmes d'exploitation (Unix, Linux, etc.). Ainsi, un disque physique peut contenir plusieurs disques logiques (d:, e:, etc.). ■ Convention ARC Le nom des partitions respectent la dénomination ARC (Advanced Risc Computer), par exemple dans le fichier boot.ini. MULTI(x)disk(0)rdisk(z)partition(n) SCSI(x)disk(y)rdisk(0)partition(n) contrôleur IDE ou SCSI (BIOS actif) BIOS du contrôleur SCSI inactif Interprétation SCSI(x) ou MULTI(x) x désigne le numéro du contrôleur disk(y) id SCSI du disque sur le contrôleur SCSI (toujours 0 pour les contrôleurs en mode MULTI) rdisk(z) toujours 0 sur les contrôleurs SCSI, numéro du disque sur le contrôleur en mode MULTI (0 pour le premier disque IDE, 1 pour l'éventuel deuxième disque IDE), id SCSI arbitraire pour les disques SCSI. partition(n) numéro de la partition (1 à 4). ■ Création des disques logiques Une fois le partitionnement réalisé, les différents disques logiques ou systèmes de fichiers sont créés. QUELQUES MECANISMES INTERNES DE WINDOWS 287 ────────────────────────────────────────────────────────────── ■ Réorganisation des disques et réparations Il est possible de réorganiser, compresser, modifier l'organisation interne des fichiers et répertoires sur chaque disque logique. Certains fichiers, certains répertoires peuvent devenir inaccessibles, soit pour des raisons matérielles (par exemple un secteur devenu défectueux), soit pour des raisons internes (tables d'allocation des fichiers inconsistante). Des utilitaires permettent d'y remédier (accès au bit, au secteur, etc.). 11.4 Dossiers systèmes Windows ■ Documents and Settings Dossiers contenant les profils et les bureaux des utilisateurs, les raccourcis vers les menus de démarrage que l'administrateur où l'utilisateur peut personnaliser. Les principes sont les suivants. Dossiers communs et dossiers personnalisés Deux types de dossiers sont accessibles : les dossiers communs (à tous les utilisateurs) et les dossiers personnels. Tout utilisateur a, par défaut, un profil. 288 CHAPITRE IX ────────────────────────────────────────────────────────────── Le bureau Le bureau d'un utilisateur donné est constitué du répertoire C:\Documents and Settings\ nom_utilisateur\Bureau Son menu Démarrer est accessible à partir du chemin C:\Documents and Settings\ nom_utilisateur \Menu Démarrer ■ Program Files Dossier contenant les dossiers systèmes et quelquefois les données de chaque application installée. ■ Windows C'est le dossier contenant les dossiers d'administration (mises à jour de Windows), gestion des périphériques (dossier INF) 12. LA BASE DE REGISTRES (REGISTRY) La base de registres contient les données essentielles de la configuration matérielle et/ou logicielle du poste de travail et permet l'accès ou la modification de tous les paramètres du système Windows. Un registre est similaire dans son concept à un fichier de configuration. Il accessible directement avec un éditeur de registres (regedit ou regedt32). ■ Des fichiers .ini de Windows 3.x à la base de registre La base de registres est apparue avec Windows 3.x. Elle est alors très restreinte et sert exclusivement à associer un fichier ou une extension de fichier avec une application pour l'éditer ou le visualiser. En 1993, elle est étendue et comprend un ensemble de clés hiérarchiques et de valeurs (Windows NT). Sa sauvegarde est appelée ruche (hive). La base de registre est reprise dans Windows 95 et remplace la plupart des fichiers d'extension .ini. ■ De SAM à Active Directory Sous Windows NT, le gestionnaire SAM (Security Account Manager) contient les mots de passe, remplacé depuis Windows 2000 par Active Directory. ■ L'utilitaire syskey L'utilitaire syskey renforce le cryptage des mots de passe. Il est toujours valide. QUELQUES MECANISMES INTERNES DE WINDOWS 289 ────────────────────────────────────────────────────────────── 12.1 Répertoires de la base de registre Sous Windows XP et Serveur, le répertoire %SystemRoot%\System32\Config stocke les fichiers des ruches suivantes : SAM (Security Account Manager) Security Software System ■ Gestion des utilisateurs Les informations relatives à un utilisateur sont stockées dans le répertoire correspondant à la variable d'environnement %UserProfile%. Il y a une ruche NTUSER.DAT par utilisateur. Exemple Pour l'utilisateur dont le login est "dupont", la valeur %UserProfile% est par défaut "C:\Documents and settings\dupont". ■ Sauvegarde Le répertoire %SystemRoot%\repair contient une sauvegarde de la base de registre ainsi que le répertoire \System Volume Information du disque système. Des journaux (extension .LOG) et des fichiers de sauvegarde (extension .SAV) sont utilisés pour pallier à toute forme d'arrêt brutal. ■ Démarrage Les emplacements des ruches utilisées lors du dernier démarrage sont indiqués sous la clé hivelist de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\. Exemple du contenu de hivelist : \\REGISTRY\\MACHINE\\HARDWARE"=" \\REGISTRY\\MACHINE\\SECURITY"="\\Device\\HarddiskVolume1\\WINDOWS\\system32\\config\\SECURITY \\REGISTRY\\MACHINE\\SOFTWARE"="\\Device\\HarddiskVolume1\\WINDOWS\\system32\\config\\software \\REGISTRY\\MACHINE\\SYSTEM"="\\Device\\HarddiskVolume1\\WINDOWS\\system32\\config\\system \\REGISTRY\\USER\\.DEFAULT"="\\Device\\HarddiskVolume1\\WINDOWS\\system32\\config\\default \\REGISTRY\\MACHINE\\SAM"="\\Device\\HarddiskVolume1\\WINDOWS\\system32\\config\\SAM \\REGISTRY\\USER\\S-1-5-20"="\\Device\\HarddiskVolume1\\Documents and Settings\\NetworkService\\NTUSER.DAT \\REGISTRY\\USER\\S-1-5-20_Classes"="\\Device\\HarddiskVolume1\\Documents and Settings\\NetworkService\\Local Settings\\Application Data\\Microsoft\\Windows\\UsrClass.dat \\REGISTRY\\USER\\S-1-5-19"="\\Device\\HarddiskVolume1\\Documents and Settings\\LocalService\\NTUSER.DAT \\REGISTRY\\USER\\S-1-5-19_Classes"="\\Device\\HarddiskVolume1\\Documents and Settings\\LocalService\\Local Settings\\Application Data\\Microsoft\\Windows\\UsrClass.dat \\REGISTRY\\USER\\S-1-5-21-123456789-1234567890-123456789-500"="\\Device\\HarddiskVolume1\\Documents and Settings\\Administrateur\\ntuser.dat \\REGISTRY\\USER\\S-1-5-21-123456789-1234567890-123456789-500_Classes"="\\Device\\HarddiskVolume1\\Documents and Settings\\Administrateur\\Local Settings\\Application Data\\Microsoft\\Windows\\UsrClass.dat 290 CHAPITRE IX ────────────────────────────────────────────────────────────── 12.2 L'éditeur de registres L'interface permet de modifier les clés de la base de registre. ■ Les gestionnaires de clé La base de registre est partagée en sections logiques dont les noms commencent par HKEY, abréviation de Handle to a KEY, gestionnaire de clé. Cinq fenêtres, chacune associée à une ruche, apparaissent avec les fonctions suivantes : HKEY_CLASSES_ROOT (HKCR) Contient les associations des types de fichiers (extensions) avec des applications, des données de configuration des fichiers .com, des identifiants de classe d'objet OLE ce qui permet de lancer automatiquement l'exécutable correspondant et d'assurer la compatibilité historique avec les systèmes Windows. On y retrouve les classes du sous arbre HKEY_LOCAL_MACHINE\SOFTWARE. Ces associations peuvent être modifiées par l'explorateur ou le gestionnaire de fichiers. Exemple Les suffixes .bat et XML sont respectivement associés à batfile et XML script engine. HKEY_CURRENT_CONFIG Paramètres spécifiques à la configuration courante mis à jour en temps réel et régénérés à chaque démarrage. On y retrouve les classes du sous arbre : HKEY_LOCAL_MACHINE\SOFTWARE\SYSTEM. QUELQUES MECANISMES INTERNES DE WINDOWS 291 ────────────────────────────────────────────────────────────── HKEY_CURRENT_USER Paramètres de configuration liés à l'environnement de l'utilisateur actif. Ce n'est qu'une sous-branche de HKEY_USERS. HKEY_LOCAL_MACHINE (HKLM) Paramètres de configuration des périphériques, des pilotes, du système d'exploitation, de la sécurité et de la base des comptes communs à l'ensemble des utilisateurs. • La sous clé Hardware décrit le matériel. Elle est reconstruite à chaque démarrage. • La sous clé DeviceMap contient les entrées des pilotes. • La sous clé ResourceMap associé chaque périphérique à ses ressources (IRQ, DMA, adresse d'entrée/sortie, etc.). • La sous clé SAM contient les informations de sécurité. • La sous clé Software contient les paramètres des programmes spécifiques installés dans l'arbre HKEY_CLASSES_ROOT. HKEYS_USERS Contient les informations spécifiques à chaque utilisateur. La sous-branche correspondant à l'utilisateur courant est la branche HKEY_CURRENT_USER. Les deux fenêtres ci-après n'apparaîssent pas. HKEY_PERFORMANCE_DATA Générée dynamiquement sans affichage. HKEY_DYN_DATA Générée dynamiquement sans affichage. ■ Définition des clés de la base de registres Le kit de ressources contient le fichier regentry.hlp, qui décrit la signification de la plupart des clés de la base de registres dont chaque clé contient des valeurs typées dont il existe une quinzaine de types. Binaire REG_BINARY Entier DWORD REG_DWORD (32 bits) REG_DWORD_BIG_ENDIAN REG_DWORD_LITTLE_ENDIAN QWORD REG_QWORD (64 bits) REG_QWORD_BIG_ENDIAN REG_QWORD_LITTLE_ENDIAN Chaîne de caractères Chaîne simple REG_SZ Chaîne extensible REG_EXPAND_SZ Chaîne multiple REG_MULTI_SZ 292 CHAPITRE IX ────────────────────────────────────────────────────────────── Donnée non typée NONE, REG_NONE Ressource REG_RESOURCE_LIST REG_RESOURCE_REQUIREMENTS_LIST REG_FULL_RESOURCE_DESCRIPTOR REG_LINK Guid Des clés et valeurs de clés sont affichées sous le format Globally Unique Identifier - Guid sur 16 octets. Exemple 3F2504E0-4F89-11D3-9A0C-0305E82C3301 Minuscule et majuscule Contrairement à l'usage sous Windows, la casse est respectée. Espace dans les noms de clés Le caractère d'espacement peut être utilisé dans les noms de clés. Exemple : la clé Use Search Asst ■ Remarques sur la sécurité Le service "Accès à distance au Registre" (RemoteRegistry) permet de lire et modifier la base de registre à distance. Pour des raisons de sécurité, il est donc prudent de le désactiver lancé par la commande "svchost.exe -k LocalService" (Processus Service HOST pour l'utilisateur local). ■ Maintenance de la base de registre L'absence de la base de registres empêche le système de fonctionner. Ses entrées erronées doivent être nettoyées. Une sauvegarde de la base de registre à un instant donné s'appelle un point de restauration. Windows en effectue régulièrement ce qui permet de revenir à la configuration sauvegardée par le point de restauration. Ces derniers sont stockés dans le répertoire System Volume Information. Des utilitaires tels regedit ou rstrui permettent de revenir à un point de restauration, par exemple lors du démarrage en mode sans échec. Si le problème est bloquant (le démarrage ne s'effectue pas dans sa totalité), l'utilisateur peut revenir à la dernière configuration connue. CHAPITRE X L'ADMINISTRATION ET SES OUTILS L'administration est une tâche complexe nécessitant de solides compétences techniques (système, réseau, bases de données). L'administrateur devant gérer des systèmes hétérogènes, il doit connaître la philosophie du fonctionnement du système plus que le détail fastidieux des commandes. Il dispose de commandes (mode texte) ou d'interfaces graphiques, propriétaires ou du domaine public telle Webmin. 1. L'ADMINISTRATION ET LA SECURITE 1.1 Services et outils d'administration L'administrateur d'un système d'informations assure les services suivants : • Connaissance des outils standards d'administration pour mise en place des services systèmes et réseau, génération système, optimisation des performances, évolutions du système d'information sur les plans matériel et logiciel. • Mise en place d'outils d'analyse et comptables, de procédures de surveillance. • Gestion des utilisateurs (ajout, suppression, aide et documentation). • Gestion des systèmes de fichiers (cohérence, suivi du fonctionnement, procédures de nettoyage, de sauvegarde, d'installation et maintenance) et mise en place d'un système sécurisé (système, données, tolérance de pannes, etc.). Les outils de base sont des utilitaires spécifiques d'installation de logiciels ou de génération système. Les commandes d'administration normalisées constituent les outils standards des systèmes actuels, dotés de nombreux et solides outils d'administration qui assurent tous les services précédemment décrits à partir de commandes d'administration, des répertoires spécifiques, des processus spécialisés. Les outils constructeurs, dont l'utilisation peut être impérative, sont spécifiques à chacun et permettent d'effectuer les tâches usuelles d'administration. Ils masquent les problèmes sous jacents et permettent d'assurer la gestion quotidienne sans avoir les compétences d'un administrateur professionnel. En cas de problèmes imprévus, l'utilisateur néophyte risque de ne pas savoir comment le résoudre. Exemples SAM ou SMH (HP-UX), SMIT (AIX), Linuxconf, KDE, Gnome (Linux). 294 CHAPITRE X ────────────────────────────────────────────────────────────── ■ Le carnet de bord Les informations du carnet de bord sont les suivantes : Procédures spécifiques à un site donné Matériel ou logiciel spécifiques nécessitant une procédure particulière. Messages d'avertissement à notifier aux utilisateurs lors de l'indisponibilité d'une ressource distribuée telle une base de données. Gestionnaires locaux de services réguliers d'archivage : utilisation, labellisation. Configuration du système Paramètres spécifiques d'une installation donnée. Journaux Enregistrement des modifications de l'installation (matériel et logiciels), enregistrement des raisons des arrêts, de la maintenance, journal des erreurs ou activités inhabituelles. Procédures spécifiques à un site donné Démarrage et arrêt, sauvegarde des données, procédures d'urgence, configuration du système et numéro de série. Etat du système Description des modifications du système en indiquant les auteurs et les causes, raisons des démarrages et arrêts des divers services, heures et type des sauvegardes. 1.2 Administration sécurisée L'administrateur a un rôle déterminant dans la mise en place d'un politique de sécurité qui ne s'improvise pas, les contraintes de sécurité augmentant dans un réseau les contrôles des accès distants s'ajoutant aux contraintes locales. Sont définies dans le présent paragraphe les notions élémentaires d'administration sécurisée d'un poste de travail (gestion des utilisateurs, installation, etc.). Les commandes présentées sont issues du monde Unix/Linux. On retrouve bien évidemment ces concepts dans les systèmes Windows Serveurs. ■ Environnement des utilisateurs L'environnement (profil) des utilisateurs doit être prévu de telle sorte qu'il puisse travailler sans être gêné ce qui nécessite un travail d'administration préalable les utilisateurs n'étant en général pas des informaticiens et ne souhaitant pas le devenir. Un utilisateur doit être verrouillé dans son application. ■ Surveillance du fonctionnement Un contrôle périodique de toute station est recommandé pour détecter d'éventuelles incohérences de fonctionnement. La mise en place d'audit peut être utile. L'ADMINISTRATION ET SES OUTILS 295 ────────────────────────────────────────────────────────────── ■ Organisation et réorganisation des données L'organisation des données sur différents disques et systèmes de fichiers est souhaitable. Une réorganisation périodique des systèmes de fichiers, par exemple mensuelle, permet d'optimiser le fonctionnement général du système. ■ Sauvegarde Il faut toujours avoir des (bonnes) sauvegardes du système complet pour pouvoir le restaurer rapidement (cartouche (DAT, DLT), disque dur amovible, système à tolérance de panne, système RAID, etc.). 1.3 Techniques d'attaque ■ Cheval de Troie Un cheval de Troie est un programme qui, sous l'apparence d'un programme normal, permet à un pirate de pénétrer dans le système comme un script d'un répertoire public se comportant d'une façon similaire à une commande demandant un mot de passe et faisant ensuite croire à celui qui l'a lancée qu'il a commis une faute de frappe. Le mot de passe est "volé" par le cheval de Troie qui s'autodétruit ensuite ce qui permet à la commande réitérée de fonctionner correctement. Une façon simple de se protéger est de supprimer le répertoire . de la variable PATH ou de le déplacer à sa droite. ■ Virus Un virus est un programme à deux fonctions : reproduction et sabotage par utilisation d'une faille de sécurité du système. Son principe de fonctionnement est le suivant : • pénétration dans le système suite à l'utilisation d'un objet infecté (CD, clé USB, accès internet, courriel, etc.) ou suite à une prise de contrôle externe utilisant une faille du système d'exploitation. • Infection de tout applicatif lors de son lancement par modification de son code ce qui provoque une utilisation ultérieure défectueuse et la reproduction du virus. Tout virus laisse une signature qui permet de l'identifier et de désinfecter le code malade si l'infection est détectée suffisamment rapidement. ■ Bombe logique Une bombe logique est un programme camouflé dont le déclenchement différé exécute une action néfaste telle le formatage d'un disque après prise de contrôle. ■ Ver Un ver est un programme qui se reproduit en exécutant une action néfaste. Contrairement au virus, il ne requiert aucune intervention extérieure. Il est autonome et capable de se déplacer dans un réseau. Le ver de l'Internet (1988), déclenché "accidentellement" par un étudiant l'a paralysé pendant 48 h. 296 CHAPITRE X ────────────────────────────────────────────────────────────── 1.4 Prévention des attaques Les principes élémentaires pour se prémunir des virus sont les suivant : ■ Principe de précaution Tout objet téléchargé est contrôlé par un logiciel de recherche et d'éradication des virus (Avast, MacAffe, Norton, Kaspersky, etc.), bien évidemment à jour. ■ Chien de garde (watchdog) Un programme résident en mémoire contrôle tous les accès disque et demande confirmation d'exécution de certaines requêtes, par exemple la modification d'un fichier exécutable. Il faut également surveiller les pièces jointes des courriels. ■ Eradication Des logiciels (anti virus) permettent d'éradiquer les virus authentifiés d'un système infecté. Il faut les utiliser le plus rapidement possible. L'ADMINISTRATION ET SES OUTILS 297 ────────────────────────────────────────────────────────────── ■ Règles complémentaires de prévention Vérification à chaque démarrage du bon état général des systèmes de fichiers. Vérification périodique de l'absence de processus parasite dont on ne connaît pas la fonction. Non utilisation d'applications ou de données dont l'origine n'est pas garantie ou certifiée et absence de piratage. Verrouillage des postes de travail inutilisés. Administration centralisée sur un serveur protégé, avec un système d'exploitation fiable et sécurisé (Unix/Linux, Windows Serveur, Windows XP Pro, Cisco, etc.). Protection de certains fichiers ou de certaines partitions (lecture seule). Téléchargement systématique sur des serveurs de données sécurisés pour le stockage de données téléchargées. Surveillance des accès Internet par un pare-feu (firewall et proxy). 298 CHAPITRE X ────────────────────────────────────────────────────────────── 2. LA GESTION DES UTILISATEURS SOUS UNIX/LINUX La création ou la suppression des utilisateurs s'effectue avec trois fichiers du répertoire /etc : • le fichier passwd contenant la liste de tous les utilisateurs référencés, • le fichier group contenant la liste des groupes ainsi que leurs membres, • le fichier shadow, contenant les mots de passe cryptés des utilisateurs. Ces fichiers ne doivent être accessibles en écriture qu'à l'administrateur (et encore). 2.1 Le fichier passwd Ce fichier a une ligne de sept champs séparés par le caractère : par utilisateur : logname:mot_de_passe_crypté:uid:GID:information:répertoire_de_login:commande Nom de connexion Identificateur (unique) de l'utilisateur (réponse à l'invitation à se connecter login), composé d'au moins huit caractères. Mot de passe Ce champ est presque toujours remplacé par l'un des caractères * ou x pour tout utilisateur, les mots de passe étant déplacés dans le fichier invisible shadow. Le mot de passe a usuellement un nombre de caractères alphanumérique compris entre 6 et 8 et doit contenir au moins 2 lettres, 1 chiffre ou caractère spécial. Identificateur de l'utilisateur Le champ entier uid, compris entre 100 et 32767, permet l'identification de l'utilisateur. Il doit être unique car deux utilisateurs ayant le même uid ont les mêmes attributs de propriété et sécurité sous des noms différents et les fichiers ont plusieurs propriétaires. Identificateur du groupe Le champ entier gid est l'identificateur du groupe d'appartenance de l'utilisateur. Informations Le champ information est disponible pour ajouter divers renseignements tels le nom patronymique ou le numéro de téléphone. Répertoire de connexion Chemin d'accès absolu du répertoire de connexion de l'utilisateur (home directory). Commande de connexion Chemin d'accès absolu de l'applicatif lancé à la connexion (interprètes de commande, interface graphique, etc.). Tout programme est valide ce qui permet de limiter les droits de l'utilisateur et de le déconnecter à la fin d'exécution du programme. Séparateur des champs Le caractère : est le séparateur des champs. Son utilisation est interdite à d'autres fins. L'ADMINISTRATION ET SES OUTILS 299 ────────────────────────────────────────────────────────────── Exemple root:*:0:1:Operator:/:/bin/csh nobody:*:65534:65534::/ sys:*:2:2::/:/bin/csh ■ Utilisateurs particuliers Utilisateurs liés aux fonctions système, dont fait partie au moins l'administrateur root qui a pour uid 0 ainsi que les utilisateurs bin, sys, manager, etc. Utilisateurs liés à une commande, par exemple who. Utilisateurs publics (guest) pouvant accéder à certaines ressources publiques. ■ Quelques privilèges d'administration • Opération autorisée sur n'importe quel fichier ou processus. • Modification de l'heure. • Modification des paramètres du noyau. • Choix du nom de domaine. • Création, montage et démontage des systèmes de fichiers. • Modification des attributs de propriété et de sécurité des objets. • Gestion des mots de passe. • Arrêt du système. La gestion de la sécurité d'un système dépend essentiellement de l'administrateur qui doit définir un compromis entre ouverture et sécurité. ■ Connexion anonyme Le login anonymous est utilisé pour des connexions ouvertes sur le monde extérieur. 2.2 Groupes ■ Généralités Un groupe est un ensemble d'utilisateurs disposant de privilèges communs (partage et contrôle d'accès) à certains fichiers. L'accès à certaines commandes peut être restreint en les réservant à certains groupes d'utilisateurs disposant des privilèges corrrespondants. Un utilisateur peut faire partie d'au plus 16 groupes. On distingue les groupes locaux à un poste de travail et les groupes globaux (définis dans un réseau (groupes de travail, domaine, etc.)), éventuellement avec la définition d'annuaires (LDAP). Cette notion est similaire dans les mondes Unix/Linux et Windows. 300 CHAPITRE X ────────────────────────────────────────────────────────────── ■ Le fichier local /etc/group Le fichier local group est constitué, pour chaque groupe déclaré, d'une ligne de quatre champs séparés par le caractère : et dans l'ordre ci-dessous : nom:mot_de_passe_crypté:gid:membres Interprétation nom mot_de_passe gid membres nom du groupe (six caractères maximum). mot de passe crypté pour le groupe, utilisé par les utilisateurs qui désirent changer de groupe (commande newgrp) sans y être inscrit. Mais comme il n'y a pas de moyen simple pour mettre ce mot de passe, ce champ est pratiquement toujours vide. numéro (entier) du groupe. liste des membres (noms de connexion séparés par une virgule) du groupe. Exemple zero:*:0:who,rwho,finger,philipp nobody:*:-2:nobody daemon:*:2:daemon operator:*:7:root,cshroot,adm,dupond user:*:20 ■ Règles d'utilisation des groupes Différents groupes sont à définir selon les types de travaux effectués et l'usage est d'affecter les numéros de groupe inférieurs à 100 aux groupes systèmes. Le groupe par défaut est le groupe other. La commande groups affiche la liste des groupes d'appartenance d'un utilisateur. Un utilisateur déclaré dans plusieurs groupes peut changer de groupe courant en utilisant la commande newgrp. ■ Classes d'administrateurs Pour des raisons de sécurité et de déontologie, il est préférable de définir des classes d'administrateur avec des privilèges limités à un type d'application donné, par exemple l'administration des mots de passe, des bases de données, de la comptabilité... Sous Unix/Linux, les administrateurs sont classés de la façon suivante : Login uid root 0 sys 3 bin 2 adm 4 ftp 5 daemon 1 lp 71 Fonction accès à l'intégralité des services système propriétaire de certains fichiers systèmes propriétaire de la plupart des commandes propriétaire de certains fichiers d'administration serveur de téléchargement propriétaire de certains démons administrateur des services, objets et fichiers d'impression. L'ADMINISTRATION ET SES OUTILS 301 ────────────────────────────────────────────────────────────── 2.3 Terminal sécurisé et login root ■ Utilisateur synonyme de root On définit un utilisateur synonyme de root dans le fichier passwd en lui donnant l'uid et le gid 0 ce qui permet à tout administrateur de se connecter avec son identificateur et son mot de passe personnel. ■ Poste de travail sécurisé Un terminal est sécurisé si l'administrateur peut s'y connecter directement ce qu'il faut interdire sur un poste banalisé. La console système est le seul terminal sécurisé. Elle doit être allumée en permanence car quand un utilisateur exécute la commande /bin/su, un message s'y affiche. Une protection de l'accès à la machine et à la console système permet d'offrir un meilleur niveau de sécurité. Il ne faut jamais laisser l'accès libre à un terminal quand une session est ouverte. Des utilitaires tels xlock permettent un verrou temporaire d'accès contrôlé par mot de passe. ■ Groupe su ou commande sudo Tout candidat au login root doit impérativement utiliser la commande /bin/su, dont l'usage doit être restreint à un groupe de la façon suivante : • création d'un groupe su contenant la liste du groupe d'utilisateurs autorisés, • attribution du fichier /bin/su au groupe su (commande chgrp). • modification éventuelle du propriétaire du fichier (commande chown), • modification des droits d'accès et d'utilisation (commande chmod). ■ Audit de la commande su Le fichier /var/adm/sulog est le journal des utilisations de la commande su. ■ Surveillance des lignes d'accès Il est possible d'ajouter un mot de passe nécessaire à tout accès extérieur par modem. 2.4 Le fichier shadow Il est important d'avoir un mot de passe non trivial. Il faut donc proscrire son propre nom, tous les prénoms, les dates de naissance, les numéros de sécurité sociale... Le mot de passe doit à la fois être facile à retenir et comporter au moins six caractères dont certains non triviaux (majuscules, minuscules, chiffres, caractères de contrôle...). Il doit être changé périodiquement. Les mots de passe cryptés sont camouflés dans le fichier shadow, accessible par l'administrateur en lecture seulement. 302 CHAPITRE X ────────────────────────────────────────────────────────────── ■ Les champs du fichier shadow logname, mot de passe crypté, date de dernière modification du mot de passe, en jour depuis le 1er Janvier 1970, intervalle en jour minimum entre deux changements, nombre maximum de jours de validité, masque d'audit, chaîne de caractère indiquant si le login est anonyme. Exemple root:h0xhfsg9NV3pa:7116:::normal: daemon:NONE:6645:::normal: joe:4v92wsUm2BVMo:7116:7:28:normal: ■ Service d'aging Le service de mise à jour des mots de passe (aging) oblige les utilisateurs à changer périodiquement leur mot de passe tout en leur interdisant d'utiliser un ancien mot de passe considéré comme périmé. Le service peut-être désactivé. Il n'est pas utilisé si : • le nombre de jours entre les changements de mot de passe est nul. • le nombre de jours d'existence du mot de passe est supérieur à celui de sa validité. • les quatrième et cinquième champs sont vides. • le fichier shadow est inaccessible en écriture. ■ Masque d'audit Le masque d'audit indique le type d'événement à surveiller. Le masque usuel permet de connaître l'activité normale d'un utilisateur (connexions effectives, tentatives d'utilisation de la commande su, problèmes d'autorisation sur les fichiers ouverts). ■ Outils constructeurs Les fichiers passwd et shadow sont modifiés à partir d'interfaces d'administration dont l'usage est obligatoire. 2.5 Algorithme de création d'un utilisateur Ajout d'une entrée dans le fichier passwd. Création d'un répertoire de connexion (home directory). Affectation d'un ou plusieurs groupes à cet utilisateur. Création d'un profil (fichier .profile, .login ...). Rendre l'utilisateur propriétaire de son répertoire (commande chown) et affecter à ce dernier l'un de ses groupes (commande chgrp). Mise à jour de fichiers utilisés par certains utilitaires (cron, acct, at)... L'ADMINISTRATION ET SES OUTILS 303 ────────────────────────────────────────────────────────────── ■ Condition de sécurité d'un script de création Accès réservé à l'administrateur et accès exclusif au fichier passwd (commande vipw). Contrôles d'unicité de l'identité et du champ uid, contrôle de l'existence du groupe, du répertoire de connexion et du répertoire parent. Définition de quotas d'utilisation (espace alloué, nombre de fichiers ouverts, etc.). Exemple # !/bin/csh # sauvegarde fichier passwd rm –f /etc/passwd.old ; cp /etc/passwd /etc/passwd.old echo " paramètres de la zone commentaire pour chaque enregistrement " echo " ------------------------------------------------------------ " echo " (1) code : Prof " echo " Eleve " echo " 2) promotion : 1ère année : promotion 1993 " echo " 2ème année : promotion 1992 " echo " 3ème année : promotion 1991 " echo " (3) NOM Prénoms " echo " (4) COURS (éventuel) " echo " (5) date enregistrement (jj-mm-aa) " echo; echo; echo echo -n " login : " set log=$< grep -s "^${log} :" /etc/passwd if ( $status == 0 ) then echo; echo " Usager deja existant! _" exec $0 endif echo " groupe :" echo " etudiants répondez par 1" echo " etudiants2 répondez par 2" echo " prof répondez par 3" echo " dfcai répondez par 4" echo " autre groupe répondez par 5" echo -n " votre reponse :" set rep=$< switch ($rep) case 1 set grp = user; set chemin = etudiants breaksw case 2 set grp = user; set chemin = etudiants2 breaksw case 3 set grp = prof; set chemin = $grp breaksw case 4 set grp = dfcai; set chemin = $grp breaksw 304 CHAPITRE X ────────────────────────────────────────────────────────────── case 5 echo -n " entrez le groupe : " set grp=$< grep -s "^${grp} :" /etc/group if ( $status != 0 ) then echo; echo " Ce groupe n'existe pas _" exec $0 endif echo -n " entrez le chemin d'acces : " set chemin=$< breaksw default echo; echo " Ce groupe n'existe pas " exec $0 breaksw endsw echo -n " commentaires : " set com=$< set hom = /usr2/$chemin/$log echo -n " sh/csh/tcsh : " set she=$< echo -n " Procédure en cours " set max=0 foreach n ( `cat /etc/passwd|/usr/5bin/cut -f3 -d :` ) if ( $max < $n ) then set max=$n endif end echo -n ". " @ uid = $max + 1 set gid=`grep $grp /etc/group | /usr/5bin/cut -f3 -d :` echo "${log} : :${uid} :${gid} :${com} :${hom} :/bin/${she}" >> /etc/passwd echo -n ".. " mkdir $hom #définition de l'environnement par défaut foreach j (.suntools .suntools.sta .defaults .login .profile .cshrc .exrc .rootmenu) cp /usr/local/gould/$j $hom end #l'utilisateur devient propriétaire de son home directory /etc/chown -R $log $hom /bin/chgrp -R $grp $hom echo -n "... " #mise en place des quotas switch($grp) case user edquota -p guest $log; echo " quotas installés" breaksw case dfcai edquota -p guest $log ; echo " quota installés " breaksw default : echo " pas de quota installés " endsw L'ADMINISTRATION ET SES OUTILS 305 ────────────────────────────────────────────────────────────── echo " Opération terminée " echo -n " Autre utilisateur (o/n) " set rep=$< if ( $rep == "o" ) then exec $0 endif touch /etc/passwd ; cd /usr/etc/yp ; make # sauvegarde rm –f /etc/passwd.old ; cp /etc/passwd /passwd.old 2.6 Suppression d'un utilisateur ■ Opérations à effectuer Les opérations à effectuer sont les suivantes : • suppression de l'entrée de l'utilisateur dans le fichier passwd, • suppression de toute référence à ce dernier dans le fichier group ainsi que les divers fichiers liés à la messagerie, aux spoules et commandes telles que cron, acct, at ... • suppression des répertoires et fichiers de l'utilisateur. Ce dernier point est particulièrement délicat car une destruction en force (rm -rf) du répertoire de connexion peut provoquer certaines incohérences : ◊ des fichiers d'un autre utilisateur sont détruits. ◊ d'éventuels fichiers de l'utilisateur créés en dehors de son répertoire ne sont pas supprimés. La commande find permet de les localiser. ◊ des liens symboliques sur des fichiers de l'utilisateur supprimé deviennent inopérants. Un script peut automatiser tout ou partie de ces tâches. ■ Commandes standards de gestion des utilisateurs et des groupes (Unix/Linux) Utilisateurs Ajout Modification Suppression Paramètres par défaut useradd usermod userdel defadm Groupes Ajout Modification Suppression groupadd groupmod groupdel 306 CHAPITRE X ────────────────────────────────────────────────────────────── 3. GESTION DES SERVICES SYSTEMES SOUS UNIX/LINUX 3.1 Les processus démons, fournisseurs de service ■ Définition Certaines requêtes de service système sont prises en charge par processus démon, acronyme français de differed auxiliary execution monitor (daemon). Un démon est donc "un moniteur auxiliaire à exécution différé" ou plus simplement "un serveur dédié résident en mémoire", appelé simplement serveur dans tout ce qui suit. La plupart des serveurs sont initialisés dans la phase de démarrage. ■ Schéma de fonctionnement L'administrateur définit préalablement le paramétrage des serveurs. L'utilisateur fait une requête de service déposée dans une file d'attente puis prise en compte par le serveur. Utilisateur Co mmandes pu bliq ues requ ête Files d'attente Paramétrage Dém on serveur Exéc ution Administrateu r Com mand es d'a dministratio n Exemples Le serveur init assure le démarrage du système. Le serveur cron gère le service d’ordonnancement. Le serveur lpsched prend en charge les requêtes d'impression. Le super serveur xinetd supervise dynamiquement l'ensemble des services de base de TCP/IP. 3.2 Modes de fonctionnement du gestionnaire des services Les services à démarrer sont déterminés par le mode de fonctionnement (niveau d'exécution) du poste de travail dont les plus usuels sont les suivants : ■ Modes arrêt et moniteur : niveaux 0 et 5 Ils sont souvent identiques. Quelquefois, le niveau 5 réinitialise les tests matériels. L'ADMINISTRATION ET SES OUTILS 307 ────────────────────────────────────────────────────────────── ■ Mode démarrage à chaud : niveau 6 Arrêt et redémarrage du système avec le niveau par défaut. ■ Mode maintenance ou mono-utilisateur : niveaux 1, s et S Les systèmes de fichiers montés ne sont pas démontés quand le niveau s ou S est appelé depuis un mode multiutilisateur. Seuls les services lancés par le gestionnaire init sont tués alors qu'au niveau 1, tous les travaux non attachés à la console le sont. ■ Modes multi travaux : niveaux 2, 3, 4 Plusieurs modes de fonctionnement peuvent être définis par exemple un pour le matin et un pour l'après-midi. Ces différents niveaux activent des serveurs spécifiques. Niveau Mode 0 1 2 3 4 5 6 s ou S moniteur mono multi multi (à définir) multi (à définir) moniteur redémarrage mono Ports d'E/S console console tous ? ? console tous console Systèmes de fichiers montés aucun minimum décrits ? ? aucun décrits les systèmes de fichiers restent montés. Application who -r niveau courant run-level 2 ■ heure de connexion niveau courant pid niveau précédent. May 7 17:59 2 0 S Modification du niveau courant On appelle le gestionnaire init selon la syntaxe : init run_level Exemple init 3 3.3 Initialisation du gestionnaire des services Les fonctions du gestionnaire init sont les suivantes : • initialisation et maintenance du poste (fichier inittab), • démarrage et arrêt des services systèmes des différents modes de fonctionnement. ■ fichier inittab Une ligne du fichier inittab a le format : id:niveau:action:commande 308 CHAPITRE X ────────────────────────────────────────────────────────────── Interprétation id niveau action commande symbole d'un à quatre caractères de différenciation des lignes. suite d'entier indiquant les mode(s) d'exécution de la ligne. mot clef indiquant au serveur le signal d'activation de la commande qui suit. nom de la commande à exécuter avec ses arguments. Les principales actions sont : bootwait action exécutée au démarrage seulement, initdefault définition du niveau initial par défaut, off ligne de commande non exécutée, once exécution immédiate sans attente ni relance, ondemand analogue à la directive respawn, powerfail exécution à réception d'un signal powerfail, respawn création du processus s'il n'existe pas et relance s'il se termine (boucle perpétuelle), sysinit exécution préalable à tout accès à la console, wait exécution terminée du processus avant poursuite de l'initialisation. Exemple conf::bootwait:conf &>/dev/console 2>&1 rc::wait:rc 1>/dev/console 2>&1 pf::powerfail:powerfail 1>/dev/console 2>&1 01:2:respawn:getty -Tvt100 tty01 19200 ■ Réinitialisation du serveur init La commande init q lit le fichier inittab et réinitialise le niveau d'exécution courant selon les règles suivantes : • les actions off, respawn, process et ondemand sont réinitialisées, • les actions wait et once ne sont pas exécutées. 3.4 Gestion des services systèmes Les modes de fonctionnement du poste sont définis à partir du répertoire init.d. ■ Propriétés du répertoire init.d Ses scripts d'administration sont des cibles des liens (matériels ou symboliques) des répertoires respectifs des différents niveaux d'exécution rc*.d, ce qui permet d'en partager une version unique. ■ Services à démarrer selon le niveau Les scripts Snnxxxx des répertoires rc*.d sont définis en fonction leur mode d'exécution futur. Les conventions de nommage sont les suivantes : L'ADMINISTRATION ET SES OUTILS 309 ────────────────────────────────────────────────────────────── • les noms de scripts commencent avec la lettre K (Kill) pour effectuer l'arrêt d'un service), ou S (Start) pour effectuer son démarrage. • nn indique l'ordre (croissant) de démarrage, • xxx indique l'action à exécuter Exemple Quelques fichiers S* du répertoire rc2.d S05MOUNTFSYS S10PRESERVE S15RMTPFILES S17log S22audit S30autoconfig S35sysetup S40addswap S51tcp S75CRON S80LP ■ Montage des systèmes de fichiers. Récupération des dernières sessions d'édition. Nettoyage des répertoires des fichiers temporaires. Démarrage des serveurs d'audit. Démarrage du serveur d'audit. support de nouveaux périphériques. Spécifications de configuration du système. Addition de zones de swap. Démarrage des services de l'Internet Démarrage du serveur cron. Démarrage du spoule d'impression. Ordre d'exécution, démarrage manuel, arrêt du système La numérotation des fichiers détermine l'ordre de démarrage des services. Les scripts dont le nom commence par un K sont exécutés à l'arrêt du système. Tous les scripts sont démarrés ou arrêtés selon la syntaxe : ./script [start | stop] ■ Diagramme récapitulatif des changements de mode d'exécution A rrê t d u sy stè m e M o n it e u r i n it s , S , 1 i n it 5 in it 0 M o d e m o n o - u t ilis a te u r in it 2 i n it 3 /e tc /r c 2 .d /K * /e tc /r c 2 .d /S * in it 1 n iv e a u 2 in it 4 /e tc /rc 3 .d /K * / e t c / r c 3 .d / S * in it 1 n iv e a u 3 M o d e s m u lti- u tilis a te u r s /e tc /rc 4 .d /K * /e tc /r c 4 .d /S * i n it 1 n iv e a u 4 310 CHAPITRE X ────────────────────────────────────────────────────────────── 3.5 Démarrage des services Services activés lors du passage en mode multi-travaux : • initialisation des ports de communication, • réinitialisation des fichiers temporaires d'administration et mise à jour éventuelle de la date, • tests de cohérence des systèmes de fichiers, • lancement des gestionnaires de la mémoire et montage des systèmes de fichiers, • nettoyage des spoules (imprimantes, communications...) et des fichiers temporaires (dossiers /tmp et /usr/tmp), • démarrage des utilitaires de comptabilité (acct, startup), • serveurs d'ordonnancement (cron) puis d'impression, utilitaires divers (statistiques, performances...), services réseau. L'ordre des opérations est important. Ainsi, le système de fichier contenant le répertoire /var doit être monté avant celui contenant le répertoire /var/spool) . Exemple 0 sched 1 init 2 vhand 3 bdflush 96 logger /dev/error /usr/adm/mes 138 cron 143 /usr/lib/lpsched 202 cpd 204 slink 209 strerr 215 syslogd 217 inetd 219 routed -k /Unix 308 portmap 313 rusersd 315 NFSclnt 8 317 biod 4 318 biod 4 319 biod 4 320 biod 4 322 statd 324 lckclnt 4 326 lockd 350 /bin/login o 351 getty tty02 sc_m 353 getty tty03 sc_m 354 getty tty04 sc_m L'ADMINISTRATION ET SES OUTILS 311 ────────────────────────────────────────────────────────────── 3.6 Planificateur de travaux sous Unix/Linux Le service de planification (service cron) exécute une action déterminée. Il fournit trois services : exécution répétée à heure fixe (commande crontab), exécution unique à heure fixe (commande at), exécution différée (commande batch). ■ Administration du planificateur de travaux Le répertoire /usr/lib/cron contient ses fichiers d'administration (liste de contrôle d'accès, historique). Le journal des travaux planifiés est le fichier /usr/lib/cron/log. Les files d'attente sont dans le dossier /usr/lib/cron/queuedefs. Le répertoire /var/spool/cron contient les listes d'actions clientes à exécuter. Co mmand es du service CRON : /etc at b a tc h c r o nt a b qu eued efs log cro n.a llow cro n.d eny at.allow a t .d e n y Ad ministration : /usr/lib/c ron ■ D ém o n c ro n c ro ntabs a tjob s action à exé cuter : /var/spoo l/c ron Listes de contrôle d'accès Le fichier cron.allow contient la liste des utilisateurs autorisés à utiliser la commande crontab les autres n'ayant pas ce droit (liste blanche). Le fichier cron.deny contient la liste des utilisateurs n'ayant pas accès à la commande crontab les autres ayant ce droit (liste noire). Un seul de ces deux derniers fichiers est utile à un instant donné. • Si le fichier cron.allow existe, le serveur cron n'accepte des travaux que des utilisateurs présents dans ce fichier les autres recevant le message Sorry ... • Si cron.allow n'existe pas et cron.deny existe, le serveur cron n'accepte des travaux que des utilisateurs absents du fichier les autres recevant le message Sorry ... • Si aucun de ces fichiers n'existe, seul l'administrateur peut utiliser le service cron. Les fichiers at.allow et at.deny ont le même format et jouent le même rôle pour la commande at que les fichiers cron.allow et cron.deny pour la commande crontab. ■ Le répertoire /var/lib/cron Ce répertoire contient les fichiers suivants : 312 CHAPITRE X ────────────────────────────────────────────────────────────── • Le tube nommé utilisé pour la communication entre l'utilisateur et le serveur cron. • Le journal des actions effectuées par le serveur cron (fichier cronlog) . • Le fichier queuedefs définit les caractéristiques des files de travaux gérées par le serveur cron dont chaque ligne sous le format : q.NNj NNn NNw avec : ◊ q une lettre de l'alphabet précisant la file, ◊ NNj le nombre maximum de travaux en attente dans la file (par défaut 100), ◊ NNn la valeur de la constante nice pour chaque travail de la file, ◊ NNw le temps d'attente (s) avant un nouvel essai (par défaut 60s). • Les champs vides sont initialisés aux valeurs par défaut. ■ Le répertoire /var/spool/cron/crontabs Les files d'attente générées par la commande crontab y sont enregistrées, chacune accessible par son propriétaire respectif. ■ Le répertoire /var/spool/cron/atjobs Y sont enregistrés les travaux lancés à partir des commandes at ou batch. Le nom de chaque fichier est le numéro du travail suivi de .x où x représente la file. ■ La commande crontab La structure d'un fichier de données de la commande crontab est la suivante : les cinq premiers champs sont des entiers précisant dans l'ordre : • la minute (0...59), • l'heure (0...23), • le jour (1...31), • le mois (1...12), • le jour de la semaine (0...6) avec 0 pour dimanche. Chaque champ peut être le caractère joker (*) représentant toute valeur ou une liste d'éléments séparés par une virgule (un élément est soit un nombre, soit de la forme x-y pour représenter tous les nombres de x à y inclus). Si le jour est donné dans les deux champs (jour du mois et jour de la semaine), les deux sont pris en compte. Le sixième champ contient la commande à exécuter, avec son chemin absolu. La notification du résultat ou des erreurs peut s'effectuer par courriel. Exemple Mn H J M S 0 2 * * * #date toutes les minutes * * * * * /usr/lib/acct/dodisk date L'ADMINISTRATION ET SES OUTILS 313 ────────────────────────────────────────────────────────────── #date toutes les heures+ 5mn 5 * * * * date #date tous les lundis à 6 H 6 du matin 6 6 * * 1 date #date le premier jour du mois à 9 H 15 15 9 1 * * date #date le 1er janvier de chaque année à 18 H 30 30 18 1 1 * date 0 6 1 * * find / -name core -exec rm {} \; ■ Lancement à heure fixe ou lancement différé La commande at exécute une fois une commande à une date et une heure fixée. La commande batch effectue une exécution différée. at . al l o w at . de ny c r on 1 at ba tch 4 3 2 Co mm and es utilisate ur d e cré ation ou mo difica tio n de s fic hie rs asso ciés /usr/sp ool/c ro n/a tjobs xx xxx. a ttttttttt.b etc .. . Synopsis at heure [date] [+ incrément] at -r [job_id] at -l [job_id] at -qheure [date] [+ incrément] Description heure est indiquée sous la forme d'un ou de deux chiffres représentant les heures, ou de quatre chiffres représentant les heures et les minutes ou encore sous la forme x:y représentant x heures et y minutes. Un suffixe am ou pm peut être ajouté. Les mots clés noon, midnight, now et next sont autorisés. date peut être le mois (éventuellement abrégé sur 3 caractères) suivi du jour et éventuellement de l'année séparée par une virgule, ou le jour de la semaine (qui peut être abrégé). Les arguments today ou tomorrow sont autorisés. Si la date n'est pas précisée, le serveur utilise le jour courant ou le lendemain selon l'heure de lancement. 314 CHAPITRE X ────────────────────────────────────────────────────────────── incrément est facultatif. Composé d'un nombre suivi d'un suffixe parmi minute, hour, today, week, month, year qui est ajouté à l'heure et/ou à la date indiquée. at -l at -r id at -q liste les travaux en instance (propriétaire, numéro, date d'échéance). détruit le travail ayant pour numéro id. détermine la file d'exécution d'un travail (a (at), b (batch), c (crontab)). Exemple at 16:10 pwd CTRL D 3.7 L'interface Webmin ■ Présentation et fonctionnalités Webmin est un logiciel libre créé par Jamie Cameron (licence BSD), implémenté sous la forme d'une interface graphique, permettant d'administrer à distance tout poste Unix/Linux via un navigateur. Développé en Perl et Java, Webmin permet : • de contrôler tout type de serveurs (Apache, Postfix, Sendmail, MySQL, Samba, etc.), • de gérer les utilisateurs (comptes, quotas, répertoires de travail, groupes, droits, annuaire, etc.), • la gestion des journaux (fichiers logs), • la gestion des grappes (clusters), des systèmes de fichiers, l'arrêt, le démarrage des services système et réseau, la configuration de Webmin, etc. L'ADMINISTRATION ET SES OUTILS 315 ────────────────────────────────────────────────────────────── ■ Utilisation Webmin est implémenté sous la forme d'un service, accessible via un nom de domaine (DNS), une adresse IP (privée ou publique), son numéro de port (par défaut 10000). Exemples http://www.mondomaine.com:10000 http://xxx.xxx.xxx.xxx:10000. Le port de l'application peut être redéfini et il est recommandé d'activer SSL. ■ Installation Il est recommandé de l'installer avec un paquetage spécifique à sa distribution. 316 CHAPITRE X ────────────────────────────────────────────────────────────── 4. GESTION DES SERVICES SOUS WINDOWS 4.1 Démarrage Les phases du démarrage (à froid ou à chaud) sont : chargement du noyau, démarrage des services, initialisation des périphériques. ■ Pré amorçage • Tests matériels à la mise sous tension. • Choix du périphérique de démarrage (disque, clé, lecteur de CDROM, etc.) pour le chargement de l'enregistrement d'amorçage maître (Master Boot Record - MBR). • Chargement du noyau (processus ntldr) ■ Amorçage Le processus ntoskrnl initialise la phase de chargement. Le menu (boot.ini) permet de démarrer en mode normal ou en mode VGA (dernière configuration connue). L'utilisateur peut choisir un profil matériel donné. Le module bootsect.dos est utilisé pour charger un OS différent de Windows. Le noyau exécute les opérations suivantes : • reconnaissance (ntdetect) de la configuration matérielle puis chargement des pilotes, initialisation des périphériques et des services associés, • invitation à la connexion pour saisie du nom de l’utilisateur et de son mot de passe (winlogon), • derniers chargement (pilotes, profil de l’utilisateur) et démarrages (services). ■ Options du fichier boot.ini /basevideo /sos /noserialmice=comn /crashdebug /nodebug maxmem:n scsiordinal:n mode d'affichage VGA 640*480 affichage des pilotes chargés lors de l'amorçage du système désactivation de la vérification de la présence d'une souris sur le port série concerné recouvrement automatique réactivé invalidation du processus de "debug" définition de l'espace mémoire maximum alloué à NT définition du périphérique de démarrage sur le bus SCSI. Exemple [boot loader] timeout=10 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINXP="Windows XP Pro" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows XP [Mode VGA]" /basevideo /sos L'ADMINISTRATION ET SES OUTILS 317 ────────────────────────────────────────────────────────────── 4.2 Services système et réseau Les services système et réseau sont accessibles par les interfaces suivantes : ■ Interface homme machine L'interface graphique GUI (Graphical User Interface) permet de gérer l'affichage (carte vidéo, moniteur), le multi-fenêtrage, la console (fenêtre de commandes). ■ Initialisation des services Certains services, initialisés au démarrage sont accessibles par l'utilitaire msconfig, qui permet à la fois d'en définir la liste et de modifier certains fichiers (*.ini). ■ Panneau de configuration Les services d'administration sont accessibles à partir du Panneau de configuration, complété par les Outils d'administration. Ainsi, le Gestionnaire de périphériques assure la gestion des pilotes installés. ■ Profil de démarrage matériel Un profil matériel (ou profil) définit un ensemble de paramètres (périphériques et services réseau) d'une configuration donnée et il en existe au moins un associé à la configuration originale du poste de travail. Un profil est associé à une configuration donnée ce qui permet d'invalider certains services ou périphériques. L'utilisateur peut choisir au démarrage du poste le profil à utiliser. 4.3 Fonctionnement des services et des pilotes Un service est constitué de sous-services appelés simplement services. ■ Etat d'un service et mode de démarrage L'état d'un service est démarré, suspendu, ou arrêté. 318 CHAPITRE X ────────────────────────────────────────────────────────────── Son mode de démarrage peut être : • automatique : démarrage du service lors du chargement du système Windows. • manuel : un utilisateur ou une application démarre manuellement le service. • désactivé : le service ne peut être démarré. Le mode de démarrage des pilotes est défini par leur ordre de chargement, du plus prioritaire au moins prioritaire : • amorcé (chargé dans la phase d'amorçage), • système (chargé dans la phase de démarrage), • automatique (chargé avant l'interface graphique), • manuel (non démarré, lancement possible depuis une application), • désactivé (impossibilité pour un utilisateur de démarrer le périphérique). 4.4 Quelques services de base Les services de base sont complétés par les services liés à certaines applications. L'ADMINISTRATION ET SES OUTILS 319 ────────────────────────────────────────────────────────────── ■ Avertissement Notification aux utilisateurs et ordinateurs sélectionnés des alertes administratives de l'ordinateur. Ce service utilisé par le service Serveur utilise le service Messagerie. ■ Explorateur d'ordinateurs Liste des ordinateurs des domaines et groupes de travail, accessibles depuis la station courante, nécessaire au service Voisinage réseau. ■ Voisinage réseau Accès aux ordinateurs et imprimantes d'un domaine ou d'un groupe de travail ainsi qu'à des réseaux externes. ■ Enregistrement d'événements Enregistrement d'événements dans des journaux (système, sécurité, applications, etc.). ■ Messagerie Emission et réception des messages envoyés aux administrateurs des différents postes de travail par le service Avertissement. ■ DDE réseau Assure un transport réseau ainsi que la sécurité des conversations DDE (Dynamic Data Exchange) ce qui permet à des applications telles Word ou Excel de partager des informations DDE localement ou au travers du réseau. ■ DSDM DDE réseau DDE Share Database Manager : gestion des conversations DDE, utilisé par le service DDE réseau. ■ Serveur Prise en charge des services RPC, partage de fichiers, imprimantes et tubes nommés. ■ Détecteur d'appel RPC Une application cliente RPC appelle le détecteur d'appel RPC pour tester la disponibilité d'un serveur RPC. La maintenance du répertoire des applications distribuées pour les programmes fonctionnant en architecture client serveur permet de déterminer les différents serveurs d'applications distribuées quand ils existent. Le détecteur d'appels RPC notifie la présence de la requête cliente au serveur RPC. ■ Service d'appel RPC Ce service assure la communication avec le service Détecteur d'appel RPC. ■ Planning Planificateur de travaux. 320 CHAPITRE X ────────────────────────────────────────────────────────────── ■ Spoule Gestion des services d'impression locaux ou en réseau. ■ Station de travail Gestion des connexions et des communications entre différents postes serveur et client. Ce service permet d'accéder aux ressources de l'ordinateur local. ■ Services TCP/IP simples Prise en charge des services et protocoles Windows Sockets, RPC, et NetBIOS. Ils intègrent quelques applicatifs et utilitaires de diagnostic standards du monde TCP/IP (FTP, telnet, arp, finger, FTP, hostname, ipconfig, lpq, lpr, nbtstat, netstat) et le support des protocoles ftpd (serveur de téléchargement), agent SNMP (Simple Network Management Protocol), lpd et CUPS (serveurs d'impressions Unix/Linux). ■ Service d'accès distant Un modem permet de se connecter sur des serveurs distants et de permettre la connexion de postes clients en utilisant le service d'accès distant (Remote Access Service - RAS). Le service d'annuaire gère les numéros de téléphone d'accès à un réseau distant. L'administration de l''accès distant permet de créer des serveurs d'accès distant. ■ Gestion des connexions Une connexion nécessite les informations suivantes : • Identification NETBIOS (forme symbolique) du poste de travail et de son domaine. • définition des protocoles et des services utilisés, • définition des liaisons entre les différents services, protocoles et contrôleurs. Les principaux services réseau sont les suivants : support de modems, service d'accès distant, gestion du service de téléphonie, Internet Information Server : services web Microsoft, partage de ressources, gestion et support des clients Microsoft, utilitaires TCP/IP (FTP, telnet, etc.), impression distribuée (serveurs Microsoft, lpd, et CUPS). 4.5 Protocoles supportées par Windows D'autres protocoles permettent la connectivité de Windows avec les autres standards du marché à savoir TCP/IP, nwlink (protocoles IPX/SPX de Netware), SNA (IBM), Appletalk (Apple), PPP (Point to Point Protocol), SLIP (Serial Line Internet Protocol) pour les accès externes via un modem, PPTP (Point to Point Tuneling Protocol, protocole de liaison point à point sur support série, permettant d'établir un tunnel de communication à travers Internet). L'utilisation simultanée des protocoles NETBEUI et TCP/IP sous Windows est améliorée par l'utilisation des protocoles WINS (Windows Internet Naming Service), DHCP (Dynamic Host Configuration Protocol), DNS (service de nom de domaine). L'ADMINISTRATION ET SES OUTILS 321 ────────────────────────────────────────────────────────────── 5. QUELQUES PRINCIPES DE MAINTENANCE ■ Logiciels Des logiciels de maintenance, souvent plus puissants que les utilitaires de base du système Windows sont disponibles en freeware (gratuitement) tels AIDA32 ou PC Wizard, en shareware (licence partagées), ou propriétaires. Leurs fonctionnalités essentielles sont les suivantes : Informations Contenu de la ROM BIOS, caractéristiques physiques de la carte mère, des disques et de la mémoire, du processeur, des périphériques, des pilotes, etc. Récupération des fichiers détruits Il est possible de récupérer des fichiers détruits si la tentative de récupération est immédiatement postérieure à leur destruction (Norton Utilities). Performance et optimisation Des tests permettent d'améliorer les performances du poste (processeur, mémoire, fichier d'échanges, accès disques, etc.). ■ Installation de logiciel Il ne faut installer que des logiciels acquis de façon licites. Il est recommandé de procéder à l'installation à partir des supports d'origine et de suivre le mode d'emploi de l'installation, gérée par l'installateur Windows (Microsoft System Installer – MSI). Une bonne organisation des données et des applications est recommandée pour que le système ne devienne pas un fourre-tout. ■ Précautions d'utilisation Les ordinateurs personnels assurent un service fiable si les règles suivantes sont respectées : • Extinction du moniteur en cas de non utilisation prolongée ou utilisation d'un économiseur. • Utilisation d'un onduleur. • Non extinction trop fréquente la station s'usant à chaque mise sous tension. ■ Documentation et maintenance Les guides d'installation en français (carte mère, moniteur, cartes d'extension, périphériques, logiciels) sont indispensables. Seul un matériel complètement testé peut être réceptionné une mise en route nécessitant presque toujours des ajustements. Il est vital de maintenir le système avec l'aide d'un informaticien de l'entreprise ou avec un contrat de maintenance (10 à 15 % environ du prix d'achat annuel). 322 CHAPITRE X ────────────────────────────────────────────────────────────── 6. L'ADMINISTRATEUR, RESPONSABLE MICRO L'introduction des ordinateurs personnels a provoqué un choc culturel et organisationnel car il a fallu former les utilisateurs. Les incidences sur l'architecture du système d'informations sont essentiellement le basculement de systèmes centraux vers des systèmes répartis. Le responsable micro-informatique assure l'interface entre la direction générale et les utilisateurs. Ses différentes fonctions sont les suivantes : ■ Interface avec la Direction Générale et l'informatique centralisée Interlocuteur de la direction générale en ce qui concerne le budget, les objectifs et la stratégie, il est le garant de la maintenance du système d'informations et de sa sécurité. L'ordinateur personnel est complémentaire des systèmes centraux. Le responsable micro-informatique est donc un interlocuteur de la direction informatique. Il participe ou élabore le plan directeur, son rôle devenant proportionnel à l'importance des ordinateurs personnels et des réseaux dans l'entreprise. ■ Veille technologique Compte tenu de l'évolution permanente des produits dont la durée de vente est aujourd'hui de trois mois, le responsable micro doit connaître l'évolution des architectures, des logiciels et des prix. Il doit faire la différence entre un serveur de base de données et une station de traitement de texte. ■ Assistance aux utilisateurs Ecoute des besoins pour les comprendre, les orienter, et pour faire évoluer le parc. Suivi de l'évolution technique des utilisateurs, assistance technique, conseils de formations et disponibilité, diffusion de l'information. ■ Définition, installation et maintenance du système Choix du système d'exploitation pour la définition d'un standard dans l'entreprise des les logiciels installés pour garantir la portabilité des applications et de leurs données. Définition et maintenance du poste de travail et adéquation aux besoins. ■ Comptabilité Définition et suivi du budget (micro) informatique, suivi comptable et amortissement des stations, suivi de la maintenance matérielle, inventaire des matériels et logiciels. Carnet de bord (gestion des incidents majeurs, surveillance de l'état des stations, télémaintenance, bonne connaissance et recherche de la cohérence du système d'informations. L'ADMINISTRATION ET SES OUTILS 323 ────────────────────────────────────────────────────────────── ■ Aspects juridiques Le responsable pouvant négocier des contrats doit avoir quelques connaissances juridiques. Négociation de contrats Le responsable micro-informatique doit savoir établir clairement un contrat de telle sorte que les besoins exprimés ne soient pas ambigus. Il peut être amené à passer des consultations ou des appels d'offre et doit alors s'assurer que les besoins sont correctement exprimés. Si les besoins de l'entreprise sont importants, il doit savoir négocier des contrats cadres avec les fournisseurs, définir des licences sites, etc. Surveillance de l'état juridique du système Les contrats de maintenance ou de leasing doivent être surveillés et quelquefois renégociés. Maintenance Matérielle et logicielle du système en connaissant les droits et devoirs respectifs du fournisseur et de l'acheteur, Relations avec les fournisseurs. Recette Un système nouvellement installé doit être réceptionné avant paiement.. Propriété Intellectuelle La loi définit le propriétaire des données et des applications. 7. CONCEPTION D'UN SYSTEME D'INFORMATIONS Nous allons tracer rapidement les étapes de conception d'un système d'informations. ■ Etape A : étude d'opportunité Il faut définir le plus précisément possible la tâche à informatiser, en fixer les limites et réfléchir à son utilité. ■ Etape B : analyse fonctionnelle A partir de la description de la fonction à informatiser, on entre dans le détail de l'application à réaliser. On en fait un premier mode d'emploi en précisant les tâches à effectuer, le type des entrées et le mode de saisie des données, les sorties, les fichiers et leur contenu. Il faut poser les problèmes de sécurité et d'organisation du travail autour du système matériel. Un dossier, compréhensible par l'utilisateur final même non informaticien, doit permettre une évaluation précise du temps nécessaire à sa mise en place. 324 CHAPITRE X ────────────────────────────────────────────────────────────── ■ Etape C : Analyse organique Rédigée par et pour un informaticien, elle précise le schéma de réalisation de l'application. ■ Etape D : Programmation Trois possibilités : Faire programmer par des spécialistes Il faut impérativement suivre l'étape A et superviser les tests et la mise en exploitation (D et E). On donne quitus aux analystes et programmeurs lorsque le résultat des tests est satisfaisant et que les dossiers d'exploitation sont effectivement rédigés. Programmer soi-même Une bonne discipline est de s'astreindre à suivre le même déroulement, surtout si l'on ne peut se consacrer à plein temps à cette activité. L'écriture d'une application professionnelle est une opération délicate et un résultat, satisfaisant pour son auteur, est rarement utilisable par d'autres. Il y a une grande différence entre connaître un langage de programmation et savoir programmer. Un programmeur professionnel utilise des méthodes qu'on ne peut inventer seul et dont l'apprentissage est très long. Acheter un progiciel Le choix d'un programme tout fait pour résoudre un problème donné est une tâche difficile. Il oblige à faire soi-même les étapes A et B et ne dispense pas de l'étape E. On doit prévoir des tests les plus complets possibles. ■ Etape E : Mise en exploitation Une période de mise en route et de formation du personnel est indispensable à la bonne utilisation du système. Un dossier d'exploitation, mode d'emploi du programme, doit être remis. 8. CONCLUSION Au cours de cet exposé, le lecteur a pu constater que le choix d'un système personnel n'est pas simple. Nous espérons toutefois que les quelques notions présentées l'aideront dans ses choix futurs et qu'elles lui permettront de mieux comprendre les divers problèmes qui se posent à l'achat où à l'utilisation. Il faut toujours se rappeler que l'informatique est en évolution permanente, comme les notions présentées ce qui explique que la durée d'amortissement des systèmes personnels dépasse rarement trois ans. Toutefois, les concepts essentiels sur les architectures, les généralités sur les systèmes d'exploitation et les logiciels seront encore valables. L'ADMINISTRATION ET SES OUTILS 325 ────────────────────────────────────────────────────────────── 9. EXERCICES ■ Gestion des utilisateurs Créer des utilisateurs. On s'attachera à définir leur répertoire de travail, leur groupe(s) de travail, leurs privilèges d'administration et de programmation. Essayer de créer un utilisateur synonyme de l'administrateur. Sous Unix/Linux, verrouiller la commande su. L'utiliser et constater son audit par le système. ■ Cheval de Troie Programmer un cheval de Troie avec un (faux) script (par exemple su ou mount). #!/bin/bash echo –n "Password: " stty -echo read X echo $X > /tmp/copie sleep 2 stty echo echo "su: incorrect password" rm /tmp/su ■ Démarrage et arrêt 1°) Quel est le répertoire essentiel utilisé au démarrage du système ? 2°) Analyser le fichier /etc/inittab. 3°) Si possible, sur un terminal en mode texte, tuer le processus de login. Constater qu'il se relance "spontanément". 4°) Visualiser les répertoires et fichiers de démarrage (rc.*). 5°) Un arrêt et un redémarrage (boot) d'une ou de deux stations seront réalisés en fin de session. Analyser le démarrage à froid puis le démarrage à chaud avec les commande shutdown, init, halt, haltsys. 6°) Modifier le fichier .profile pour y ajouter une fonction logout exécutée automatiquement lors de la déconnexion et effaçant l'écran. Indication : définir la fonction logout puis utiliser la commande Unix trap. ■ Divers Créer un script qui affiche la liste des utilisateurs connectés, la date, les processus du système et les informations sur la mémoire. L'exécuter en indiquant le temps d'exécution (commande time) puis en ajoutant en plus le nom de chaque commande avant son exécution. ANNEXES 1. L'ENVIRONNEMENT UTILISATEUR SOUS UNIX/LINUX Des fichiers permettent de configurer l'environnement de travail constituant le profil de chaque utilisateur. Leur mise au point par l'utilisateur ou l'administrateur dont c'est une responsabilité majeure est indispensable. L'utilisateur, s'il en a le désir et les compétences, peut ensuite les modifier. 1.1 Fichiers de configuration d'applicatifs usuels Il est possible de configurer les applicatifs suivants : • les interprètes de commandes, • les variables d'environnement relatives à un environnement donné, par exemple celui d'Oracle, • les éditeurs de textes (vi ou emacs), • les interfaces graphiques multifenêtres (Xwindow, Motif (l'ex standard), Open Look (ex standard SUN), CDE (le standard actuel), KDE (environnement Linux), • la messagerie électronique, • les utilitaires de transfert de fichiers (ftp, rcp, etc.), • etc. Tous ces fichiers ont un identificateur commençant par le caractère . ■ Interprètes de commandes Le fichier .profile initialise les interprètes Bourne shell et Korn shell. Le fichier .bash_profile initialise l'interprète bash. Les fichiers .login et .cshrc initialisent l'interprète C shell. Le fichier .kshrc contient les alias utilisés par l'interprète Korn-shell. Exercice A partir de la commande ls -a, afficher les fichiers constituant votre profil d'utilisateur. 328 ANNEXES ────────────────────────────────────────────────────────────── ■ Editeurs de textes • Le fichier .exrc initialise l'éditeur vi. • Le fichier .emacsrc initialise l'éditeur emacs. ■ Services TCP/IP et services de l'Internet Les fichiers de configuration des services TCP/IP sont: .mailrc .netrc .xinitrc, etc. .mwmrc, etc. messagerie électronique, commande FTP, XWindows, gestionnaire de fenêtres. 1.2 Initialisation du terminal ■ La commande stty La commande stty définit les paramètres de communication du terminal (caractères spéciaux, bit de parité, gestion de l'écho, etc.). Son intérêt essentiel pour un utilisateur est la redéfinition du caractère d'effacement. Exemples • Modification de la touche associée au caractère d'effacement stty erase '^H' • Affichage des paramètres de gestion du terminal stty -a speed 9600 baud ; ispeed 9600 baud ; ospeed 9600 baud ; line = 0 ; intr = DEL ; quit = ^\ ; erase = ^H ; kill = ^U ; eof = ^D ; eol = ^@ ; swtch = ^@ ;susp = ^Z ;start = ^Q ;stop = ^S ; parenb -parodd cs8 -cstopb hupcl cread -clocal -loblk -ortsfl -ctsflow -rtsflow ignbrk -brkint -ignpar -parmrk -inpck -isprip -inlcr -igncr icrnl -iuclc ixon -ixany -ixoff isig icanon -xcase echo echoe echok -echonl -noflsh -iexten -tostop -xclude opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel isscancode ■ La commande tput La commande tput initialise et gère les attributs du terminal par défaut (défini par la variable TERM), en utilisant la base de données associée (terminfo sous System V, termcap dans l'environnement BSD). Synopsis tput [-Ttype_du_terminal] action ANNEXES 329 ────────────────────────────────────────────────────────────── Description La commande tput exécute une des actions ci-après sur le terminal. bell blink bold civis clear cols cup cvvis flash init sonnerie, mode clignotant, mode surbrillant, curseur invisible, effacement de l'écran, affichage du nombre de colonnes utilisables, ligne colonne déplace le curseur (ligne,colonne), curseur visible, vidéo inverse si possible ou sonnerie sinon, réinitialisation du terminal selon l'émulation décrite par la variable TERM, affichage du nom en clair du terminal, réinitialisation du terminal selon son type(option -T), inversion vidéo, arrêt du mode (voir l'action smso), annulation de tous les attributs en cours, retourne le code permettant la mise en évidence d'une partie du texte (en général l'inversion vidéo. longname reset rev rmso sgro smso 1.3 Commandes diverses ■ Identification d'un terminal La commande tty permet d'identifier le terminal virtuel utilisé. ■ Gestion de l'affichage clear ■ effacement Gestion de la date date affichage de la date et de l'heure courante Cette commande permet également de modifier la date du poste de travail. Elle est alors réservée à l'administrateur. Synopsis date mmddhhmm avec yy l'année, mm le mois, dd le jour, hh les heures, mm les minutes. 330 ANNEXES ────────────────────────────────────────────────────────────── ■ Recopie simultanée sur fichier et moniteur Synopsis tee [-a] fichier Description Recopie simultanée du flot d'entrée sur le périphérique d'affichage et dans le fichier (utile dans les tubes pour les résultats intermédiaires). L'option -a permet d'ajouter les données dans le fichier sans l'écraser. ■ Statistiques temporelles Synopsis time commande_du_shell Description Exécution de la commande puis affichage (peu précis) de son temps d'exécution (en secondes) en mode système et en mode utilisateur. Exemple time ps pid 1736 1786 1806 real user sys ■ TTY p7 p7 p7 0m0.34s 0m0.03s 0m0.05s TIME 0:00 0:03 0:00 COMMAND ksh xman ps Attente d'un travail Synopsis wait Description Attente de la fin des processus lancés en tâche de fond. ANNEXES 331 ────────────────────────────────────────────────────────────── 2. IMPRESSION Les commandes associées au service d'impression sont différentes dans les environnements System V et BSD. 2.1 Impression (System V) ■ Requête d'impression Synopsis lp [option(s)] fichier(s) Description Envoi d'une requête d'impression. Ses principales options sont: c dX m nx s tTitre w o0pt ■ recopie du fichier (par défaut, seul un lien est crée), choix d'une destination X (imprimante ou classe), requête de notification de fin d'impression par un courier électronique, nombre de copies (par défaut une), suppression des messages de la commande lp, impression d'un titre (bannière), émission d'un message électronique en fin d'impression, options spécifiques de l'imprimante. Etat des requêtes d'impression Synopsis lpstat [option(s)] Description Indication de l'état du service lp et des requêtes d'impression en attente. Les principales options sont: d o p r t ■ destination par défaut, état des requêtes, état des imprimantes, état du serveur, les informations précédentes. Suppression d'un requête d'impression Synopsis cancel id(s) Description Suppression de la requête d'impression id (réponse par le numéro de la requête supprimée). 332 ANNEXES ────────────────────────────────────────────────────────────── 2.2 Impression (BSD) ■ Requête d'impression. Synopsis lpr [option(s)] fichier(s) Options Pet_logique n t ■ choix d'une imprimante par son étiquette logique, n copies du document, fichier à imprimer au format nroff/troff. Affichage du contenu de la file d'attente du spoule d'impression. Synopsis lpq [-Petiquette_logique] ■ Suppression d'une requête d'impression. Synopsis lprm [-Petiquette_logique] numéro_de_job Exemples lpq -Plp2 lp is reading and printing Rank Owner Job Files Total Size active donald 420 win 127586 bytes active philipp 421 standart input 123456 bytes lprm -Plp2 421 2.3 Mise en page d'un fichier pour impression Synopsis pr [option(s)] fichier(s)... Description Impression avec un en-tête (date, nom du fichier, numéro de la page). Les principales options sont : n +n h xxx wn ln t sc a format de sortie sur n colonnes, impression commençant page n, remplace le nom du fichier de l'en-tête par xxx, n caractères par ligne, par défaut 72 , n lignes par page, par défaut 66, suppression de l'impression de l'en-tête, séparateur de colonnes c, caractère de tabulation par défaut, impression simultanée des fichiers (un par colonne). ANNEXES 333 ────────────────────────────────────────────────────────────── 3. GENERALITES SUR LES EDITEURS DE TEXTES ■ Les éditeurs lignes (antérieur à l'ère primaire) Indépendant du terminal utilisé, l'éditeur ligne sous Unix est ed. Il n'est pas très convivial (c'est un euphémisme) mais il est standard et peut être appelé dans un script. ■ L'éditeur sed L'éditeur non interactif sed (stream editor) utilise la même syntaxe que celle de l'éditeur ed sur des flots de données obtenus, soit à partir d'une autre commande (via un tube), soit à partir d'un fichier ordinaire. Le principe est le suivant: • lecture des données sur l'entrée standard, • exécution des commandes désirées, • écriture du résultat sur la sortie standard, ce qui permet l'insertion de l'appel à sed dans une suite de commandes reliées par des tubes. ■ Les éditeurs pleines pages Plus agréables à utiliser, ils nécessitent une interface selon le terminal utilisé (définition de ses caractéristiques dans la base de données (termcap ou terminfo). L'association entre le terminal et la base de données est réalisée par la variable TERM. Exemple TERM=xterm export TERM On les classe en deux catégories : • les éditeurs lancés en mode commande par défaut dont le plus connu est vi, • les éditeurs lancés en mode insertion par défaut dont le plus connu est emacs. ■ Les éditeurs multifenêtres Ces éditeurs fonctionnent dans des environnements multifenêtres. Le plus connu est Open Office (SUN), du domaine public, à consommer sans modération. 4. L'EDITEUR VI Il est important de le connaître car c'est l'éditeur standard pleine page interactif d'Unix/Linux. Il a été développé à l'université de Berkeley par Bill Joy. Il utilise les attributs vidéo des terminaux qu'il reconnaît par la variable du shell TERM et le système d'adressage (caractères et lignes) et de substitution de l'éditeur ed. Son jeu de commandes est puissant. Il peut opérer sur les caractères, les mots, les lignes, l'intégralité du fichier (opérations d'ajout, de suppression, de remplacement, etc.). 334 ANNEXES ────────────────────────────────────────────────────────────── Comme l'éditeur ed, il travaille dans un tampon en mémoire qui est l'image du fichier lu sur le disque. Les fichiers manipulés par vi sont compatibles avec ceux utilisés par les autres éditeurs de texte. Malheureusement, compte tenu de son âge vénérable (cet éditeur a plus de 25 ans), l'utilisateur habitué aux traitements de texte actuels ne l'appréciera vraisemblablement pas. Tyrannosaurus Rex fut son surnom…. 4.1 Graphe d'état et modes de fonctionnement de vi L'éditeur vi fonctionne selon un des trois modes : • mode commande (utilisation des commandes internes de vi), • mode insertion de texte "effectuée au km", • mode ligne (utilisation de directive dont la portée est une ligne de texte). Le graphe des états de vi est le suivant Mode commande :w :w! :! :!! Shell Appel de vi sauvegarde du tampon sauvegarde forcée exécution d'une commande du shell insertion du résultat d'une commande :q! sortie forcée sans modif :q sortie (tampon non modifié) :wq sauvegarde et sortie Esc :x idem Mode ligne [n1,n2]s/c1/c2/[g] [n]x [n]dd [n]c ^B,^C Esc i,a,o,O Esc i,a,o,O Mode insertion Tampon de travail 4.2 Appel de vi vi [identificateur_fichier] Un fichier existant est chargé en mémoire et son nombre de caractères affiché. Un fichier inexistant n'est effectivement créé que lors de la sauvegarde du contenu du tampon. Exemples et variantes vi +n fichier vi + fichier vi +/chaîne fichier vi -r fichier édition à partir de la ligne n du fichier, édition à partir de la fin du fichier, édition à partir de la ligne du fichier contenant la chaîne spécifiée, tentative de récupération après un "plantage". ANNEXES 335 ────────────────────────────────────────────────────────────── 4.3 Commandes de vi On distingue plusieurs types de commandes de l'éditeur: • les commandes de sauvegarde et de sortie, • les commandes d'insertion, • les commandes de remplacement de caractères, • les commandes de concaténation de ligne, • les commandes de positionnement dans la ligne ou le fichier, • les commandes de manipulation de chaînes de caractères, • les commandes de suppression (caractères, mots, lignes), • les commandes d'annulation des effets de la dernière commande, • les commandes de recherche et de substitution de chaînes de caractères, • l'utilisation de plusieurs tampons de travail, • les options de fonctionnement de l'éditeur et l'accès à l'interprète de commandes. ■ Sauvegarde du tampon de travail et de sortie de l'éditeur :w :wq :w fichier :n,mw fichier :q :q! :e! fichier ■ Les commandes de passage en mode insertion i I a A o O :r fichier <Ctrl> v ■ passage en mode insertion devant le curseur, passage en mode insertion en début de ligne saisie, passage en mode insertion après le curseur, passage en mode insertion en fin de ligne, passage en mode insertion à la ligne suivante, passage en mode insertion à la ligne précédente avec ajout d'une ligne, insertion du fichier à partir de la ligne suivante, inhibition d'un caractère en mode insertion, très pratique pour insérer un caractère Esc. Les commandes de remplacement (caractère, mot) [n]r,s R C ou cw c$ c^ ■ sauvegarde du ficher en cours d'édition, sauvegarde du fichier et sortie de l'éditeur, sauvegarde du fichier défini, idem avec la sauvegarde des lignes n à m, abandon de la session courante sans prise en compte des modifications du fichier, abandon sans sauvegarde du tampon associé au fichier en cours modifié, abandon de la session en cours sans sauvegarde et démarrage d'une nouvelle session. remplacement du (de n) caractère(s) courant et passage en mode insertion, remplacement du reste de la ligne et sortie du mode insertion par Esc, remplacement du mot courant et sortie du mode insertion par Esc, remplacement du caractère courant jusqu'à la fin de la ligne et sortie du mode insertion par Esc, remplacement du début de la ligne jusqu'au caractère courant. La concaténation de lignes J concaténation de la ligne courante et de celle qui la suit. 336 ANNEXES ────────────────────────────────────────────────────────────── ■ Les commandes de positionnement dans le tampon Esc h ou Esc = Esc l ou Esc Esc j Esc k ou Esc + Ctrl f Ctrl b Ctrl d Ctrl u w b ) ( ■ déplacement d'un caractère à gauche, déplacement d'un caractère a droite, déplacement à la ligne suivante, déplacement à la ligne précédente, déplacement à la page suivante, déplacement à la page précédente, déplacement à la ½ page suivante, déplacement à la ½ page précédente, déplacement d'un mot à droite, déplacement d'un mot à gauche, déplacement en fin de phrase, déplacement en début de phrase. Les commandes de manipulation de texte :f ou:nu :n ^ $ n+ nCtrl g G demande de la position courante, positionnement au début de la ligne n, positionnement au début de la ligne courante, positionnement à la fin de la ligne courante, avance de n lignes, recul de n lignes, taux d'occupation de la ligne dans le tampon, positionnement à la fin du tampon. La fin de phrase est détectée soit par une ligne vide, soit par les caractères ! ? suivi d'au moins deux caractères d'espacement. ■ Les commandes de suppression x nx dw ndw dd ndd dA d$ ■ Annulation de la dernière commande u ■ annule l'action de la commande précédente. Les commandes de recherche de chaînes de caractères /xxx ?xxx /^xxx /[xy]xx n ■ suppression du caractère courant, suppression de n caractères à partir du caractère courant. suppression du mot pointé par le curseur, suppression de n mots pointé(s) à partir du curseur, suppression de la ligne courante, suppression de n lignes à partir de la ligne courante, suppression depuis le début de la ligne jusqu'au curseur, suppression depuis le curseur jusqu'à la fin de la ligne, recherche de la chaîne xxx suivante, recherche de la chaîne xxx précédente, recherche de la prochaine ligne commençant par la chaîne xxx, recherche de la chaîne xxx ou yxx suivante (les crochets sont véritables), relance la dernière recherche. Exécution de commandes de l'interprète depuis l'éditeur :! commande La terminaison de la commande provoque le retour à l'éditeur. ANNEXES 337 ────────────────────────────────────────────────────────────── ■ Appel de l'interprète de commandes depuis vi :!sh L'édition est suspendue par un appel à l'interprète de commandes. Le retour à l'éditeur s'effectue par l'utilisation du caractère Ctrl D ou de la commande de sortie de l'interprète exit. ■ Récupération du résultat d'exécution d'une commande dans un texte édité !! commande Le résultat de la commande est inséré à la ligne qui suit la position du curseur. Exemple !!date ■ Les commandes de substitution de chaînes de caractères :s/xxx/yyy/ :s/xxx/yyy/g :0,$s/xxx/yyy/g :n1,n2s/xxx/yyy/g :0,$s/xxx/yyy/cg [xy] [a-e] ■ substitue la chaîne yyy à la première occurrence de la chaîne xxx dans la ligne courante, substitue toutes les occurrences de la chaîne xxx par la chaîne yyy dans la ligne courante, substitue la chaîne yyy à la chaîne xxx dans tout le fichier sans demande de confirmation, substitue la chaîne yyy à la chaîne xxx entre les lignes n1 et n2 sans demande de confirmation, substitue la chaîne yyy à la chaîne xxx dans tout le fichier avec demande de confirmation, l'un des caractères x ou y un caractère de l'ensemble [a,e]. Utilisation des tampons Stockage dans un tampon yy ou Y "xyy ou "xY nyy ou nY n"xyy ou n"xY y$ mémorisation de la ligne courante dans le tampon par défaut, idem mais mémorisation dans le tampon x, mémorisation de n lignes dans le tampon par défaut, mémorisation de n lignes en utilisant le tampon x, mémorisation de la portion de ligne située entre le curseur et la fin de la ligne. Si la lettre référençant le tampon est majuscule, les mémorisations s'exécutent en mode ajout. Récupération du contenu d'un tampon p P "xp ou "xP ■ écriture du tampon par défaut derrière la position du curseur ou à la ligne suivante en fonction du contenu du tampon, idem mais écriture à la ligne précédente, idem mais utilisation du tampon x. Options de paramétrage :set all :set showmode :set [no]autoindent :set [no]number :set [no]list affichage des options définies. affichage du mode courant d'exécution (insertion, ajout, etc.). indentation automatique des paragraphes. affichage des numéros de lignes de l'édition courante. affichage des caractères non visualisés par défaut à savoir $ (fin de ligne), A (tabulation). 338 ANNEXES ────────────────────────────────────────────────────────────── Le fichier .exrc permet de définir des options de fonctionnement permanentes. Il est constitué d'une suite de lignes de directives respectant la syntaxe précédente. Exemple :set showmode :set nu[mber] :set no[mesg :set autoindent Exercice 1°) Utiliser l'éditeur de textes vi pour créer un fichier appelé avis qui contient vos impressions d'utilisation à son inventeur Bill Joy. La première version de la lettre sera truffée de fautes d'orthographe car la saisie sera effectuée au kilomètre et l'éditeur ne vous est pas familier. La dernière version devra être bien présentée, respectueuse, sans faute d'orthographe car Bill Joy est un des dirigeants de SUN. Vous avez même le droit de lui écrire en Anglais si vous vous en sentez capable. Il faudra sauvegarder ce fichier et le rappeler pour ajouter le post-scriptum. L'idéal serait que la lettre comporte environ 100 lignes. 10 lignes sont tout de même acceptées car la torture est, en principe, bannie de ce monde, même avec T-Rex...N'essayez pas d'y insérer des accents sauf dans une fenêtre xterm (et encore). 2°) Modifier votre fichier .exrc de telle sorte que : Le mode d'utilisation de l'éditeur vi apparaisse sur le moniteur, Le numéro de la ligne apparaisse sur le moniteur, L'indentation automatique soit prise en compte. 3°) Insérer une ligne contenant la chaîne de caractère /usr/lib/etc. 4°) A partir des commandes dd et p, la dupliquer. 5°) Concaténer ces deux lignes (commandes J). 6°) A partir de la commande Y, faire une duplication de 3 lignes à partir de la ligne courante. 7°) Remplacer en une seule commande la chaîne de caractères /usr/lib/etc par la chaîne de caractères /etc/bin/lib. 5. L'EDITEUR LIGNE ED 5.1 Présentation L'éditeur ligne standard d'Unix est ed. Antérieur à vi, il permet d'éditer des fichiers textes de 28 Ko au plus et il ignore les caractères NULL ou postérieurs au dernier Return. Synopsis ed [fichier] ANNEXES 339 ────────────────────────────────────────────────────────────── ■ Description L'éditeur ed affiche le nombre d'octets du fichier lu ou ? si le fichier n'existe pas ou est inaccessible, ou rien du tout si l'appel de ed est sans argument. Il n'affiche pas de prompt pour indiquer qu'il est en attente de commande. Il répond simplement par le caractère ? quand il ne peut pas exécuter une commande. 5.2 Principales commandes de l'éditeur ed Une commande est constituée d'un caractère précédé éventuellement d'une numérotation sous la forme n,p pour les lignes de n à p.suivie du caractère RC. ■ Insertion de texte na ni ajout du texte saisi au clavier après la ligne n, insertion du texte saisi au clavier avant la ligne n. La sortie du mode insertion est effectuée en tapant un point (.) en début de ligne. ■ Affichage n,pl /ch/ ?ch? n ■ Gestion des lignes n,pd n,pc n,piq n,ptq n,ps/chl/ch2/ ■ écriture des lignes n à P sur le fichier courant, lecture du fichier fichier1 après la ligne n, affiche le nom du fichier courant. Commandes diverses q !commande g ■ destruction des lignes n à p, destruction des lignes n à P et passage en mode insertion, recopie des lignes n à P après la ligne q, duplique les lignes n à P après la ligne q, remplacement de la chaîne de caractères chl par ch2 de la ligne n à la ligne p. Seule la première occurrence de chaque ligne est remplacée. Le caractère / n'est pas un caractère spécial mais seulement un délimiteur n'apparaissant dans aucunes des chaînes chl et ch2. Gestion des fichiers n,pw nr f1 f ■ affichage des lignes n à p, affichage de la première ligne contenant la chaîne ch, idem en parcourant le fichier en arrière, affichage de la ligne n, sortie de l'éditeur (ed répond ? si les modifications n'ont pas été sauvegardées, un deuxième appel à q force la sortie), exécution d'une commande du shell depuis l'éditeur, traitement global pour certaines commandes. Caractères spéciaux . $ ^ .= RUBOUT ligne courante ou un caractère quelconque, fin d'une ligne ou dernière ligne du fichier, début d'une ligne, affichage du numéro de la ligne courante, abandon d'une commande. 340 ANNEXES ────────────────────────────────────────────────────────────── 6. PRINCIPALES COMMANDES D'UNIX La liste ci-dessous présente sommairement les principales commandes Unix dans les environnements System V ou BSD. adb apply ar as at awk banner basename bc cal calendar cat cb cc cd chgrp chmod chown clear cmp compress cp cpio cpp crontab crypt csh cu cut cxref date dbx dc dd df diff du echo ed egrep emacs env eqn Metteur au point. Exécution d'une commande sur plusieurs arguments. Archiveur (gestionnaire de bibliothèques). Appel de l'assembleur. Exécution différée d'une commande. Manipulateur de fichiers. Affichage d'une bannière. Affichage du chemin d'accès relatif d'un fichier. Calculateur. Calendrier. Agenda. Affichage du contenu d'un fichier texte. C beautifier : enjoliveur de programmes C. Compilateur C. Déplacement dans l'arborescence. Modification du groupe d'un fichier. Modification des droits d'accès d'un fichier. Modification du propriétaire d'un fichier. Effacement de l'écran. Comparaison de fichiers. Compression de fichiers. Copie de fichiers. Archivage. Préprocesseur C. Exécution d'activités périodiques. Cryptage de fichiers. Appel de l'interprète de commandes C Shell. Utilitaire de communication. Sélection de champs dans un fichier. Cross-référenceur (enrichit la table des symboles via cpp). Affichage et modification de la date. Débogueur. Calculateur de bureau. Copie physique d'un média. Etat des systèmes de fichiers montés. Comparaison de fichiers. Affichage (récursif) du nombre de blocs utilisés par un répertoire. Affichage d'une chaîne de caractères. Editeur ligne. Recherche d'occurrences de texte dans un fichier. Editeur pleine page. Affichage des variables d'environnement. Formateur de symboles mathématiques (pour fichier troff). ANNEXES 341 ────────────────────────────────────────────────────────────── expr exit f77 fgrep file find finger from grep head id ipcrm ipcs join ksh kermit kill last lastcomm ld leave lex line lint lock login logout logname look lp/lpr lpstat/lpq lprm ls mail make makekey man mesg mkdir more mv newgrp news nice Evaluation d'expressions arithmétiques. Déconnexion. Compilateur Fortran. Recherche d'occurrences de texte dans un fichier. Affichage du type des fichiers. Recherche de fichiers dans l'arborescence selon des critères définis. Information sur les utilisateurs. Indicateur de l'origine du courrier. Recherche d'occurrences de texte dans un fichier. Affichage des premières lignes (texte) d'un fichier. Affichage de l'uid et du gid de l'utilisateur. Suppression d'un IPC (Inter Process Communication). Affichage de l'état des IPC (Inter Process Communication). Opérateur relationnel de jointure. Appel de l'interprète Korn shell. Logiciel de communications en mode asynchrone. Emission d'un signal à un processus. Historique des dernières connexions. Historique des dernières commandes. Editeur de liens. Invitation à se déconnecter (signal sonore et message envoyé à une heure donnée). Analyseur syntaxique. Lecture d'une ligne. Analyseur syntaxique C. Verrouillage d'un terminal. Connexion. Déconnexion. Affichage du nom de login. Recherche dans un fichier ou un dictionnaire. Impression (System V / BSD). Etat du spoule impression (System V / BSD). Destruction d'une entrée dans le spoule (BSD). Informations sur les fichiers. Agent utilisateur de la messagerie électronique. Gestionnaire d'applications (génie logiciel et administration). Création d'une clé cryptée. Documentation en ligne. Autorisation ou non de réception de messages envoyés par la commande write. talk ou wall. Création de répertoire. Affichage par page. Renomme ou déplace un fichier ou un répertoire. Changement du groupe courant (à condition d'être déclaré dans plusieurs groupes). Affichage des nouvelles. Modification de la priorité d'exécution d'un processus. 342 ANNEXES ────────────────────────────────────────────────────────────── nm nohup nroff od pack passwd paste pr ps pwd ranlib rev rm rmdir sar sccs script sdb sed size sleep sort split strip stty strings su sync tail talk tar tbl tee test time touch tput tr troff tsort tty umask uname uncompress Affichage de la table des symboles de fichiers objets ou exécutables. Exécution d'une commande ignorant les signaux SIGHUP et SIGQUIT. Formateur de texte. Affichage d'un dump. Compression d'un fichier. Modification du mot de passe. Fusion de fichiers. Affichage de fichiers formatés. Affichage de l'activité des processus. Affichage du répertoire courant. Réorganisation d'une bibliothèque. Inversion des lignes dans un fichier. Suppression de fichiers. Suppression de répertoire(s). Statistiques d'activité système. Gestion des versions des fichiers source. Enregistrement du déroulement de la session dans un fichier. Metteur au point. Editeurs de flots non interactif. Affichage des tailles des segments d'un fichier objet ou exécutable. Suspension d'exécution. Tri de fichiers texte. Partitionnement de fichiers. Suppression de la table des symboles d'un fichier objet ou exécutable. Affichage ou modification des attributs d'un terminal. Recherche de chaînes de caractères dans un fichier binaire. Changement de l'identité courante. Vidage du cache sur disque. Affichage des dernières lignes d'un fichier. Dialogue interactif entre deux utilisateurs connectés. Sauvegarde. Metteur en forme de tableaux pour nroff et troff. Filtre à 2 sorties. Evaluation d'expression. Affichage du temps d'exécution. Création d'un fichier vide ou changement de la date de dernière modification (make). Gestion des attributs vidéos d'un terminal. Translation de caractères. Photocomposeuse. Tri d'un fichier texte selon un champ. Affichage du terminal logique associé au poste de travail. Définition des droits d'accès par défaut des fichiers. Affichage du nom du système hôte (exemple : uname -a ). Décompression d'un fichier compressé par compress. ANNEXES 343 ────────────────────────────────────────────────────────────── uniq users vi w wc who whoami write yacc Suppression des lignes identiques d'un fichier trié Affichage de la liste des utilisateurs connectés (rusers dans un réseau). Editeur pleine page. Affichage des commandes exécutées par les utilisateurs. Comptage du nombre de mots. de caractères. des lignes d'un fichier. Affichage des utilisateurs connectés. Affichage de l'identité de l'utilisateur. Emission d'un message interactif à un utilisateur. Analyseur grammatical. BIBLIOGRAPHIE ■ Ouvrages généraux sur les systèmes d'exploitation Architecture de l'ordinateur - Andrew Tanenbaum (Editeur : InterEditions). Operating System Concepts - J. Peterson / A. Silbershatz (Editeur : Addison Wesley). Systèmes d'exploitation des ordinateurs - Crocus (Editeur : Dunod). Modern Operating Systems - Andrew Tanenbaum (Editeur : Prentice Hall). Réseaux de Pétri : Théorie et pratique - G.W. Brams (Editeur Masson). ■ Unix The Design of the Unix System V operating system M.J. Bach (Editeur: Prentice Hall) The Design and the implementation of the 4.3 BSD Unix operating system Leffler, McKusick, Karels, Quarterman (Editeur Addison Weslay) The Magic garden explained : the Internals of Unix System V Release 4 Berny Goodheart & James Cox (Editeur: Prentice Hall) Unix System Administration Handbook Evi Nemeth, Garth Snyder, Scott Seebass (Editeur : Prentice Hall) ■ Windows Windows Internals Mark Russinovitch, David Solomon, Dave Cutler (Editeur : Microsoft Press) ■ Programmation système The C programming Langage - Brian Kernighan, Dennis Ritchie (Editeur : Prentice Hall) POSIX Programmers Guide - D. Lewine (Editeur: O'Reilly & Associates, Inc) INDEX " ", 118 . .cshrc, 185, 327 .exrc, 328, 338 .kshrc, 184, 327 .login, 185, 327 .logout, 185 .mailrc, 328 .mwmrc, 328 .netrc, 328 .profile, 183, 327 .xinitrc, 328 / /bin, 133 /bin/su, 301 /dev/kmem, 231 /dev/mem, 231 /dev/null, 231 /dev/tty, 231 /etc/at, 311 /etc/batch, 311 /etc/crontab, 311 /etc/default/checklist, 216 /etc/fstab, 216 /etc/group, 298, 299 /etc/motd, 165 /etc/passwd, 298, 302 /etc/profile, 165 /etc/shadow, 104, 298, 302 /lib, 133 /mnt, 132 /sbin, 133 /tmp, 133, 310 /unix, 133 /usr/bin, 133 /usr/lib, 133 /usr/lib/cron, 311 /usr/lib/cron/queuedefs, 311 /usr/spool, 310 /usr/spool/cron, 311 /usr/tmp, 133, 310 [ [], 173 A abort, 91 Accès à distance au Registre, 292 accès aléatoire, 31 accès concurrents, 69, 110 accès direct, 31 accès distant, 251, 320 accès séquentiel, 31 access, 131 Access, 100 Access Control Entry, 117 Access Control List, 116 accolades, 168 acct, 302, 310 accumulateur, 33 ACE, 117 ACL, 116 acledit, 117 aclget, 117 aclput, 117 activité multiple, 72 ada, 15 ADA, 10, 15, 97 Ada Lovelace, 10 additionneur, 9 administrateur de disques, 208 Adobe, 51 adressage absolu, 81 adressage direct, 81 adressage immédiat, 81 adressage indexé, 82 adressage indirect, 81 adressage normal, 81 adressage par base et déplacement, 81 adressage par page, 82 adressage relatif, 81 adressage relativement à l'adresse courante, 82 adresse, 81 adresse absolue, 81 adresse de base, 81 adresse effective, 81 adresse réelle, 81 adresse relative, 81 Advanced Risc Computer, 286 AFNOR, 15 AFS, 211 aging, 302 agrégat de partitions, 55 agrégat par bande avec parité, 55 agrégats par bandes, 54 Aida, 57 AIX, 18, 19, 20, 99, 117, 224, 240, 293 Al Gore, 21 alarm, 148 algèbre de Boole, 10 Algol, 97 algorithme, 96 algorithme de la double chance, 159 346 INDEX ────────────────────────────────────────────────────────────── algorithme de Zempel-Liv, 247 algorithme d'Euclide, 26 algorithme du tourniquet, 150 algorithme du voleur de cycles, 159 algorithme FIFO, 87 algorithme LFU, 87 algorithme LRU, 87 algorithme RAND, 87 alias, 107, 164, 165, 166, 184, 185, 186, 327 allocateur de ressources, 78 AMD, 13, 28, 251, 256 American Standard Code For Informations Interchange, 26 American Telephone et Telegraph, 12 analyse formelle, 96 analyse numérique, 22 Andrew Morton, 240 annuaire, 102 antémémoire, 86 anticipation, 86, 159, 226 Apache, 314 APC, 264, 266, 274 APC en mode noyau, 274 APC en mode utilisateur, 274 API, 17, 98, 252, 253, 259, 264, 265, 266, 267, 268, 270, 274, 281, 282 API 32 bits, 252 API 64 bits, 252 API OS/2, 252 appel asynchrone de procédure, 274 appel de procédure locale, 256, 277 appel système, 98, 138 Apple, 13, 18, 251, 320 Appletalk, 320 application, 23 Application Programming Interface, 98, 252 apropos, 107 ARC, 286 architecture externe, 29 architecture interne, 29 arp, 320 ASP, 101 Asynchronus Procedure Call, 264, 274 at, 302, 313 ATA with Packet Interface Extension, 48 ATAPI, 48 Athlon, 28 ATT, 12, 17, 18, 19, 99, 100 attente active, 72, 179 attribut de propriété, 113 attribut de sécurité, 113 attributs de sécurité par défaut, 115 attributs graphiques, 50 authentification, 278 automate programmable, 23 Avast, 296 avi, 51, 101 B Babbage, 10 backquote, 168 backslash, 118 backup, 246 balayage, 49 balise, 101 bande passante, 49 Bardeen, 12 barette, 32 base de registres, 33, 279, 280, 288, 291, 292 basename, 119 bash, 155 Basic, 13, 97 Basic Input Output System, 32 batch, 25, 311, 312, 313, 314 BCPL, 17 bdbclk, 223 bdevsw_add, 238 Bell, 12, 17, 19 benchmark, 35 Best Fit, 86 bibliothèque, 96 bibliothèque liée dynamiquement, 98, 252 bibliothèque partagée, 159 Bill Clinton, 21 Bill Gates, 13 Bill Joy, 163, 333, 338 binary digit, 11 BIOS, 32, 57 bit, 11 bit d'adhérence, 116, 145 bit le plus signicatif, 27 bit s, 115 bit S, 116 bit suid, 115, 116 bitmap, 27 bits de poids faible, 26 bits de poids fort, 26 bloc, 41 blocage mutuel, 63, 64 bmap, 215 bmp, 101 bogue, 96 bogue de l'an 2000, 95 boîtier, 28 Bombe logique, 295 Boole, 10 boot.ini, 286, 316 boucle d'attente active, 74 boulier Chinois, 9 Bourne Again shell, 163, 173 branchement conditionnel, 10, 92 Brattain, 12 break, 178 Brian Kernighan, 17 brochage, 30 broche, 29 browser, 100 buffer, 226 bug, 97 bureau, 288 bureautique, 21 INDEX 347 ────────────────────────────────────────────────────────────── bus AGP, 38 bus d'adresses, 29, 37 bus de données, 29, 34, 35, 37 bus externe, 29 bus ISA, 38 bus SCSI, 39, 43, 56 bus Ultra DMA, 39 C C, 97 C shell, 77, 155 c_bloc, 239 C++, 15, 97, 101 cache, 32, 77, 83, 99, 110, 113, 158, 160, 214, 217, 218, 226, 227, 256, 282, 283, 342 cache disque, 77, 226 cache logiciel, 32, 77, 113, 226, 256 cache matériel, 32 cadre de pile, 274 canal d'accès à un objet, 268 cancel, 331 canput, 237 capacité de la mémoire, 31 capacité de stockage, 43 capacité formatée, 42 capacité nominale, 42 caractère backquote, 168 caractère spécial ", 118 caractère spécial *, 118 caractère spécial ?, 118 caractères spéciaux, 118, 127, 128, 129, 163, 167, 173, 188, 239, 244, 245, 328 carnet de bord, 294 carte à puces, 21 carte d'acquisition, 52 carte de communications, 52 carte mère, 21, 29, 32, 37, 47, 48, 52, 321 carte perforée, 10 cat, 124 catalogue, 89, 109 cathodic ray tube, 49 cavalier, 47 CCITT, 15 cd, 122 CDE, 77 cdevsw_add, 238 CDROM, 43 Céléron, 28 Central Processing Unit, 23 chaînage arrière, 22 chaînage avant, 22 chaîne de modules, 234 chargement, 33, 84, 158 chargeur, 208, 264 chemin d'accès, 109, 110, 111, 119, 127, 129, 145, 160, 170, 182, 188, 216, 243, 268, 340 chemin d'accès absolu, 119, 170 chemin d'accès relatif, 119 chemin de données, 234 cheval de Troie, 295 chgrp, 113, 302 chien de garde, 296 chiffrement, 234 chip, 28 chipset, 37 chkdsck, 217 chmod, 114, 131, 171, 301 Chomsky, 97 chown, 113, 301, 302 circuit spécialisé, 37 classe de répartiteur, 276 clause case, 176 clause for, 177 clause if, 175 clause until, 178 clause while, 177 clavier, 24, 48 clavier azerty accentué, 48 clavier numérique, 48 clavier sans fil, 48 clé, 89, 90 clear, 329 clonage, 144, 158 close, 131, 235 clri, 223 cluster, 54, 159, 314 cmp, 125 Cobol, 97 codage digital, 26 code ASCII, 26 code EBCDIC, 26 code exécutable, 78 code opération, 33, 34, 81 codec, 51 cohérence d'un système de fichiers, 217 comm, 125 command unit, 24 commentaire, 167 commerce électronique, 101 commit, 91 Common Development Environment, 20 compatibilité, 34, 94, 251, 282 compatibilité ascendante, 34 compatible, 14 compilateur, 97 complexité, 22, 93, 94, 96 composant logiciel, 96 compress, 247, 248 compression, 247 compteur ordinal, 33, 82 conception assistée par ordinateur, 21 condition d'adressage, 81 conditions aux limites, 96 connecteur ATX, 39 connectivité, 320 consommable, 51 conteneur, 89, 109, 207, 267, 271 conteneur racine, 109 contexte d'exécution, 46, 78, 91, 169, 171, 233, 262, 263, 264, 274 continue, 178 348 INDEX ────────────────────────────────────────────────────────────── contrôleur, 24, 39, 42, 54, 227, 228, 238, 252 contrôleur de services, 252 contrôleur de système de fichiers, 217 contrôleur d'interruptions, 39 convert, 283 convertisseur analogique/digital, 48 cookie, 100 Copernic, 102 core, 13, 128, 145, 148, 222, 313 Core 2 Multi Core, 28 couche d'abstraction matérielle, 256, 282 couche socket, 232 couches fonctionnelles, 251 couleur, 27, 50, 51 cp, 123 CP/M, 13 cpio, 127, 244, 245 CPU, 23 creat, 131 création, 129 cron, 302, 306, 309, 310, 311, 312 cron.allow, 311 cron.deny, 311 crontab, 311, 312, 314, 340 CRT, 49 crypt, 125 csrss.exe, 253 CSS, 101 CUPS, 320 cycle d'horloge, 29, 33 cycle d'une mémoire, 31 cycle perpétuel, 93 cylindre, 42 D daemon, 300, 306 daisy chain, 48 DAO, 21 DARPA, 17 DAT, 43 data segment, 78, 159 date, 329 DB2, 21 dcopy, 246 dd, 245, 246 DDE, 319 dead lock, 63 Debian, 19 débit d'une mémoire, 31 débogueur, 139, 140, 148, 231, 262, 263, 274, 340 déchargement, 84, 158 décodeur de code barre, 24 defadm, 305 défaut de page, 86, 159 Defense Advanced Research Project Agency, 17 degré de multiprogrammation, 84 delayed write, 113 délimiteur, 167, 339 démasquage, 45 démontage, 43 Dennis Ritchie, 17, 100, 232 déplacement, 81 déroutement, 44, 138, 147, 256 descripteur, 78 descripteur d'accès à l'objet, 255 descripteur d'adressage virtuel, 261 descripteur de sécurité, 268 dessin assisté par ordinateur, 21 détrompeur, 53 device driver, 77, 89 df, 223, 340 DHCP, 320 DHTML, 101 dialogue homme/machine, 24 diff, 125 Differed Procedure Call, 274 Digital Audio Tape, 43 Digital Equipment, 10 Digital Linear Tape, 43 Digital Research, 13 Direct Memory Access, 39 directory, 89, 109 dirname, 119 discipline de ligne, 239 Disk Operating System, 25, 88 dispatcher, 79, 151, 259 disque amovible, 43 disque dur, 43 disque fixe, 43 disque logique, 208, 287 disque miroir, 54, 208 distribution uniforme, 90 dll, 98 DLT, 43 DNS, 315, 320 document technique normatif de référence, 96 domaine, 251, 319 domaine public, 16, 19, 20, 293 donnée, 23 donnée alphanumérique, 26 DOS, 25 dossier, 24, 89, 109 double clock, 159 double précision, 27 double quotes, 167 douceur, 100 downstream queue, 232 DPC, 274 drapeau, 33 Dreamweaver, 101 droits d'accès, 114 du, 122 dump, 246 duplexing, 54 Dynamic Data Exchange, 319 Dynamic Host Configuration Protocol, 320 Dynamic Linked Library, 98, 252 E E. Dijkstra, 64, 70, 92 INDEX 349 ────────────────────────────────────────────────────────────── EAO, 21 échange total, 83 echo, 166 écran plat, 49 ed, 333, 338 édition dynamique de liens, 133 edquota, 219 EDSAC, 10 EEPROM, 31 efficacité, 95 egrep, 129 EIDE, 39 Electrically and Erasable PROM, 31 emacs, 166, 327, 328, 333, 340 en tête de l'objet, 270 enregistrement logique, 88 enregistrement physique, 41, 42, 88 enseignement assisté par ordinateur, 21 entrées/sorties, 24 entrées/sorties de bas niveau, 113 entrées/sorties de haut niveau, 113 entrées/sorties en mode bloc, 113 entrées/sorties en mode caractère, 113 entrées/sorties en mode cru, 113 entrées/sorties en mode raw, 113 env, 170 EPROM, 31 éradication, 296 ergonomie, 14, 95 erreur de troncature, 27 espace mémoire adressable, 31 espace vital, 85, 158 estimateur, 150 Ethernet, 37, 52 étreinte fatale, 63 événement, 45, 46, 139, 142, 143, 147, 151, 236, 259, 266, 267, 268, 275, 276, 302 Everest, 57 évolutivité, 47 exception, 147 exclusion mutuelle, 61, 64 exécutif, 77 executive, 77 exit, 105 expr, 178, 181, 194, 341 EXT3, 211 Extended Binary Coded Decimal Information Code, 26 eXtended Markup Langage, 101 extensibilité, 94 F facteur de groupage, 88 faille de sécurité, 216, 295 Fairchild, 12 famine, 64 FAO, 21 fast mutexes, 73 FAT, 43, 129, 207, 282, 283 Feautrier, 188 Fedora, 19 fermeture, 130 ff, 223 fg, 155 fgrep, 129 Fiber Channel, 56 fibre, 72, 264 fibre d'un processus, 72 fichier, 24, 41, 88, 109 fichier banalisé, 109 fichier d'échanges, 222 fichier image tar, 242, 243, 246, 247, 248 fichier indexé, 91 fichier normal, 109 fichier ordinaire, 109 fichier régulier, 109 fichier relatif, 90 fichier séquentiel indexé, 91 fichier silencieux, 112, 118 fichier spécial, 110 fichier standard, 110 fichier standard d'affichage des messages d'erreurs, 110, 212 fichier standard de sortie, 212 fichier standard d'entrée, 110, 212 fichier virtuel, 212 FIFO, 87 file, 232 file d'attente, 64 file de messages, 159, 160, 235 file d'écriture, 232 file des messages descendants, 232 file des messages montants, 232 file en lecture, 232 file mapping object, 264 file system, 207 file system debugger, 220 filesave, 246 filtre, 233 find, 127, 244, 245, 305, 313 finger, 108, 320 Firefox, 100 firewall, 297 First Fit, 86 First In First Out, 87 Flops, 35 flux, 24, 38, 59, 87, 100, 112, 113, 129, 227, 232, 233, 234, 235, 236, 237 flux d'entrées/sortie, 232 flux des données descendantes, 232 flux des données montantes, 232 fmodsw, 233 fonction de hachage, 90 formatage, 42 formatage de bas niveau, 42 formatage de haut niveau, 43 forme canonique, 145 forme normalisée, 27 Fortran, 15, 97 fragment, 211 fragmentation, 86, 158 frame based exception handler, 274 350 INDEX ────────────────────────────────────────────────────────────── FreeBSD, 19 fréquence de balayage, 49 fréquence de rafraîchissement, 49 fréquence de synchronisation horizontale, 49 fréquence de synchronisation verticale, 49 fréquence ligne, 49 friendly mutexes, 73 Front Page, 101 Front Side Bus, 38 FSB, 38 fsck, 132, 217, 218, 219 fsdb, 220 fstab, 307 FTP, 314, 320 ftpd, 320 fuser, 126 G garbage collector, 86 Gary Kildal, 13 GDI, 252, 253, 284 GDI32.dll, 253, 258 General Electric, 16 génération d'un noyau, 240 Gentoo linux, 19 gestion, 21 gestion de production assistée par ordinateur, 22 gestion mémoire, 80 Gestionnaire de périphériques, 317 gestionnaire de tâches, 255 gestionnaire de travaux, 59, 77 gestionnaire de travaux, 78 gestionnaire de volumes logiques, 208, 224 gestionnaire des comptes de sécurité, 279 gestionnaire des déroutements, 272 gestionnaire d'exception basé sur le cadre, 274 gestionnaire d'interruptions, 45 gestionnaire d'objets, 268 gestionnaire d'objets, 255 gestionnaire d'objets, 268 get priority level, 152 getcontext, 154 getmsg, 236 Gibioctet, 11 gif, 27, 101 Giga octets, 11 Gio, 11 Gnome, 105, 293 GNU, 20, 100, 208, 240 Google, 102 GPAO, 22 gpl, 152 GPU, 52 grammaire, 97 granularité, 83 granularité d'un verrou, 69 graphe d'allocation des ressources, 75 graphe orienté des transitions, 139 Graphical Device Interface, 252 Graphical Processor Unit, 52 Graphical User Interface, 317 grappe, 54, 314 grep, 129 Gries, 92 groupadd, 305 groupdel, 305 groupe, 104, 113 groupe courant, 105 groupe de volumes physiques, 224 groupmod, 305 groups, 105, 300 GRUB, 208 GUI, 317 gzip, 247 H HAL, 256 handle, 255, 268 handler, 255 hard limit, 219 hardware, 21 Hardware Abstraction Layer, 256 hash coding, 90 head, 124 héritage, 16, 144, 263, 268 Hewlett Packard, 10 hexadécimal, 26 history, 166 HISTSIZE, 164 HKEY_CLASSES_ROOT, 290 HKEY_CURRENT_CONFIG, 290 HKEY_CURRENT_USER, 291 HKEY_DYN_DATA, 291 HKEY_LOCAL_MACHINE, 291 HKEY_LOCAL_MACHINES, 279 HKEY_PERFORMANCE_DATA, 291 HKEYS_USERS, 291 Hoff, 12 Hollerith, 10 home directory, 298, 302 Honeywell, 13 horloge temps réel, 33, 34, 37, 39, 151 hostname, 320 HP-UX, 18, 20, 240, 293 HTML, 101 Hyper Text Markup Langage, 101 I IBM, 10, 12, 13, 14, 18, 20, 25, 26, 36, 50, 99, 208, 224, 251, 320 id, 105 IDT, 272 IEEE, 16, 27 IHM, 24, 100 i-liste, 210 image d'un processus, 137 imprimante, 51 imprimante à jet d'encre, 51 imprimantes laser, 51 INDEX 351 ────────────────────────────────────────────────────────────── index, 91 index number, 210 indexation, 82 indicateurs d'état, 33 indice de performance, 35 indirection, 210 inetd, 310 informations de contrôle, 255 informatique, 23 ingénierie du logiciel, 92 Ingo Molnar, 240 Ingres, 100 init, 306, 307, 308, 310 init.d, 308 initialisation, 42 initialisation d'un sémaphore, 64 inittab, 307, 308 inode, 110, 111, 210, 233 Input Output Request Packet, 282 input/output, 24 installateur Windows, 321 instruction indivisible, 61 instruction privilégiée, 34 intégrité, 95 Intel, 10, 12, 13, 14, 19, 28, 38, 251, 253, 256 Intelligence artificielle, 22, 97 interblocage, 63, 79 interface homme machine, 20, 24, 59, 77, 95, 267 interface MIDI, 52 interface parallèle, 51 interface série, 51 International Business Machines, 10 Internet Exploreur, 100 Internet Information Server, 320 interopérabilité, 14, 16 interprète de commandes, 97 Inter-Process Communication, 100, 159 Interrupt dispatch table, 272 interrupt handler, 45 Interrupt Service Routine, 272 interruption, 138, 147, 256 interruption logicielle, 44 interruption logicielle différée, 274 interruption matérielle, 39 interruption request, 44 Interruption Request Level, 273 i-number, 210 ioctl, 233, 236 IPC, 100, 159, 232 ipconfig, 320 ipcs, 160 IPX/SPX, 320 IRP, 282 IRQ, 32, 44, 291 IRQL, 272, 273, 275 ISO, 15 ISR, 272 J Jacquart, 9 Jamie Cameron, 314 Java, 15, 97, 101, 314 Javascript, 101 JCL, 25 jeton, 261, 263, 280, 281 jeton d'accès, 261 jeton d'accès primaire, 263 jeton d'accès sécurisé, 256 Job Control Langage, 25 jobs, 155 journal des images après, 91 journal des images avant, 91 joystick, 52 jpg, 27, 101 jumper, 47 K Kaspersky, 296 KDE, 105, 293, 327 Ken Thompson, 17 kernel, 59, 137 kernel.org, 241 kernel32.dll, 253, 263 kerneld, 238 kgdb, 240 Kibioctet, 11 kill, 148, 149, 156, 161, 166, 239, 328, 341 killall, 157, 162 Kilo octets, 11 Kio, 11 Knoppix, 19 Knuth, 92 Korn shell, 77, 155, 163 L label de disque, 246 label de volume, 41 labelit, 246 l'AFUU, 36 LAN Manager, 251 langage d'assemblage, 97 langage de deuxième génération, 97 langage de manipulation d'objet, 97 langage de quatrième génération, 100 langage de représentation, 101 langage machine, 92, 97 langage orienté objet, 97 langage structuré, 97 lastcomm, 157, 341 LCD, 49 Least Frequently Used, 87 Least Recently Used, 87 lecteur de badge, 24 lecteur de code barre, 48 lecteur optique, 48 LFU, 87 liaisons, 320 licence publique générale, 20 lien hypertexte, 111 352 INDEX ────────────────────────────────────────────────────────────── lien matériel, 110, 210, 244 lien symbolique, 111, 242, 272 LILO, 208 limite douce, 219 limite dure, 219 Linus Torvalds, 19, 240 Linux, 14, 17 Linuxconf, 293 Lisp, 97 liste, 102, 115, 235, 242, 311, 312, 314 liste blanche, 311 liste de contrôle d'accès, 268 liste des inodes, 210 liste noire, 311 listes de contrôle d'accès, 116 ln, 111 load, 33 Local Procedure Call, 256, 277 Local Security Authority server, 279 Logical Volume Manager, 208, 224 logiciel, 21 logiciel applicatif, 60 logiciel de base, 60 logiciel de maintenance, 321 logiciel de reconnaissance de caractères, 51 logiciel libre, 314 logname, 105 logout, 105 loi de Moore, 11, 28, 47 longjump, 154 LOO, 97 lost+found, 132, 211 lp, 331 lpd, 320 lpq, 320 lpr, 320 lpsched, 306 lpstat, 331 LRU, 87, 159 ls, 111, 114, 118 LSA, 279 lsass, 279 lseek, 131 lsmod, 238 LVM, 224 M MacAffe, 296 machine de Falcon, 9 machine de Türing, 10 machine réelle, 59, 60 machine virtuelle, 19, 59, 60, 61, 252, 254 machine virtuelle MS/DOS, 254 machine virtuelle OS/2, 253 machine virtuelle POSIX, 253 macro, 172, 178, 180 macro $, 167 Macromédia, 101 mainframe, 11 mainline, 240 maintenance, 97 majeur, 14, 187, 195, 221, 229, 240 make, 106, 126, 161, 189, 305, 341, 342 makefile, 240 man, 106, 107, 108, 183, 341 mandatory locking, 69 Mandriva, 19 manettes de jeux, 52 manuel de références, 106 Martin Richard, 17 masquage, 45, 56, 65, 152 masque d'affinité, 266 masque d'audit, 302 masque de sécurité, 115 Master Boot Record, 316 MBR, 316 Mean Time Between Failure, 10 Mébioctet, 11 mécanisme d'affinité du processeur, 258 mécanismes de communications entre processus, 100 Méga octets, 11 meilleur choix, 86 mémoire, 23 mémoire cache, 86 mémoire centrale, 24, 31, 33, 37, 83, 84, 85, 86, 87, 140, 142, 157, 158, 215 mémoire commune, 73, 159 mémoire flash, 32 mémoire mécanique, 10 mémoire partagée, 77, 100, 159, 160, 264, 267, 277 mémoire secondaire, 32, 41, 85, 86 mémoire virtuelle, 85 mémoire-cache, 77 mémoire-tampon, 67 Memory Management Unit, 80 Mepis, 19 message, 100, 235 message entrant, 232 message sortant, 232 messages, 232, 234, 235, 236, 237, 319 mesure de productivité, 94 méta caractère, 118 méta moteur de recherche, 102 méthode d'accès, 89 méthode des approximations successives, 96 micro-noyau, 256 microprocesseur, 11, 12, 13, 28, 29, 30, 37, 51 Microsoft, 10, 13, 14, 18, 20, 96, 100, 101, 251, 289, 320, 344 Microsoft System Installer, 321 MIDI, 48 mineur, 12, 187, 195, 221, 229, 240 Mio, 11 Mips, 35 mirroring, 54 MIT, 16 mkdir, 122 mknod, 229 mmap, 159, 228 MMU, 80 mode asynchrone, 89 INDEX 353 ────────────────────────────────────────────────────────────── mode background, 146, 148, 155, 156, 167, 172, 185 mode bloc, 110, 227 mode c, 110 mode canonique, 239 mode caractère, 227, 239 mode cbreak, 239 mode cooked, 239 mode cru, 239 mode d'adressage, 81 mode d'exécution, 98 mode différé, 146, 148, 155, 156, 161, 189, 313 mode esclave, 48 mode foreground, 146, 155 mode graphique, 50 mode interactif, 146, 155, 161 mode ligne, 239 mode maître, 48 mode natif, 61 mode noyau, 34, 232 mode privilégié, 138 mode raw, 211, 217, 239, 242 mode superviseur, 34 mode synchrone, 89 mode système, 34, 137 mode texte, 50 mode utilisateur, 34, 98, 137, 138, 140, 142, 232, 252, 253, 261, 263, 264, 267, 268, 270, 274, 276, 330 modèle des lecteurs et des rédacteurs, 99 modèle du producteur et du consommateur, 67, 99 modèle en couches, 60 modem, 238, 301, 320 module, 233 module de tête du flux, 233 module stream, 233 module terminal du flux, 233 monétique, 21 moniteur, 49, 59 moniteur de sécurité, 256 moniteur LCD, 49 montage, 43, 132, 211, 212, 214, 215, 216, 217, 247, 299, 310 Moore, 12, 28 more, 124 most significant bit, 27 mot, 29, 31 mot-clé, 97 moteur de recherche, 102 moteur d'inférences, 22 mouchard, 100 mount, 215, 216, 223 Mozilla, 100 mp3, 27, 51 MPEG2, 27, 51, 101 MPEG4, 27, 51, 101 MPEG7, 51 MS/DOS, 13, 14, 252, 271, 278, 282, 284 MSI, 321 mt, 242, 248 MTBF, 10 Multics, 16 multiprocesseurs, 15, 20, 65, 73, 100, 251, 256, 275, 278, 285 multiprogrammation, 25 multitâches, 251 multitâches préemptif, 256 multithread, 72, 251 mutex, 65, 71, 73, 74, 271, 273, 275, 276, 280 mutexes amicales, 73 mutexes rapides, 73 mv, 122 mv, 123 mv, 123 mvdir, 122 MVS, 25, 59 MySQL, 100 N named pipe, 110 nappes, 53 NAS, 56, 57 navigateur, 100 nbtstat, 320 ncheck, 222 NETBEUI, 320 Netscape, 101 netstat, 320 Netware, 251, 320 Network Attached Storage, 56 Network File System, 99, 212 newfs, 218 newgrp, 105, 113, 300 NFS, 99, 111, 212, 215, 216 nice, 142, 150, 157, 158, 162, 312, 341 niveau de gris, 27, 50 niveau de priorité, 138, 150, 151, 259 niveau d'exécution, 45, 152, 259, 264, 306, 308 niveau d'indirection, 81 niveau d'interruption, 45, 65, 273 niveau logique, 89 niveau physique, 89 niveau unique de stockage, 83 nodev, 229 nœud d'index, 110, 111, 129, 210 nohup, 148, 156, 161, 342 nombre entier non signé, 26 nombre entier signé, 27 normalisation, 21 norme, 15 North Bridge, 37 Norton, 296, 321 notification d'événement, 236 noyau, 59, 232, 233, 234, 240 noyau générique, 240 noyau Linux, 240, 241 noyau Linux version stable, 240 noyau Linux version de développement, 240 Noyce, 12 NTFS, 207, 211, 282, 283 354 INDEX ────────────────────────────────────────────────────────────── ntldr, 316 ntoskrnl, 316 ntoskrnl.exe, 258 NTVDM, 254 nulldev, 229 numéro de cylindre, 42 numéro de piste, 42 nwlink, 320 O objet, 260, 267, 268, 269, 270, 276, 280, 290 objet DPC, 274 objet informatique, 61 objet port, 277 objet type, 270 OCR, 51 octet, 11 od, 124 open, 131, 212, 235 Open Software Foundation, 18 opérande, 33 opérateur crochets, 173 opérateur test, 173 opérateurs crochets, 118 opération lock, 73 opération P, 64 opération unlock, 73 opération V, 64 Oracle, 21, 100, 327 ordinateur personnel, 10 ordinateur universel, 11 ordonnancement, 59, 258 ordonnanceur, 77, 79, 139, 140, 141, 142, 147, 151, 158, 160, 234, 235, 236, 252, 255, 258, 266, 273, 274 organisation, 16, 24, 88, 89, 90, 100, 210, 287, 295, 321, 323 organisation aléatoire, 90 organisation indexée, 90 organisation logique, 85 organisation physique, 85 organisation séquentielle, 90 organismes de normalisation, 15 OS/2,, 208, 252 OSF, 18 Outils d'administration, 317 ouverture, 14, 129 overclocker, 57 overhead, 43, 86 overlay, 145 P p_nice, 150 p_swaddr, 154 page, 82 page composer, 101 pagedaemon, 158, 160 pagination, 84 Panneau de configuration, 317 Parallel ATAPI, 39 parallèle, 51 pare-feu, 297 partition, 42, 54, 55, 207, 208, 209, 211, 224, 228, 229 partition étendue, 208, 286 partition logique, 55 partition physique, 224 partition principale, 208, 286 partitionnement, 207, 208, 209, 286 Pascal, 9, 92 PATA, 39 pathname, 109, 119, 129 Paul Allen, 13 PC Wizard, 57, 321 PCI, 37, 38, 39 PCI Express, 37, 38, 39, 52 Pébioctet, 11 périphérique, 24 périphérique maître, 48 périphérique virtuel, 88, 231 Perl, 101, 314 Personal Computer, 13 Personal System, 14 Peta octets, 11 Photoshop, 51 PHP, 101 Picassa, 51 picture element, 27 pid, 141 PIDLE, 151 pile de commandes, 164 pile d'exécution, 260, 264 pile système, 98 pile utilisateur, 98 pilote, 24, 46, 89, 95, 152, 210, 227, 228, 229, 230, 231, 232, 233, 234, 236, 238, 239, 253, 274, 283, 285, 317, 318 pilote de miniport, 284 pilote de périphériques matériels, 284 pilote de port, 284 pilote des systèmes de fichiers, 284 pilote filtrant, 284 pilote-stream, 233 PINOD, 151 pins, 28 Pio, 11 pipe, 99 pipeline, 35 piste, 41 pixel, 27, 49 PL/1, 16 planificateur de travaux, 222, 311 plateau, 41 platter, 41 PLOCK, 151 Plug and Play, 32 plug-in, 100 plus mauvais choix, 86 png, 101 PnP, 32 INDEX 355 ────────────────────────────────────────────────────────────── Po, 11 point de montage, 216 point de préemption, 150 point de reprise, 91 Point to Point Protocol, 320 Point to point tuneling protocol, 320 police de caractères, 26 poll, 236 port de communication client, 277 port de communication non nommé, 277 port de communication serveur, 277 port de connexion serveur, 277 port parallèle, 37 port PS/2, 39 port série, 37, 52 portabilité, 12, 14, 15, 16, 20, 36, 95, 322 Portable Operating Systems Interface for computing environnement, 15 portage, 97 portail, 101, 102 POSIX, 15, 18, 20, 116, 251, 252, 253, 271, 282, 344 Postfix, 314 post-indexation, 82 postulat de Denning, 86 PPIPE, 151 PPP, 320 PPTP, 320 pr, 332 précision d'une représentation, 27 préemption, 137 pré-indexation, 82 premier trouvé, 86 PRIBIO, 151 primitive de bas niveau, 146, 237 principe de localisation, 86, 159 printenv, 170 priorité, 45 priorité de base, 259 prise, 99 prise de communication, 113 problème des accès concurrents, 68 Process Environment Bloc, 261 processeur, 61 processeur préféré, 266 processus, 61, 260 processus de poids faible, 264 processus démon, 306 processus indépendant, 61 processus leader, 142 processus léger, 72, 74, 264 processus poids plume, 72 profil matériel, 317 Programmable Read Only Memory, 31 programme, 10, 23, 61 Prolog, 97 PROM, 31 prompt, 170 propriétaire effectif, 115 propriétaire réel, 115 protection mémoire, 80, 81, 147, 148 proxy, 297 pseudo device, 230 pseudo driver, 230 pseudo périphérique, 230 pseudo pilote, 230 pseudo terminal, 231 pseudo-périphérique, 231 PSLEP, 151 PSWP, 151 psxss.exe, 253 puce, 28 PUSER, 151 putmsg, 236 PWAIT, 151 pwd, 122 PZERO, 151 Q quantum, 258, 259, 262, 263, 266, 276 queuedefs, 312 quotacheck, 219 quotaoff, 219 quotaon, 219 quotas, 314 R rafraîchissement, 32 RAID, 54 RAM, 32 ramasseur d'ordures, 86 RAND, 87 Random, 87 Random Access Memory, 32 rangement, 33 RAS, 320 raw device interface, 227 read, 131, 179, 235 read ahead, 113, 226 Read Only Memory, 31 read queue, 232 Real Player, 100 récepteur d'informations, 255 recouvrement, 145 redirection, 119 redo, 91 Redundant Arrays of Inexpensive Disks, 54 regedit, 288, 292 regedt32, 288 regentry.hlp, 291 région, 159, 160, 267 registre, 29, 81, 82, 83, 288, 289, 290, 292 registre d'adresse, 33 registre d'échanges, 33 registre instruction, 33 registres généraux, 33 REISER, 207 rémanence, 49 Remote Access Service, 320 renice, 157 répartiteur, 79, 259, 272, 273, 275, 276 356 INDEX ────────────────────────────────────────────────────────────── répartiteur d'exceptions, 274 répartiteur d'interruptions, 272 répertoire, 89, 109 répertoire courant, 119 répertoire de travail, 122 répertoire des applications distribuées, 319 répertoire d'objets, 271 répertoire parent, 119 réplique, 54 reprise, 46, 88, 91, 137, 256, 266, 288 reprise à chaud, 91 reprise à froid, 91 réseau de stockage, 56 résistance terminale, 48 résolution, 49 responsable micro-informatique, 322 ressource, 60, 61, 62, 63, 64, 65, 68, 71, 72, 74, 75, 76, 77, 80, 139, 230, 266, 275, 276, 278, 294 ressource commune, 61 ressource critique, 61, 62, 63, 64, 65 ressource locale, 61 ressource partageable, 61 restore, 246 resume, 154 réutilisabilité, 94 révision, 240 rm, 122 rmdir, 122 rmmod, 238 robotique, 21 robustesse, 94 ROM, 31 ROM BIOS, 32, 321 round robin, 150 routage, 236 RPC, 319, 320 rsh, 246 run level, 45 rupture de séquence, 10, 92 rusers, 108 rwho, 108 S SAM, 279, 288, 289, 291, 293 Samba, 314 SAN, 56, 57 SAT, 256 SATA, 39, 43 SATA2, 37, 39 sauvegarde, 245, 295 save, 154 scandisk, 217 scanner, 48, 51 schedcpu, 150 scheduler, 77, 79, 139 script, 171 SCSI, 39, 43, 51, 209, 284 secteur, 42 section critique, 63 sections critiques imbriquées, 273 sector, 42 sectorisation, 42 sécurisation, 101 Security Access Token, 256 Security Reference Monitor, 256 sed, 333 segment, 78, 85, 86, 145, 153, 154, 158, 159, 264 segmentation, 84, 85 select, 179 sémantique, 109, 235 sémaphore, 64, 100, 159 Sendmail, 314 séparateur, 121, 126, 132, 167, 170, 186, 190, 298, 332 séparateur d'une liste de commandes, 168 Serial Line Internet Protocol, 320 serveur d'exécution, 311 serveur FTP, 320 service, 233, 234 service d'accès distant, 320 service de planification, 311 service d'ordonnancement, 310 service stream, 233 service système, 44, 98 services réseau, 320 set, 170, 181 set priority level, 152 setcontext, 154 setitimer, 148 setjmp, 154 setuid, 115 setup, 32 Seymour CRAY, 11 SGF, 25 SGML, 101 shadow, 301 Shannon, 10 shared library, 133 shared objects, 133 shell de Bourne, 77 shell script, 112, 167, 171, 173, 174, 249, 325 Shockley, 12 signal, 11, 45, 46, 66, 146, 147, 148, 149, 154, 156, 162, 189, 197, 198, 204, 236, 308, 341 Simple Network Management Protocol, 320 simple précision, 27 simulation, 96 Sinclair, 13 sleep, 143, 146, 147, 148, 178, 230, 342 SLIP, 320 Small is beautiful, 98 SMH, 293 SMIT, 240, 293 SMP, 256 SNA, 320 SNMP, 320 socket, 30, 99 soft limit, 219 software, 21 Software Sandra, 36 sort, 126 INDEX 357 ────────────────────────────────────────────────────────────── souris, 24, 48 souris électromagnétique, 48 souris mécanique, 48 sous système de sécurité, 255 sous systèmes d'environnement, 252 South Bridge, 37 spécification, 94, 96 spin-lock, 74 spl*, 152 spl0, 152 spl1, 152 spl6, 152 spl7, 152 splstr, 152 spltty, 152 splx, 152 spool, 68 spooler, 68 spoule, 68 SQL Serveur, 21 SRM, 256 SSBA, 36 stack segment, 159 Standard Generalized Markup Language, 101 startup, 310 stat, 131 station de travail, 13 statut, 140 stderr, 110 stdin, 110 stdout, 110 Stephen Wozniak, 13 Steve Bourne, 163 Steve Jobs, 13 sticky bit, 116 stockage, 24 stockage attaché au réseau, 56 Storage Area Network, 56 store, 33 stream, 232 stream driver, 233 stream end, 233 stream head, 233 stream message, 232, 235 stream module, 232 stream queue, 232 streamer, 43 stripping, 54 structure de répertoire, 268 structure mutex, 73 structure U, 142 stty, 328 su, 105, 302 sudo, 301 super bloc, 210 super calculateur, 11 super user, 104 super utilisateur, 104 support, 97 support système, 252 Suze, 19 SVID, 18 swap, 83, 216, 309 swap in, 84, 158 swap out, 84, 158 swapoff, 158 swapoff, 222 swapon, 158, 222 swapper, 158 Sybase, 100 Symetric Multi Processing, 256 sync, 160, 226, 342 synopsis, 105 System Service Dispatch Table, 258 System V Interface Definition, 18 système binaire, 10, 11, 26, 27 système de fichiers, 207, 209 système de gestion de fichiers, 24, 25, 88 système d'exploitation, 25, 59 système d'exploitation préemptif, 78 système distribué, 12 système ouvert, 12, 16 système propriétaire, 12 T table de répartition des interruptions, 272 table des processus, 255 table des régions, 159 table système proc, 142 table VTOC, 208 tablette à digitaliser, 48 tableur, 13 tâche, 61 tail, 124 tampon, 226 tar, 242, 243, 246, 247, 248 tarfile, 242 TCP/IP, 14, 17, 99, 306, 320, 328 tcsh, 185 Tébioctet, 11 tee, 330 téléchargement, 297 télématique, 21 telnet, 320 temps d'accès, 31, 41 temps d'attente, 41 temps de chargement, 41 temps de cycle, 33 temps de rangement, 41 temps de recherche, 41 temps moyen de bon fonctionnement, 10 temps partagé, 25 temps réel, 15, 33, 95, 137, 150, 259, 290 Téra octets, 11 TERM, 329 termcap, 328 terminateur, 121 terminfo, 328 test, 92 Test And Set, 65, 72 test de validation, 96 358 INDEX ────────────────────────────────────────────────────────────── text segment, 159 théorie de l'Information, 10 thread, 72, 154, 260 thread id, 264 tic d'horloge, 33 time, 330 time sharing, 25 Tio, 11 toile, 100, 101 token, 261 tolérance aux pannes, 54 tolérance de pannes, 99, 218, 224, 251, 293 toner, 51 touch, 126 touches de fonctions, 48 tput, 328 track, 41 traitement, 23 traitement de l'information, 23 traitement de texte, 13 traitement d'images, 21 traitement en temps réel, 25 traitement multitâche, 25 traitement par lots, 25 transaction, 62, 69, 99 transcodage, 26 transistor, 10 translation d'adresse, 81 trap, 138, 149, 162, 185 trashing, 85 tube, 68, 99, 232 tube nommé, 99, 110, 232, 312 Türing, 10 U Ubuntu, 19 ulimit, 145 ultra 640 SCSI, 39 ultra SCSI, 39 umask, 115 umount, 217 unalias, 165, 166 uncompress, 247, 248 undo, 91 uniq, 343 unité arithmétique et logique, 24, 29, 33, 37 unité centrale, 24 unité centrale de traitements, 23 unité de commandes, 24, 33 unité de contrôle, 33 unité de transfert, 41 unité d'exécution, 72 unité d'instructions, 33 Unix, 10, 17 Unix based, 17 Unix like, 17 update, 160 upstream queue, 232 USB, 37, 38, 39, 41, 43, 51, 52, 132, 216, 295 USER32.dll, 253, 258 useradd, 305 userdel, 305 usermod, 305 usurpation d'identité, 115 utilisateur propriétaire, 113, 114 V VAD, 261 validité, 94 vanilla, 240 variable de condition, 74 variable exportée, 169 variable locale, 169 variable volatile, 170 VBscript, 101 vecteur d'interruption, 272 ventilation, 29 ver de l'Internet, 295 vérifiabilité, 95 verrou consultatif, 69, 99 verrou d'accès, 69 verrou exclusif, 69 verrou impératif, 69, 99 verrou mortel, 63 verrou partagé, 69 verrou sur boucle, 74 verrouillage d'enregistrement, 99 VFS, 212 vfstab, 216, 219 VGA, 50 vi, 128, 166, 170, 184, 223, 327, 328, 333, 334, 335, 337, 338, 343 victime, 14, 54, 87, 159 vipw, 303 Virtual Adress space Descriptor, 261 Virtual DOS Machine, 254 Virtual File System, 212 Virtual Table Of Contents, 208 virus, 295, 296 Visual Basic, 101 vitesse de rotation, 42 vitesse de transfert, 87 vmlinuz, 133 vmunix, 133 VMvare, 61 vnode, 214 volcopy, 246 volume, 41 volume logique, 208, 215, 224 volume physique, 207, 224 Von Neumann, 10, 92 VTOC, 208, 209 W wait, 74, 142, 143, 147, 188, 189, 197, 308, 330 wakeprocs, 146 watchdog, 296 wav, 27, 51, 101 Webmin, 293, 314, 315 INDEX 359 ────────────────────────────────────────────────────────────── what, 173 whatis, 107 whereis, 107 which, 107 who, 107, 299 Win32, 252, 253, 256, 259, 261, 263, 264, 267, 268, 270, 271, 274 Win32 pour 64 bits, 253 win32k.sys, 253 Win64, 253 Windows 95, 14, 96, 288 Windows 98, 14 Windows Internet Naming Service, 320 Windows Media Player, 100 Windows NT, 14, 288 Windows on Win32, 254 Windows Vista., 14 Windows XP, 14, 59, 289 winlogon, 256, 277, 279, 281 WINS, 320 WOLK, 240 Working Over Loaded Kernel, 240 working set, 85 WorkingSpace, 264 workstation, 13 World Wide Web, 100 Worst Fit, 86 wow, 254 write, 131, 235 write behind, 226 X X/Open, 16, 20 Xandros, 19 xconfig, 240 xedit, 333 Xenix, 18 xlock, 301 XLS, 101 xman, 106, 108, 330 XML, 101 XWindow, 16, 20, 106 Z zcat, 247 Zilog, 12 zombi, 139, 143 zone de swap, 84