Aller au contenu principal

Systèmes d'exploitation — fondations · L2 · Section 11/12

Annales corrigées

Progression

Points d’expérience : XPSérie de jours consécutifs : · —Progression du module : — / —compris

#Annales corrigées

Ce module prolonge l'UE SPUF201 « Système 1 : utilisation d'Unix et programmation shell » (Licence, portail Sciences et technologies, semestre 2, Université Côte d'Azur, campus Valrose), dont le fonds documentaire contient sept chapitres de cours, six feuilles de travaux pratiques, des fiches de révision et quatre sujets d'épreuve. Les exercices repris ici sont ceux qui portent sur les mécanismes du système — noyau et couches, processus, fichiers et inodes, partitions et montage, virtualisation, réseau — et non sur la syntaxe du shell, traitée dans les annales du module Unix & Shell.

Sources exactes.

  • Chapitres de cours cours-chap01.pdf à cours-chap07.pdf : historique et responsabilités du noyau, fichiers et permissions, installation et virtualisation, réseau, shell, outils, connexion et communication.
  • Feuilles de TP tp01.pdf à tp06.pdf : session utilisateur et terminaux, arborescence et droits, installation d'une distribution en machine virtuelle, réseau et courrier, shell et redirections, processus et filtres.
  • Sujets d'épreuve : partiel blanc 2023-2024, partiel du 23/03/2022, contrôle continu terminal du 9/05/2022 et du 9/05/2023.
  • Fiches de révision Révision_Linux.pdf (fichiers, droits, recherche, expressions rationnelles) et Révision_Shell.pdf (shell, scripts, options, codes de retour).

#Exercice 1 — Composants, noyau et architecture en couches

Énoncé (partiel blanc, partie 1, questions a à c ; CCT du 9/05/2023, questions g à i ; chapitre 1).

  1. Qu'est-ce que Linux ? Qu'est-ce que GNU ? Qu'est-ce qu'un système d'exploitation Linux ? Citez l'autre nom.
  2. Qu'appelle-t-on le shell ? Quel lien a-t-il avec le noyau ?
  3. Qu'est-ce qu'un serveur X ?
  4. De quels composants un système informatique est-il constitué ? Pourquoi un ordinateur isolé n'est-il pas, à proprement parler, un système informatique ?
  5. Quelles sont les grandes responsabilités de ressources assumées par Unix, et à quel niveau chacune se situe-t-elle ?
  6. Quel objet mathématique ou informatique permet de modéliser un réseau ? Expliquer.
Correction détaillée

1. Linux, GNU, GNU/Linux. Linux est le noyau : la partie logicielle qui masque le matériel et n'offre les ressources que par un ensemble d'opérations primitives. GNU est le projet de logiciel libre lancé en 1984 pour reconstruire une version complète d'Unix entièrement libre : c'est lui qui fournit le shell, les utilitaires, le compilateur, l'éditeur. Un système d'exploitation complet associe les deux — le cours précise que les composants du projet GNU représentent 90 % du total, et que Linux n'est qu'un des noyaux utilisables par le système GNU. Le nom à citer est donc GNU/Linux ; le nom générique est Unix, dont le nom n'est plus une marque déposée.

2. Le shell. C'est le programme de démarrage et l'interpréteur de commandes : il est à l'écoute de l'utilisateur, il interprète et exécute les commandes tapées, et lorsque le processus appelé se termine, le processus du shell redevient actif. Son lien avec le noyau est un lien de couches : matériel, noyau, shell, scripts et applications. Le noyau masque le matériel ; on n'accède aux ressources que par les opérations primitives, qui s'exécutent en mode privilégié (mode système) tandis que le reste des programmes tourne en mode utilisateur. Le shell est indépendant du noyau : c'est pour cette raison que plusieurs shells peuvent coexister sur le même système, et que le seul shell dont on peut garantir l'existence dans toute installation Unix est sh.

3. Le serveur X. X (ou X11) est le système de fenêtrage d'Unix, construit au MIT et librement disponible, organisé selon une relation client-serveur. Le serveur X gère le terminal graphique dans sa totalité : affichage sur l'écran, reconnaissance des signaux (événements) envoyés par le clavier et la souris, reconnaissance d'événements graphiques comme le passage de la souris dans une fenêtre ou le recouvrement d'une fenêtre par une autre. Les clients sont les programmes qui envoient au serveur des requêtes d'affichage et reçoivent la notification des événements qui les concernent. Le système est indépendant des machines : le même serveur X peut satisfaire des requêtes provenant de plusieurs machines, et clients comme serveur ignorent le fonctionnement de l'autre. C'est cette indépendance qui rend possible l'affichage d'une application distante sur l'écran local, à condition que la variable d'environnement DISPLAY du client soit correctement positionnée.

4. Composants d'un système informatique. Le cours en distingue trois : l'ordinateur proprement dit, les moyens de communication et le système d'exploitation. L'ordinateur est une machine de von Neumann comprenant un processeur (partie active), une mémoire principale (partie passive, divisée en mémoire vive et mémoire de masse) et des organes de communication vers l'extérieur. Un ordinateur isolé n'est pas un système informatique — « à la rigueur une machine de bureautique ou un gestionnaire d'agenda » — car l'appartenance à un réseau est indispensable à l'échange d'informations. Le système d'exploitation est la partie logicielle : intermédiaire obligé entre l'utilisateur et le matériel, il gère l'utilisation de la totalité des ressources (temps, mémoire, fichiers, communications) et fournit un ensemble de programmes utilitaires pour ce qu'il ne réalise pas lui-même.

5. Responsabilités de ressources. Le cours en distingue quatre, chacune à deux niveaux.

  • Gestion du processeur. Au niveau proche du matériel : interruptions (événements extérieurs) et trappes (événements dans le programme en cours), alternance entre mode système et mode utilisateur, masquage de tout ce qui dépend du modèle de processeur. Au niveau proche de l'utilisateur : alternance entre processus indépendants, synchronisation par horloge ou par événements précis.
  • Gestion de la mémoire. L'espace est fini et les programmes sont en concurrence pour l'utiliser ; le partage du temps implique le partage de la mémoire. Unix introduit la notion de mémoire virtuelle, beaucoup plus grande que la mémoire réelle et représentée sur disques, avec des échanges entre mémoire réelle et mémoire virtuelle qui doivent rester rapides et fiables.
  • Gestion du système de fichiers. Gestion de l'espace offert par les supports externes, création et suppression de fichiers, construction, lecture et déplacement, avec des moyens d'assez haut niveau pour masquer les caractéristiques du support physique.
  • Gestion des organes périphériques. Disques, cassettes, haut-parleurs, micros, imprimantes, écran, clavier, souris, plus la gestion d'un grand nombre de protocoles de communication de niveaux très variés, avec les exigences de sécurité et de fiabilité.

6. Modéliser un réseau. Par un graphe : un ensemble de nœuds (sommets) et de liens (arêtes). Les nœuds représentent les ordinateurs, les serveurs, les imprimantes, les nœuds de communication ; les arêtes représentent les liaisons. Le cours file l'analogie du réseau routier : routes, échangeurs, convois, les sous-réseaux correspondant à des opérateurs distincts, nationaux ou trans-nationaux, reliés par leurs nœuds centraux.

Ce que l'exercice évalue. La capacité à situer chaque notion sur la bonne couche : matériel, noyau, shell, applications. Les questions de cours des quatre sujets reviennent toutes à cette carte.

#Exercice 2 — Le concept de processus

Énoncé (chapitre 1, section « Le concept de processus » ; TP séance 6, questions 17 à 21 ; partiel blanc, question 1f).

  1. Qu'est-ce qu'un processus ? Qu'est-ce que son « image » ?
  2. Quels sont les états d'un processus, et pourquoi le cours dit-il que « tout se passe comme s'ils s'exécutaient simultanément » ?
  3. Qu'appelle-t-on processus père et arbre généalogique des processus ? Que distinguent le propriétaire réel et le propriétaire effectif ?
  4. Quelle différence entre une commande intrinsèque et une autre commande dans un shell, du point de vue des processus créés ?
  5. Que font les variables $$, $! et $? dans un script shell ?
Correction détaillée

1. Processus et image. Un processus est un programme en cours d'exécution. La plupart des commandes exécutent un programme, et donc lancent un processus ; le programme de démarrage, lui, correspond à un processus présent pendant toute la session. Un processus est identifié par un numéro entier (le PID) et associé à un ensemble d'informations appelé son image : le code du programme en cours d'exécution, les données traitées par ce code, l'identification des fichiers en cours de traitement et leur état, le répertoire courant, l'identité du propriétaire du processus, le terminal associé, etc. Des dizaines ou centaines de processus sont en fonctionnement à tout moment.

2. États. Le cours énumère quatre situations : en attente d'un événement extérieur (une action de l'utilisateur), en attente d'exécution (une tranche de temps), en attente de l'arrivée d'une partie de la mémoire virtuelle, et en exécution — un seul à la fois. Tout se passe comme s'ils s'exécutaient simultanément parce que le processeur est partagé en tranches très courtes : « je compile un programme, je reçois du courrier, mon voisin exécute un programme sur ma machine ». C'est le temps partagé, qui suppose à la fois le partage du processeur et celui de la mémoire.

