Installation du système de virtualisation lxc (linux containers)

Voyons comment fonctionne LXC, qui est un système de virtualisation utilisant l'isolation…

Qu’est ce que LXC ?

Wikipedia le fait très bien. Voici la définition de LXC :

LXC, contraction de l’anglais Linux Containers1 est un système de virtualisation, utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau et une plus ou moins grande partie du système hôte. Le conteneur apporte une virtualisation de l'environnement d'exécution (Processeur, Mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de machine virtuelle.
Ce système est similaire aux autres systèmes de virtualisations au niveau du système d'exploitation comme openVZ, Linux-VServer sur Linux ou comme les BSD jails de FreeBSD, ou encore les zones Solaris.
LXC repose sur les fonctionnalités des Cgroups du noyau Linux disponibles depuis la version 2.6.24 du noyau. Il repose également sur d'autres fonctionnalités de cloisonnement comme le cloisonnement des espaces de nommage du noyau, permettant d'éviter à un système de connaître les ressources utilisées par le système hôte ou un autre conteneur.\\

Installation

Paquets requis pour l'installation

apt-get install lxc lxc-templates

Paquets optionnels pour l'installation

apt-get install bridge-utils libvirt-bin debootstrap

LXC est maintenant installé.
Voici, comment tester la configuration.

lxc-checkconfig

Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-3.2.0-4-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

tous doit être au vert.

Création d'un conteneur LXC :

LXC vient avec des Templates, c'est à dire des scripts permettant l'installation simple d'un système. Il en existe pour Debian, Archlinux, Fedora, OpenSuse et Ubuntu.

Création d'un conteneur avec le système debian jessie :

lxc-create -n MyName -t debian -- -r jessie

-n : définit le nom de votre conteneur -t : définit votre template – -r jessie : Cela passera les options -r jessie comme arguments au template debian. Pour afficher la liste des options prises en charge par le template, vous pouvez faire : lxc-create -t debian -h Dans mon exemple je suis partie sur le template debian.

Configuration du conteneur

Le fichier est situé dans /var/lib/lxc/MyName/config et il pourrait ressembler à ça :

MyName dans le chemin est le nom de votre conteneur

lxc.utsname = MyName
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = lxcnet0
lxc.network.hwaddr = 00:FF:AA:00:00:01
lxc.network.ipv4 = 192.168.1.6/24
lxc.network.ipv4.gateway = 192.168.1.1
lxc.start.auto = 1
lxc.arch = amd64
lxc.mount = /var/lib/lxc/MyName/fstab
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.rootfs = /var/lib/lxc/MyName/rootfs
lxc.kmsg = 0

lxc.utsname : définit le nom de votre conteneur lxc.network.type : définit le type de virtualisation réseau à utiliser pour votre conteneur.
Plusieurs type sont possible :

none : Le conteneur se partagera l'espace de noms réseau de l'hôte.

veth : création d'une interface Ethernet virtuelle avec un coté affecté au conteneur et l'autre attaché à un pont spécifié par l'option lxc.network.link

vlan : Une interface vlan est liée à l'interface spécifiée par lxc.network.link et affectée au conteneur.
L'identifiant vlan est spécifié avec l'option lxc.network.vlan.id

macvlan : Une interface macvlan est liée à l'interface spécifiée par lxc.network.link et affectée au conteneur

phys : une interface existant est assigné au conteneur par lxc.network.link

lxc.network.flags : définit une action à faire pour le réseau up permet d'activer l'interface
lxc.network.link : définit l'interface qui va être utilisé sur votre hôte
lxc.network.name : Nom de l’interface réseau dans le conteneur
lxc.network.hwaddr : L'adresse MAC de l'interface est allouée dynamiquement par défaut à l'interface virtuelle, mais dans certains cas, ceci est nécessaire pour résoudre un conflit d'adresse MAC ou pour avoir toujours la même adresse ipv6 locale de lien.
lxc.network.ipv4 : assigne une adresse IPV4 à l'interface virtuelle
lxc.network.ipv4.gateway : définit l'adresse IPV4 qui est utilisé comme passerelle par défaut, celle-ci sera inséré dans le conteneur
lxc.start.auto : définit si le conteneur doit être démarrer automatiquement, 0 = éteint et 1 = allumé
lxc.arch : définit l'architecture du conteneur les options valide sont : x86, i686, x86_64, amd64
lxc.mount : définit l'endroit ou se situe le fichier contenant les information de montage au formatfstab
lxc.include : spécifie le fichier a inclure, le fichier inclue peut être dans le même format de configuration lxc.
lxc.rootfs : spécifie le chemin du système de fichier du conteneur
lxc.kmsg : Définissez cette valeur sur 1 pour activer les Liens symboliques /dev/kmsg.

Configuration réseau

Comme vu dans le fichier de configuration, nous avons choisis une interface bridge comme lien avec le réseau.
Donc nous devons créer cette interface de pont.

Dans le fichier /etc/network/interfaces de l’hôte

Requiert le paquet bridge-utils.

auto br0
iface br0 inet static
bridge_ports eth0
bridge_fd 0
bridge_stp off
bridge_maxwait 0
address 192.168.1.20
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254
# les options dns-* sont implémentées par le paquet resolvconf package, si installé
dns-nameservers 192.168.1.1 192.168.1.2
dns-search ksh-linux.info

Relancez les connections réseaux:

/etc/init.d/networking restart

L’interface Ethernet virtuelle veth accède au réseau via le bridge créé sur l’hôte. Par défaut, le container n’est pas visible en dehors de l'hôte. Je vais vous montrez comment mettre à disposition de vos utilisateurs un conteneur: C'est un exemple, il y plusieurs possibilité Nous devons activer le routage sur le serveur: la première méthode, vous permet d'activer le routage instantanément, mais au premier redémarrage cela ne tiendra pas. echo 1 > /proc/sys/net/ipv4/ip_forward Pour que ce soit fait à chaque démarrage : vim /etc/sysctl.conf puis dé-commenter la ligne suivante : net.ipv4.ip_forward=1 ensuite nous pouvons masquer l'IP et rediriger le trafic de notre interface 192.168.1.20 vers notre conteneur 192.168.1.5 : iptables -t nat -A POSTROUTING -s 192.168.1.5 -o br0 -j MASQUERADE iptables -t nat -A PREROUTING -d 192.168.1.20/32 -j DNAT --to-destination 192.168.1.5

Administrer vos conteneur LXC

Démarrer un container :

lxc-start -n MyName -d

-n: indique le nom de votre conteneur -d: pour lancer le conteneur comme un daemon

sans l'option -d, il ne sera pas possible de sortir du conteneur

Démarrage automatique de lxc, et donc de vos conteneur :

systemctl enable lxc

ou

update-rc.d lxc defaults

ajouter cela dans le fichier de configuration de vos conteneurs: lxc.start.auto = 1

Se connecter au conteneur :

lxc-console -n MyName

pour en sortir faire ctrl+a puis q

Arrêter un conteneur :

lxc-stop -n MyName

Mettre en pause un conteneur :

lxc-freeze -n MyName

Sortir de pause un conteneur :

lxc-unfreeze -n MyName

Détruire un conteneur :

lxc-destroy -n MyName

Lister les conteneurs :

lxc-ls

Afficher l’état (démarré/arrêté/en pause) et l’IP de tous les conteneurs :

lxc-ls --fancy

ou

lxc-ls -f

Afficher des informations sur un conteneur :

lxc-info -n MyName

Purger le cache d’une image :

/usr/share/lxc/templates/lxc-debian --clean