This commit is contained in:
parent
8c3ea223e5
commit
25aef1af17
54 changed files with 123 additions and 122 deletions
|
|
@ -31,7 +31,7 @@ combinaison de chaque couche.
|
|||
|
||||
### Historique
|
||||
|
||||
Les premières implémentations de ce type de systèmes de fichiers est apparu
|
||||
Les premières implémentations de ce type de systèmes de fichiers sont apparues
|
||||
avec les LiveCD : on disposait d'une distribution Linux complètement
|
||||
opérationnelle sur un support en lecture seule, mais on pouvait dédier un
|
||||
espace de stockage sur son disque dur (ou en RAM, au travers d'un `tmpfs`) pour
|
||||
|
|
@ -42,7 +42,7 @@ Historiquement, le noyau Linux devait être *patché* pour supporter ce type de
|
|||
système de fichiers (que ce soit `unionfs` ou `aufs`, les deux principaux
|
||||
*patch* apportant cette fonctionnalité). Les systèmes BSD disposent d'une
|
||||
implémentation depuis au moins 1995 et c'est SunOS qui fut le premier OS à
|
||||
développer cette technique dès 1986 (pour un système de fichier appelé
|
||||
développer cette technique dès 1986 (pour un système de fichiers appelé
|
||||
*Translucent File Service*). Pour Linux, il aura fallu attendre 2014 pour voir
|
||||
l'arrivée du système de fichier OverlayFS dans un noyau sans *patch*.
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ processus se fait en fonction des *flags* qui sont passés. On retrouve donc :
|
|||
Le nom du *flag* `CLONE_NEWNS` est historique et assez peu explicite
|
||||
contrairement aux autres : il désigne en fait l'espace de nom `mount`.
|
||||
|
||||
Au départ, les *namespace*s ont étés pensés pour former un tout : une couche
|
||||
Au départ, les *namespace*s ont été pensés pour former un tout : une couche
|
||||
d'isolation complète pour les processus. Mais lors des développements suivants,
|
||||
il s'est avéré pratique de pouvoir choisir finement de quels aspects on
|
||||
souhaitait se dissocier.
|
||||
|
|
@ -108,7 +108,7 @@ semblable à :
|
|||
#define STACKSIZE (1024 * 1024)
|
||||
static char child_stack[STACKSIZE];
|
||||
|
||||
int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD;
|
||||
int clone_flags = CLONE_NEWCGROUP | CLONE_NEWNET | SIGCHLD;
|
||||
|
||||
pid_t pid = clone(do_execvp, // First function executed by child
|
||||
child_stack + STACKSIZE, // Assume stack grows downward
|
||||
|
|
@ -155,7 +155,7 @@ extensions GNU :
|
|||
\
|
||||
|
||||
Lorsque l'on crée un nouveau processus, on ajoute l'option `SIGCHLD` afin
|
||||
d'être notifié par signal lorsque notre processus fil a terminé son
|
||||
d'être notifié par signal lorsque notre processus fils a terminé son
|
||||
exécution. Cela permet d'être réveillé de notre `wait(2)`.
|
||||
|
||||
:::::
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ processus est rendu orphelin dans ce *namespace*, il devient un fils de ce
|
|||
processus, et non un fils de l'`init` de l'arbre global.
|
||||
|
||||
|
||||
#### L'espace de nom `network` {.unnumbered}
|
||||
#### L'espace de noms `network` {.unnumbered}
|
||||
|
||||
Depuis Linux 2.6.29.
|
||||
|
||||
|
|
@ -149,9 +149,9 @@ Lorsque l'on souhaite mesurer un écoulement de temps, la méthode naïve consis
|
|||
soustraction avec l'heure de fin. Cette technique fonctionne bien, à partir du
|
||||
moment où l'on est sûr que l'horloge ne remontera pas dans le temps, parce
|
||||
qu'elle se synchronise ou que le changement d'heure été/hiver
|
||||
intervient, ... Pour palier ces situations imprévisibles, le noyau expose une
|
||||
intervient, ... Pour pallier ces situations imprévisibles, le noyau expose une
|
||||
horloge dite monotone (`CLOCK_MONOTONIC`) : cette horloge démarre à un entier
|
||||
abstrait et s'incrèmente chaque seconde qui passe, sans jamais sauter de
|
||||
abstrait et s'incrémente chaque seconde qui passe, sans jamais sauter de
|
||||
secondes, ni revenir en arrière. C'est une horloge fiable pour calculer des
|
||||
intervalles de temps.
|
||||
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@ abstract: |
|
|||
Le but de cette seconde partie sur les mécanismes internes du noyau
|
||||
va nous permettre d'utiliser les commandes et les appels système
|
||||
relatifs aux espaces de noms du noyau Linux ainsi que d'appréhender
|
||||
la complexité des sytèmes de fichiers.
|
||||
la complexité des systèmes de fichiers.
|
||||
...
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ Cette commande nous dévoile déjà de nombreuses choses :
|
|||
contenerisé » (dans un *namespace*). Le processus initial de la machine se
|
||||
retrouve donc dans des espaces de nom, tout comme les processus d'un conteneur.
|
||||
|
||||
- On aperçoit un genre de hiérarchie dans certain cas.
|
||||
- On aperçoit un genre de hiérarchie dans certains cas.
|
||||
|
||||
- La première colonne nous renseigne sur l'identifiant du *namespace*.
|
||||
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ esclave ne propagera pas ses nouveaux points de montage à son *maître*.
|
|||
<div lang="en-US">
|
||||
```bash
|
||||
# Suite de l'exemple précédent
|
||||
cd /mnt/test-slave
|
||||
mkdir /mnt/test-slave
|
||||
|
||||
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
|
||||
mount --bind /mnt/test-shared /mnt/test-slave
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ l'autre.
|
|||
:::::
|
||||
|
||||
Afin d'amener du réseau à notre nouvel espace de nom, il va falloir lui
|
||||
attribuer des interface. En fait, nous allons pouvoir déplacer nos interfaces
|
||||
attribuer des interfaces. En fait, nous allons pouvoir déplacer nos interfaces
|
||||
réseaux, dans le *namespace* vers lequel elle doit être accessible. Une
|
||||
interface donnée ne peut se trouver que dans un seul *namespace* à la fois.
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ foo virli
|
|||
</div>
|
||||
|
||||
Les fichiers utilisés par `ip netns` ne sont donc rien de plus que des
|
||||
*bind-mount*. Ce qui explique qu'ils soient persistant même sans processus
|
||||
*bind-mount*. Ce qui explique qu'ils soient persistants même sans processus
|
||||
s'exécutant à l'intérieur.
|
||||
|
||||
:::::
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ donc été alloué à un processus d'initialisation de `bash`, qui s'est termin
|
|||
depuis.\
|
||||
|
||||
Le comportement du noyau, lorsque le PID 1 se termine, est de lancer un *kernel
|
||||
panic* (car c'est un processus indispensable, notamment de part son rôle de
|
||||
panic* (car c'est un processus indispensable, notamment de par son rôle de
|
||||
parent pour tous les processus orphelin). Au sein d'un *namespace* `PID` qui
|
||||
n'est pas le *namespace* racine, le noyau appelle la fonction
|
||||
`disable_pid_allocation` qui retire le *flag* `PIDNS_HASH_ADDING` de l'espace
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ Vous allez continuer aujourd'hui le projet qui s'étendra depuis le TP précéde
|
|||
et qui consistera à réaliser la partie d'isolation de la moulinette des ACUs !
|
||||
|
||||
Cette semaine, il faudra faire en sorte de restreindre un groupe de processus
|
||||
pour qu'il s'exécute indépendemment de votre système.
|
||||
pour qu'il s'exécute indépendamment de votre système.
|
||||
|
||||
Il n'y a pas de restriction sur le langage utilisé, vous pouvez tout aussi bien
|
||||
utiliser du C, du C++, du Python, du shell, etc.
|
||||
|
|
|
|||
|
|
@ -62,4 +62,4 @@ sur `rendu4`, ... ce qui vous permet d'avoir une arborescence
|
|||
correspondant à ce qui est demandé, sans pour autant perdre votre
|
||||
travail (ou le rendre plus difficile d'accès).
|
||||
|
||||
::::
|
||||
:::::
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ main(int argc, char *argv[])
|
|||
Ce programme prend au minimum deux arguments :
|
||||
- le chemin d'un fichier d'espace de nom que l'on souhaite rejoindre (le chemin
|
||||
vers le lien symbolique donc) ;
|
||||
- le programme (et ses arguments) que l'on souhaite souhaite exécuter une fois
|
||||
- le programme (et ses arguments) que l'on souhaite exécuter une fois
|
||||
que l'on a rejoint l'espace de noms ciblé.
|
||||
|
||||
Dans un premier temps, on ouvre le fichier passé en paramètre afin d'obtenir un
|
||||
|
|
|
|||
|
|
@ -14,6 +14,6 @@ abstract: |
|
|||
|
||||
Les exercices de ce cours sont à rendre au plus tard le mardi 15
|
||||
novembre 2022 à 23 h 42. Consultez les sections matérialisées par un
|
||||
bandeau jaunes et un engrenage pour plus d'informations sur les
|
||||
bandeau jaune et un engrenage pour plus d'informations sur les
|
||||
éléments à rendre.
|
||||
...
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue