tutorials: improve theme + use pandoc 2
This commit is contained in:
parent
de21be218a
commit
d25af4fdb2
65 changed files with 1283 additions and 1294 deletions
|
|
@ -1,18 +1,6 @@
|
||||||
|
include ../pandoc-opts.mk
|
||||||
|
|
||||||
SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md oom.md seccomp.md project-intro.md project-body.md project-rendu.md
|
SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md oom.md seccomp.md project-intro.md project-body.md project-rendu.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
|
||||||
--standalone \
|
|
||||||
--normalize \
|
|
||||||
--number-sections \
|
|
||||||
--smart \
|
|
||||||
-M lang=fr-FR \
|
|
||||||
-M fontsize=12pt \
|
|
||||||
-M papersize=a4paper \
|
|
||||||
-M mainfont="Linux Libertine O" \
|
|
||||||
-M monofont="FantasqueSansMono-Regular" \
|
|
||||||
-M sansfont="Linux Biolinum O" \
|
|
||||||
-M colorlinks=true \
|
|
||||||
-M linkcolor="black" \
|
|
||||||
--include-in-header=../header.tex
|
|
||||||
|
|
||||||
|
|
||||||
all: tutorial.pdf
|
all: tutorial.pdf
|
||||||
|
|
|
||||||
|
|
@ -78,25 +78,25 @@ Sous Linux, les attributs sont regroupés dans des espaces de noms :
|
||||||
Par exemple, on peut définir un attribut sur un fichier comme cela :
|
Par exemple, on peut définir un attribut sur un fichier comme cela :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ echo 'Hello World!' > toto
|
42sh$ echo 'Hello World!' > toto
|
||||||
42sh$ setfattr -n user.foo -v bar toto
|
42sh$ setfattr -n user.foo -v bar toto
|
||||||
42sh$ getfattr -d toto
|
42sh$ getfattr -d toto
|
||||||
# file: toto
|
# file: toto
|
||||||
user.foo="bar"
|
user.foo="bar"
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Encore plus fort, vous pouvez utiliser les ACL POSIX :
|
Encore plus fort, vous pouvez utiliser les ACL POSIX :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ sudo chown root:root toto && sudo chmod o-r toto
|
42sh$ sudo chown root:root toto && sudo chmod o-r toto
|
||||||
42sh$ cat toto
|
42sh$ cat toto
|
||||||
cat: toto: Permission denied
|
cat: toto: Permission denied
|
||||||
42sh$ sudo setfattr -m u:$USER:r toto
|
42sh$ sudo setfattr -m u:$USER:r toto
|
||||||
42sh$ cat toto
|
42sh$ cat toto
|
||||||
Hello World!
|
Hello World!
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -106,10 +106,10 @@ les ACL POSIX vous autorisent à le lire.
|
||||||
Vous pouvez voir ces attributs avec la commande :
|
Vous pouvez voir ces attributs avec la commande :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ getfattr -d -m "^system" toto
|
42sh$ getfattr -d -m "^system" toto
|
||||||
# file: toto
|
# file: toto
|
||||||
system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8=
|
system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8=
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -126,19 +126,19 @@ l'utilisation de cet attribut auquel on accroîtrait l'ensemble des
|
||||||
Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
|
Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ getfattr -d -m "^security" $(which ping)
|
42sh$ getfattr -d -m "^security" $(which ping)
|
||||||
# file: bin/ping
|
# file: bin/ping
|
||||||
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
|
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Ou, dans sa version plus lisible :
|
Ou, dans sa version plus lisible :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ getcap $(which ping)
|
42sh$ getcap $(which ping)
|
||||||
/bin/ping = cap_net_raw+ep
|
/bin/ping = cap_net_raw+ep
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -149,39 +149,39 @@ Ou, dans sa version plus lisible :
|
||||||
d'un processus :
|
d'un processus :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ ./view_caps 1
|
42sh$ ./view_caps 1
|
||||||
cap_user_header_t
|
cap_user_header_t
|
||||||
-----------------
|
-----------------
|
||||||
Version: 20080522
|
Version: 20080522
|
||||||
PID: 1
|
PID: 1
|
||||||
|
|
||||||
cap_user_data_t
|
cap_user_data_t
|
||||||
---------------
|
---------------
|
||||||
effective: 0x3fffffffff
|
effective: 0x3fffffffff
|
||||||
CAP_AUDIT_CONTROL
|
CAP_AUDIT_CONTROL
|
||||||
CAP_AUDIT_READ
|
CAP_AUDIT_READ
|
||||||
[...]
|
[...]
|
||||||
CAP_SYS_TIME
|
CAP_SYS_TIME
|
||||||
CAP_SYS_TTY_CONFIG
|
CAP_SYS_TTY_CONFIG
|
||||||
CAP_SYSLOG
|
CAP_SYSLOG
|
||||||
CAP_WAKE_ALARM
|
CAP_WAKE_ALARM
|
||||||
permitted: 0x3fffffffff
|
permitted: 0x3fffffffff
|
||||||
CAP_AUDIT_CONTROL
|
CAP_AUDIT_CONTROL
|
||||||
CAP_AUDIT_READ
|
CAP_AUDIT_READ
|
||||||
[...]
|
[...]
|
||||||
CAP_SYS_TIME
|
CAP_SYS_TIME
|
||||||
CAP_SYS_TTY_CONFIG
|
CAP_SYS_TTY_CONFIG
|
||||||
CAP_SYSLOG
|
CAP_SYSLOG
|
||||||
CAP_WAKE_ALARM
|
CAP_WAKE_ALARM
|
||||||
inheritable: 0x0
|
inheritable: 0x0
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Astuces : `capget(2)`, X-macros, ...
|
Astuces : `capget(2)`, X-macros, ...
|
||||||
|
|
||||||
|
|
||||||
## Pour aller plus loin
|
## Pour aller plus loin {-}
|
||||||
|
|
||||||
Je vous recommande la lecture des *man* suivants :
|
Je vous recommande la lecture des *man* suivants :
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@ pas de dossier `freezer` ou si celui-ci est vide, montez-le en suivant la
|
||||||
procédure suivante :
|
procédure suivante :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
mkdir /sys/fs/cgroup/freezer/
|
mkdir /sys/fs/cgroup/freezer/
|
||||||
mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/
|
mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -42,9 +42,9 @@ Pour ce faire, il suffit de créer un nouveau dossier dans un groupe existant,
|
||||||
par exemple la racine :
|
par exemple la racine :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
mkdir /sys/fs/cgroup/freezer/virli/
|
mkdir /sys/fs/cgroup/freezer/virli/
|
||||||
ls /sys/fs/cgroup/freezer/virli/
|
ls /sys/fs/cgroup/freezer/virli/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -64,8 +64,8 @@ La liste des processus rattachés à un *cgroup* se trouve dans le fichier `task
|
||||||
du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière :
|
du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
echo $PID > /sys/fs/cgroup/freezer/virli/tasks
|
echo $PID > /sys/fs/cgroup/freezer/virli/tasks
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -102,8 +102,8 @@ Faisons exécuter à notre interpréteur une commande pour voir effectivement
|
||||||
l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez :
|
l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
|
for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -111,8 +111,8 @@ Maintenant, nous avons donné l'ordre au noyau de ne plus allouer de temps de
|
||||||
calcul à notre shell et ses fils :
|
calcul à notre shell et ses fils :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state
|
echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -120,8 +120,8 @@ calcul à notre shell et ses fils :
|
||||||
l'exécution :
|
l'exécution :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state
|
echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -138,8 +138,8 @@ Commençons par lancer le conteneur Docker d'InfluxDB (pour éviter de
|
||||||
l'installer sur notre machine) :
|
l'installer sur notre machine) :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
docker container run --name mytsdb -d -p 8086:8086 influxdb
|
docker container run --name mytsdb -d -p 8086:8086 influxdb
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -148,11 +148,11 @@ métriques. Voici comment on s'était débrouillé dans un précédent TP pour
|
||||||
interagir avec InfluxDB :
|
interagir avec InfluxDB :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
docker container exec -i mytsdb influxdb <<EOF
|
docker container exec -i mytsdb influxdb <<EOF
|
||||||
CREATE DATABASE metrics;
|
CREATE DATABASE metrics;
|
||||||
SHOW DATABASES;
|
SHOW DATABASES;
|
||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -167,19 +167,21 @@ mémoire utilisée par le groupe monitoré.
|
||||||
Vous pouvez utiliser un programme comme `memhog` pour remplir rapidement votre
|
Vous pouvez utiliser un programme comme `memhog` pour remplir rapidement votre
|
||||||
mémoire.
|
mémoire.
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# mkdir /sys/fs/cgroup...
|
42sh# mkdir /sys/fs/cgroup...
|
||||||
42sh$ echo $$ | sudo tee /sys/fs/cgroup.../tasks
|
42sh$ echo $$ | sudo tee /sys/fs/cgroup.../tasks
|
||||||
42sh# ./monitor group_name memhog 500
|
42sh# ./monitor group_name memhog 500
|
||||||
~~~ 13595 ~~~ Current memory usage: 75194368/550502400 (13%)
|
~~~ 13595 ~~~ Current memory usage: 75194368/550502400 (13%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 150290432/550502400 (27%)
|
~~~ 13595 ~~~ Current memory usage: 150290432/550502400 (27%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 223690752/550502400 (40%)
|
~~~ 13595 ~~~ Current memory usage: 223690752/550502400 (40%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 296828928/550502400 (53%)
|
~~~ 13595 ~~~ Current memory usage: 296828928/550502400 (53%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 368001024/550502400 (66%)
|
~~~ 13595 ~~~ Current memory usage: 368001024/550502400 (66%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 438517760/550502400 (79%)
|
~~~ 13595 ~~~ Current memory usage: 438517760/550502400 (79%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 480329728/550502400 (87%)
|
~~~ 13595 ~~~ Current memory usage: 480329728/550502400 (87%)
|
||||||
~~~ 13595 ~~~ Current memory usage: 155648/550502400 (0%)
|
~~~ 13595 ~~~ Current memory usage: 155648/550502400 (0%)
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas
|
Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas
|
||||||
activé par défaut par votre système. Si vous êtes dans ce cas, essayez
|
activé par défaut par votre système. Si vous êtes dans ce cas, essayez
|
||||||
|
|
@ -192,9 +194,9 @@ Maintenant, envoyons nos données vers la base
|
||||||
<https://docs.influxdata.com/influxdb/v1.6/guides/writing_data/> :
|
<https://docs.influxdata.com/influxdb/v1.6/guides/writing_data/> :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \
|
curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \
|
||||||
"$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)"
|
"$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)"
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -203,7 +205,7 @@ requête suivante dans notre client `influx` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```sql
|
```sql
|
||||||
SELECT * from "$my_cgroup_name";
|
SELECT * from "$my_cgroup_name";
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -235,8 +237,8 @@ particuliers.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ sudo ./monitor_init my_cgroup_name
|
42sh$ sudo ./monitor_init my_cgroup_name
|
||||||
42sh$ ./monitor my_cgroup_name memhog 500
|
42sh$ ./monitor my_cgroup_name memhog 500
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -251,22 +253,24 @@ correspondant à une valeur limite, comme par exemple
|
||||||
`memory.max_usage_in_bytes`, qui limite le nombre d'octets que notre groupe de
|
`memory.max_usage_in_bytes`, qui limite le nombre d'octets que notre groupe de
|
||||||
processus va pouvoir allouer au maximum :
|
processus va pouvoir allouer au maximum :
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
|
||||||
0
|
|
||||||
# 0 = Aucune limite
|
|
||||||
42sh$ echo 4M > /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
|
||||||
# Maintenant, la limite est à 4MB, vérifions...
|
|
||||||
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
|
||||||
4194304
|
|
||||||
```
|
```
|
||||||
|
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
||||||
|
0
|
||||||
|
# 0 = Aucune limite
|
||||||
|
42sh$ echo 4M > /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
||||||
|
# Maintenant, la limite est à 4MB, vérifions...
|
||||||
|
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
||||||
|
4194304
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux
|
Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux
|
||||||
limiteurs, n'hésitez pas à consulter la documentation associée à chaque
|
limiteurs, n'hésitez pas à consulter la documentation associée à chaque
|
||||||
*cgroup*.
|
*cgroup*.
|
||||||
|
|
||||||
|
|
||||||
## Pour aller plus loin
|
## Pour aller plus loin {-}
|
||||||
|
|
||||||
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
||||||
Control groups](https://lwn.net/Articles/604609/) est excellente !
|
Control groups](https://lwn.net/Articles/604609/) est excellente !
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ Pour se créer un environnement afin de changer notre racine, il va falloir
|
||||||
commencer par créer le dossier de notre nouvelle racine :
|
commencer par créer le dossier de notre nouvelle racine :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mkdir newroot
|
mkdir newroot
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -26,12 +26,12 @@ Queques mots, pour commencer, à propos du projet Busybox : c'est un programme
|
||||||
*linké* statiquement, c'est-à-dire qu'il ne va pas chercher ni charger de
|
*linké* statiquement, c'est-à-dire qu'il ne va pas chercher ni charger de
|
||||||
bibliothèque dynamique à son lancement. Il se suffit donc à lui-même dans un
|
bibliothèque dynamique à son lancement. Il se suffit donc à lui-même dans un
|
||||||
*chroot*, car il n'a pas de dépendances. Nous pouvons donc tester notre
|
*chroot*, car il n'a pas de dépendances. Nous pouvons donc tester notre
|
||||||
première isolation :
|
première isolation\ :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
cp $(which busybox) newroot/
|
cp $(which busybox) newroot/
|
||||||
chroot newroot /busybox ash
|
chroot newroot /busybox ash
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -39,10 +39,10 @@ Jusque là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
|
||||||
`bash` :
|
`bash` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ cp $(which bash) newroot/
|
42sh$ cp $(which bash) newroot/
|
||||||
42sh# chroot newroot /bash
|
42sh# chroot newroot /bash
|
||||||
chroot: failed to run command ‘bash’: No such file or directory
|
chroot: failed to run command ‘bash’: No such file or directory
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -57,8 +57,8 @@ dossier correspond au point de montage de la nouvelle racine choisie par
|
||||||
l'utilisateur lors de l'installation) le système de base.
|
l'utilisateur lors de l'installation) le système de base.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
debootstrap jessie newroot/ http://httpredir.debian.org/debian/
|
debootstrap jessie newroot/ http://httpredir.debian.org/debian/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -68,12 +68,12 @@ l'utilisateur lors de l'installation) le système de base.
|
||||||
### *stage3*
|
### *stage3*
|
||||||
|
|
||||||
Les distributions *à l'ancienne* proposent encore de télécharger leur système
|
Les distributions *à l'ancienne* proposent encore de télécharger leur système
|
||||||
de base sous forme de tarball :
|
de base sous forme de tarball\ :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
wget http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20181021T214502Z.tar.xz
|
wget http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20181021T214502Z.tar.xz
|
||||||
tar xpf stage3-amd64-*.tar.xz -C newroot/
|
tar xpf stage3-amd64-*.tar.xz -C newroot/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -81,31 +81,31 @@ L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans
|
||||||
environnement qui tient dans 300 MB.
|
environnement qui tient dans 300 MB.
|
||||||
|
|
||||||
|
|
||||||
## Exercice
|
## Exercice {-}
|
||||||
|
|
||||||
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot`:
|
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
make escape
|
make escape
|
||||||
echo bar > ../foo
|
echo bar > ../foo
|
||||||
chroot .
|
chroot .
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
|
Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
cat ../foo
|
cat ../foo
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
|
Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
./escape
|
(chroot) 42sh# ./escape
|
||||||
cat /path/to/foo
|
bash# cat /path/to/foo
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,8 @@ disponibles sur la page d'accueil de <https://kernel.org>.
|
||||||
Dans les sources, on affiche la liste des options avec la commande :
|
Dans les sources, on affiche la liste des options avec la commande :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
make menuconfig
|
make menuconfig
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,13 @@ pour chaque exercice) :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
login_x-TP3/escape.c
|
login_x-TP3/escape.c
|
||||||
login_x-TP3/procinfo.sh
|
login_x-TP3/procinfo.sh
|
||||||
login_x-TP3/rev_kdb_leds.sh
|
login_x-TP3/rev_kdb_leds.sh
|
||||||
login_x-TP3/view_caps.c
|
login_x-TP3/view_caps.c
|
||||||
login_x-TP3/monitor.sh
|
login_x-TP3/monitor.sh
|
||||||
login_x-TP3/monitor_init.sh
|
login_x-TP3/monitor_init.sh
|
||||||
login_x-TP3/syscall_filter.c
|
login_x-TP3/syscall_filter.c
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ montage :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
|
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
|
||||||
/dev/sda3 on /home type ext4 (rw,relatime,data=ordered)
|
/dev/sda3 on /home type ext4 (rw,relatime,data=ordered)
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -61,16 +61,20 @@ exemple, pour modifier les paramètres du noyau, on passe par le fichier
|
||||||
|
|
||||||
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
|
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
42sh$ cat /sys/power/state
|
|
||||||
freeze mem
|
|
||||||
```
|
```
|
||||||
|
42sh$ cat /sys/power/state
|
||||||
|
freeze mem
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
La modification d'un élément se fait avec `echo`, comme ceci :
|
La modification d'un élément se fait avec `echo`, comme ceci :
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
42sh# echo mem > /sys/power/state
|
```bash
|
||||||
|
42sh# echo mem > /sys/power/state
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
Vous devriez constater l'effet de cette commande sans plus attendre !
|
Vous devriez constater l'effet de cette commande sans plus attendre !
|
||||||
|
|
||||||
|
|
@ -84,39 +88,39 @@ afficher des informations sur un processus donné :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ./procinfo $$
|
42sh$ ./procinfo $$
|
||||||
PID: 4242
|
PID: 4242
|
||||||
Path: /bin/bash
|
Path: /bin/bash
|
||||||
Command line: bash
|
Command line: bash
|
||||||
Working directory: /home/nemunaire/virli/
|
Working directory: /home/nemunaire/virli/
|
||||||
Root: /
|
Root: /
|
||||||
State: S (sleeping)
|
State: S (sleeping)
|
||||||
Threads: 1
|
Threads: 1
|
||||||
|
|
||||||
CGroups
|
CGroups
|
||||||
=======
|
=======
|
||||||
12:pids:/
|
12:pids:/
|
||||||
11:net_prio:/
|
11:net_prio:/
|
||||||
10:perf_event:/
|
10:perf_event:/
|
||||||
9:net_cls:/
|
9:net_cls:/
|
||||||
8:freezer:/
|
8:freezer:/
|
||||||
7:devices:/
|
7:devices:/
|
||||||
6:memory:/
|
6:memory:/
|
||||||
5:blkio:/
|
5:blkio:/
|
||||||
4:cpuacct:/
|
4:cpuacct:/
|
||||||
3:cpu:/
|
3:cpu:/
|
||||||
2:cpuset:/
|
2:cpuset:/
|
||||||
1:name=openrc:/
|
1:name=openrc:/
|
||||||
|
|
||||||
Namespaces
|
Namespaces
|
||||||
==========
|
==========
|
||||||
cgroup:[4026531835]
|
cgroup:[4026531835]
|
||||||
ipc:[4026531839]
|
ipc:[4026531839]
|
||||||
mnt:[4026531840]
|
mnt:[4026531840]
|
||||||
net:[4026531969]
|
net:[4026531969]
|
||||||
pid:[4026531836]
|
pid:[4026531836]
|
||||||
user:[4026531837]
|
user:[4026531837]
|
||||||
uts:[4026531838]
|
uts:[4026531838]
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -147,8 +151,8 @@ Après avoir exécuté le script, nous devrions avoir :
|
||||||
Voici un exemple d'utilisation :
|
Voici un exemple d'utilisation :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ ./rev_kdb_leds.sh input20
|
42sh$ ./rev_kdb_leds.sh input20
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -158,23 +162,23 @@ Voici un exemple d'utilisation :
|
||||||
Voici un exemple d'utilisation :
|
Voici un exemple d'utilisation :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ ./batinfo.sh
|
42sh$ ./batinfo.sh
|
||||||
BAT0 Discharging
|
BAT0 Discharging
|
||||||
====
|
====
|
||||||
Capacity: 83% (Normal)
|
Capacity: 83% (Normal)
|
||||||
Voltage: 11.972000 V (minimal: 11.400000 V)
|
Voltage: 11.972000 V (minimal: 11.400000 V)
|
||||||
Energy: 18.290000/21.830000 Wh
|
Energy: 18.290000/21.830000 Wh
|
||||||
Power: 7.937000 W
|
Power: 7.937000 W
|
||||||
Remaining time: 2.304 h
|
Remaining time: 2.304 h
|
||||||
|
|
||||||
BAT1 Unknown
|
BAT1 Unknown
|
||||||
====
|
====
|
||||||
Capacity: 83% (Normal)
|
Capacity: 83% (Normal)
|
||||||
Voltage: 11.972000 V (minimal: 11.400000 V)
|
Voltage: 11.972000 V (minimal: 11.400000 V)
|
||||||
Energy: 18.290000/21.830000 Wh
|
Energy: 18.290000/21.830000 Wh
|
||||||
Power: 0.0 W
|
Power: 0.0 W
|
||||||
Remaining time: N/A
|
Remaining time: N/A
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -184,21 +188,21 @@ Voici un exemple d'utilisation :
|
||||||
Voici un exemple d'utilisation :
|
Voici un exemple d'utilisation :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ ./cpuinfo.sh
|
42sh$ ./cpuinfo.sh
|
||||||
cpu0
|
cpu0
|
||||||
====
|
====
|
||||||
Current frequency: 2100384 Hz
|
Current frequency: 2100384 Hz
|
||||||
Current governor: powersave
|
Current governor: powersave
|
||||||
Allowed frequencies: between 500000 - 2100000 Hz
|
Allowed frequencies: between 500000 - 2100000 Hz
|
||||||
Thermal throttle count: 0
|
Thermal throttle count: 0
|
||||||
|
|
||||||
cpu1
|
cpu1
|
||||||
====
|
====
|
||||||
Current frequency: 2099871 Hz
|
Current frequency: 2099871 Hz
|
||||||
Current governor: powersave
|
Current governor: powersave
|
||||||
Allowed frequencies: between 500000 - 2100000 Hz
|
Allowed frequencies: between 500000 - 2100000 Hz
|
||||||
Thermal throttle count: 0
|
Thermal throttle count: 0
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ ce mode via :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```c
|
```c
|
||||||
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
|
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -67,25 +67,25 @@ argument de l'appel système :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```c
|
```c
|
||||||
struct sock_filter filter[];
|
struct sock_filter filter[];
|
||||||
struct sock_fprog prog = {
|
struct sock_fprog prog = {
|
||||||
.len = (unsigned short) (sizeof(filter) / sizeof(filter[0])),
|
.len = (unsigned short) (sizeof(filter) / sizeof(filter[0])),
|
||||||
.filter = filter,
|
.filter = filter,
|
||||||
};
|
};
|
||||||
seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
|
seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Exercice
|
### Exercice {-}
|
||||||
|
|
||||||
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
|
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ./syscall_filter sleep 5
|
42sh$ ./syscall_filter sleep 5
|
||||||
sleep: cannot read realtime clock: Operation not permitted
|
sleep: cannot read realtime clock: Operation not permitted
|
||||||
42sh$
|
42sh$
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,25 @@
|
||||||
---
|
---
|
||||||
title: Virtualisation légère -- TP n^o^ 3
|
title: Virtualisation légère -- TP n^o^ 3
|
||||||
subtitle: Linux Internals partie 1
|
subtitle: Linux Internals partie 1
|
||||||
author: Pierre-Olivier *Nemunaire* Mercier
|
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||||
institute: EPITA
|
institute: EPITA
|
||||||
date: Mercredi 24 octobre 2018
|
date: Mercredi 24 octobre 2018
|
||||||
|
abstract: |
|
||||||
|
Ce premier TP consacré aux Linux Internals va nous permettre
|
||||||
|
d'appréhender les notions de pseudos systèmes de fichiers, de
|
||||||
|
cgroups ainsi que de capabilities.
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
Certains éléments de ce TP sont à rendre à <virli@nemunai.re> au
|
||||||
|
plus tard le mercredi 7 novembre 2018 à 12 h 42. Consultez la
|
||||||
|
dernière section de chaque partie pour plus d'information sur les
|
||||||
|
éléments à rendre.
|
||||||
|
|
||||||
|
En tant que personnes sensibilisées à la sécurité des échanges
|
||||||
|
électroniques, vous devrez m'envoyer vos rendus signés avec votre
|
||||||
|
clef PGP. Pensez à
|
||||||
|
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
|
||||||
|
faire signer votre clef et n'hésitez pas à [faire signer votre
|
||||||
|
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
|
||||||
...
|
...
|
||||||
|
|
||||||
Ce premier TP consacré aux Linux Internals va nous permettre d'appréhender les
|
|
||||||
notions de pseudos systèmes de fichiers, de cgroups ainsi que de capabilities.
|
|
||||||
|
|
||||||
Certains éléments de ce TP sont à rendre à <virli@nemunai.re> au plus tard le
|
|
||||||
mercredi 7 novembre 2018 à 12 h 42. Consultez la dernière section de chaque partie
|
|
||||||
pour plus d'information sur les éléments à rendre.
|
|
||||||
|
|
||||||
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
|
|
||||||
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
|
|
||||||
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire
|
|
||||||
signer votre clef et n'hésitez pas à
|
|
||||||
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
|
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,8 @@
|
||||||
|
include ../pandoc-opts.mk
|
||||||
|
|
||||||
SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md
|
SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md
|
||||||
SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md
|
SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md
|
||||||
|
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
|
||||||
--standalone \
|
|
||||||
--normalize \
|
|
||||||
--number-sections \
|
|
||||||
--smart \
|
|
||||||
-M lang=fr-FR \
|
|
||||||
-M fontsize=12pt \
|
|
||||||
-M papersize=a4paper \
|
|
||||||
-M mainfont="Linux Libertine O" \
|
|
||||||
-M monofont="FantasqueSansMono-Regular" \
|
|
||||||
-M sansfont="Linux Biolinum O" \
|
|
||||||
-M colorlinks=true \
|
|
||||||
-M linkcolor="black" \
|
|
||||||
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
|
|
||||||
--include-in-header=../header.tex
|
|
||||||
|
|
||||||
|
|
||||||
all: lesson.pdf tutorial.pdf
|
all: lesson.pdf tutorial.pdf
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ Exemples {.unnumbered}
|
||||||
--------
|
--------
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```sh
|
```
|
||||||
42sh$ ./cmpns $(pgrep influxdb) $(pgrep init)
|
42sh$ ./cmpns $(pgrep influxdb) $(pgrep init)
|
||||||
- cgroup: differ
|
- cgroup: differ
|
||||||
- ipc: differ
|
- ipc: differ
|
||||||
|
|
@ -30,7 +30,7 @@ Exemples {.unnumbered}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```sh
|
```
|
||||||
42sh$ ./cmpns $(pgrep init) self
|
42sh$ ./cmpns $(pgrep init) self
|
||||||
- cgroup: same
|
- cgroup: same
|
||||||
- ipc: same
|
- ipc: same
|
||||||
|
|
@ -47,7 +47,7 @@ Ici, `self` fait référence au processus actuellement exécuté.
|
||||||
Et pourquoi pas :
|
Et pourquoi pas :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```sh
|
```
|
||||||
42sh$ unshare -m ./cmpns $$ self
|
42sh$ unshare -m ./cmpns $$ self
|
||||||
- cgroup: same
|
- cgroup: same
|
||||||
- ipc: same
|
- ipc: same
|
||||||
|
|
|
||||||
|
|
@ -17,33 +17,33 @@ Pour savoir si vous avez réussi, comparez les sorties des commandes :
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
|
|
||||||
Tests {.unnumbered}
|
Tests {-}
|
||||||
-----
|
-----
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ docker run --name mywebserver -d -p 80:80 nginx
|
42sh$ docker run --name mywebserver -d -p 80:80 nginx
|
||||||
d63ceae863956f8312aca60b7a57fbcc1fdf679ae4c90c5d9455405005d4980a
|
d63ceae863956f8312aca60b7a57fbcc1fdf679ae4c90c5d9455405005d4980a
|
||||||
42sh$ docker container inspect --format '{{ .State.Pid }}' mywebserver
|
42sh$ docker container inspect --format '{{ .State.Pid }}' mywebserver
|
||||||
234269
|
234269
|
||||||
|
|
||||||
42sh# ./mydocker_exec mywebserver ip address
|
42sh# ./mydocker_exec mywebserver ip address
|
||||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
|
||||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
inet 127.0.0.1/8 scope host lo
|
inet 127.0.0.1/8 scope host lo
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
||||||
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
|
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
|
||||||
inet 172.17.0.1/16 scope global eth0
|
inet 172.17.0.1/16 scope global eth0
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
|
|
||||||
42sh# hostname
|
42sh# hostname
|
||||||
koala.zoo.paris
|
koala.zoo.paris
|
||||||
42sh# ./mydocker_exec mywebserver hostname
|
42sh# ./mydocker_exec mywebserver hostname
|
||||||
d63ceae86395
|
d63ceae86395
|
||||||
|
|
||||||
42sh# ./mydocker_exec mywebserver mount
|
42sh# ./mydocker_exec mywebserver mount
|
||||||
42sh# ./mydocker_exec mywebserver ps aux
|
42sh# ./mydocker_exec mywebserver ps aux
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Virtualisation légère -- Linux Internals partie 2
|
title: Virtualisation légère -- Linux Internals partie 2
|
||||||
subtitle: Support de cours
|
subtitle: Support de cours
|
||||||
author: Pierre-Olivier *nemunaire* Mercier
|
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||||
institute: EPITA
|
institute: EPITA
|
||||||
date: Mercredi 7 novembre 2018
|
date: Mercredi 7 novembre 2018
|
||||||
|
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èmes
|
||||||
|
relatifs aux espaces de noms du noyau Linux ainsi que d'appréhender
|
||||||
|
la complexité des sytèmes de fichiers.
|
||||||
...
|
...
|
||||||
|
|
||||||
Le but de cette seconde partie sur les mécanismes internes du noyau va nous
|
|
||||||
permettre d'utiliser les commandes et les appels systèmes relatifs aux espaces
|
|
||||||
de noms du noyau Linux ainsi que d'appréhender la complexité des sytèmes de
|
|
||||||
fichiers.
|
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,8 @@ Lorsque l'on souhaite monter à un deuxième endroit (ou plus) une partition, on
|
||||||
utilise le *bind mount* :
|
utilise le *bind mount* :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
mount --bind olddir newdir
|
mount --bind olddir newdir
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -81,11 +81,11 @@ Pour que tout cela fonctionne, nous aurons besoin, au préalable, d'exécuter le
|
||||||
commandes suivantes :
|
commandes suivantes :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
cd newroot
|
cd newroot
|
||||||
mount --bind /dev dev
|
mount --bind /dev dev
|
||||||
mount --bind /proc proc
|
mount --bind /proc proc
|
||||||
mount --bind /sys sys
|
mount --bind /sys sys
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -104,11 +104,11 @@ d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus
|
||||||
correct de lancer :
|
correct de lancer :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
cd newroot
|
cd newroot
|
||||||
mount --rbind /dev dev
|
mount --rbind /dev dev
|
||||||
mount -t proc none proc
|
mount -t proc none proc
|
||||||
mount --rbind /sys sys
|
mount --rbind /sys sys
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -128,15 +128,15 @@ Dans un montage partagé, une nouvelle accroche sera propagée parmi tous les
|
||||||
systèmes de fichiers de ce partage (on parle de *peer group*).
|
systèmes de fichiers de ce partage (on parle de *peer group*).
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
# Création de notre répertoire de travail
|
# Création de notre répertoire de travail
|
||||||
mkdir /mnt/test-shared
|
mkdir /mnt/test-shared
|
||||||
|
|
||||||
# On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared
|
# On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared
|
||||||
mount --make-shared /tmp
|
mount --make-shared /tmp
|
||||||
|
|
||||||
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
|
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
|
||||||
mount --bind /tmp /mnt/test-shared
|
mount --bind /tmp /mnt/test-shared
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -144,9 +144,9 @@ Si l'on attache un nouveau point de montage dans `/tmp` ou dans
|
||||||
`/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée :
|
`/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mkdir /mnt/test-shared/toto
|
mkdir /mnt/test-shared/toto
|
||||||
mount -t tmpfs none /mnt/test-shared/toto
|
mount -t tmpfs none /mnt/test-shared/toto
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -161,33 +161,33 @@ propagera, mais seulement dans un sens. Le point de montage déclaré comme
|
||||||
esclave ne propagera pas ses nouveaux points de montage à son *maître*.
|
esclave ne propagera pas ses nouveaux points de montage à son *maître*.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
# Suite de l'exemple précédent
|
# Suite de l'exemple précédent
|
||||||
cd /mnt/test-slave
|
cd /mnt/test-slave
|
||||||
|
|
||||||
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
|
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
|
||||||
mount --bind /mnt/test-shared /mnt/test-slave
|
mount --bind /mnt/test-shared /mnt/test-slave
|
||||||
|
|
||||||
# On rend notre dossier esclave
|
# On rend notre dossier esclave
|
||||||
mount --make-slave /mnt/test-slave
|
mount --make-slave /mnt/test-slave
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Si l'on effectue un montage dans `/mnt/test-shared` :
|
Si l'on effectue un montage dans `/mnt/test-shared` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mkdir /mnt/test-shared/foo
|
mkdir /mnt/test-shared/foo
|
||||||
mount -t tmpfs none /mnt/test-shared/foo
|
mount -t tmpfs none /mnt/test-shared/foo
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre :
|
Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mkdir /mnt/test-slave/bar
|
mkdir /mnt/test-slave/bar
|
||||||
mount -t tmpfs none /mnt/test-slave/bar
|
mount -t tmpfs none /mnt/test-slave/bar
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -203,8 +203,8 @@ Pour forcer un point d'accroche à ne pas propager et à ne pas recevoir de
|
||||||
propagation, on utilise l'option suivante :
|
propagation, on utilise l'option suivante :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mount --make-private mountpoint
|
mount --make-private mountpoint
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -214,17 +214,17 @@ propagation, on utilise l'option suivante :
|
||||||
Ce mode interdira tout tentative d'attache à un autre endroit.
|
Ce mode interdira tout tentative d'attache à un autre endroit.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mount --make-unbindable /mnt/test-slave
|
mount --make-unbindable /mnt/test-slave
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Il ne sera pas possible de faire :
|
Il ne sera pas possible de faire :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mkdir /mnt/test-unbindable
|
mkdir /mnt/test-unbindable
|
||||||
mount --bind /mnt/test-slave /mnt/test-unbindable
|
mount --bind /mnt/test-slave /mnt/test-unbindable
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -236,11 +236,11 @@ existe les mêmes options pour les appliquer en cascade sur les points d'attache
|
||||||
contenus dans leur sous-arbre :
|
contenus dans leur sous-arbre :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```bash
|
||||||
mount --make-rshared mountpoint
|
mount --make-rshared mountpoint
|
||||||
mount --make-rslave mountpoint
|
mount --make-rslave mountpoint
|
||||||
mount --make-rprivate mountpoint
|
mount --make-rprivate mountpoint
|
||||||
mount --make-runbindable mountpoint
|
mount --make-runbindable mountpoint
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -269,16 +269,16 @@ emplacement soient prévenu du changement.
|
||||||
On utilise pour cela l'option `--move` de `mount(8)` :
|
On utilise pour cela l'option `--move` de `mount(8)` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mount --move olddir newdir
|
mount --move olddir newdir
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Par exemple :
|
Par exemple :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
mount --move /dev /newroot/dev
|
mount --move /dev /newroot/dev
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -287,7 +287,7 @@ racine de notre système de fichiers : par exemple pour passer de l'*initramfs*
|
||||||
au système démarré, de notre système hôte au système d'un conteneur, ...
|
au système démarré, de notre système hôte au système d'un conteneur, ...
|
||||||
|
|
||||||
|
|
||||||
## Aller plus loin
|
## Aller plus loin {-}
|
||||||
|
|
||||||
Voici quelques articles qui valent le détour, en lien avec les points de
|
Voici quelques articles qui valent le détour, en lien avec les points de
|
||||||
montage :
|
montage :
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ Nous allons essayer de changer la racine de notre système de fichier. À la
|
||||||
différence d'un `chroot(2)`, changer de racine est quelque chose d'un peu plus
|
différence d'un `chroot(2)`, changer de racine est quelque chose d'un peu plus
|
||||||
sportif car il s'agit de ne plus avoir aucune trace de l'ancienne racine. Au
|
sportif car il s'agit de ne plus avoir aucune trace de l'ancienne racine. Au
|
||||||
moins ici, il ne sera certainement pas possible de revenir en arrière dans
|
moins ici, il ne sera certainement pas possible de revenir en arrière dans
|
||||||
l'arborescence !
|
l'arborescence\ !
|
||||||
|
|
||||||
Pour l'instant, votre système utilise sans doute la partition d'un disque
|
Pour l'instant, votre système utilise sans doute la partition d'un disque
|
||||||
physique comme racine de son système de fichier. Le changement de racine, va
|
physique comme racine de son système de fichier. Le changement de racine, va
|
||||||
|
|
@ -39,9 +39,9 @@ ne se trouvait pas à la racine d'une partition au moment du basculement.
|
||||||
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
|
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# mkdir /mnt/newroot
|
42sh# mkdir /mnt/newroot
|
||||||
42sh# mount -t tmpfs none /mnt/newroot
|
42sh# mount -t tmpfs none /mnt/newroot
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -73,8 +73,8 @@ devoir nous isoler sur :
|
||||||
Isolons-nous :
|
Isolons-nous :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# unshare -p -m -f --mount-proc
|
42sh# unshare -p -m -f --mount-proc
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -89,8 +89,8 @@ Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
|
||||||
comme esclave :
|
comme esclave :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# mount --make-rslave /
|
42sh# mount --make-rslave /
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -131,7 +131,7 @@ Pour lancer la première commande dans la nouvelle racine, on passe généraleme
|
||||||
par :
|
par :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# exec chroot / command
|
42sh# exec chroot / command
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -44,9 +44,11 @@ notre *namespace* est d'appliquer le type esclave à l'ensemble de nos points de
|
||||||
montage, récursivement, dès que l'on est entré dans notre nouvel espace de
|
montage, récursivement, dès que l'on est entré dans notre nouvel espace de
|
||||||
noms.
|
noms.
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
mount --make-rslave /
|
```bash
|
||||||
|
mount --make-rslave /
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### L'espace de noms `UTS` {#uts-ns}
|
### L'espace de noms `UTS` {#uts-ns}
|
||||||
|
|
@ -148,18 +150,18 @@ Par exemple, nous pouvons modifier sans crainte le nom de notre machine, si
|
||||||
nous sommes passés dans un autre *namespace* `UTS` :
|
nous sommes passés dans un autre *namespace* `UTS` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh# hostname --fqdn
|
42sh# hostname --fqdn
|
||||||
koala.zoo.paris
|
koala.zoo.paris
|
||||||
42sh# sudo unshare -u /bin/bash
|
42sh# sudo unshare -u /bin/bash
|
||||||
bash# hostname --fqdn
|
bash# hostname --fqdn
|
||||||
koala.zoo.paris
|
koala.zoo.paris
|
||||||
bash# hostname lynx.zoo.paris
|
bash# hostname lynx.zoo.paris
|
||||||
bash# hostname --fqdn
|
bash# hostname --fqdn
|
||||||
lynx.zoo.paris
|
lynx.zoo.paris
|
||||||
bash# exit
|
bash# exit
|
||||||
42sh# hostname --fqdn
|
42sh# hostname --fqdn
|
||||||
koala.zoo.paris
|
koala.zoo.paris
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -194,17 +196,17 @@ similaire à :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```c
|
```c
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
|
||||||
#define STACKSIZE (1024*1024)
|
#define STACKSIZE (1024*1024)
|
||||||
static char child_stack[STACKSIZE];
|
static char child_stack[STACKSIZE];
|
||||||
|
|
||||||
int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD;
|
int clone_flags = CLONE_CGROUP | CLONE_NEWNET | SIGCHLD;
|
||||||
|
|
||||||
pid_t pid = clone(do_execvp,
|
pid_t pid = clone(do_execvp,
|
||||||
child_stack + STACKSIZE,
|
child_stack + STACKSIZE,
|
||||||
clone_flags,
|
clone_flags,
|
||||||
&args);
|
&args);
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -220,41 +222,41 @@ auquel on passe le *file descriptor* d'un des liens du dossier
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```c
|
```c
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
// ./a.out /proc/PID/ns/FILE cmd args...
|
// ./a.out /proc/PID/ns/FILE cmd args...
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int fd = open(argv[1], O_RDONLY);
|
int fd = open(argv[1], O_RDONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
{
|
{
|
||||||
perror("open");
|
perror("open");
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (setns(fd, 0) == -1)
|
|
||||||
{
|
|
||||||
perror("setns");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
execvp(argv[2], &argv[2]);
|
|
||||||
|
|
||||||
perror("execve");
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (setns(fd, 0) == -1)
|
||||||
|
{
|
||||||
|
perror("setns");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
execvp(argv[2], &argv[2]);
|
||||||
|
|
||||||
|
perror("execve");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Dans un shell, on utilisera la commande `nsenter(1)` :
|
Dans un shell, on utilisera la commande `nsenter(1)` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
|
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -275,9 +277,9 @@ Lorsque l'on a besoin de référencer un *namespace* (par exemple pour le faire
|
||||||
persister après le dernier processus), on peut utiliser un `mount bind` :
|
persister après le dernier processus), on peut utiliser un `mount bind` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# touch /tmp/ns/myrefns
|
42sh# touch /tmp/ns/myrefns
|
||||||
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
|
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -296,7 +298,7 @@ Même en étant attaché à un fichier du disque, il s'agit d'un pointeur vers u
|
||||||
structure du noyau, qui ne persistera pas au redémarrage.
|
structure du noyau, qui ne persistera pas au redémarrage.
|
||||||
|
|
||||||
|
|
||||||
## Aller plus loin
|
## Aller plus loin {-}
|
||||||
|
|
||||||
Je vous recommande la lecture des *man* suivants :
|
Je vous recommande la lecture des *man* suivants :
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,10 @@ En entrant dans un nouvel espace de nom `network`, on se retrouve dans un
|
||||||
environnement qui n'a plus qu'une interface de *loopback* :
|
environnement qui n'a plus qu'une interface de *loopback* :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh# unshare -n ip a
|
42sh# unshare -n ip a
|
||||||
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
|
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
|
||||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -38,8 +38,8 @@ La suite d'outils `iproute2` propose une interface simplifiée pour utiliser le
|
||||||
Nous pouvons tout d'abord créer un nouvel espace de nom :
|
Nous pouvons tout d'abord créer un nouvel espace de nom :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# ip netns add virli
|
42sh# ip netns add virli
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -53,10 +53,10 @@ Maintenant que notre *namespace* est créé, nous pouvons regarder s'il contient
|
||||||
des interfaces :
|
des interfaces :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```sh
|
```
|
||||||
42sh# ip netns exec virli ip link
|
42sh# ip netns exec virli ip link
|
||||||
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
|
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
|
||||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -67,19 +67,19 @@ D'ailleurs, cette interface est rapportée comme étant désactivée, activons-l
|
||||||
via la commande :
|
via la commande :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# ip netns exec virli ip link set dev lo up
|
42sh# ip netns exec virli ip link set dev lo up
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
À ce stade, nous pouvons déjà commencer à lancer un `ping` sur cette interface:
|
À ce stade, nous pouvons déjà commencer à lancer un `ping` sur cette interface:
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh# ip netns exec virli ping 127.0.0.1
|
42sh# ip netns exec virli ping 127.0.0.1
|
||||||
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
|
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
|
||||||
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
|
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -96,7 +96,7 @@ type `veth` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# ip link add veth0 type veth peer name veth1
|
42sh# ip link add veth0 type veth peer name veth1
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -112,17 +112,17 @@ devient alors possible de réaliser un échange de paquets entre les deux.
|
||||||
Pour déplacer `veth1` dans notre *namespace* `virli` :
|
Pour déplacer `veth1` dans notre *namespace* `virli` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# ip link set veth1 netns virli
|
42sh# ip link set veth1 netns virli
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Il ne reste maintenant plus qu'à assigner une IP à chacune des interfaces :
|
Il ne reste maintenant plus qu'à assigner une IP à chacune des interfaces :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1
|
42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1
|
||||||
42sh# ip a add 10.10.10.41/24 dev veth0
|
42sh# ip a add 10.10.10.41/24 dev veth0
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -132,10 +132,10 @@ Dès lors[^linkdown], nous pouvons `ping`er chaque extrêmité :
|
||||||
vethX up`.
|
vethX up`.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh# ping 10.10.10.42
|
42sh# ping 10.10.10.42
|
||||||
- et -
|
- et -
|
||||||
42sh# ip netns exec virli ping 10.10.10.41
|
42sh# ip netns exec virli ping 10.10.10.41
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -158,9 +158,9 @@ supportant la technologie [802.1q](https://fr.wikipedia.org/wiki/IEEE_802.1Q).
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# ip link add link eth0 name eth0.100 type vlan id 100
|
42sh# ip link add link eth0 name eth0.100 type vlan id 100
|
||||||
42sh# ip link set dev eth0.100 up
|
42sh# ip link set dev eth0.100 up
|
||||||
42sh# ip link set eth0.100 netns virli
|
42sh# ip link set eth0.100 netns virli
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ Pour construire une nouvelle interface de ce type :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# ip link add link eth0 mac0 type macvlan mode vepa
|
42sh# ip link add link eth0 mac0 type macvlan mode vepa
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -208,7 +208,7 @@ conteneur de la même machine.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# ip link add link eth0 mac1 type macvlan mode private
|
42sh# ip link add link eth0 mac1 type macvlan mode private
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -224,12 +224,12 @@ Pour construire une nouvelle interface de ce type :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh# ip link add link eth0 mac2 type macvlan mode bridge
|
42sh# ip link add link eth0 mac2 type macvlan mode bridge
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Aller plus loin
|
## Aller plus loin {-}
|
||||||
|
|
||||||
Pour approfondir les différentes techniques de routage, je vous
|
Pour approfondir les différentes techniques de routage, je vous
|
||||||
recommande cet article :
|
recommande cet article :
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,8 @@ trouve.
|
||||||
Première étape s'isoler :
|
Première étape s'isoler :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# unshare --pid --fork /bin/bash
|
42sh# unshare --pid --fork /bin/bash
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -50,8 +50,8 @@ notre système initial. Pour s'en sortir, il est nécessaire de s'isoler du
|
||||||
Voici la nouvelle ligne de commande que l'on va utiliser :
|
Voici la nouvelle ligne de commande que l'on va utiliser :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh# unshare --pid --mount --fork --mount-proc /bin/bash
|
42sh# unshare --pid --mount --fork --mount-proc /bin/bash
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -94,7 +94,7 @@ l'extérieur du conteneur, les propriétés d'`init` sont biens appliquées à
|
||||||
l'intérieur pour conserver un comportement cohérent.
|
l'intérieur pour conserver un comportement cohérent.
|
||||||
|
|
||||||
|
|
||||||
## Aller plus loin
|
## Aller plus loin {-}
|
||||||
|
|
||||||
N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de
|
N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de
|
||||||
noms : `pid_namespaces(7)`.
|
noms : `pid_namespaces(7)`.
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ Voici une arborescence type:
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
login_x-mymoulette/README
|
login_x-mymoulette/README
|
||||||
login_x-mymoulette/...
|
login_x-mymoulette/...
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,8 @@ Voici une arborescence type :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
login_x-TP4/cmpns.sh
|
login_x-TP4/cmpns.sh
|
||||||
login_x-TP4/mydocker_exec.sh
|
login_x-TP4/mydocker_exec.sh
|
||||||
login_x-TP4/myswitch_root.sh
|
login_x-TP4/myswitch_root.sh
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -94,9 +94,11 @@ noyau pour adapter le comportement.
|
||||||
Si vous utilisez Debian ou l'un de ses dérivés, vous devrez autoriser
|
Si vous utilisez Debian ou l'un de ses dérivés, vous devrez autoriser
|
||||||
explicitement cette utilisation non-privilégiée :
|
explicitement cette utilisation non-privilégiée :
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
42sh# sysctl -w kernel.unprivileged_userns_clone=1
|
```bash
|
||||||
|
42sh# sysctl -w kernel.unprivileged_userns_clone=1
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Grsecurity {.unnumbered}
|
### Grsecurity {.unnumbered}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,24 @@
|
||||||
---
|
---
|
||||||
title: Virtualisation légère -- TP n^o^ 4
|
title: Virtualisation légère -- TP n^o^ 4
|
||||||
subtitle: Linux Internals partie 2
|
subtitle: Linux Internals partie 2
|
||||||
author: Pierre-Olivier *nemunaire* Mercier
|
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||||
institute: EPITA
|
institute: EPITA
|
||||||
date: Mercredi 7 novembre 2018
|
date: Mercredi 7 novembre 2018
|
||||||
|
abstract: |
|
||||||
|
Le but de ce second TP sur les mécanismes internes du noyau va nous
|
||||||
|
permettre d'utiliser les commandes et les appels systèmes relatifs
|
||||||
|
aux *namespaces* ainsi que d'appréhender la complexité des systèmes
|
||||||
|
de fichiers.
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> au
|
||||||
|
plus tard le mercredi 14 novembre 2017 à 12 h 42.
|
||||||
|
|
||||||
|
En tant que personnes sensibilisées à la sécurité des échanges
|
||||||
|
électroniques, vous devrez m'envoyer vos rendus signés avec votre
|
||||||
|
clef PGP. Pensez à
|
||||||
|
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
|
||||||
|
faire signer votre clef et n'hésitez pas à [faire signer votre
|
||||||
|
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
|
||||||
...
|
...
|
||||||
|
|
||||||
Le but de ce second TP sur les mécanismes internes du noyau va nous permettre
|
|
||||||
d'utiliser les commandes et les appels systèmes relatifs aux *namespaces* ainsi
|
|
||||||
que d'appréhender la complexité des systèmes de fichiers.
|
|
||||||
|
|
||||||
Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> au plus tard le
|
|
||||||
mercredi 14 novembre 2017 à 12 h 42.
|
|
||||||
|
|
||||||
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
|
|
||||||
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
|
|
||||||
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire
|
|
||||||
signer votre clef et n'hésitez pas à
|
|
||||||
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
|
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,8 @@ Par exemple, le *namespace* `user` initial défini la correspondance suivante :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ cat /proc/self/uid_map
|
42sh$ cat /proc/self/uid_map
|
||||||
0 0 4294967295
|
0 0 4294967295
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -79,8 +79,8 @@ Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ cat /proc/self/uid_map
|
42sh$ cat /proc/self/uid_map
|
||||||
0 1000 1
|
0 1000 1
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -98,8 +98,8 @@ des groupes au lieu des utilisateurs.
|
||||||
## Utilisation de l'espace de noms
|
## Utilisation de l'espace de noms
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
|
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -110,7 +110,7 @@ jeu. L'idée étant que l'on a été désigné root dans son conteneur, on devra
|
||||||
pouvoir y faire ce que l'on veut, tant que l'on n'agit pas en dehors.
|
pouvoir y faire ce que l'on veut, tant que l'on n'agit pas en dehors.
|
||||||
|
|
||||||
|
|
||||||
## Aller plus loin
|
## Aller plus loin {-}
|
||||||
|
|
||||||
N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* :
|
N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* :
|
||||||
`user_namespaces(7)`.
|
`user_namespaces(7)`.
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,6 @@
|
||||||
|
include ../pandoc-opts.mk
|
||||||
|
|
||||||
SOURCES = tutorial.md setup.md what.md manual.md compose.md security.md rendu.md
|
SOURCES = tutorial.md setup.md what.md manual.md compose.md security.md rendu.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
|
||||||
--standalone \
|
|
||||||
--normalize \
|
|
||||||
--number-sections \
|
|
||||||
--smart \
|
|
||||||
-M lang=fr-FR \
|
|
||||||
-M fontsize=12pt \
|
|
||||||
-M papersize=a4paper \
|
|
||||||
-M mainfont="Linux Libertine O" \
|
|
||||||
-M monofont="FantasqueSansMono-Regular" \
|
|
||||||
-M sansfont="Linux Biolinum O" \
|
|
||||||
-M colorlinks=true \
|
|
||||||
-M linkcolor="black" \
|
|
||||||
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
|
|
||||||
--include-in-header=../header.tex
|
|
||||||
|
|
||||||
|
|
||||||
all: tutorial.pdf
|
all: tutorial.pdf
|
||||||
|
|
|
||||||
|
|
@ -12,19 +12,19 @@ construction).
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```yaml
|
```yaml
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
influxdb:
|
influxdb:
|
||||||
...
|
...
|
||||||
chronograf:
|
chronograf:
|
||||||
build: grafana/
|
build: grafana/
|
||||||
image: nginx
|
image: nginx
|
||||||
ports:
|
ports:
|
||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- ./:/tmp/toto
|
- ./:/tmp/toto
|
||||||
links:
|
links:
|
||||||
- influxdb
|
- influxdb
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -61,9 +61,9 @@ suit :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```yaml
|
```yaml
|
||||||
volumes:
|
volumes:
|
||||||
mysql-data:
|
mysql-data:
|
||||||
driver: local
|
driver: local
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -72,11 +72,11 @@ l'emplacement à partager :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```yaml
|
```yaml
|
||||||
|
[...]
|
||||||
|
mysql:
|
||||||
[...]
|
[...]
|
||||||
mysql:
|
volumes:
|
||||||
[...]
|
- mysql-data:/var/lib/mysql
|
||||||
volumes:
|
|
||||||
- mysql-data:/var/lib/mysql
|
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -94,9 +94,9 @@ qui pourront être utilisés par les `services`. On pourrait donc avoir :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```yaml
|
```yaml
|
||||||
networks:
|
networks:
|
||||||
knotdns-slave-net:
|
knotdns-slave-net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -145,8 +145,8 @@ Une fois le build terminé, nous pouvons lancer la commande suivante et admirer
|
||||||
le résultat :
|
le résultat :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```bash
|
||||||
docker-compose up
|
docker-compose up
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ allons tâcher d'utiliser ce même port pour tester localement :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
docker container run -p 8086:8086 -d --name mytsdb influxdb
|
docker container run -p 8086:8086 -d --name mytsdb influxdb
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -35,9 +35,9 @@ notre base de données en appelant :
|
||||||