3. Père, arbre, propriétaires. Tout processus est lancé par un processus père, ce qui dessine un arbre généalogique dont la racine est le processus d'initialisation. Le propriétaire réel est l'utilisateur qui a lancé le processus ; le propriétaire effectif est l'utilisateur dont les droits s'appliquent au processus. Les deux coïncident en général ; ils diffèrent lorsque le processus s'exécute avec des privilèges élevés — c'est le principe même d'un programme setuid.

4. Intrinsèque contre externe. Une commande intrinsèque est interne au shell : elle ne correspond pas au lancement d'un processus. Une commande externe est un fichier exécutable que le shell fait exécuter par le noyau, ce qui crée un processus. C'est pour cela que cd doit être intrinsèque : exécuté dans un processus fils, le changement de répertoire n'affecterait pas le shell. Une troisième voie existe : la commande intrinsèque exec, qui remplace le processus du shell en cours par celui de la commande demandée — le shell ne reprend pas la main ensuite, ce que le TP 5 fait constater en lançant exec gnome-terminal depuis un terminal.

5. $$, $! et $?. $$ est le numéro de processus du shell en cours, par définition différent de tout autre. $! est le PID du dernier processus lancé en arrière-plan. $? est le code de retour de la dernière commande exécutée : 0 si elle s'est exécutée correctement, une valeur non nulle sinon. La fiche de révision le rappelle : le code de retour est une valeur comprise entre 0 et 255, l'algèbre booléenne y est inversée par rapport à l'électronique — 0 signifie vrai, tout le reste signifie faux — et les clauses if, for et while se fondent toujours sur ce code, jamais sur une sortie standard.

#Exercice 3 — Fichiers, inodes et liens

Énoncé (partiel blanc, question 1g ; CCT du 9/05/2022, question 1a ; TP séance 2, questions 20 à 22 ; fiche Révision_Linux.pdf).

  1. Quelle est la structure de données utilisée sous les systèmes de fichiers Unix/Linux ? Donnez les principales caractéristiques.
  2. Où est stocké le nom d'un fichier ? Quelle conséquence en tire-t-on sur les liens durs ?
  3. Citer un système de fichiers utilisé sous Linux et un utilisé sous Windows.
  4. Un fichier est accessible par un lien normal et par un lien symbolique. Quelles sont les différences entre les deux, et que se passe-t-il si l'on supprime le fichier cible ?
  5. Les permissions r, w et x ont-elles la même signification sur un fichier et sur un répertoire ?
Correction détaillée

1. L'inode. Les systèmes de fichiers Unix/Linux reposent sur l'inode (index node). Chaque fichier et chaque répertoire se voit attribuer un numéro d'inode unique, qui permet de localiser sur le disque un ensemble d'informations : le bloc de disque où la donnée est stockée, le type de fichier, la taille du fichier, l'identifiant du propriétaire, les autorisations de lecture, d'écriture et d'exécution, les dates de dernière modification et de dernier accès. Le nombre d'inodes est défini au formatage du système de fichiers. Caractéristique essentielle : le nom du fichier n'est pas dans son inode, il est stocké dans l'inode du répertoire.

2. Nom et liens durs. Le nom vit dans le répertoire, sous forme d'une association entre un nom et un numéro d'inode. Deux conséquences en découlent, que le cours énonce explicitement : créer un fichier, c'est d'abord placer un lien dur dans le répertoire correspondant, et plusieurs liens durs peuvent pointer sur le même fichier — autrement dit, « un fichier n'est donc pas dans un répertoire ». La commande ln initial pointeur crée un lien nommé pointeur sur le fichier initial. Un lien dur ne peut pas traverser deux volumes, puisqu'il désigne un bloc de données dans un espace physique donné. Enfin, la commande rm ne supprime pas un fichier mais le lien dur mentionné en argument : un fichier n'est réellement supprimé que lorsque plus aucun lien dur ne le désigne.

3. Systèmes de fichiers. Sous Linux : ext3 ou ext4 (on peut aussi citer ext2, ReiserFS v3, F2FS). Sous Windows : NTFS (ou FAT, FAT32). Autres exemples du cours : ISO9660 pour les CD-ROM et DVD, HFSX sous Mac OS à partir de 10.4.

4. Lien normal contre lien symbolique. Le lien dur est un pointeur vers le fichier : deux noms, un seul inode, un contenu partagé. Le lien symbolique est un fichier spécial dont le contenu est la chaîne de caractères qui représente le nom d'un autre fichier : c'est une référence indirecte. Trois différences pratiques :

  • le lien dur ne peut désigner qu'un fichier existant ; le lien symbolique peut désigner un fichier qui n'existe pas ;
  • le lien dur ne peut pas franchir un volume ; le lien symbolique le peut, puisqu'il désigne un chemin ;
  • supprimer le lien symbolique n'efface que le lien lui-même et n'a aucune influence sur le fichier désigné ; supprimer un lien dur laisse le contenu intact tant qu'un autre lien subsiste.

On crée un lien symbolique avec ln -s initial pointeur, avec les mêmes règles que pour la forme sans option ; la forme à un seul argument crée un lien symbolique de même nom dans le répertoire courant.

5. Signification des permissions. Non, elles diffèrent, et le cours consacre une section entière à cette différence.

Sur un répertoire : r permet de consulter la liste des fichiers sur lesquels il pointe ; w permet d'ajouter ou d'enlever des références de fichiers au répertoire ; x permet d'accéder aux fichiers répertoriés, c'est-à-dire de traverser le répertoire. Il faut à la fois r et x pour pouvoir explorer un répertoire.

Sur un fichier ordinaire : r permet d'afficher le contenu ; w permet d'y écrire ; x permet d'exécuter un script ou un programme binaire.

Cette différence s'explique précisément par l'inode : un répertoire est lui-même un fichier dont le contenu est une table associant des noms à des numéros d'inode ; le droit d'exécution y est donc le droit de lire une entrée pour obtenir l'inode visé.

#Exercice 4 — Partitions, systèmes de fichiers et montage

Énoncé (chapitre 3 ; TP séance 3, questions 14 à 20 et 28 ; TP séance 6, questions 34 à 35 ; CCT du 9/05/2022, question 1c).

  1. Qu'est-ce qu'une partition ? Pourquoi partitionner un disque dur ?
  2. Quels sont les deux types de partitions, et combien de partitions primaires un disque de PC peut-il contenir ? Où se situe la table des partitions primaires ?
  3. Qu'est-ce qu'un système de fichiers ? Que signifie « le nombre d'inodes est défini au formatage » ?
  4. Comment appelle-t-on la partition d'échange d'un système Unix, et où la place-t-on traditionnellement dans le plan de partitionnement ?
  5. Comment accède-t-on à un système de fichiers sous Unix, et pourquoi n'y a-t-il pas de « lecteurs » C: ou D: ?
  6. Quelles commandes donnent l'occupation et l'espace libre d'un système de fichiers ?
Correction détaillée

