1 Programmation système & Réseaux Philippe Lahire Université de Nice Sophia-Antipolis Septembre 2015 3 ème année Licence MIAGE Version septembre 2015 N°2 Organisation du cours Planning : Cours: 12 séances (1h30) TP: 12 séances (1h30) Contrôle continu : TP: deux à trois TP notés un ou deux contrôles courts + contrôle terminal (1h30) Note complémentaire : Le travail : Motivation, Compréhension, Progression,… La tenue : Assiduité, Respect,… Matériel : PC sous linux
77
Embed
Programmation système & Réseauxdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/... · 1 Programmation système & Réseaux Philippe Lahire Université de Nice Sophia-Antipolis
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
Programmation système &
Réseaux
Philippe Lahire
Université de Nice Sophia-Antipolis
Septembre 2015
3ème année Licence MIAGE
Version septembre 2015 N°2
Organisation du cours
Planning :
Cours: 12 séances (1h30)
TP: 12 séances (1h30)
Contrôle continu :
TP: deux à trois TP notés
un ou deux contrôles courts + contrôle terminal (1h30)
Note complémentaire :
Le travail : Motivation, Compréhension, Progression,…
La tenue : Assiduité, Respect,…
Matériel : PC sous linux
2
Version septembre 2015 N°3
Programme
Système de Fichiers
Entrée-sortie + API (read, write…)
Notion de processus + API (fork, exec…)
Tubes + API (pipe)
Signaux + API (signal, sigaction, kill…)
Langage : • principalement C
Version septembre 2015 N°4
Organisation des enseignements
cours Semaine/date TP
1 Introduction + Entrées-Sorties 37/10.09
2 Introduction + Entrées-Sorties 37/10.09
3 Systèmes de Fichiers 38/17.09 TP N°1 : E/S (1h30)
Mise à jour des tables internes (processus + noyau)
fd est une entrée dans la TDF :
open, fork, voie standard…
Fermeture par le noyau des fichiers à la terminaison d’un
processus (exit(?))
Descripteur de fichier
Version septembre 2015 N°71
Fermeture d'un fichier
Processus 2#include <unistd.h> int main () {
int rfd, wfd;/* Ouverture et utilisation */ ... close (rfd); /* exit: fermeture implicite */ close (wfd); /* exit: fermeture implicite */
}Tables fichiers/inodes
Décrémentations compteurs
Désallocations éléments
Libération complète si le compteur atteint 0
Commande(s) associée(s): exit, éditeur…
Structure(s) interne(s): tables, buffers
28
Version septembre 2015 N°72
Fermeture d'un fichier: Vision interne
Table fichiersEspace utilisateur Table inodes
Pro
cess
us
P2 0
12
345
…
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
O_RDONLY
1
…
Position :État :Nombre :
O_RDWR
1…
Position :État :Nombre :
O_WRONLY
1
/etc/bashrc
N° inode :Nb. copies :Inode Infos …
12
Position :État :Nombre :
1
O_RDONLYN° inode :Nb. copies :Inode Infos …
/.bash_profile
1
…
N° inode :Nb. copies :Inode Infos …
1/.bashrc
…
Position :État :Nombre :
O_WRONLY
1
3
null
null
Version septembre 2015 N°73
Lecture d’un fichier: read
Mise à jour des tables internes (noyau)
fd est une entrée dans la TDF ouverte en lecture :
open, fork, voie standard…
Allocation de buffer impérative
Nb octets lus ≤ Nb octets à lire (EOF, périphérique,…)
Début = position du curseur Après = position + nb oct.lus
Descripteur fichier
Lieu de stockage données lues
Nombre octets à lire
Nombre octets lus
29
Version septembre 2015 N°74
Lecture d'un fichier
Processus 1#include <sys/types.h> #include <unistd.h> int main () {
int rfd, nb; char tabp[30]; char tabg[1024];/* Ouverture rfd */ ... nb = read (rfd, tabp, 30); nb = read (rfd, tabg, 1024);nb = read (rfd, tabp, 20);
}
Lecture à travers une même entrée
Commande(s) associée(s): cat, more, emacs, ...
Structure(s) interne(s): tables, blocs, buffers
Version septembre 2015 N°75
Lecture d'un fichier: Commentaires
Verrouillage/partage
Durée d'un read
Verrouillage explicite possible
Schéma lecteur/écrivain possible
Plusieurs descripteurs possibles
Lecture réelle
Attention: Lecture bloc par bloc
Bloc dans le "buffer cache" ou sur le disque?
Lecture anticipée
30
Version septembre 2015 N°76
Lecture d'un fichier
Processus 1#include <sys/types.h> #include <unistd.h> int main () {
int rfd1, rfd2, nb;char tab1[30], tab2[30];/* Ouverture rfd1, rfd2 */ ... nb = read (rfd1, tab1, 30); nb = read (rfd2, tab2, 30);
}
Lecture à travers plusieurs entrées – attentionIci: 2 descripteurs indépendance
fork: "2" descripteurs dépendance
Version septembre 2015 N°77
Lecture d’un fichier (2)
31
Version septembre 2015 N°78
Mise à jour des tables internes (noyau)
fd est une entrée dans la TDF ouverte en écriture :open, fork, voie standard…
Nb octets écrits ≤ Nb octets à écrire EOF, périphérique (imprimante, réseau…), signal, média/quota plein
Début = position du curseur
Après = position + nb octets écrits
Ecriture dans un fichier: write
Descripteur fichier
Données à écrire
Nombre octets à écrire
Nombre octets écrits
Version septembre 2015 N°79
Ecriture dans un fichier
Processus 1#include <sys/types.h> #include <unistd.h> int main () {
int wfd, nb;char tab[30];/* Ouverture wfd */ /* Remplissage de tab */ ... nb = write (wfd, tab, 30); /* Remplissage à partir de tab */ ... nb = write (wfd, tab, 30);
}
Commande(s) associée(s): cat, emacs, …
Structure(s) interne(s): Tables, blocs, buffer
32
Version septembre 2015 N°80
Ecriture dans un fichier (2)
Version septembre 2015 N°81
Ecriture d'un fichier: commentaires
Verrouillage/partage
Durée d'un write
Verrouillage explicite possible
Schéma lecteur/écrivain possible
Plusieurs descripteurs possibles
Ecriture réelle
Allocation de blocs par nécessité (indirect, données)
Ecriture partielle Lecture du bloc
Ecriture différée des blocs: "buffer cache"
33
Version septembre 2015 N°82
Positionnement dans un fichier: lseek
Mise à jour des tables internes (noyau)
fd est une entrée dans la TDF ouverte en écriture :
open, fork, voie standard…
Retour = position par rapport au début du fichier
Référentiel = SEEK_SET, SEEK_CUR, SEEK_END
déplacement positif/négatif
avant (resp. après) le début (resp. fin)
Descripteur fichier
Référentiel
déplacement
position
Entier 64 bits
Version septembre 2015 N°83
Positionnement : commentaires
Référentiel :
SEEK_SET : par rapport au début
SEEK_CUR: par rapport au curseur
SEEK_END :par rapport à la fin
Comment connaitre la position courante?
On peut se positionner après la fin
Toute écriture crée des trous
La lecture de trous rend des octets nuls
Une position négative est souvent une erreur
34
Version septembre 2015 N°84
Positionnement dans un fichier
#include <sys/types.h>#include <unistd.h>int main () {
mount -t ext2 -o nodev,nosuid,noexec /dev/sda3 /usr
Automatisation
Fichiers: /etc/fstab
/etc/init.d/* …
43
Version septembre 2015 N°105
Le super-bloc
Gestion des blocs
Nombre blocs libres
« Liste » blocs libres
Bitmap blocs libre/occ.
Gestion des inodes
Nombre total inodes
Compteur inodes libres
« Liste » inodes libres
Bitmap inode libre/occupé
Gestion globale
Taille système fichiers
Indicateur de modification
Duplication dans les groupes
Super-bloc … … 1 b
Gr. Blocs 0
…Descr. De gr. n b
… 1 bBitm. blocsBitm. inodes 1 b…
n bTab. inodes …
Blocs Fichiers
Blocs libres
n bTab. blocs
…
Gr. Blocs n
Version septembre 2015 N°106
Maintien de la cohérence FSCK 1/2
Qui ?: L'administrateur
Pourquoi ?: Synchronisation (sync)
Blocs: cache buffer disque
Inode: Copie en mémoire disque
Super-bloc: Copie en mémoire disque
Quand ?:
Réparation: Crash, Coupure alimentation
Prévention: Au reboot
Réparation: Attention aux pertes de données !!
44
Version septembre 2015 N°107
Maintien de la cohérence FSCK 2/2
Objectifs: Vérifications, réparations
Blocs:
Appartenances à plusieurs inodes
Non référencés
Inodes:
Tailles fichier/répertoire incohérentes
Nombres de liens incorrects
Mauvais formats
Non référencés
Super-bloc:
Plus de blocs que possible
Mauvais format de la liste des blocs libres
Total des blocs/inodes libres incohérents
Blocs libres manquants
Version septembre 2015 N°108
Montage/démontage et structures
internes
Table inodesTable volumes
…
…
N° inode :Nb. copies :Inode Infos …
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
N° inode :Nb. copies :Inode Infos …
…
SuperBloc :Inode cible :Inode à monter :Syst. Fichier :
…
SuperBloc :Inode cible :Inode à monter :Syst. Fichier :
…
mount
/dev/sda3
/
-t ext2
… copie mémoire
mount
/dev/sda7
/usr
-t ext2
45
Version septembre 2015 N°109
Principales arborescences 1/2
Répertoire Description
/bin Binaires
/dev Périphériques
/etc Fichiers de configuration
/lib Bibliothèques de base
/tmp Fichiers temporaires
/mnt Montages nfs
/var Fichiers de log, mail, impression, …
/home Répertoires utilisateurs
Version septembre 2015 N°110
Principales arborescences 2/2
Répertoire Description
/usr/X11R6 Noyau X Window
/usr/bin Binaires autres paquetages
/usr/include En-têtes
/usr/lib Bibliothèques autres paquetages
/usr/man Manuels en ligne
/usr/src Source noyau, …
/usr/local Installation locales au site
/usr/share Fichiers paquetages de l'instal.
/usr/sbin Binaires administration
46
Version septembre 2015 N°111
Filesystem Hierarchy Standard (2004)
Bin : Essential command binaries
Boot : Static files of the boot loader
dev : Device files
etc : Host-specific system configuration
lib : Essential shared libraries and kernel modules
media : Mount point for removeable media
mnt : Mount point for mounting a filesystem temporarily
opt : Add-on application software packages
sbin : Essential system binaries
srv : Data for services provided by this system
tmp : Temporary files
usr : Secondary hierarchy
var : Variable data
Root filesystem
Uniformisation des distributions
(extrait)
Version septembre 2015 N°112
Organisation logique: la réalité
Une forêt de liens
Un nom = un lien
Liens:
Entre père et fils
Entre frères
Mise en oeuvre
Commandes associées: ln et unlink
Liens: dur et symboliques
Par rapport aux inodes:
lien en dur [N:1] un inode
lien symbolique [1:1] un inode
47
Version septembre 2015 N°113
Organisation logique: la réalité
etud
shared
home
etud2
/
etud1
oracle
etud1
usr
.profile
.profile
Gprofile
etud2
Lien en dur
Lien symbolique
Lien en dur
Même partition
Un seul fichier
Lien symbolique
≈Raccourci
Pas de vérification
Version septembre 2015 N°114
Protections: groupes / utilisateurs
Principaux éléments
Grain: le fichier
Opérations:
lecture, écriture,
exécution/traversée
Objet: utilisateur, groupe, autres
Ne pas confondre:
Groupe de l'utilisateur et groupe d'un fichier
Fichier /etc/group
Commande newgrp (processus)
Commande chgrp (fichier)
Liens symbolique / physique
48
Version septembre 2015 N°115
Protections: de fichier/répertoire
Les fichiers r: permission de lire le fichier
w: permission d’écrire le fichier, i.e. ajouter, supprimer ou modifier les données qu’il contient
x: permission d’exécuter le fichier
Les répertoires r: permission de lire, donc de lister le répertoire mais pas forcément d’en lire les fichiers…
w: permission d’écrire dans le répertoire et donc de supprimer les fichiers qu’il contient
x: permission de traverser le répertoire. Sans cette permission, toute opération est interdite. Cette interdiction est héritée par tous les fichiers et répertoires qu’il contient
“Un fichier est protégé contre une modification par ses propres permissions, et contre la suppression par les permissions du répertoire qui le contient.“
u g o
Version septembre 2015 N°116
Protections:
exemple
rwxrwxrwx REP-1
rwxrwxrwx
rwxrwxrwx
rwxrwxrwxrwxrwxrwx
rwxr-xr--
REP-2 REP-3
FIC-1
rwxrwxrwx
REP-5
REP-4
LIEN-1
REP-6
FIC-2
rwxr-----
r-xr-xr-x
PL,PROF PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
Utilisateurs: RC, PROF / JPP, ETUD1
Commandes: ls, cd, touch
REP-1/REP-2/REP-4/REP-6
REP-1/REP-3/REP-5/LIEN-1
REP-1/REP-2/REP-4/REP-6
LIEN-1 =
Les droits qui comptent(voir chmod)
49
Version septembre 2015 N°119
Structure générale d'un fichier
Qualités requises:
Evolution de la taille des fichiers
Accès efficace
Nombre de fichiers ?
Accès multi-processus
Accès multi-utilisateurs
Une structure interne
Des appels systèmes appropriés
Version septembre 2015 N°120
Structure générale d'une inode 1/2
Copie disque:
Propriétaire
Groupe propriétaire
Type fichier
Droits d'accès
Dates (accès, modification, inode)
Nombres de liens
Adresses disque (blocs)
Taille fichier
Référence ACL au fichier et répertoire
inode = anglais (i-noeud)
50
Version septembre 2015 N°121
Copie mémoire = Copie disque + …
Verrouillé ?
Processus en attente
Copie et image disque différentes
Périphérique logique
Numéro inode
Pointeurs inodes (une par liste)
liste des inodes libres
liste des inodes (adressage calculé)
Nombre copies actives
Structure générale d'une inode 2/2
Copie disque
du super bloc
Version septembre 2015 N°122
Inode de fichier/répertoire
5007105
ordinairerwxr-xr--
19/10/200510/10/200512/10/2005
5
653450 1 … 10
conte
nu aaaaaaaaaaabbbbbcccccc
ddddddddddd
5007105
répertoirerwxr-xr--
19/10/200510/10/200512/10/2005
3
3450 1 … 10
conte
nu N° Nom
Un format
ls, cd, …
UIDGID
Type fichierProtectionsDate lecture
Date modificationDate inode
Nombre liensContenu
Taille
51
Version septembre 2015 N°123
Arborescence et inodes
2010 .8010 ..1003 D1
2010
1003 .2010 ..1067 D25790 F1
1003
…
1067 .1003 ..1
067
aaaaaaaaaaaccccccc
bbbbbbbbbbbbbbbb5790
Infos inode
Infos inode
Infos inodeInfos inode
Version septembre 2015 N°124
Organisation physique
Taille max (blocs) =
10 + 256 + 2562 + 2563
ls –il
.
...
.
.
...
.
.
...
.......
...
.
.
...
.
0
1
2
3
4
5
6
7
8
9
simple
double
triple
Blocs de donnees
Taille max (blocs) =
10 +
256 +
2562 +
2563
52
Version septembre 2015 N°125
Organisation physique:
Comprendre les choix
Choix d'organisationsBlocs contiguës
Table des blocs
Compactage, nettoyage
Taille de blocs
Accès indirect
Répertoire / fichier
ConséquencesFragmentation
Efficacité (espace / temps)
Limite des fichiers
Version septembre 2015 N°126
Nom attribut
st_mode
st_ino
st_dev
st_nlink
st_uid
st_gid
st_size
st_atime
st_mtime
st_ctime
Description
Mot = bits de protection
Identif. Fich.: num. i-node
Périphérique du fichier
Nombre de liens
Ident. utilisateur
Ident. groupe
Taille en octets
Date dern. accès lecture
Date dern. accès écriture
Date dern. modification
Information sur fichiers: norme POSIX
53
Version septembre 2015 N°127
Accès aux fichiers: norme POSIX
Routine
fd = creat (nom,mode)
fd = open (fichier,mode)
e = close (fd)
n = read (fd,buff,nb)
n = write (fd,buff,nb)
p = lseek (fd,dep,deb)
e = stat (nom,&buff)
fd = mkdir (nom,mode)
e = rmdir (nom)
e = link (nom1,nom2)
e = unlink (nom)
e = chdir (nom_rep)
e = chmod (nom,mode)
Description
création nouveau fichier
ouverture fichier lecture/ecriture
fermeture fichier ouvert
lecture fichier --> tampon
écriture tampon --> fichier
déplacement dans fichier
récupération info. fichiers
création répertoire
suppression répertoire
création nouvelle Entrée
suppression Entrée
changement répertoire de Travail
modification protection de fichier
Version septembre 2015 N°128
Contenu inode: stat, fstat, lstat
lstat: informations sur le lien symbolique lui-même
fstat: accès direct par le descripteur ce fichier
lstat accès par le nom de fichier
Mise à jour des tables internes (noyau)
Descripteur fichier
Nom fichier
Informationsinode
54
Version septembre 2015 N°129
Informations sur un fichier
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main () {
int fd, e;struct stat buf;... e = stat ("/etc/passwd",&buf);/* autre possibilité */fd = open ("/etc/passwd", ...);e = fstat (fd, &buf);printf ("Nombre liens: %d", buf.st_nlink);
}
Macros POSIX: S_ISREG(m), S_ISDIR(m), I_SRWXU
Commande(s) associée(s): ls
Structure(s) interne(s): inode
Version septembre 2015 N°130
stat, fstat, lstat (compléments)
Protections + type de fichiers
Numéro dans /etc/group
Numéro dans /etc/passwd
Taille en octets
Dates : modification Inode, accès et modifications du
contenu
N° inode sur disque
Nombre liens en dur
+ st_dev et r_dev : majeur/mineur+ st_blksize et st_blocks