3.0 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 !