1. Partition et raisons de partitionner. Une partition est une partie d'un disque dur. Le partitionnement permet trois choses : allouer plusieurs partitions pour installer plusieurs systèmes d'exploitation (par exemple GNU/Linux et Microsoft Windows) ; séparer les données dans un même système (les programmes d'un côté, les données des utilisateurs de l'autre) ; et créer une partition d'échange (swap), zone dédiée à l'échange entre la mémoire vive et le disque dur. Le cours avertit que l'opération touche aux structures de données fondamentales du disque et qu'elle est de ce fait très sensible.

2. Types de partitions et MBR. Il existe deux types : la partition primaire, capable d'accueillir un système d'exploitation, et la partition étendue, qui est une partition primaire spéciale pouvant contenir jusqu'à 64 partitions logiques. Un disque dur de PC peut contenir 4 partitions primaires. La table des partitions primaires se situe dans le MBR (Master Boot Record), premier secteur du disque. Le programme présent dans le MBR est le chargeur d'amorçage (bootstrap loader) : il charge le secteur de boot de la partition active, dans lequel se trouve un chargeur d'amorçage — LILO ou Grub pour Linux — qui permet de lancer le système d'exploitation. Le cours signale la différence avec les standards UEFI et GPT, le MBR étant très souvent remplacé par le GPT.

3. Système de fichiers. C'est une structure de données sur disque contenant des fichiers, dans lesquels les applications peuvent stocker leurs données ; il est généralement structuré hiérarchiquement et regroupe les fichiers dans des répertoires, d'où l'existence d'un répertoire racine, la notion de chemin d'accès et la notion d'inode : chaque fichier a un inode unique, à ne pas confondre avec son nom. Dire que le nombre d'inodes est défini au formatage signifie que la table des inodes est dimensionnée une fois pour toutes lors de la création du système de fichiers : on ne peut pas en ajouter ensuite sans reformater, même si l'espace disque reste disponible.

4. Partition d'échange. C'est la partition swap. Le plan de partitionnement recommandé par le cours prévoit une partition d'échange en début de disque — plus rapide si le disque est organisé en cylindres —, une partition pour le système de fichiers racine /, une partition pour les données des utilisateurs /home, et éventuellement des partitions pour d'autres systèmes d'exploitation.

5. Montage. Unix n'a pas de spécification de lecteurs différents comme C: ou D: sous Windows : on associe un système de fichiers à un répertoire appelé point de montage, avec la commande mount -t type device dir. Cela permet d'accéder à tous les systèmes de fichiers de la même manière, locaux ou distants. L'opération symétrique est le démontage, umount répertoire, réservé à l'administrateur pour les volumes fixes ; pour les lecteurs amovibles, il faut démonter les systèmes de fichiers avant de les retirer. La plupart des volumes locaux sont montés automatiquement au démarrage sur des sous-répertoires de la racine : /var, /tmp, /usr, /home, etc. Le mécanisme NFS (Network File System) étend la même idée aux volumes non locaux : l'ordinateur distant exporte le volume en jouant le rôle de serveur, le client demande le montage sur un répertoire local, souvent à la demande (auto-montage) ; la transmission se fait en UDP, plus simple et rapide que TCP mais moins sûr. Samba joue le même rôle de serveur de fichiers distribué et permet le partage d'imprimantes et de fichiers entre Unix et Windows.

6. Commandes d'occupation. du évalue l'encombrement des fichiers : sans option il parcourt les hiérarchies indiquées et donne l'encombrement de chaque répertoire, -s ne donne que l'encombrement global, -a donne au contraire l'encombrement de chaque fichier, -k compte en kilo-octets. df donne pour chaque partition le périphérique de montage, la taille totale, la taille occupée, la taille disponible et le répertoire de montage.

#Exercice 5 — Virtualisation

Énoncé (chapitre 3 ; TP séance 3, questions 1, 14 à 18 et 28 ; CCT du 9/05/2022, question 1c).

  1. Pourquoi recourir à la virtualisation ? Quelles solutions alternatives existent pour faire cohabiter deux systèmes ?
  2. Définir la virtualisation et citer ses différents types.
  3. Quelles sont les caractéristiques de l'émulation, de la virtualisation complète, de l'hyperviseur et de l'environnement virtuel ?
  4. Quels fichiers définissent une machine virtuelle créée avec VMware ? Et avec VirtualBox ?
  5. Écrire les commandes qui permettent de se connecter à un serveur avec transfert X, puis d'afficher une horloge carrée de 100 pixels de côté en bas à gauche de l'écran.
Correction détaillée

1. Pourquoi virtualiser. Le point de départ est une contrainte : en règle générale, une machine égale un système d'exploitation. Trois questions en découlent : comment utiliser des applications spécifiques à Windows sous GNU/Linux, et inversement, avec un seul système d'exploitation disponible ; comment installer plusieurs versions différentes de systèmes d'exploitation ; comment utiliser une seule machine pour gérer plusieurs serveurs afin de réduire les coûts. Les solutions alternatives citées par le cours sont l'usage de Wine sous GNU/Linux (dont le nom est un acronyme récursif : Wine Is Not an Emulator), l'usage de Cygwin sous Windows pour émuler un système Unix, et le multi-boot. Le multi-boot a deux défauts : il impose de créer plusieurs partitions pour les différentes installations et il est difficilement réversible, et surtout les systèmes ne peuvent pas être utilisés simultanément.

2. Définition et types. La virtualisation est un ensemble de techniques matérielles et logicielles qui permettent de faire fonctionner sur une seule machine plusieurs systèmes d'exploitation ou plusieurs applications, séparément les uns des autres, comme s'ils fonctionnaient sur des machines physiques distinctes. Le cours distingue quatre types : l'émulation, la virtualisation complète (full virtualization), l'hyperviseur (ou paravirtualisation) et l'environnement virtuel (operating system-level virtualization), auxquels s'ajoute la virtualisation matérielle.

3. Caractéristiques des quatre types.

  • Émulation : le logiciel crée un ordinateur virtuel simulé complet (BIOS, processeur, mémoire, disque dur, cartes réseau et vidéo) et intercepte la grande majorité des instructions du système invité pour les remplacer par leur équivalent sur l'hôte. Elle permet d'exécuter des applications prévues pour d'autres architectures, mais les performances sont médiocres ; le système invité n'a pas conscience de la virtualisation.
  • Virtualisation complète : le logiciel émule un ordinateur virtuel mais ne traduit que certaines instructions particulières du système invité, celles qui auraient un impact en dehors de la machine virtuelle ou ne peuvent pas être exécutées directement par l'hôte. Elle permet d'exécuter des applications prévues pour la même architecture, avec d'assez bonnes performances ; le système invité n'a pas conscience de la virtualisation. Exemples : VMware, VirtualBox.
  • Hyperviseur : le système invité doit être écrit de manière particulière (pilotes et API spécifiques) et fonctionne directement sans interception des instructions. Il faut donc un système invité compatible, mais les performances sont excellentes, proches de l'exécution native ; cette fois le système invité a conscience de la virtualisation. Exemples : Xen, UML, coLinux.
  • Environnement virtuel : chaque environnement exécuté possède son propre espace mémoire, pour être isolé des autres, tandis que les autres ressources système sont partagées (pilotes, noyau). Les instructions ne sont pas interceptées et l'environnement doit impérativement être compatible avec celui de l'hôte — on ne peut pas exécuter Windows sur un environnement virtuel de type Linux. Les ressources partagées empêchent d'obtenir une isolation sûre entre les environnements invités. Exemples : Linux-VServer, OpenVZ, Docker.

À cela s'ajoute la virtualisation matérielle : le support peut être intégré au processeur ou assisté par lui, le matériel se chargeant par exemple de virtualiser les accès mémoire ou de protéger le processeur physique des accès les plus bas niveau, ce qui simplifie la virtualisation logicielle et réduit la dégradation des performances. Exemples : VM/CMS, AMD-V, Intel VT.

4. Fichiers de définition. Une machine virtuelle VMware est définie par trois fichiers : un fichier .vmx pour la définition de la machine, un fichier .vmdk pour la définition des disques virtuels et les fichiers binaires correspondants, et un fichier .log pour les événements relatifs à l'exécution. Une machine virtuelle VirtualBox est définie de la même manière avec un fichier .xml, un fichier .vdi et un fichier .log. Le TP 3 fait précisément ouvrir /home/VM/L1Systeme/Ubuntu.vmx et VM_TP03.vbox pour en extraire la quantité de mémoire et la taille du disque virtuel alloués. Il existe par ailleurs un format ouvert, Open Virtual Machine, qui encapsule les machines virtuelles pour les utiliser sur différentes plateformes, l'outil VMware OVF Tool assurant la conversion.

