diff --git a/slides/Makefile b/slides/Makefile index 74e8937..817cdd4 100644 --- a/slides/Makefile +++ b/slides/Makefile @@ -1,9 +1,9 @@ all: slides.pdf .md.pdf: - pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 -o $@ $< + pandoc --latex-engine=xelatex -t beamer -V theme:Szeged -V colortheme:beaver --toc --toc-depth=1 --normalize --listings --chapters --slide-level=3 -M lang=frenchb --standalone -o $@ $< .md.tex: - pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 --standalone -o $@ $< + pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 -M lang=frenchb --standalone -o $@ $< .SUFFIXES: .md .tex .pdf diff --git a/slides/cntnr.png b/slides/cntnr.png new file mode 100644 index 0000000..9540574 Binary files /dev/null and b/slides/cntnr.png differ diff --git a/slides/cntrapp.png b/slides/cntrapp.png new file mode 100644 index 0000000..b325847 Binary files /dev/null and b/slides/cntrapp.png differ diff --git a/slides/hyperv.png b/slides/hyperv.png new file mode 100644 index 0000000..0371719 Binary files /dev/null and b/slides/hyperv.png differ diff --git a/slides/slides.md b/slides/slides.md index e74899a..61156e7 100644 --- a/slides/slides.md +++ b/slides/slides.md @@ -2,20 +2,25 @@ % Pierre-Olivier Mercier % Samedi 29 novembre 2014 -# Historique +# Rappels & historique ## Rappels sur la virtualisation classique ### Prémices -#### IBM 370 +#### Au départ -* une super machine ! +Exécuter simultanément plusieurs environnements distinct sur un +mainframe IBM. + +#### IBM System/370 + +* Virtualisation grâce au système CP/CMS ; +* permis par la présence d'une MMU et par l'ajout d'un mode + *supervisor* au processeur. ### Vocabulaire -#### Définitions - * Machine hôte/host machine * Machine invité/guest machine @@ -24,35 +29,20 @@ * Émulation : simulation logiciel de matériel (potentiellement une architecture différente) : pas d'accès direct au matériel ; * Virtualisation : accès direct, mais restrint au matériel. -* QEMU -* Bochs - #### Technologies de virtualisation matérielle * Intel VT-x/AMD-V/ARM Virtualization Extensions * partitionne le processeur pour exécuter plusieurs système d'exploitation via le même processeur. -### Pourquoi virtualiser ? - -#### - -* Réduction des coûts ; -* facilité de migration (répartition de charge, panne hardware, ...) ; - - -### Paravirtualisation - -#### Caractéristiques - -* Nécessite un noyau patché ; -* l'hôte expose une API accessible aux invités ; -* les invités accèdent au matériel via l'API de l'hôte. - -* Xen ### Hyperviseurs -Contrôle l'utilisation faite des ressources de la machine hôte par les machines virtuelles. +![](hyperv.png) + +### Hyperviseurs + +Contrôlent l'utilisation faite des ressources de la machine hôte par les +machines virtuelles. #### Type 1 @@ -63,18 +53,54 @@ Contrôle l'utilisation faite des ressources de la machine hôte par les machine #### Type 2 -* L'hyperviseur s'appuie sur le système d'exploitation déjà lancé pour accéder au matériel ; +* L'hyperviseur s'appuie sur le système d'exploitation déjà lancé pour accéder + au matériel ; * Linux KVM, VirtualBox, BHyVe, ... -### Isolateurs + +### Paravirtualisation + +#### Caractéristiques + +* Nécessite un noyau patché ; +* l'hôte expose une API accessible aux invités ; +* les invités accèdent au matériel via l'API de l'hôte. + +#### Exemple + +* Xen + + +## Virtualisation légère + +### Conteneur + +![](cntnr.png) + +### Conteneur #### Caractéristiques * Isolation faite par le noyau du système d'exploitation ; -* le noyau est partagé entre tous les invités. +* le noyau est partagé entre tous les invités ; +* les périphériques sont déjà en place (pas besoin d'en émuler) ; +* l'invité démarre à partir de `/sbin/init`. -### Versus chroot + +### Conteneurs applicatifs + +![](cntrapp.png) + +### Conteneurs applicatifs + +#### Caractéristiques + +* Noyau est partagé avec l'hôte ; +* on utilise tout en place : fs, sockets, périphériques ; +* lance directement une application, pas `init`. + +#### Versus chroot * Simple isolation d'une partie du système de fichier ; * pas de limitation sur les ressources utilisés ; @@ -82,78 +108,47 @@ Contrôle l'utilisation faite des ressources de la machine hôte par les machine * implémentations douteuses (GrSecurity !). -## Les différentes technologies +## Différentes implémentations ### Points communs #### Environnement virtualisé -* Arborescence de fichiers propre ; +* Arborescence de fichiers séparé ; * arbre de processus isolé ; * comptes utilisateurs distincts ; -* +* pile réseau et nom de machine propre. -#### Sécurité +### Diversité +#### Unix -### Unix +* **FreeBSD :** Jails lancées en 1998 ; +* **Solaris :** Zones lancées en 2005 ; -#### Zones Solaris - -* Lancé en 2005 -* - -#### Jails BSD - - -### GNU/Linux - -#### OpenVZ/VServer - -#### Linux Containers +#### GNU/Linux +* **OpenVZ :** 2005, nécessite de patcher son kernel ; +* **Linux Containers (LXC) :** 2008, basé sur les namespaces et les cgroups ; +* **Docker :** 2013, en pleine croissance ! ### Et Windows ? +#### Isolation + +* Parallels Virtuozzo Containers ; +* Sandboxie. + +#### Dérivés + +* **Boot2Docker :** Docker dans une VM. # GNU/Linux -## Capabilities +## Namespaces & cgroups -### Résumé - -#### Historiquement - -* Processus privilégiés : `UID == 0`. -* Processus non-privilégiés : `UID != 0`. - -#### Depuis Linux 2.2 - -* Séparation des privilèges de l'UID 0. -* Chaque thread peut posséder ses propres capacités. -* `prctl(2)`, `execve(2)`, - -### Principales capacités - -#### Ne pas oublier de désactiver - -* `CAP_MKNOD` : `mknod` -* `CAP_NET_RAW` : permet d'écouter tout le réseau -* `CAP_SYS_MODULE` : charge et décharge des modules noyau -* `CAP_SYS_RAWIO` : accès brut aux entrées/sorties -* `CAP_SYS_RESOURCE` : dépassement des quotas, utilisation de l'espace réservé, ... -* `CAP_SYS_TIME` : changer l'heure de la machine -* `CAP_SYS_ADMIN` : misc - -#### Ne pas oublier d'activer - -* `` - - -## Namespaces - -### Isolation de parties du système +### Isolation du système #### Mount Namespace @@ -168,6 +163,8 @@ Identification du système : nom de machine et de domaine. Crée un arbre d'exécution parallèle où le premier process à être exécuté devient le PID 1 de cet arbre. +### Isolation du système + #### Network Namespace Isole la pile réseau ; crée un nouveau groupe d'interfaces. @@ -190,50 +187,189 @@ Isolation des files de messages de communication interprocessus (IPC). static char child_stack[STACKSIZE]; int clone_flags = CLONE_NEWNET | SIGCHLD; + pid_t pid = clone(do_execvp, child_stack + STACKSIZE, clone_flags, &args); ``` -## cgroups +### cgroups -### Freezer cgroup subsystem +`/sys/fs/cgroup/` -### Device controller for cgroups +#### Block I/O -### CPU accounting cgroup subsystem +* Limitation de la bande passante lecture/écriture ; +* poids d'un groupe ; +* métriques: IOPS, latence, file d'attente. -### Memory Resource Controller for Control Groups +#### CPU -### Block IO controller +* Poids d'utilisation du CPU ; +* statistiques d'utilisation -### Device controller for cgroups +### cgroups -### Network priority cgroup +`/sys/fs/cgroup/` + +#### Mémoire + +* Limite de taille ; +* métriques : total rss, swap, nb pages in/out + +#### Autres + +Réseau, périphériques, gel de processus, ... -## LXC +## Capabilities -## Docker +### Résumé -## Vagrant +#### Historiquement -## Hardening +* Processus privilégiés : `UID == 0`. +* Processus non-privilégiés : `UID != 0`. + +#### Depuis Linux 2.2 + +* Séparation des privilèges de l'UID 0. +* Chaque thread peut posséder ses propres capacités. +* `prctl(2)`, `execve(2)`, `clone(2)`, ... + +### Principales capacités + +#### Ne pas oublier de désactiver + +* `CAP_MKNOD` : `mknod` +* `CAP_NET_RAW` : permet d'écouter tout le réseau +* `CAP_SYS_MODULE` : charge et décharge des modules noyau +* `CAP_SYS_RAWIO` : accès brut aux entrées/sorties +* `CAP_SYS_RESOURCE` : dépassement des quotas, utilisation de l'espace réservé, ... +* `CAP_SYS_TIME` : changer l'heure de la machine +* `CAP_SYS_ADMIN` : misc +* ... + +## Isolateurs + +### Systemd + +* Chaque service est démarré dans un cgroup ; +* on peut appliquer des limites au groupe en modifiant le `.service` ; +* `systemd-nspawn` pour créer manuellement un nouveau namespace. + +```ini +[Service] +CPUShares=1500 +MemoryLimit=1G +BlockIOWeight=500 +``` + +### LXC + +* Lance un système complet à partir de `/sbin/init` ; +* se configure via un fichier de conf : + +```ini +lxc.rootfs = /var/lib/lxc/toto/rootfs +lxc.utsname = toto + +lxc.network.type = veth +lxc.network.hwaddr = 00:16:3e:c6:0e:04 +lxc.network.flags = up +lxc.network.link = tap0 +lxc.network.name = eth0 + +lxc.tty = 4 +lxc.pts = 1024 +lxc.cap.drop = mac_admin mac_override +``` + +### Docker + +* Lance une application, packagé dans un environnement ; +* création d'environnement possible à partir de `Dockerfile` : + +``` +FROM debian:wheezy +RUN groupadd -r mysql && useradd -r -g mysql mysql +RUN apt-get update && apt-get install -y perl +ENV MYSQL_MAJOR 5.7 +VOLUME /var/lib/mysql +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] +EXPOSE 3306 +CMD ["mysqld", "--datadir=/var/lib/mysql"] +``` -# Réseau +## Réseau -http://containerops.org/2013/11/19/lxc-networking/ +### Réseaux physiques -## empty +#### empty -## phys +Loopback uniquement, n'ajoute aucune interface. -## vlan +#### phys -## veth +Utilisation d'une interface physique directement. -## macvlan vepa +#### vlan -## macvlan bridge +Assignation d'un VLAN à chaque conteneur. + + +### Réseaux virtuels + +#### veth + +On crée une interface virtuelle sur l'hôte que l'on connecte à un bridge. + +#### MAC VLAN + +* **VEPA :** tous les paquets sortants sortent, y compris ceux à destination + d'une autre machine locale. Le switch derrière doit rerouter les paquets vers + la machine. +* **Bridge :** le noyau analyse les paquets avant de les transmettre. + + +# En production + +### LXC API + +```python +import lxc +import sys + +# Setup the container object +c = lxc.Container("apicontainer") + +# Create the container rootfs +c.create("download", lxc.LXC_CREATE_QUIET, + {"dist": "ubuntu", "release": "trusty", + "arch": "i386"}) + +# Start the container +if not c.start(): + print("Failed to start the container") + sys.exit(1) +``` + +### Projets naissants + +#### Core OS + +* Système d'exploitation minimaliste ; +* fleet : systemd administrable à distance ; +* lance des conteneur via fichiers de service Systemd. + +#### Citadel + +* Interaction avec un cluster Docker ; +* schedule l'emplacement d'exécution des conteneurs. + +#### Shipyard + +* Interface web pour gérer son cluster Docker. diff --git a/subject/subject.md b/subject/subject.md index e259686..fc77923 100644 --- a/subject/subject.md +++ b/subject/subject.md @@ -1,5 +1,4 @@ % Virtualisation légère -% Sujet du rush % Pierre-Olivier *Nemunaire* Mercier % Samedi 29 novembre 2014 diff --git a/template.tex b/template.tex index 90ad704..ebe1a0f 100644 --- a/template.tex +++ b/template.tex @@ -54,6 +54,7 @@ $endif$ \fi \setmainfont[Ligatures={Common,Rare}]{LinLibertine} \setsansfont[Ligatures=Common]{LinBiolinum} +\setmonofont{DejaVuSansMono} \linepenalty=100 \allsectionsfont{\color{black}} \setlist{itemsep=1pt,topsep=2pt,partopsep=0pt,parsep=0pt,leftmargin=20pt} diff --git a/tutorial/tutorial.md b/tutorial/tutorial.md index 566daee..6ddf0e9 100644 --- a/tutorial/tutorial.md +++ b/tutorial/tutorial.md @@ -1,5 +1,4 @@ % Virtualisation légère -% Travaux pratiques % Pierre-Olivier *Nemunaire* Mercier % Samedi 29 novembre 2014 @@ -71,6 +70,7 @@ curl -sSL https://get.docker.com/ | sh ## LXC +Votre distribution fourni sans doute un paquet `lxc`. # Docker