Systèmes Unix

Introduction

Définitions

Le système d'exploitation (SE, en anglais Operating System ou OS) est un ensemble de programmes qui fournissent les services nécessaires à la gestion de l'ordinateur. Il assure le démarrage de l'ordinateur, et fournit aux programmes des interfaces standardisées pour l’accès aux périphériques.

Le système d'exploitation assure plusieurs services :

  • Gestion de la mémoire
  • Gestion des disques
  • Gestion du processeur
  • Communication avec les périphériques
  • Partage des ressources entre les usagers (pour un système multi-user)

La partie du système d'exploitation qui assure les services de base comme la communication entre matériel et logiciel est appelé noyau.

Unix est une famille de systèmes d'exploitation, multi-tâche et multi-utilisateur, qui dérivent du système original AT&T développé à partir de 1969 dans les laboratoires Bell par (entre autre) Ken Thompson et Dennis Ritchie.

Ken_Thompson_(sitting)_and_Dennis_Ritchie_at_PDP-11_(2876612463)

Ken Thompson (assis) et Dennis Ritchie (debout) en 1970

Historique des systèmes Unix

Au milieu des années 1960, le MIT, les laboratoires Bell, et General Electric développent le système Multics (Multiplexed Information and Computer Services). À partir de la fin des années 1960, plusieurs chercheurs des laboratoires Bell dont Ken Thompson et Dennis Ritchie, mécontents des difficultés rencontrées avec Multics, commencent à travailler sur un système d'exploitation, sans nom à l'époque. En 1970, ils le nomment Unics (Uniplexed Information and Computing Service) comme un pied de nez au système Multics. Unics deviendra par la suite Unix, comment et quand, personne ne sait ! Les versions 1 à 3 du système sont développées en langage assembleur, puis en C à partir de la version 4.

En 1975, la première licence du système est vendue au département d'informatique de l'Université de l'Illinois. À partir de là, l'influence d'Unix dans le monde académique se développe. L'université de Berkeley en Californie développe une nouvelle version dérivée appelée BSD (Berkeley Software Distribution).

Chez AT&T, le développement d'Unix se poursuit avec UNIX System V. Dans les années 80, AT&T autorise le clonage d’UNIX par d’autres constructeurs. De nouveaux systèmes dérivés d'Unix voient le jour comme AIX sur IBM.

Ces deux branches, System V et BSD, sont considérées comme les deux branches majeures d'Unix. Dans les années 80 et au début des années 90, la rivalité entre les deux est bien présente. HP et IBM choisissent System V. Sun et DEC étendent plutôt la branche BSD. AT&T et Sun finiront par collaborer pour fusionner System V et SunOs pour donner naissance à Solaris. La branche BSD donnera naissance à un système que vous connaissez : Mac OS.

En image, l'historique d'Unix :

historique des versions unix

Systèmes Unix like

Quand AT&T autorise le clonage de son système, on l'a vu : de nombreuses versions apparaissent. L'incompatiblité entre ces nouveaux systèmes dérivés d'Unix, souvent propriétaires, conduit à développer des standards, dont POSIX et la spécification Unix. Dans les années 80 et 90, de nouveaux systèmes sont développés. Basés sur Unix, libres, ils sont destinés à être similaires à un système Unix sans être nécessairement certifiés. On les appelle des systèmes Unix-like. Parmi eux, on retrouve Linux.

Tux

Le projet GNU initié en 83 par Richard Stallman avait pour objectif de concevoir un ensemble de logiciels totalement compatibles avec Unix mais composé uniquement de logiciels libres. À partir de 1991, Linus Torvalds développe lui le noyau Linux. L'intégration de ce noyau avec les composants du projet GNU créera un système d'exploitation Unix-like entièrement fonctionnel et libre.

La mascotte de Linux est un manchot (non pas un pingouin !). L'anecdote veut que Linus Torvalds se soit fait mordre par un manchot dans un zoo quand il était petit.

