134 lines
3.0 KiB
Markdown
134 lines
3.0 KiB
Markdown
\newpage
|
|
|
|
# Utiliser les *namespaces*
|
|
|
|
## Comparaison de *namespace*
|
|
|
|
Écrivez un script ou un programme, `cmpns`, dans le langage courant de votre
|
|
choix, permettant de déterminer si deux programmes s'exécutent dans les mêmes
|
|
*namespaces*.
|
|
|
|
### Exemples
|
|
|
|
```sh
|
|
42sh$ cmpns $(pgrep influxdb) $(pgrep init)
|
|
- ipc: differ
|
|
- mnt: differ
|
|
- net: differ
|
|
- pid: differ
|
|
- user: same
|
|
- uts: same
|
|
```
|
|
|
|
```sh
|
|
42sh$ cmpns $(pgrep init) self
|
|
- ipc: same
|
|
- mnt: same
|
|
- net: same
|
|
- pid: same
|
|
- user: same
|
|
- uts: same
|
|
```
|
|
|
|
Ici, `self` fait référence au processus actuellement exécuté.
|
|
|
|
|
|
## Rejoindre un *namespace*
|
|
|
|
Dans le langage courant de votre choix, écrivez un programme : `setns`,
|
|
permettant, à la manière de `unshare(1)` et `unshare(2)`, d'utiliser `setns(2)`
|
|
via votre interpréteur.
|
|
|
|
Les options attendues sont :
|
|
|
|
* rejoindre un *namespace* IPC : `-i`, `--ipc` ;
|
|
* rejoindre un *namespace* mount : `-m`, `--mount` ;
|
|
* rejoindre un *namespace* net : `-n`, `--net` ;
|
|
* rejoindre un *namespace* PID : `-p`, `--pid` ;
|
|
* rejoindre un *namespace* UTS : `-u`, `--uts` ;
|
|
* rejoindre un *namespace* user : `-U`, `--user`.
|
|
|
|
### Exemples
|
|
|
|
```sh
|
|
42sh# setns /bin/bash
|
|
bash# _
|
|
```
|
|
|
|
#### IPC and PID Namespaces
|
|
|
|
```sh
|
|
42sh# setns --ipc=/proc/42/ns/ipc -p /proc/42/ns/pid /bin/echo toto
|
|
toto
|
|
```
|
|
|
|
#### Net Namespace
|
|
|
|
```sh
|
|
42sh# setns --net=/proc/42/ns/net ip a
|
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
|
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00::00
|
|
inet 127.0.0.1/8 brd 127.255.255.255 scope lo
|
|
valid_lft forever preferred_lft
|
|
inet6 ::1/128 scope host
|
|
valid_lft forever preferred_lft forever
|
|
```
|
|
|
|
#### UTS Namespace
|
|
|
|
```sh
|
|
42sh# hostname --fqdn
|
|
koala.zoo.paris
|
|
42sh# setns --uts=/proc/42/ns/uts hostname --fqdn
|
|
lynx.zoo.paris
|
|
```
|
|
|
|
|
|
## My Little Container
|
|
|
|
En utilisant le langage courant de votre choix, concevez l'exécutable `mlc`,
|
|
permettant de lancer une application dans un environnement différent (comme un
|
|
`chroot`, mais sans permettre de s'en échapper) et avec des privilèges réduits.
|
|
|
|
Votre solution doit créer au moins un nouveau *namespace* mount et PID.
|
|
|
|
Vous aurez sans doute besoin de : `clone(2)`, `capabilities(7)`, `capset(2)`, `pivot_root(2)`,
|
|
|
|
### Exemples
|
|
|
|
```sh
|
|
42sh# ls newroot
|
|
bin etc home usr root proc var
|
|
|
|
42sh# mlc newroot/ /bin/bash
|
|
bash# ls ../../../
|
|
bin etc home usr root proc var
|
|
|
|
bash# escape_chroot ls
|
|
bin etc home usr root proc var
|
|
|
|
bash# ls -ld /proc/[0-9]* | wc -l
|
|
2
|
|
|
|
bash# curl http://www.linuxcontainers.org/ | md5sum
|
|
0123456789abcdef
|
|
|
|
bash# ping 8.8.8.8
|
|
Operation not permitted
|
|
```
|
|
|
|
|
|
## Rendu
|
|
|
|
Pour chaque exercice de cette partie, vous pouvez rendre un seul fichier s'il
|
|
s'agit d'un script ; sinon, vous devez rendre une tarball contenant un
|
|
`Makefile` permettant de générer les éventuels exécutables et/ou un `README`
|
|
expliquant comment s'en servir.
|
|
|
|
Vous devez donc rendre 3 fichiers : `cmpns` ou `cmpns.tar.bz2`, `setns` ou
|
|
`setns.tar.bz2` et `mlc` ou `mlc.tar.bz2`.
|
|
|
|
\vspace{3em}
|
|
|
|
Bon courage !
|