5. Connexion avec transfert X et horloge carrée. La connexion avec transfert X se fait avec l'option -X de ssh :

bashbash

1ssh -X tpsi

L'option autorise le serveur X distant à afficher ses fenêtres sur l'écran local. Une fois connecté, xclock affiche une horloge ; ses dimensions et sa position se règlent avec l'option -geometry, dont la syntaxe est largeur x hauteur + décalage x + décalage y, les décalages positifs partant du coin supérieur gauche de l'écran :

bashbash

1xclock -geometry 100x100+0-0

Les deux signes moins placent la fenêtre à 0 pixel du bord gauche et à 0 pixel du bord inférieur : c'est la convention de X pour compter depuis le bord droit ou inférieur. Pour une horloge numérique, on utilise xclock -digital. Le mémento de la séance 1 rappelle les autres options utiles de xclock : -bg pour le fond, -fg pour les aiguilles, -transparent pour une horloge transparente. Un serveur X graphique local est nécessaire : c'est le rôle de la variable DISPLAY, vide dans un terminal purement textuel.

#Exercice 6 — Réseau, adressage et protocoles

Énoncé (partiel blanc, questions 1d et 1e ; CCT du 9/05/2022, questions 1d à 1g ; CCT du 9/05/2023, questions 1h et 1i ; chapitre 4).

  1. Définir IRC et décrire brièvement à quoi cela sert. En quoi diffère-t-il du protocole NNTP ?
  2. Combien peut-on avoir d'adresses IPv6 théoriques ? Pourquoi l'IPv6 remplace-t-il l'IPv4 ?
  3. Définir TCP et décrire brièvement à quoi cela sert. À quoi sert un numéro de port ?
  4. Que fait un serveur de noms de domaine ? Comment se lit la hiérarchie des domaines ?
  5. Quelle commande permet de faire une copie sécurisée sur une machine distante ? Quel protocole utilise-t-elle ?
  6. Comment est identifiée une machine sur un réseau Ethernet ? Et sur Internet ?
  7. Citer, avec leur numéro de port, quatre protocoles applicatifs courants.
Correction détaillée

1. IRC et NNTP. IRC (Internet Relay Chat) permet la communication entre plusieurs personnes, sous forme immédiate. Son architecture est élaborée : des serveurs IRC sont reliés entre eux, un utilisateur se connecte à un serveur et choisit un canal parmi un très grand nombre, avec la liberté d'en définir de nouveaux ; tout message tapé sur un canal est transmis par le serveur à tous les autres serveurs qui servent ce canal. Le cours en tire la conséquence sans détour : « tout le monde parle ensemble, comme dans une foule, peu de gens écoutent ». NNTP (Network News Transfer Protocol) permet la communication entre plusieurs personnes, mais sous forme différée : des serveurs NNTP communiquent entre eux, l'utilisateur s'abonne à un ou plusieurs groupes de discussion, il peut lire tous les articles récents et en publier, les serveurs se synchronisent régulièrement, et les administrateurs choisissent les groupes diffusés ainsi que la durée de vie des articles. La différence tient donc en un mot : IRC est immédiat et suppose la présence simultanée, NNTP est différé et fonctionne comme des panneaux d'affichage publics. Le cours note aussi que les articles NNTP sont publics, qu'il n'y a pas d'identification absolue des articles, que certains groupes ont un modérateur qui filtre, et que « le rapport signal sur bruit est très proche de zéro ».