L'adoption de Linux décolle ensuite dans les années 90 et il s'impose sur les serveurs et les systèmes embarqués. En usage domestique, Linux est notamment utilisé sur les netbooks avec Chrome OS. Son succès le plus important chez les particuliers est sur le marché des smartphones avec Android.

Il existe beaucoup (beaucoup !) de systèmes basés sur GNU+Linux. On les appelle des distributions. Un aperçu :

Arbre des distributions Linux

On peut citer notamment les distributions mères dont sont issues toutes les autres :

  • ArchLinux
  • Debian
  • Gentoo
  • Red Hat
  • Slackware

Et parmi les distributions grand public, on retrouve par exemple Ubuntu, basée sur Debian, ou Fedora, basée sur Red Hat.

Un petit schéma pour récapituler tout ça :

Historique d'Unix

L'interpréteur de commandes

Présentation

L'interpréteur de commandes, aussi appelé shell, est l'interface entre l'utilisateur et le système d'exploitation. C'est une application qui va interpréter les commandes saisies par l'utilisateur et les transmettre au système.

Il existe des dizaines d'interpréteurs de commandes sous Unix. Les deux principaux sont le Bourne-shell (sh et ses variantes : ksh, bash) et le C-shell (csh).

L'application se présente comme une fenêtre avec un prompt : l'invite de commande. Par défaut, elle est composé du login de l'utilisateur et du nom de la machine. On peut la modifier.

On saisit donc sa commande à la suite du prompt. Plusieurs raccourcis sont à connaître :

  • Pour stopper la commande en cours : Ctrl-C
  • Pour mettre en attente la commande en cours : Ctrl-Z
  • Pour terminer l’entrée standard (les éventuelles paramètres donnés par l’utilisateur via le clavier) : Ctrl-D
  • Pour compléter une commande, ou un chemin : Tab

Syntaxe des commandes

Syntaxe de base

La syntaxe de base d'une commande est la suivante :

nom_commande [options] [arguments]

Note: les crochets autour des arguments et des options signifient que ceux-ci sont optionnels.

Le caractère séparateur entre les différents éléments de la commande est le blanc (un espace). Les options commencent habituellement par le caractère "-" (le signe moins) suivi d’une ou plusieurs lettres-clés. Ces options vont modifier le comportement de la commande. Les arguments spécifient les objets (fichiers ou variables) sur lesquels la commande va s’appliquer.

À noter que tous les shells font la distinction entre les lettres minuscules et majuscules pour les commandes et les noms de fichiers contrairement à MS-DOS.

Exemple - Lister les éléments d'un répertoire :

ls -l repertoire1

  • La commande ls permet de lister les éléments d'un répertoire
  • L'option -l permet d'obtenir tous les attributs des fichiers listés
  • L'argument repertoire1 signifie qu'on listera les éléments du répertoire 1

Pour savoir comment utiliser une commande, un manuel est disponible. On y accède avec la commande man :

man ls

Caractères génériques

Certaines commandes acceptent plusieurs noms de fichiers en arguments. Il est donc intéressant d’avoir des notations permettant de raccourcir l’écriture d’une telle liste. Ainsi, il existe plusieurs caractères génériques qui, incorporés dans les noms de fichiers, ont la signification suivante :

  • le caractère ? qui peut remplacer n’importe quel caractère
  • le caractère * (astérisque) qui peut remplacer n’importe quelle chaîne de caractères, y compris la chaîne vide

Exemple - disons que j'ai un répertoire qui contient ces éléments : fic fic1 fic2 fic3 fic33 mbox rep1 rep2 rep3

  • ls donne fic fic1 fic2 fic3 fic33 mbox rep1 rep2 rep3
  • ls fic? liste tous les fichiers dont le nom est composé de fic suivi d'une lettre : fic1, fic2, fic3
  • ls fic* donnera fic fic2 fic33 fic1 fic3
  • ls fic?? donnera fic33

Entrées/sorties, redirections

