Académique Documents
Professionnel Documents
Culture Documents
Système d'exploitation
(Linux)
Dr TCHOUPE T. Maurice
Objectif
2
Objectif
comprendre, décrire l’architecture et le fonctionnement des
systèmes d’exploitation
utiliser le SE Linux
Pré-requis
Afin de suivre ce cours sans difficulté, il serait intéressant:
d’être familier avec l’utilisation de base d’un système
d’exploitation :Windows, MS-DOS, …
de posséder quelques notions d’algorithmique
Posséder des connaissances sur l'architecture des ordinateurs
Déroulement du Cours
CM=30h, TD=15h, TP=15h
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Programme
3
Théorie des SE
Définition et rôle d’un SE
Gestion des fichiers
Gestion des processus
Gestion de la mémoire
Gestion des E/S
Etude du SE Linux
Installation,
Commandes de bases
Programmation en Shell
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Bibliographie
4
Théorie des SE
A quoi ça sert ?
à simplifier la vie des utilisateurs et des programmeurs:
machine virtuelle (abstraite)
à gérer les ressources de la machine d’une manière
efficace
Les ressources d’un ordinateur sont :
• le processeur,
• les mémoires,
• les périphériques
<ouvrir_fichier “TP/expr.txt”>
Système d’exploitation
Pilote de disquette Pilote d’imprimante Pilote d’écran
<démarrer moteur>
<lire_secteur(début_secteur_5,param1_5, param2_5,…, param12_5)>
<lire_secteur(début_secteur_0,param1_0, param2_0,…, param12_0)>
…
<lire_secteur(début_secteur_7,param1_7, param2_7,…, param12_7)>
<arrêter_moteur>
Contrôleur de disquette
Gestion de
fichiers
Gestion de Gestion de
la mémoire processus
x y z
a b a b
x y z
c d c d
p q r q q r
Contrôles d'accès
On distingue trois classes d’utilisateurs :
le propriétaire (u : user, par défaut créateur),
le groupe (g : group, par défaut groupe principal du
créateur) et
le reste du monde (o : others).
Chaque classe peut se voir affecter sur un fichier les
droits
de lecture (r : read),
d’écriture (w : write) et
d'exécution (x : execute).
Contrôles d'accès
Contrôles d'accès
La commande ls -l permet de connaître le détail des droits sur un
fichier: le type de fichier (catalogue, fichier ordinaire ou spécial),
les droits d'accès pour les différents utilisateurs, le nombre de lien
du fichier, les noms du propriétaire et du groupe, la taille du
fichier en nombre de caractères et la date de dernière
modification
ls -l /etc/passwd
-r--r--r-- 1 root sys 8620 Jan 21 12:41 /etc/passwd
ls -l /bin/passwd
-rwsr-sr-x 1 root sys 16686 Jul 30 12:41 /bin/passwd
La commande passwd (fichier/bin/passwd) a le "set-uid" bit positionné
(indication s en lieu et place de x pour le bit exécution par le
propriétaire) et donc au travers de cette commande tout utilisateur peut
modifier le fichier /etc/passwd (en l'occurrence changer son mot de
passe.)
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Le Système de Fichiers: LE SGF D’UNIX
28
Contrôles d'accès
La commande chmod permet de modifier les droits sur un fichier (noter la descente
récursive d’une sous arborescence avec l’option -r). ) pour pouvoir l’utiliser sur un fichier, il
faut en être le propriétaire.
Syntaxe: chmod <mode> <reférenceFichier>
Il existe deux syntaxe: la notation symbolique et la notation octale
notation octale: Les modes peuvent être absolus et sont alors obtenus par combinaison des
nombres octaux
4000 positionne le "set-uid" bit
2000 positionne le "set-gid" bit
1000 positionne le "sticky" bit
0400 lisible par le propriétaire
0040 lisible par les membres du groupe propriétaire
0001 exécutable par les autres utilisateurs
…
exemple
$ chmod 664 exemples/toto
$ ls -l exemples/toto
-rw-rw-r-- 1 jmr ens 84 Jan 27 19:09 exemples/toto
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Le Système de Fichiers: LE SGF D’UNIX
29
Contrôles d'accès
La commande chmod permet de modifier les droits sur un fichier (noter la descente récursive d’une sous arborescence
avec l’option -r). ) pour pouvoir l’utiliser sur un fichier, il faut en être le propriétaire.
Syntaxe: chmod <mode> <reférenceFichier>
Il existe deux syntaxe: la notation symbolique et la notation octale
notation symbolique: les modes peuvent être symboliques et ils ont alors la forme:
[<quit>] <permission> <operation>
<quit> est une combinaison des lettres: u pour le propriétaire, g pour le groupe, o pour les autres,
a pour tous.
<permission> est: + pour autoriser, - pour interdire, = imposer certaines permissions et supprimer
les autres;
<opération> est une combinaison des lettrez: r pour lire, w pour écrire, x pour exécuter, s pour le
"set-uid" (bit associé à u) ou le "set-gid" (associé à g); t pour le "sticky" bit.
Exemples:
$ ls -l exemples/toto
-rw-r----- 1 jmr ens 84 Jan 27 19:09 exemples/toto
$ chmod go+r exemples/toto
-rw-r--r-- 1 jmr ens 84 Jan 27 19:09 exemples/toto
Contrôles d'accès
Exemples:
$ ls -l ../c/bks
-rwx--x--x 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ chmod u+t ../c/bks
$ chmod u+s ../c/bks
$ ls -l ../c/bks
-rws--x--t 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ chmod g+s ../c/bks
$ ls -l ../c/bks
-rws--s--t 1 jmr ens 9282 Nov 13 13:27 ../c/bks
$ ls -l /tmp/toto
-rw-r--r-- 1 jmr ens 200 Jan 27 18:51 /tmp/toto
$ chmod g=w /tmp/toto
$ ls -l /tmp/toto
-rw--w-r-- 1 jmr ens 200 Jan 27 18:51 /tmp/toto
Contrôles d'accès
chown permet de modifier le propriétaire d’un fichier,
syntaxe: chown <nom> <refFich>
Exemple:
$ chown root exemples/toto
$ ls -l exemples/toto
-rw-rw-r-- 1 root ens 84 Jan 27 19:09 exemples/toto
Recherche de fichiers.
find permet de rechercher un ou des fichiers dans le
système de fichier. On recherche récursivement, en
partant d’un répertoire des fichiers ou des répertoires
suivant certains critères (nom de fichier, éventuellement
avec joker, type de fichier, nom de l’utilisateur ou du
groupe, droits d’accès, type de fichier).
test peut entre autres opérations, tester les
caractéristiques d’un fichier et renvoyer une valeur de
retour 0 si vrai et 1 si faux. Très utile dans les scripts de
langage de commandes (nous en reparlerons).
stdout stdout
0 1 stdin
0 1 fichier
stdin
Processus
Processus
2 stderr 2 stderr
mardi dimanche
Processus exécutant
wc –l <f1
Processus exécutant
lundi hier
demain lundi
lundi mardi 5
>f2
dimanche
2 stderr 2 stderr
Processus exécutant
wc –l <f1
Processus exécutant
lundi
demain
lundi 5
>f2
dimanche
2 stderr 2 stderr
Les inodes
Chaque fichier est représenté par une structure nommée inode.
Un inode contient la description (pour le SGF) d’un fichier:
Propriétaire, groupe, type de fichier, permissions
Date d.accès, de modification et de dernier accès à l.inode
Taille
Description des blocs constituant le fichier
Etat de l’inode
N° de périhérique logique
N° de l’inode
Pointeurs sur d’autres inodes en mémoire
Compteur de référence indiquant le nombre d’instances du fichier
actuellement ouvertes
Zone de verrous
Les inodes
Chaque inode permet de retrouver l’ensemble des blocs de données
constituant un fichier.
Une première série de 10 entrées contiennent chacune le numéro de
bloc d’un bloc de données du disque.
Simple indirection : une onzième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données du disque.
Double indirection : une douzième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données qui contient 256 entrées référençant chacune un bloc de données du
disque.
Enfin triple indirection : une treizième entrée contient le numéro d.un bloc de
données qui contient lui même 256 entrées référençant chacune un bloc de
données qui contient 256 entrées référençant chacune un bloc de données qui
contient 256 entrées référençant chacune un bloc de données du disque.
Les inodes
Les inodes
Remarque : Un fichier peut avoir plusieurs liens donc
plusieurs noms. Il suffit pour cela qu’ils pointent sur le
même inode (celui du fichier).
L’inode n°2 est l’inode racine du système de fichiers.
Répertoires
Un répertoire est un fichier comme les autres.
Chaque répertoire peut contenir des fichiers ou des
répertoires.
Les répertoires sont structurés en arbre hiérarchique (plus
exactement en graphe sans cycle).
Les données contenues dans un fichier de type répertoire
sont une suite d’éléments contenant chacun un numéro
d’inode et le nom du fichier.
Lorsque un processus a besoin d’un fichier, le noyau parcourt
les différents répertoires jusqu’à trouver le nom recherché.
Celui-ci fournit alors un numéro d’inode, qui est chargé en
mémoire et utilisé dans la suite du processus.
Gestion de processus
57
Programme C Processus C
Programme B Processus B
temps
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Algorithmes d’ordonnancement (1/2)
58
Après le quantum de P1 :
P5 P3 P2 P3 P4 P5 P6 P1
P4
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Algorithmes d’ordonnancement (1/2)
59
1. Tourniquet avec priorité : les processus attendent dans plusieurs files selon
leurs priorités. La file de la plus grande priorité est servie d’abord. A
l’intérieur d’une file l’ordonnancement se fait selon la méthode de tourniquet.
Processus prêts
Têtes de files
Priorité 4 (Priorité la plus élevée)
Priorité 3
Priorité 2
Priorité 1 (Priorité la plus basse)
8 4 4 4 4 4 4 8
A B C D B C D A
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Temps moyen = (8+12+16+20)/4 = 14 Temps moyen = (4+8+12+20)/4 = 11
Etats d’un processus
61
ETATS
Elu (running) = en cours
d’exécution TRANSITIONS
Prêt (ready, runnable) = Elu 1 = le processus se
2 bloque en attente
suspendu
temporairement pour d’événement
3
permettre l’exécution 1 Prêt 2 = l’ordonnanceur
d’un autre processus choisit un autre
Bloqué (blocked) = processus
attendant un événement 3 = l’ordonnanceur
extérieur, e.g. appui Bloqué 4 choisit ce processus
d’une touche au clavier, 4 = l’événement
pour pouvoir continuer attendu survient
Plus précisément, dans le système UNIX, les différents états d'un processus
peuvent être caractérisés comme suit :
Le processus est prêt en mémoire. Il ne s'exécute pas, mais il est
chargé en mémoire et est prêt à s'exécuter dès que le noyau l'élira
comme processus actif.
Le processus s'exécute en « mode noyau », c'est à dire qu'il fait appel
à une fonction du noyau du système (read, write, fork, exec, .) .
Le processus s'exécute en « mode utilisateur », c'est à dire qu'il réalise
des calculs d'une fonction de bibliothèque (+, -, strcpy, .) .
Le processus est « préempté », c'est à dire que le noyau a effectué un
changement de contexte pour élire (« donner la main à ») un autre
processus.
Le processus est « zombie ». Il a provoqué un appel à une instruction
de terminaison (exit), et n'aura donc plus besoin du CPU, mais son père
n'a pas encore pris connaissance de ses codes de retour et de ses
statistiques d'exécution. Cet état est typique des processus UNIX. Il est
normalement très transitoire. C.est un état terminal.
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Etats d’un processus (cas d'UNIX)
63
après I1
Fich.c TP17.c CV.doc Test.ps
après I2
F_b dans [qb]> //I2 Fich.c TP17.c CV.doc Test.ps F_b
5 6 7 8 9
après I3
Fich.c TP17.c CV.doc Test.ps F_b
Processus C : qb 9 5 6 7 8 9
Fich.c TP17.c CV.doc Test.ps après
<qc ← queue>
F_b
//I1c qc 9 I2b
<charger fichier tête queue
F_c dans [queue]> //I2c qb 9 5 6 7 8 9
<queue← qc+1> //I3c Fich.c TP17.c CV.doc Test.ps F_c après
qc
Support : Système d'exploitation (Linux) 9 //Par: Dr TCHOUPE T. Maurice I2c
tête queue
Conflits d’accès aux variables partagées (2/2)
Processus B : qb 9 5 6 7 8 9
69<qb ← queue> Fich.c TP17.c CV.doc Test.ps après
F_c
qc 9 I3b
//I1b
tête queue
<charger fichier
F_b dans [queue]> //I2b qb 9 5 6 7 8 9
<queue← qb+1> //I3b Fich.c TP17.c CV.doc Test.ps F_c
après
qc 9 I3c
Processus C : tête queue
<qc ← queue> //I1c Problème : Le fichier F_b ne sera jamais imprimé,
<charger fichier car il a été écrasé par F_c.
F_c dans [queue]> //I2c Source du problème : la variable partagée queue
<queue← qc+1> //I3c est lue est modifiée par deux processus à la fois.
Les conflits d’accès concurrents aux variables partagées ont plusieurs solutions
possibles (sémaphores, moniteurs, …).
L’idée commune de ces solutions est l’exclusion mutuelle : une variable partagée ne
doit pas être lue ni modifiée par plus d’un processus à la fois. Si d’autres processus
veulent y accéder ils doiventSupport
attendre que le premier processus ait fini.
: Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
Echange de messages
70
Les mécanismes de communication par variables partagées conviennent bien à
des processus qui tournent sur le même processeur ou sur plusieurs processeurs
possédant une mémoire commune.
Pour les systèmes distribués, i.e. constitués de plusieurs processeurs ayant chacun
leur propre mémoire et reliés par un réseau local, la communication inter-
processus peut se faire par échange de message :
• Un processus peut envoyer un message par réseau à un destinateur précis :
send(destination, message)
• Un autre processus peut “consommer” un message par :
receive(source, message)
• Les problèmes qui se posent :
– Perte de message lors du passage par réseau - nécessité d’acquittement
– Perte d’acquittement - nécessité de retransmission d’un message
– Reconnaissance d’un message envoyé 2 fois (à cause de perte
d’acquittement)
Support : Système d'exploitation (Linux) //Par: Dr TCHOUPE T. Maurice
– Authentification des processus envoyant et recevant le message, etc.
71
Gestion de la mémoire
(voir support annexe)
Paramètres
Les paramètres sont initialisés si on les tape à la suite du
nom du fichier.
Ils portent les numéros de 1 à 9 précédés du $.
$1 est une expression dont la valeur est celle du premier
paramètre effectif placé après une commande simple.
$2, pour le deuxième, . et
$9 pour le neuvième.
$0 existe et désigne la commande elle-même.
Notons, tout de suite, que cette technique ne limite pas le
nombre de paramètres à 9, comme nous le verrons par la
suite.
Exemples
1) ESSAI=${VAR:-mot} VAR n’étant pas initialisée, ESSAI est initialisé par mot
(équivalent à ESSAI=mot) ($VAR n’existe pas).
VAR=init
ESSAI=${VAR:-mot} VAR étant initialisée par init, ESSAI est initialisé par $VAR
(équivalent à ESSAI=$VAR).
2) ESSAI=${VAR:=mot} VAR n’étant pas initialisée, VAR est initialisée par mot et
ESSAI devient équivalent à $VAR (équivalent à VAR=mot, ESSAI=$VAR, donc
ESSAI=mot)
VAR=init
ESSAI=${VAR:=mot} VAR étant initialisée par init, ESSAI devient équivalent à
$VAR (équivalent à ESSAI=$VAR)
3) ESSAI=${VAR:?mot} VAR n’étant pas initialisée, affiche VAR: et mot puis
arrête le processus shell en cours.
VAR=init
ESSAI=${VAR:?mot} VAR étant initialisée par init, ESSAI devient équivalent à
$VAR (équivalent à ESSAI=$VAR) et le processus shell se continue.
Boucle while
while liste_de_commandes_1
do NUM=0
while [ $1 ] #tant que $1 existe, [ ] commande
liste_de_commandes_2 test
done do
La liste_de_commandes_1 est NUM=`expr $NUM + 1`
exécutée. Si le code de retour echo "paramètre $NUM = $1"
shift #décale les paramètres
de la dernière commande de
done
liste_de_commandes_1 est 0
(vrai), alors la
liste_de_commandes_2 est
exécutée et la boucle continue.
boucle until
until liste_de_commandes_1
do NUM=0
liste_de_commandes_2 until [ $# -eq 0 ] #jusqu’à ce que le nombre de
done #paramètres soit nul
do
La liste_de_commandes_1 est NUM=`expr $NUM + 1`
exécutée. Dès que le code de echo "paramètre $NUM = $1"
retour de la dernière
shift #décale les paramètres
commande de
done
liste_de_commandes_1 est 0
(vrai), la liste_de_commande_2
n’est plus exécutée et la boucle
s’arrête.
Sélection if
if liste_de_commandes_1
then
liste_de_commandes_2
else
liste_de_commandes_3
fi
On teste le code de retour de la dernière commande de
liste_de_commandes_1 ;
s’il est égal à 0, liste_de_commandes_2 est exécutée
sinon c’est liste_de_commandes_3 qui l’est.
L’existence de else liste_de_commandes_3 n’est pas obligatoire.
Le code de retour de la structure est 0 si liste_de_commandes_2 est
exécutée sinon c’est celui de la dernière commande de
liste_de_commandes_3.
Sélection case
Exemple : Préciser si le paramètre est un chiffre, une lettre
ou une suite de caractères.
NUM=0
for PARAM in $*
do
NUM=`expr $NUM + 1`
case $PARAM in
[0-9]) echo "le paramètre $NUM est un chiffre: $PARAM" ;;
[a-z]|[A-Z]) echo "le paramètre $NUM est une lettre: $PARAM" ;;
*) echo "le paramètre $NUM contient plusieurs caractères: $PARAM";;
esac
done
Commandes internes
Une commande interne est une commande prédéfinie dans le shell pour
laquelle il n’existe pas de fichier exécutable portant son nom.
pwd imprime le répertoire courant
cd change de répertoire
mkdir crée un répertoire
rmdir supprime un répertoire
echo affiche ses arguments
read lit une entrée au clavier
export « export » une variable (la rend visible au processus appelant)
break sortir d’une boucle (for, .).
continue continuer à l’itération suivante d’une boucle (for, ..).
exit quitter le programme avec, en code de retour, celui de la dernière
commande exécutée (fin du shell en cours).
return idem pour quitte
Commandes internes
. fichier exécuter les commandes du fichier sans créer un nouveau processus
: instruction vide du shell.
set list_args fournir les valeurs des paramètres effectifs correspondant aux
paramètres formels 1, 2, ... Permet ainsi de paramétrer les sous-programmes réalisés
par eval : il suffit pour cela que les commandes contenues dans la variable $VAR
soient paramétrées en faisant référence à $1, $2 ...
eval $VAR le contenu de la variable $VAR est considéré comme une liste de
commandes shell. Cela ressemble à un appel de sous-programme sans paramètre
shift les paramètres formels sont renommés: $2->$1 ; $3->$2... Utile lorsqu’une
commande a plus de 9 paramètres (exemple page 47).
On a déjà noté que les paramètres formels d’une commande sont désignés par des
chiffres et ce sont des paramètres de position : 0 représente le nom de la commande
paramétrée, 1 le premier paramètre, 2 le deuxième et ainsi de suite jusqu’à 9. La
notation $* est équivalente à "$1$2...", tandis que la notation $@ est équivalente à
"$1""$2".... On rappellera que $# renvoie le nombre de paramètres de la commande
test expr
[ expr ] test
Commandes externes
Toutes les commandes peuvent être utilisées dans les scripts shell.
Certaines commandes sont des grands classiques des scripts :
awk recherche d'expressions régulières et enchaînement d.action
si trouvées .
grep recherche d'expressions régulières et impression de la ligne
les contenant
wc compte de mots
sort tri
bc calculateur
PARENTHESAGES
Les parenthésages servent à regrouper des séquences de mots ou à isoler des mots.
Ils sont multiples et ont des significations spécifiques:
{...} regroupement de commandes, parenthésage ordinaire ; délimite aussi la portée de
l’opérateur de prise de valeur $.
(...) entoure une liste de commandes qui sont exécutées par un nouveau processus UNIX.
’...’ (quotes) parenthésage dans lequel aucun caractère, sauf ’, n’a de signification spéciale.
"..." (guillemets) parenthésage dans lequel aucun caractère, sauf ‘ " et $ n’a de signification
spéciale.
‘...‘ (accents graves) exécution de la phrase placée entre les accents graves; délivre la sortie
standard des commandes situées dans ce parenthésage. Les caractères spéciaux à l’intérieur du
parenthésage ne sont interprétés qu’à l’exécution de la phrase.
Le rôle des parenthésages par ’ et " est d’éviter une utilisation fastidieuse du
caractère \ quand il faut banaliser plusieurs caractères spéciaux dans une
commande. Bien entendu, on ne peut pas banaliser le caractère quote dans un
parenthésage quote, ni le caractère guillemet dans un parenthésage guillemet.
SOUS-PROGRAMMES
Procédure
Un texte écrit en shell et stocké dans un fichier constitue une procédure shell.
Dans le texte, les paramètres formels ont pour noms 1, 2...9 et leurs valeurs sont désignées par
$1,..., $9.
L’activation de la procédure peut se faire en exécutant la commande sh suivie du nom du fichier
(avec certaines options si l’on veut) ou en rendant le fichier exécutable ce qui fabrique une
nouvelle commande appelée sous-programme shell.
Fonction
Une fonction est un sous-programme local à un processus shell.
Elle n’est pas exécutée par un nouveau processus shell et n’est pas stockée seule dans un fichier.
Elle se déclare, un peu comme en C, dans le programme qui l’utilise :
nom()
{
corps de la fonction
}
SOUS-PROGRAMMES
Les parenthèses ne servent qu’à distinguer le nom d’une fonction du nom d’une
variable.
Exemple:
L’exemple suivant reprend l’écriture d’un programme shell utilisant 3 fonctions (menu, erreur et
traitement) appelées par un programme principal.(sélection if). Ce programme réclame un
paramètre, et seulement un, et celui-ci doit être obligatoirement un fichier ordinaire. Le
programme principal effectue ces vérifications, appelle menu et traitement si c.est correct
sinon lance erreur qui affiche le message correspondant à l.erreur faite.
Processus exécutant
Après avoir effectué les éventuelles substitutions de paramètres,
le shell traite les redirections,
puis examine le premier mot de la commande.
S’il est suivi d’un signe = cela signifie que c’est une affectation de
variable.
S’il correspond à une commande interne, à une commande structurée
(for, if...) ou à une activation de fonction, la commande est exécutée
dans le processus shell en cours.
Dans le cas contraire, il y a création d’un nouveau processus auquel
est passée en paramètre la commande.
Les règles de recherche des commandes sont fixées par la variable
PATH qui est initialisée à la connexion.
Paramètres de la commande sh
Lorsqu’un processus est créé par la commande sh, plusieurs
options définissant le mode d’exécution peuvent être indiquées.
Les plus utiles sont :
-v imprime les lignes telles qu’elles sont lues par le processus
shell
-x imprime les commandes telles qu’elles sont exécutées, après
les substitutions de paramètres.
Elles sont très intéressantes pour détecter d’éventuelles erreurs
de syntaxe. On les utilise de la manière suivante : sh -v proc.
On peut aussi les inclure dans un fichier shell en écrivant dans
la procédure : set -v ou set -x