2. IPv6. Une adresse IPv6 est longue de 128 bits, soit 16 octets, notée en hexadécimal en 8 groupes de 16 bits séparés par des deux-points. Le nombre d'adresses théoriques est donc 21283,4×10382^{128} \approx 3{,}4 \times 10^{38}. IPv6 remplace IPv4 parce que celui-ci a atteint ses limites : les adresses de 32 bits sont découpées en une partie réseau (net id) et une partie machine (host id), l'adressage définit cinq classes dont trois pour les réseaux membres d'Internet — classe A (premier octet inférieur à 128, pas plus de 128 très grands réseaux, l'octet 18 correspondant au réseau du MIT), classe B (premier octet entre 128 et 192, 16 384 réseaux de 65 536 machines, 134.59 correspondant au réseau de l'UNSA), classe C (premier octet entre 192 et 224, plus de deux millions de petits réseaux de 256 machines) — et malgré le recours au NAT (network address translation), par lequel beaucoup d'entreprises cachent leurs adresses internes, « ce système a atteint ses limites ». Les classes ont été abandonnées dès 1993 avec le CIDR (Classless Inter-Domain Routing). Une adresse IPv6 comporte plusieurs types indiqués par le préfixe : unicast, anycast, multicast ; le préfixe 2000::/3 correspond à la monodiffusion mondiale (Global Unicast), plage d'adresses publiques routable sur Internet et globalement unique.

3. TCP et les ports. TCP (Transmission Control Protocol) intervient aux deux extrémités de la communication : au départ il découpe le message en paquets et associe à chaque paquet une enveloppe identifiant l'expéditeur, le destinataire, le message lui-même et l'ordre des paquets ; à l'arrivée il réassemble les paquets. Il assure la sécurité et l'intégrité de la transmission en dialoguant avec l'expéditeur pour redemander les paquets manquants ou mal transmis, et il sert de support à de très nombreuses applications de communication. Le numéro de port identifie l'application : « chaque application utilise un numéro de port spécialisé qui l'identifie, ainsi le message à l'arrivée est transmis à la bonne application ». Le couple TCP et IP a été développé vers la fin des années 1970.

4. Serveur de noms de domaine. L'adresse IP est malcommode pour l'utilisateur ; on définit donc des adresses symboliques hiérarchisées en domaines, et des serveurs de noms établissent la correspondance depuis et vers les adresses IP. La hiérarchie se lit de droite à gauche, le niveau le plus élevé apparaissant en dernier : un domaine par pays (fr, uk, za), des domaines « apatrides » (org, net, com, biz), des domaines réservés aux États-Unis (mil, gov, edu). Les niveaux précédents sont gérés par l'organisme propriétaire du domaine — en France, l'Afnic gère .fr. Il existe souvent des alias : sesame-mips.unice.fr et www-mips.unice.fr sont deux alias de polymnie.unice.fr, d'adresse 134.59.2.13. Les outils d'interrogation sont host, qui prend en argument l'une des deux formes d'adresse et répond avec l'autre, et dig, qui fournit plus d'informations.

5. Copie sécurisée. La commande est scp, et elle utilise le protocole SSH. scp a une forme d'appel identique à celle de l'ancien rcp, mais la sécurité est celle de SSH : authentification du client par le serveur, cryptage de la transmission, garantie d'intégrité de cette transmission. Elle demande les mots de passe si nécessaire et permet de copier des fichiers entre deux machines distantes. L'appel de SSH lui-même se fait comme pour rlogin : ssh -l utilisateur machine ou ssh utilisateur@machine ; en situation normale, une simple demande de mot de passe sur la machine distante suffit, et si le mot de passe est correct la session s'établit.

6. Identifier une machine. Sur un réseau Ethernet, par son adresse Ethernet, aussi appelée adresse MAC, caractéristique dans le monde entier ; Ethernet met en œuvre le principe de diffusion, tout organe ayant une adresse Ethernet et chacun étant à l'écoute de ce qui le concerne. Sur Internet, par son adresse IP, portée par le message : un message passe par plusieurs routeurs avant d'arriver au réseau local de l'ordinateur destinataire, il est découpé en paquets transmis par des chemins qui peuvent varier d'un paquet à l'autre, et sur le réseau local c'est le réseau qui fait se correspondre l'adresse physique et l'adresse IP, un routeur envoyant un message vers le routeur voisin capable de traiter l'adresse IP.

7. Protocoles et ports. Le cours donne une liste explicite : FTP sur le port 21, Telnet (connexion à distance) sur le port 23, SMTP (courrier) sur le port 25, DNS (serveur de noms) sur le port 53, HTTP (pages web) sur le port 80, POP3 (serveur de courrier) sur le port 110, NNTP (groupes de discussion) sur le port 119, NTP (service de l'heure) sur le port 123, IRC (bavardage) sur le port 194. Tous ces protocoles sont accessibles par telnet, qui est un outil général de connexion à distance servant de support à la plupart des protocoles de plus haut niveau — c'est ce qui permet de dialoguer « à la main » avec un serveur SMTP.

#Exercice 7 — Les trois fichiers standard et les redirections

Énoncé (chapitre 5 ; TP séance 5, questions 11 à 18 ; TP séance 6, questions 1 à 8).

  1. À quels fichiers chaque programme Unix accède-t-il au minimum ? Comment sont-ils numérotés et à quoi sont-ils associés par défaut ?
  2. Qui effectue la redirection : le programme ou le shell ? Quelle est la conséquence pour un programme qui n'a pas été écrit pour cela ?
  3. Quelles sont les différences entre ls -l toto >& f1, ls -l toto 1> f2 et ls -l toto 2> f3 lorsqu'aucun fichier toto n'existe ?
  4. Que fait la commande ls | wc -l ? Qu'est-ce qu'un filtre ?
  5. En quoi un tube diffère-t-il d'un enchaînement séquentiel avec ; ?
  6. Que fait exec dans un script ou un shell interactif ?
Correction détaillée

1. Les fichiers standard. Le cours est catégorique : chaque programme Unix accède à au moins trois fichiers standard — l'entrée, numérotée 0, la sortie, numérotée 1, et la sortie d'erreur, numérotée 2. Sauf indication contraire, ils sont associés au terminal du processus : entrée depuis le clavier, sortie dans la fenêtre, sortie d'erreur dans la fenêtre. En termes de système d'exploitation, ce sont les descripteurs de fichiers 0, 1 et 2, hérités du shell par chaque processus qu'il lance.

2. Qui redirige. C'est le shell, et il le fait indépendamment du programme qui s'exécute. C'est un point décisif : un programme qui se contente de lire sur son entrée standard et d'écrire sur sa sortie standard devient automatiquement un filtre, utilisable dans un tube, sans avoir été écrit pour cela. Les notations du cours sont : < fichier redirige l'entrée standard, > fichier la sortie standard, 2> fichier la sortie d'erreur, >> fichier concatène la sortie standard à la fin d'un fichier existant. Deux règles à connaître : le fichier en entrée doit exister ; le fichier en sortie ne doit pas exister — vrai avec zsh, pas nécessairement avec d'autres shells comme bash, où > écrase. C'est l'option clobber qui commande ce comportement, et la fiche de révision signale que clobber est activé par défaut à Valrose et qu'une question là-dessus est déjà tombée à un partiel.

3. >& f1, 1> f2 et 2> f3. Aucun fichier toto n'existe, donc la commande échoue et le message d'erreur part sur la sortie d'erreur. Le comportement des trois formes diffère :

  • ls -l toto >& f1 redirige la sortie standard et la sortie d'erreur vers f1 : c'est le message d'erreur qui s'y trouve ;
  • ls -l toto 1> f2 redirige seulement la sortie standard vers f2 : le fichier f2 est créé mais vide, et le message d'erreur s'affiche toujours à l'écran ;
  • ls -l toto 2> f3 redirige seulement la sortie d'erreur vers f3 : c'est le message d'erreur qui s'y trouve, et rien ne s'affiche à l'écran.

C'est exactement la manipulation que le TP 5 fait faire, et la raison pour laquelle on distingue deux flux de sortie : sans cette distinction, impossible de séparer le résultat utile du diagnostic.

4. ls | wc -l et la notion de filtre. La ligne de commandes ls | wc -l compte le nombre de fichiers du répertoire courant. ls écrit un nom par ligne sur sa sortie standard, et le tube connecte directement cette sortie à l'entrée standard de wc, qui compte les lignes. Un filtre est un programme qui effectue une transformation sur son entrée standard pour produire sa sortie standard ; il s'utilise typiquement dans un tube. Le cours donne l'exemple complet ps aux | grep emacs | sort | less, qui enchaîne quatre filtres.

5. Tube contre point-virgule. Le point-virgule note une exécution séquentielle : les commandes s'exécutent l'une après l'autre, sans rapport entre elles. Le tube note une exécution en tube : les processus sont exécutés simultanément et c'est le système qui gère leur synchronisation — « un processus qui produirait des résultats plus vite que le processus suivant serait capable de les lire devra suspendre temporairement son activité ». C'est cette exécution concurrente qui rend le tube élégant : ls -l /usr/bin > resultats ; more resultats ; rm resultats utilise un fichier auxiliaire et trois processus successifs, là où ls -l /usr/bin | more n'utilise aucun fichier intermédiaire.

6. exec. exec commande remplace le processus du shell en cours par celui de la commande. Le shell ne reprend pas la main : le TP 5 le fait constater en lançant gnome-terminal en premier plan puis en le quittant par exit — le shell d'origine est retrouvé —, puis en recommençant avec exec gnome-terminal, au terme duquel la fenêtre d'origine se ferme, puisqu'elle a été remplacée. C'est la différence observable entre « lancer un fils » et « devenir ce programme ».

#Exercice 8 — Observer et piloter les processus

Énoncé (chapitre 6 ; TP séance 6, questions 29 à 32 et 39 ; TP séance 1, questions 37 et 38).

  1. Que fait la commande ps ? Quelles informations donnent ps x et ps aux, et pourquoi faut-il combiner ps aux avec less ou grep ?
  2. Que donnent les commandes uptime et top ? Que désigne la « charge moyenne » ?
  3. Que se passe-t-il quand on ferme un terminal dans lequel un processus a été lancé en arrière-plan ? Comment y remédier ?
  4. Comment suspendre puis reprendre un processus de premier plan ? Comment le faire se terminer ?
  5. Que signifient les signaux -9 et -19 de la commande kill ?
Correction détaillée

1. ps. ps sert à obtenir des informations sur les processus en cours. La forme utilisée dans ce cours est celle du système BSD, dont les paramètres s'écrivent sans tiret initial. Le choix des processus dépend des options : ceux qui appartiennent à l'utilisateur, sauf si l'option a est présente ; ceux qui sont associés à un terminal, sauf si l'option x est présente. Donc ps x affiche tous les processus de l'utilisateur et ps aux affiche de manière détaillée tous les processus de l'ordinateur. Le choix des informations dépend aussi des options : sans option, ps donne le numéro, le terminal associé, l'état du processus, le temps machine utilisé et la commande associée ; avec l'option u, il ajoute le nom de l'utilisateur et la consommation des ressources en temps et en mémoire. Comme ps aux produit une sortie volumineuse, le cours précise qu'« cette dernière commande doit donc être mise dans un tube avec less ou grep ».

2. uptime et top. uptime affiche trois choses : la durée de fonctionnement sans arrêt du système, le nombre d'utilisateurs connectés, et la charge moyenne pendant la dernière minute, les 5 et les 15 dernières. La charge moyenne est la longueur de la file d'attente pour exécution : autrement dit, le nombre de processus qui attendent le processeur. C'est la seule notion d'ordonnancement que le cours aborde, et elle suffit à diagnostiquer une machine saturée. top affiche les processus les plus actifs, le plus actif en tête ; le haut de la fenêtre reprend la ligne d'uptime, puis le nombre total de processus et leur répartition dans les différentes catégories, l'utilisation du processeur, l'utilisation de la mémoire et l'utilisation de la zone d'échange. La commande est interactive : q termine l'exécution, k permet de tuer un ou plusieurs processus, u permet de n'afficher que les processus d'un utilisateur donné. Le TP fait constater qu'essayer de tuer un processus qui ne vous appartient pas échoue — c'est le contrôle de propriété du noyau.

3. Fin des processus fils. Point capital : quand un processus se termine, tous ses processus fils se terminent aussi. Ainsi, tous les processus d'arrière-plan lancés depuis une fenêtre de terminal doivent se terminer quand on tape exit : le shell signale les processus non terminés, et si l'on tape à nouveau exit, les processus se terminent. Le cours ajoute qu'« il vaut mieux les faire se terminer individuellement ». Pour qu'un processus survive à la déconnexion, on le lance avec nohup (no hang up, ne pas raccrocher) : nohup make install &. La sortie standard et la sortie d'erreur sont alors envoyées sur le fichier ./nohup.out, et l'on peut même se déconnecter — le processus continue de fonctionner. C'est le comportement que le TP 6 fait comparer entre xclock & et nohup xclock &.

4. Suspendre, reprendre, terminer. Une des erreurs les plus fréquentes consiste à lancer en premier plan un processus depuis le shell : le processus du shell devient alors inaccessible. On peut intervenir : C-c fait se terminer immédiatement le processus de premier plan, C-z suspend son exécution — le cours note que « le processus peut résister à la première commande, pas à la deuxième ». Un processus suspendu peut être repris de trois manières : fg le fait reprendre au premier plan, bg le fait reprendre en arrière-plan et il devient une tâche, kill lui envoie un signal. L'opérateur & lance une commande directement en arrière-plan et libère l'invite de commande. Ces manipulations structurent le TP 1, où l'on compare gnome-calculator (qui monopolise le terminal), gnome-calculator interrompu par C-c, puis gnome-calculator &.

5. Les signaux -9 et -19. kill envoie un signal à un processus ou à une tâche ; le processus est indiqué par son numéro (donné par ps), la tâche par son numéro de tâche précédé du signe pour cent. Le signal est « plus ou moins fort » : -9 correspond à la destruction inconditionnelle du processus, -19 à une suspension. Le cours ne mentionne pas d'autre signal ; en pratique, -15 (SIGTERM) est l'arrêt gracieux, et -9 (SIGKILL) est réservé aux processus qui refusent de mourir. Un processus terminé par un signal fait apparaître, dans le shell, le code de retour conventionnel 128 + numéro du signal.

#Exercice 9 — Permissions, propriété et super-utilisateur

Énoncé (CCT du 9/05/2022, questions 2l à 2o ; TP séance 3, questions 23 à 27 ; TP séance 4, questions 9 à 12).

  1. Déterminer la valeur du umask avant la création des répertoires drwxr-xr-x rep1 et drw-r----x rep2.
  2. Déterminer les valeurs possibles du umask avant la création du fichier -r---w---- fic.
  3. Quels droits obtient un répertoire créé avec un umask de 345 ? Et avec 136 ?
  4. Comment change-t-on le propriétaire d'un fichier ? Quels privilèges cela suppose-t-il ?
  5. Un fichier a été créé par un utilisateur avec les droits 400 dans son répertoire personnel. Un second utilisateur essaie de le lire : que se passe-t-il, et quelles sont les deux façons de le lui permettre ?
  6. Après un chown au profit du second utilisateur, que peut encore faire le premier ?
Correction détaillée

1. umask devant drwxr-xr-x et drw-r----x. Le droit de référence d'un répertoire est le droit global rwxrwxrwx, soit 777 ; le masque se soustrait bit à bit.

  • drwxr-xr-x vaut 755, donc 777 privé du masque donne 755, soit umask 022.
  • drw-r----x vaut 641. La résolution de 777 privé du masque égal à 641 impose un complément de 641, soit umask 136. Vérification : après umask 136, un mkdir produit bien drw-r----x.

2. umask devant -r---w----. Le fichier vaut 420. Cette fois la base est 666, et non 777 : pour des raisons de sécurité, Linux n'autorise pas le droit d'exécution lors de la création d'un fichier. Il faut donc résoudre 666 privé du masque égal à 420, chiffre octal par chiffre octal, en notant que le bit x du masque est libre puisqu'il n'a aucun effet sur un fichier :

  • propriétaire : 6 privé du masque donne 4, donc le bit 2 du masque est posé ;
  • groupe : 6 privé du masque donne 2, donc le bit 4 du masque est posé ;
  • autres : 6 privé du masque donne 0, donc les bits 4 et 2 du masque sont posés.

Les valeurs possibles sont donc 246, 247, 256, 257, 346, 347, 356, 357, le troisième chiffre hésitant entre 6 et 7 selon que le bit x du masque est posé ou non.

3. Droits d'un répertoire pour umask 345 et umask 136. On calcule 777 privé du masque.

  • umask 345 : le complément vaut 432, donc les droits sont dr---wx-w-.
  • umask 136 : le complément vaut 641, donc les droits sont drw-r----x.

Ces résultats, apparemment exotiques, sont exactement ceux que produit un mkdir après avoir posé le masque : ils montrent qu'un umask n'est pas une valeur « interdite » mais un masque de bits, dont les combinaisons n'ont aucune raison d'être intuitives.

4. Changer le propriétaire. Avec la commande chown (et chgrp pour le groupe) : chown utilisateur fichier, ou chown utilisateur:groupe fichier. L'opération suppose des privilèges étendus : seul le propriétaire actuel — et surtout le super-utilisateur — peut transférer la propriété. C'est pour cela que le TP 3 impose d'être root, ou d'utiliser sudo : le compte root, aussi appelé administrateur ou super-utilisateur, a tous les droits sur le système, et sudo permet de lancer une commande en se substituant à root sans s'y installer durablement.

5. Lecture d'un fichier 400 par un autre utilisateur. Le fichier appartient au premier utilisateur et n'accorde la lecture qu'à lui : le second essai échoue, quelle que soit sa bonne volonté, parce que seul le propriétaire et le super-utilisateur peuvent définir les droits. Deux voies :

  • le second utilisateur passe par sudo pour lire le fichier, ce qui contourne la vérification mais laisse la propriété inchangée ;
  • le premier utilisateur — ou root — change les droits, par exemple chmod o+r, ou transfère la propriété par chown.

C'est précisément la manipulation demandée par le TP 3, questions 26 et 27 : créer un fichier date.txt dans le répertoire personnel d'un autre utilisateur, le passer en 400 pour que seul le propriétaire le lise, constater l'échec depuis l'autre compte, puis corriger.

6. Après le chown. Le premier utilisateur n'est plus propriétaire : il n'a donc plus que les droits des autres sur ce fichier. Si les droits ont été fixés à 600 ou 700, il ne peut plus rien faire du fichier — ni le lire, ni le modifier, ni le supprimer. La seule action qui lui reste est celle que le noyau autorise à tout utilisateur sur un répertoire où il a le droit d'écriture : supprimer le nom — l'entrée de répertoire —, donc délier le fichier, à condition que le répertoire parent soit inscriptible par lui. C'est la différence, vue à l'exercice 3, entre le fichier et son nom : les droits du fichier protègent le contenu, les droits du répertoire gouvernent les entrées. Le TP formule d'ailleurs la question dans ces termes : « constatez maintenant que l'ancien propriétaire ne peut plus rien faire de ce fichier, sauf quoi ? Pourquoi ? »

#Exercice 10 — Liens, inodes et archivage en pratique

Énoncé (TP séance 2, questions 20 à 22 et 26 à 27 ; TP séance 6, questions 36 à 38 ; CCT du 9/05/2023, question 1a).

  1. Dans un répertoire, créer un lien normal culture_4n.txt et un lien symbolique culture_4s.txt pointant tous deux vers culture4.txt. Quelles sont les différences entre les deux liens ?
  2. On copie culture4.txt en culture4_copie.txt, puis on supprime culture4.txt. Que contiennent alors culture_4n.txt et culture_4s.txt ?
  3. Écrire la suite de commandes qui permet d'extraire le contenu d'une archive compressée, sachant que la commande file a répondu : fichiermystere: gzip compressed data, was "fichiermystere.tar", last modified: Fri Dec 15 08:08:08 2022, from Unix.
  4. Quelle est la méthode de compression la plus efficace entre zip, gzip et bzip2 ? Comment tar combine-t-il archivage et compression ?
Correction détaillée

1. Lien normal contre lien symbolique. Un lien normal (lien dur) est un pointeur vers le fichier : les deux noms désignent le même inode, donc le même bloc de données. Un lien symbolique est un fichier spécial dont le contenu est la chaîne de caractères qui représente le nom d'un autre fichier : c'est une référence indirecte. Trois conséquences pratiques, que le TP fait vérifier :

  • le lien dur ne peut pas traverser un volume, puisqu'il désigne un bloc de données dans un espace physique donné ; le lien symbolique le peut, puisqu'il désigne un chemin ;
  • le lien dur exige que la cible existe ; le lien symbolique peut désigner un fichier absent ;
  • lister avec ls -l montre le lien symbolique par un type l et la flèche vers sa cible, tandis que le lien dur est indiscernable d'un fichier ordinaire — seule la colonne du compteur de liens le trahit.

Le TP ajoute une subtilité de chemin : si le contenu du fichier n'apparaît pas à travers le lien symbolique, c'est une question de chemin relatif ou absolu — un lien symbolique contenant un chemin relatif est résolu par rapport au répertoire qui le contient.

2. Après suppression de la cible. C'est le test décisif de la leçon. culture_4n.txt, qui est un lien dur, continue d'afficher le contenu : la commande rm n'a supprimé qu'un lien dur, et le fichier n'est réellement détruit que lorsque plus aucun lien dur ne le désigne — ici il en restait un. culture_4s.txt, qui est un lien symbolique, ne contient plus rien d'accessible : le lien subsiste en tant que fichier, mais le chemin qu'il contient pointe vers un nom qui n'existe plus. C'est exactement la vérification demandée par le TP 2, question 27 : « Visualisez à nouveau culture_4s.txt et culture_4n.txt. Expliquez la différence de contenu. »

3. Extraire une archive compressée. La réponse du file indique trois choses : le contenu est compressé avec gzip, et une fois décompressé il s'agit d'une archive tar (le nom d'origine était fichiermystere.tar). Il faut donc décompresser, puis désarchiver, et la question impose de renommer d'abord :

bashbash

1mv fichiermystere fichiermystere.tgz2gunzip fichiermystere.tgz3tar xvf fichiermystere.tar

Le renommage en .tgz n'est pas nécessaire au fonctionnement de gunzip, qui détecte le format par le contenu, mais il rend le nom cohérent avec le contenu — c'est la convention .tgz pour « tar gzippé ». gunzip restitue fichiermystere.tar, que tar xvf désarchive (x pour extraire, v pour afficher les fichiers traités, f pour préciser que le nom du fichier d'archive suit et doit apparaître en dernier). En une seule commande, on écrirait tar xzvf fichiermystere.tgz, l'option z demandant à tar de décompresser au passage avec gzip.

4. Compression et archivage. Le cours distingue nettement les deux opérations : compresser réduit la taille d'un fichier, archiver regroupe une hiérarchie entière en un seul fichier. Il donne les trois familles d'algorithmes avec leurs taux indicatifs sur un même fichier : compress (suffixe .Z, environ 34 %), gzip (suffixe .gz, environ 27 %) et bzip2 (suffixe .bz, environ 22 %). La méthode la plus efficace des trois est donc bzip2, et le cours précise que plus le fichier est gros, meilleur est le taux. tar combine les deux : -c construit une archive, -x l'extrait, -t en liste le contenu, -r ajoute des fichiers à la fin, -u ajoute ceux qui manquent ou ont été modifiés depuis la création ; l'option z compresse ou décompresse avec gzip, j avec bzip2, et h suit les liens symboliques comme s'il s'agissait de fichiers ordinaires. Les noms, permissions et dates sont conservés tels quels par l'archivage et le désarchivage. Enfin, zip permet l'échange avec Windows et équivaut à peu près à une combinaison de tar et compress.

#Exercice 11 — Scripts de test, codes de retour et contrôle des paramètres

Énoncé (TP séance 6, questions 17 à 21 ; fiche Révision_fonctions.pdf ; fiche Révision_Shell.pdf).

  1. Écrire un script qui, si aucun paramètre n'est fourni, demande une identité à l'utilisateur, puis compare cette identité au nom de l'utilisateur courant et salue ou refuse selon le cas. Quel mécanisme teste le nombre de paramètres ?
  2. Que fait le script suivant, et que produit-il selon le nombre de paramètres reçus ?
zshzsh

1case $# in20) echo "$0 est sans paramètre" ;;31) echo "$0 possède un paramètre = $1" ;;42) echo "$0 possède deux paramètres = $1, $2" ;;5*) echo "$0 possède $# paramètres = $*" ;;6esac
  1. Que font les deux boucles suivantes, et pourquoi n'ont-elles pas le même temps d'exécution pour un grand nombre d'itérations ?
zshzsh

1nombre=02while [[ $nombre -lt 10 ]]3do4  echo $nombre5  nombre=$(expr $nombre + 1)6done
zshzsh

1nombre=02while [[ $nombre -lt 10 ]]3do4  echo $nombre5  ((nombre=$nombre + 1))6done
  1. Que fait la substitution ${0##*/} ? Par quelle commande peut-on la remplacer ?
  2. En shell, une fonction peut-elle renvoyer une valeur par return ? Que renvoie-t-elle, et comment récupérer un résultat de calcul ?
Correction détaillée

1. Contrôle du nombre de paramètres. $# contient le nombre de paramètres positionnels. Le script attendu est celui du TP :

zshzsh

1if [[ $# -eq 0 ]]2then echo "Veuillez décliner votre identité"3read id4else id=$15fi6if [[ $id == "$(whoami)" ]]7then echo "Bonjour Maître"8else echo "Je ne vous dis pas bonjour, mon maître est $(whoami)"9fi

Trois mécanismes y sont mobilisés : $# pour le comptage, read pour la saisie interactive sur l'entrée standard, et la substitution de commande $(whoami) pour insérer le résultat d'une commande dans le test. La clause [[ ]] est équivalente à la commande test : elle fournit un code de retour, jamais une sortie standard, et c'est ce code qui décide de la branche exécutée.

2. Le case sur $#. Le script affiche la manière dont il a été appelé : le nom du script — $0 —, le nombre de paramètres et leur valeur. Avec zéro paramètre il annonce qu'il est sans paramètre ; avec un, il affiche sa valeur ; avec deux, les deux valeurs séparées par une virgule ; avec trois ou plus, il affiche le nombre et la liste complète via $*. Le motif *) joue le rôle de branche par défaut. C'est une illustration de $0 (nom du script), $1 et $2 (paramètres positionnels), $# (leur nombre) et $* (leur concaténation en un seul mot).

3. Les deux boucles et leur différence de temps. Les deux boucles affichent les entiers de 0 à 9. La différence est le mode d'incrémentation : la première fait appel à la commande externe expr, ce qui crée un processus à chaque itération ; la seconde utilise la construction arithmétique interne (( )), qui s'exécute dans le shell. Pour 10 itérations l'écart est invisible ; pour 5 000, la première version lance 5 000 processus et devient beaucoup plus lente — c'est précisément la comparaison demandée par le TP, qui invite à remplacer 10 par 5000. La leçon dépasse le cas d'espèce : tout ce qui crée un processus a un coût, et une boucle répète ce coût autant de fois qu'elle itère.

4. ${0##*/} et basename. $0 contient le nom du script tel qu'il a été invoqué, chemin compris. La substitution ${0##*/} retire de ce nom le plus long préfixe conforme au modèle */, c'est-à-dire tout ce qui précède le dernier caractère de barre oblique. Elle ne conserve donc que le nom de base du script, ce qui permet d'écrire un message d'usage indépendant du répertoire d'appel. La commande équivalente est basename : $(basename $0). Le cours présente les quatre formes voisines — ${p#modèle} pour le plus court préfixe, ${p##modèle} pour le plus long préfixe, ${p%modèle} pour le plus court suffixe, ${p%%modèle} pour le plus long suffixe — et rappelle que basename est un usage classique dans les scripts.

5. Fonctions et valeurs de retour. En shell, une fonction ne renvoie pas de valeur : l'instruction return sert uniquement à fournir un code de retour, valeur comprise entre 0 et 255, où 0 signifie vrai et tout le reste faux. Ce code définit si la fonction s'est exécutée correctement ou non, et $? permet de le récupérer après l'appel. Pour produire un résultat de calcul, la fonction l'écrit sur sa sortie standard — un echo — et l'appelant le capture par substitution de commande : x2=$(carre $x). La fiche Révision_fonctions.pdf insiste sur deux points supplémentaires : toutes les variables sont globales en shell — y compris celles créées dans une fonction — et une fonction s'appelle comme une commande ordinaire, sans lancer de sous-shell, ce qui est exactement ce qui la rend utile pour modifier l'état du shell.

#Exercice 12 — Accès distant et diagnostic réseau

Énoncé (TP séance 4, questions 13 à 21 et 22 à 24 ; TP séance 6, questions 27 et 28 ; CCT du 9/05/2022, question 2f ; CCT du 9/05/2023, question 1a).

  1. Déterminer le nom de la machine, puis son adresse IP.
  2. À quoi servent les commandes host, ping et traceroute ? Pourquoi peut-on abréger ping polymnie.unice.fr en ping polymnie ?
  3. Quelle commande affiche le nom symbolique associé à une adresse IP, et quel service sollicite-t-elle ?
  4. À l'aide de find, rechercher à partir du répertoire /etc tous les répertoires dont le nom contient zsh, en redirigeant les erreurs vers la « poubelle ».
  5. Comment se connecter à un serveur en SSH et envoyer un courrier électronique « à la main » sur le port SMTP ?
Correction détaillée

1. Nom de machine et adresse IP. hostname sans paramètre donne le nom de votre ordinateur ; avec la bonne option, il donne l'adresse IP :

bashbash

1hostname2hostname -I

Les machines de TP font partie du réseau de l'université et possèdent toutes une adresse réseau et un nom symbolique associé.

2. host, ping, traceroute. host interroge un serveur de noms : il prend en argument une des deux formes d'adresse et répond avec l'autre — c'est l'outil d'association entre nom symbolique et adresse IP. dig fournit plus d'informations et a plus de possibilités. ping teste l'accessibilité d'une machine : on peut l'utiliser pour tester des relais de plus en plus éloignés et déterminer où apparaît une panne ; le TP fait terminer la commande par C-c après un nombre d'essais jugé suffisant. traceroute montre le chemin de routeur en routeur vers une machine donnée ; le TP invite à observer que certaines adresses correspondent à des machines par lesquelles on passe très souvent — ce sont les routeurs d'interconnexion. L'abréviation ping polymnie fonctionne parce que la machine appartient au domaine local : le serveur de noms complète automatiquement le nom court en lui ajoutant le domaine unice.fr. Le cours signale que beaucoup de machines ne répondent pas au ping pour des raisons de sécurité.

3. Nom symbolique depuis une adresse. C'est l'opération inverse, réalisée par la même commande host, ou plus complètement par dig -x. Elle sollicite un serveur de noms de domaine (DNS) : ces serveurs établissent la correspondance depuis et vers les adresses IP. Le TP fait retrouver le nom symbolique associé à 134.59.2.99 — le réseau 134.59 est celui de l'UNSA, dont le domaine est unice.fr. Pour connaître l'adresse et le nom du serveur DNS effectivement utilisé, le TP indique la commande nmcli.

4. find et la redirection des erreurs.

bashbash

1find /etc -type d -name "*zsh*" 2> /dev/null

-type d restreint la sélection aux répertoires, -name prend un motif en expression générique — les jokers du shell, pas une expression rationnelle —, et 2> /dev/null redirige la sortie d'erreur vers la poubelle /dev/null, ce qui supprime les messages d'« accès refusé » que find produit en parcourant les répertoires protégés. C'est la manipulation exacte du TP 5, question 13 : rediriger les erreurs d'un find dans un fichier, puis dans /dev/null quand on ne souhaite pas les conserver.

5. SSH et courrier SMTP. La connexion distante se fait avec ssh, dont le TP rappelle qu'il ouvre une session sur la machine distante après saisie du mot de passe, et que l'on quitte par exit. Une fois la session ouverte, on peut observer les utilisateurs connectés avec who — qui indique pour chaque utilisateur son nom, son terminal de connexion, le jour et l'heure de connexion et la machine d'origine — et w, qui ajoute l'état de la machine et, pour chaque utilisateur, la durée d'inactivité, la consommation de temps machine et la commande en cours d'exécution.

Pour envoyer un courrier à la main, on utilise telnet comme client SMTP générique : c'est le protocole qui sert de support à tous les autres, et le cours en donne la trace complète.

bashbash

1telnet echo.unice.fr 25
texttext

1220 echo.unice.fr ESMTP Postfix2HELO wfsm3250 echo.unice.fr4MAIL FROM: guingne@echo.unice.fr5250 ok6RCPT TO: guingne@echo.unice.fr7250 ok8DATA9354 End data with <CR><LF>.<CR><LF>10essai pour le cours ...11.12250 Ok: queued as EB26D2C0313QUIT14221 Bye

Trois enseignements s'en dégagent. D'abord, le protocole s'appuie sur TCP et IP et utilise le port 25 (non crypté ; 465 et 587 en version cryptée). Ensuite, la commande DATA s'achève par une ligne ne contenant qu'un point, ce qui est la convention d'encadrement du corps du message. Enfin, et c'est le point de sécurité que le cours souligne, il n'y a aucune authentification : l'expéditeur déclaré dans MAIL FROM n'est vérifié par personne, ce qui rend la fraude triviale — c'est le fondement de la plupart des pourriels. Le TP 4 fait d'ailleurs rédiger un message complet à la main, en-têtes compris, puis vérifier dans le client de messagerie que le champ Received retrace le chemin suivi par le message à travers les agents de transport.

Complément : le protocole de messagerie. Le courrier électronique met en jeu deux types d'outils : l'agent de transport, qui effectue la transmission des messages d'une machine à une autre et écoute sur le port 25, et l'agent de courrier, qui sert à composer, envoyer, recevoir et afficher les messages. Les messages reçus sont rangés par l'agent de transport dans une boîte aux lettres, fichier portant le nom de l'utilisateur et rangé dans un répertoire spécifique comme /var/spool/mail ; l'agent de courrier en extrait ensuite les messages un à un. À distance, ce sont les protocoles POP ou IMAP qui permettent de consulter le courrier sans l'amener localement, avec la limite que le cours rappelle : « il faut un mot de passe transmis en clair ».

#Ce que ces annales vérifient

  • Architecture : composants d'un système informatique, rôle du noyau, couches matériel-noyau-shell-applications, mode système et mode utilisateur, responsabilités de ressources (exercice 1).
  • Processus : définition et image, états, filiation, propriétaires réel et effectif, intrinsèque contre processus, codes de retour (exercice 2).
  • Fichiers : inode et son contenu, nom dans le répertoire, liens durs et symboliques, sémantique différenciée de r, w et x (exercice 3).
  • Systèmes de fichiers : partitions, MBR et chargeur d'amorçage, inodes définis au formatage, swap, montage, NFS et Samba, du et df (exercice 4).
  • Virtualisation : quatre types, isolation et performance, fichiers de définition, affichage X distant (exercice 5).
  • Réseau : graphe, Ethernet et MAC, classes IPv4, IPv6 et CIDR, DNS, TCP et ports, SSH et scp (exercice 6).
  • Entrées-sorties : trois fichiers standard, redirections faites par le shell, filtres, tubes, exec (exercice 7).
  • Pilotage des processus : ps, uptime et charge moyenne, top, nohup, C-c et C-z, fg et bg, signaux (exercice 8).
  • Droits : umask calculé dans les deux sens, bases distinctes des fichiers et des répertoires, chown et privilèges, portée des droits après transfert de propriété (exercice 9).
  • Liens et archives : lien dur contre lien symbolique à l'épreuve de la suppression, gzip et tar, taux de compression (exercice 10).
  • Scripts système : tests de fichiers, codes de retour, contrôle des paramètres, coût des processus, fonctions (exercice 11).
  • Connexion distante : résolution de noms, ping et traceroute, find et la poubelle, SSH, SMTP à la main (exercice 12).
Le noyau crée un fichier ordinaire alors que le umask vaut 027. Quels droits obtient-il ?
Le noyau crée un fichier ordinaire alors que le umask vaut 027. Quels droits obtient-il ?
Après suppression du fichier culture4.txt, qu'affichent un lien dur et un lien symbolique qui pointaient vers lui ?
Après suppression du fichier culture4.txt, qu'affichent un lien dur et un lien symbolique qui pointaient vers lui ?