Lors de l’exécution d’une commande, un processus est créé. Celui-ci va alors ouvrir trois flux :

  • stdin : l’entrée standard, par défaut le clavier, identifiée par l’entier 0
  • stdout : la sortie standard, par défaut l’écran, identifiée par l’entier 1
  • stderr : la sortie d’erreur standard, par défaut l’écran, identifée par l’entier 2

Généralement, les commandes lisent l’entrée standard et/ou écrivent sur la sortie standard. Normalement, l’entrée standard est le clavier et la sortie standard est l’écran. Il est possible de rediriger ces entrées et sorties standards vers des fichiers.

Redirection de la sortie standard

Pour que le résultat d’une commande soit rangé dans un fichier au lieu d’apparaître à l’écran, il faut utiliser la syntaxe :

nom_commande [options] [arguments] > fichier_sortie

Exemple : ls -l > log.txt. Le résultat de la commande sera enregistré dans le fichier log.txt

Si le fichier existe, il sera écrasé, sinon il sera créé.

Redirection de la sortie standard sans écrasement

On voit que si le fichier de redirection existe déjà, son contenu est écrasé avec la redirection >. Si on veut que ce contenu soit préservé et y ajouter des résultats d’une commande, il faut utiliser la redirection >>.

Exemple : ls -l >> log.txt. Le résultat de la commande sera ajouté à la fin du fichier log.txt

Redirection de l'entrée standard

Au lieu de fournir des données en les entrant au clavier, ces données peuvent être lues dans un fichier avec la syntaxe :

nom_commande [options] [arguments] < fichier_entrée

Exemple : wc -l < log.txt. On obtiendra le nombre de lignes dans le fichier log.txt.

Redirection de la sortie standard vers l'entrée standard

On peut également utiliser le mécanisme de pipe qui permet de prendre la sortie standard d’une première commande et de la rediriger sur l’entrée standard d’une 2ème commande. La syntaxe est :

nom_commande1 [options] [arguments] | nom_commande2 [options] [arguments]

Exemple : ls -l | wc -l permet de lister tous les fichiers du répertoire et de compter les lignes du résultat obtenu avec la commande wc. On obtiendra donc le nombre d'éléments dans le répertoire !

Un résumé des redirections possibles :

Symbole Redirection
> redirection de la sortie standard (par exemple dans un fichier)
< redirection de l’entrée standard
>> redirection de la sortie standard sans écrasement (ajout)
| redirection de la sortie standard vers l’entrée standard (pipe)

Le système de fichiers

Arborescence d'Unix

L’unité d’information gérée par le système est le fichier et celui-ci peut contenir n’importe quoi et être éventuellement vide. Selon leur utilisation, les fichiers sont appelés répertoires (directories) ou fichiers tout court (files). Un répertoire est un catalogue de fichiers contenant leurs caractéristiques comme les droits d’accès, la taille, la date de création, etc. L’ossature du système est une structure arborescente de fichiers et de répertoires. Chaque utilisateur peut ajouter dans son coin de nouvelles branches.

/ est le nom du répertoire racine (root) de l’arbre.

arborescence d'Unix

Dans les systèmes basés sur Unix, le système de fichiers contient les répertoires de bases suivant :

  • /bin : exécutables essentiels pour le système, directement utilisable par les utilisateurs
  • /boot contient les fichiers permettant à Linux de démarrer
  • /dev contient les points d’entrée des périphériques
  • /etc configuration du réseau. Contient les commandes et les fichiers nécessaires à l’administrateur du système (fichiers passwd, group, inittab, ld.so.conf, lilo.conf, ...)
  • /home répertoire personnel des utilisateurs
  • /lib contient des bibliothèques partagées essentielles au système lors du démarrage
  • /mnt contient les points de montage des partitions temporaires (cd-rom, disquette, ...), parfois nommé media
  • /opt contient des packages d’applications supplémentaires
  • /proc fichiers contient des info sur la mémoire, E/S, périphérique, compatibilité, pour le noyau, ...
  • /root répertoire de l’administrateur root
  • /usr hiérarchie secondaire (utilisateurs)
  • /var contient des données variables
  • /tmp contient les fichiers temporaires

Chemins absolus, chemins relatifs

