Les Linux containers (lxc) sont une solution d’isolation ou de virtualisation (selon l’utilisation) à l’instar des Jails BSD. Contrairement à d’autres solutions similaires (vserver ou openvz) sous Linux, les lxc ne nécessitent pas de patch du noyau car faisant directement partie de la branche principale du développement du noyau. Même si lxc est jeune (donc souffrant d’un certain nombre de bugs), il s’agit d’une solution déjà fonctionnelle. Je vais décrire ici l’installation et la configuration de lxc sur une Debian Squeeze disposant d’une seule interface avec une IP publique (comme sur un serveur dédié quoi).
Préparation du système
On installe d’abord lxc et debootstrap :
# apt-get install lxc debootstrap
Il nous faudra aussi créer un bridge lié à une interface dummy :
# apt-get install bridge-utils
# modprobe dummy
Ensuite il faut créer un bridge. Ajoutez ceci au fichier /etc/network/interfaces :
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports dummy0
bridge_fd 0
bridge_maxwait 0
pre-up /sbin/modprobe dummy
Pour charger cette nouvelle configuration :
# /etc/init.d/networking restart
Préparation des cgroups
Pas très compliqué :
# mkdir /cgroup
# echo "cgroup /cgroup cgroup defaults 0 0" >> /etc/fstab
# mount cgroup
Vérification de la configuration de lxc
Cela se fait à l’aide de la commande lxc-checkconfig :
$ lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.32-5-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 namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: missing
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
Il est possible que vous n’obteniez pas enabled sur la ligne File capabilities. Vous aurez alors besoin d’installer libcap2-bin :
# apt-get install libcap2-bin
Création d’un container
Le paquet lxc fournit un moyen très simple de créer un container Debian via le script /usr/lib/lxc/templates/lxc-debian mais celui-ci ne fournit qu’une debian lenny, sans compter que son chemin d’accès n’est pas très pratique. Donc :
# cp /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-debian-squeeze
# ln -s /usr/lib/lxc/templates/lxc-debian-squeeze /usr/sbin/lxc-debian-squeeze
Ensuite vous éditez ce nouveau script et vous remplacez :
SUITE=${SUITE:-lenny}
par
SUITE=${SUITE:-squeeze}
et
dhcp3-client,\
par
isc-dhcp-client,\
Vous êtes libre d’ajouter les paquets que vous voulez avoir par défaut dans votre container dans la liste des paquets déjà présente (htop et multitail par exemple). Vous avez un répertoire tout près à accueillir vos containers mais le chemin n’est pas très pratique. Je vous conseille donc de faire :
# ln -s /var/lib/lxc /lxc
Créons un répértoire qui contiendra le container et celui-ci dans la foulée:
# mkdir /lxc/vm0
# lxc-debian-squeeze -p /lxc/vm0
Le répertoire /lxc/vm0 contiendra un fichier config et un répertoire rootfs. Voici le contenu du fichier de configuration du container :
lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/sql/rootfs
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
# mounts point
lxc.mount.entry=proc /var/lib/lxc/sql/rootfs/proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=devpts /var/lib/lxc/sql/rootfs/dev/pts devpts defaults 0 0
lxc.mount.entry=sysfs /var/lib/lxc/sql/rootfs/sys sysfs defaults 0 0
Ajoutez ceci :
lxc.utsname = vm0
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
# lxc.network.name = eth0
lxc.network.hwaddr = 00:FF:12:34:56:02
lxc.network.ipv4 = 192.168.1.2
La ligne lxc.network.name est commentée car eth0 est la valeur par défaut de l’interface du container. Libre à vous de la modifier.
ATTENTION : pour que vos containers soient en mesure de communiquer entre eux, prenez soin de changer leur adresse mac virtuelle ! (ligne lxc.network.hwaddr)
Si vous n’avez pas de serveur dhcp et ne voulez pas vous embêter à en installer un, allez dans le répertoire rootfs et modifiez le fichier etc/network/interfaces en remplaçant :
auto eth0
iface eth0 inet dhcp
par
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.225.0
network 192.168.1.0
broadcast 192.168.1.255
Ajoutez ceci au fichier etc/rc.local (toujours dans /lxc/vm0/rootfs, hein !):
route add default gw 192.168.1.1
Se simplifier la vie
Vous pouvez télécharger ma lxc-debian : elle est en squeeze et surtout elle permet de choisir l’adresse ip, l’adresse mac et le hostname du container et ça ajoute la route dans rc.local lors de sa création. Par contre je n’ai pas mis de sécurité si on ne précise pas ces paramêtres et certaines ip sont en dur donc « bla bla bla logiciel fourni bla bla bla aucune garantie bla bla bla à vos risques et périls ».
Configurer le firewall
Et oui, sans firewalling, vos containers vont avoir du mal à communiquer avec internet ! (sauf si vous les avez directement intêgrés à votre réseau local) :
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
Voici deux options à changer dans /etc/sysctl.conf :
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.default.forwarding=1
Pour les prendre en compte :
# sysctl -p
C’est fini
Vous pouvez maintenant lancer vos containers :
# lxc-start -n vm0 -d
Les stopper :
# lxc-stop -n vm0
Savoir s’ils sont up ou down :
# lxc-info -n vm0
Y entrer (pour sortir, faites Ctrl+a q) :
# lxc-console -n vm0
Sources
http://blog.foaa.de/2010/05/lxc-on-debian-squeeze/ (c’est par là si vous voulez tuner vos lxc (mémoire, cpu, toussa))
http://www.nsnam.org/wiki/index.php/HOWTO_Use_Linux_Containers_to_set_up_virtual_networks