\newpage

Prérequis
=========

## Noyau Linux

Ce TP requiert un noyau Linux, dans sa version 3.8 au minimum. Il doit de plus
être compilé avec les options suivantes (lorsqu'elles sont disponibles pour
votre version) :

```
General setup  --->
    [*] Control Group support  --->
      [*]   Freezer cgroup subsystem
      [*]   PIDs cgroup subsystem
      [*]   Device controller for cgroups
      [*]   Cpuset support
      [*]   Simple CPU accounting cgroup subsystem
      [*]   Memory Resource Controller for Control Groups
      [*]   Group CPU scheduler  --->
        [*]   Group scheduling for SCHED_OTHER
        [*]   Group scheduling for SCHED_RR/FIFO
      <*>   Block IO controller
    -*- Namespaces support
      [*]   UTS namespace
      [*]   IPC namespace
      [*]   User namespace
      [*]   PID Namespaces
      [*]   Network namespace
[*] Networking support  --->
    Networking options  --->
      <M> 802.1d Ethernet Bridging
      [*] Network priority cgroup
      [*] Network classid cgroup
Device Drivers  --->
    [*] Network device support  --->
      <M>   MAC-VLAN support
      <M>   Virtual ethernet pair device
```


### Vérification via `menuconfig`

L'arbre ci-dessous correspond aux options qui seront *built-in* (signalée par
une `*`) ou installées en tant que module (signalée par un `M`). En effet,
chaque noyau Linux peut être entièrement personnalisé en fonction des options
et des pilotes que l'on voudra utiliser.

Pour parcourir l'arbre des options du noyau, il est nécessaire d'avoir les
sources de celui-ci. Les dernières versions stables et encore maintenues sont
disponible sur la page d'accueil de <https://kernel.org>.

Dans les sources, on affiche la liste des options avec la commande :

```shell
make menuconfig
```


### Vérification via `/boot/config-xxx`

Les distributions basées sur Debian ont pour habitude de placer le fichier de
configuration ayant servi à compiler le noyau et ses modules dans le dossier
`/boot`, aux côtés de l'image du noyau `vmlinuz-xxx`, de l'éventuel système de
fichiers initial (`initramfs-xxx`) et des symboles de débogage
`System.map-xxx`.

Ce fichier répertorie toutes les options qui ont été activées. Par rapport à
l'arbre présenté ci-dessus, vous devriez trouver :

```
CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_MEMCG=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y

CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y

CONFIG_NET=y
CONFIG_BRIDGE=m
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y

CONFIG_NETDEVICES=y
CONFIG_MACVLAN=m
CONFIG_VETH=m
```


### Vérification via `/proc/config.gz`

Dans la plupart des autres distributions, la configuration est accessible à
travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans
`/proc` pour décompresser le fichier, utilisez les outils `zcat`, `zgrep`, ...

Vous devez retrouves les mêmes options que celles de la section précédente.



## Présence des en-têtes

Si vous utilisez un noyau standard fourni par votre distribution, les options
requises seront a priori déjà sélectionnées et vous n'aurez donc pas à compiler
votre propre noyau. Néanmoins, durant ce TP, nous allons nous interfacer avec
le noyau, il est donc nécessaire d'avoir les en-têtes de votre noyau.

Sous Debian, vous pouvez les installer via le paquet `linux-headers`.