Le chemin absolu d’un fichier est formé de tous les noms de répertoires traversés depuis la racine pour l’atteindre, noms séparés par des obliques avant / (contrairement à Windows qui utilise des obliques arrière \). Chaque fichier a un chemin absolu unique dans le système.

Exemple : 2 fichiers de même nom, fic1, peuvent coexister s’ils sont dans 2 répertoires différents et ont donc un chemin absolu différent : /home/tom/fic1 et /home/tom/rep1/fic1.

Le chemin relatif d'un fichier est formé à partir du répertoire courant. Le répertoire courant est noté ".", son répertoire parent est noté "..". Ainsi, si je me situe dans le répertoire rep1, .. me renvoie au répertoire tom.

La commande cd (change directory) permet de changer de répertoire. En argument, on lui passe le nom du répertoire dans lequel on veut se déplacer. Sans argument, on revient au répertoire personnel.

Droits d'accès

Chaque fichier (ou répertoire) possède un ensemble d’attributs définissant les droits d’accès à ce fichier pour tous les utilisateurs du système.

Il existe 3 classes d’utilisateurs pouvant éventuellement accéder à un fichier :

  • le propriétaire du fichier (User)
  • le groupe dans lequel appartient le propriétaire (Group)
  • les autres (Others)

À sa création, un fichier appartient à son auteur. Le propriétaire du fichier peut ensuite distribuer ou restreindre les droits d’accès sur ce fichier (voir plus loin).

Pour chaque classe d’utilisateurs, il y a 3 types d’accès à un fichier donné :

  • r: en lecture (Read)
  • w: en écriture (Write)
  • x: en exécution (eXecute)

Au niveau répertoire, ces droits signifient :

  • droit de lister les fichiers présents dans ce répertoire (Read)
  • droit de créer ou de détruire un fichier qui s’y trouve (Write)
  • droit de traverser ce répertoire (eXecute)

Pour visualiser les droits d'accès, on utilise la commande ls -l. Le 1er caractère spécifie si le fichier est un répertoire (caractère d) ou un fichier tout court (caractère -). Les 9 caractères suivants identifient les droits d’accès (présence du droit si lettre r, w ou x; absence de droit si caractère -).

r   w   x   r   w   x   r   w   x

user     group     others

-rw------- 1 toto 49 Sep 18 12:37 fic.txt : signifie que Toto est le propriétaire et a le droit de lire et écrire le fichier.

-rwxr-xr-x 1 toto 49 Sep 18 12:37 script.py : signifie que Toto est le propriétaire et a le droit de lire, écrire et exécuter le fichier. Les autres n'ont que le droit de lire et exécuter le fichier

Les commandes de base

Liste des fichiers

On l'a vu : on utilise la commande ls.

