3 KiB
\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
42sh$ cmpns $(pgrep influxdb) $(pgrep init)
- ipc: differ
- mnt: differ
- net: differ
- pid: differ
- user: same
- uts: same
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
42sh# setns /bin/bash
bash# _
IPC and PID Namespaces
42sh# setns --ipc=/proc/42/ns/ipc -p /proc/42/ns/pid /bin/echo toto
toto
Net Namespace
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
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
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 !