Exemples :

  • ls l* : liste tous les fichiers commençant par l
  • ls -l : liste tous les fichiers du répertoire courant, en donnant les attributs des fichiers (droits, taille, etc)
  • ls -a : liste tous les fichiers du répertoire courant (y compris les fichiers cachés dont le nom commence par un “.”)
  • man ls : affiche la page de manuel de la commande ls
  • Visualiser un fichier

    Pour visualiser le contenu d'un fichier en entier, on utilise la commande cat. Exemple : cat toto.txt.

    Pour visualiser le contenu d'un fichier page à page, on utilise la commande more. Exemple : more toto.txt.

    Pour visualiser le contenu d'un fichier au fur et à mesure, à partir de la fin, on utilise la commande tail avec l'option f. Exemple : tail -f toto.txt. Bien utile pour les logs puisque les dernières opérations s'affichent au fur et à mesure.

    Supprimer un fichier

    On utilise la commande rm. Exemple : rm toto.txt. L'option f permet de forcer la suppression sans demander confirmation à l'utilisateur, l'option r permet de supprimer récursivement tous les fichiers d'un répertoire.

    rm -rf repertoire1 supprimera donc le répertoire repertoire1 et tout son contenu. À manier avec précaution...

    Éditer un fichier

    On peut utiliser les éditeurs vim ou nano directement dans le terminal. Pour cela on fait : vim toto.txt ou nano toto.txt.

    Copier un fichier

    On utilise la commande cp.

    cp [option] [chemin vers fichier source] [chemin vers fichier destination]

    Exemples :

    • cp toto.txt /tmp/ : copie toto.txt dans /tmp
    • cp -r projet /tmp : copie tout le répertoire projet dans /tmp

    Déplacer un fichier

    On utilise la commande mv qui permet de déplacer un fichier source en le renommant si le chemin du fichier destination contient un nom de fichier.

    mv [option] [chemin vers fichier source] [chemin vers fichier destination]

    • mv ancien_nom nouveau_nom (renommage)
    • mv nom_fichier nom_répertoire (déplacement)

    Rechercher un motif dans un fichier

    Pour rechercher un motif (un mot, un groupe de mots) dans un fichier, on utilise la commande grep.

    grep [options] expression_régulière fichier1

    Exemples :

    • grep "deadline" cours/* : va rechercher le mot deadline dans tous les fichiers du répertoire cours
    • grep -n "deadline" cours/*, affiche le numéro de ligne en plus
    • grep -c "deadline" cours/*, affiche le nombre d'occurences en plus

    Connaître l'activité du système

    Pour surveiller ou analyser l'activité du système, on utilise la commande top. Elle permet de voir de manière interactive les processus en cours, les ressources qu'ils occupent. Capture de la commande top

    Pour retrouver un processus particulier, on peut utiliser la commande ps aux. Si vous voulez extraire un processus particulier à partir de son nom, vous pouvez ajouter la commande grep pour obtenir directement les informations liés à ce processus.

    Capture de la commande ps

    Interrompre un processus

    On interrompt un processus avec la commande kill suivi du PID du processus. Par exemple, pour interrompre Apache ici : kill 24640. Pour forcer le processus à s'interrompre : kill -9 PID.

    Modifier les droits d'accès d'un fichier

    Pour modifier les droits d'accès d'un fichier, on utilise la commande chmod.

    chmod [options] droits fichier

    La commande chmod accepte deux types de notations : la notation symbolique et la notation numérique.

    Notation symbolique

    Cette notation consiste à associer un ou plusieurs degrés de propriété, une action et un ou plusieurs types d'accès. On l'utilise généralement pour ajouter ou retirer des permissions par rapport à la normale (-rw-r--r-- pour un fichier, drwxr-xr-x pour un répertoire).

    Degré de propriété Action Type d'accès
    u (utilisateur)
    g (groupe)
    o (autres)
    a (tout le monde)
    + (ajoute le droit)
    - (enlève le droit)
    = (définit le droit)
    r (lecture)
    w (écriture)
    x (exécution

    Exemples :

    • chmod og+r fichier.txt : Donne les droits en lecture aux utilisateurs du groupe et aux autres
    • chmod +x script : donne les droits en exécution à tout le monde

    Notation numérique

    Cette notation est basée sur l'utilisation de chiffres qui viennent de la notation binaire.

    • 7 : Toutes les permissions
    • 6 : Lecture et écriture seulement
    • 5 : Lecture et exécution seulement
    • 4 : Lecture seulement
    • 3 : Écriture et exécution seulement
    • 2 : Écriture seulement
    • 1 : Exécution seulement
    • 0 : Aucune permission

    Exemples :

    • chmod 600 file : Vous seul pouvez lire et écrire file
    • chmod 700 file : Vous seul pouvez lire, écrire et exécuter file
    • chmod 644 file : Vous pouvez lire et écrire, et les autres seulement lire
    • chmod 755 file : Vous pouvez lire, écrire et exécuter, et les autres seulement lire et exécuter

    Le manuel !

    Pour toutes les commandes, vous pouvez accéder au manuel avec

    man commande

    La page du manuel vous expliquera la tâche réalisée par la commande et toutes ses options.

    Pour chercher un mot dans les pages du manuel et retrouver une commande, on utilise l'option k :

    man -k "recherche"