Lxc sur Debian

Les Linux contai­ners (lxc) sont une solu­tion d’iso­la­tion ou de virtua­li­sa­tion (selon l’uti­li­sa­tion) à l’ins­tar des Jails BSD. Contrai­re­ment à d’autres solu­tions simi­laires (vser­ver ou openvz) sous Linux, les lxc ne néces­sitent pas de patch du noyau car faisant direc­te­ment partie de la branche prin­ci­pale du déve­lop­pe­ment du noyau. Même si lxc est jeune (donc souf­frant d’un certain nombre de bugs), il s’agit d’une solu­tion déjà fonc­tion­nelle. Je vais décrire ici l’ins­tal­la­tion et la confi­gu­ra­tion de lxc sur une Debian Squeeze dispo­sant d’une seule inter­face avec une IP publique (comme sur un serveur dédié quoi).

Prépa­ra­tion du système

On installe d’abord lxc et deboots­trap :

# apt-get install lxc debootstrap

Il nous faudra aussi créer un bridge lié à une inter­face dummy :

# apt-get install bridge-utils
# modprobe dummy

Ensuite il faut créer un bridge. Ajou­tez ceci au fichier /etc/network/inter­faces :

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 char­ger cette nouvelle confi­gu­ra­tion :

# /etc/init.d/networking restart

Prépa­ra­tion des cgroups

Pas très compliqué :

# mkdir /cgroup
# echo "cgroup        /cgroup        cgroup        defaults    0    0" >> /etc/fstab
# mount cgroup

Véri­fi­ca­tion de la confi­gu­ra­tion de lxc

Cela se fait à l’aide de la commande lxc-check­con­fig :

$ 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’ob­te­niez pas enabled sur la ligne File capa­bi­li­ties. Vous aurez alors besoin d’ins­tal­ler libcap2-bin :

# apt-get install libcap2-bin

Créa­tion d’un contai­ner

Le paquet lxc four­nit un moyen très simple de créer un contai­ner Debian via le script /usr/lib/lxc/templates/lxc-debian mais celui-ci ne four­nit qu’une debian lenny, sans comp­ter que son chemin d’ac­cè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 rempla­cez :

SUITE=${SUITE:-lenny}

par

SUITE=${SUITE:-squeeze}

et

dhcp3-client,\

par

isc-dhcp-client,\

Vous êtes libre d’ajou­ter les paquets que vous voulez avoir par défaut dans votre contai­ner dans la liste des paquets déjà présente (htop et multi­tail par exemple). Vous avez un réper­toire tout près à accueillir vos contai­ners 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ér­toire qui contien­dra le contai­ner et celui-ci dans la foulée:

# mkdir /lxc/vm0
# lxc-debian-squeeze -p /lxc/vm0

Le réper­toire /lxc/vm0 contien­dra un fichier config et un réper­toire rootfs. Voici le contenu du fichier de confi­gu­ra­tion du contai­ner :

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

Ajou­tez 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 commen­tée car eth0 est la valeur par défaut de l’in­ter­face du contai­ner. Libre à vous de la modi­fier.

ATTENTION : pour que vos contai­ners soient en mesure de commu­niquer entre eux, prenez soin de chan­ger leur adresse mac virtuelle ! (ligne lxc.network.hwaddr)

Si vous n’avez pas de serveur dhcp et ne voulez pas vous embê­ter à en instal­ler un, allez dans le réper­toire rootfs et modi­fiez le fichier etc/network/inter­faces 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

Ajou­tez ceci au fichier etc/rc.local (toujours dans /lxc/vm0/rootfs, hein !):

route add default gw 192.168.1.1

Se simpli­fier la vie

Vous pouvez télé­char­ger ma lxc-debian : elle est en squeeze et surtout elle permet de choi­sir l’adresse ip, l’adresse mac et le host­name du contai­ner et ça ajoute la route dans rc.local lors de sa créa­tion. Par contre je n’ai pas mis de sécu­rité si on ne précise pas ces para­mêtres et certaines ip sont en dur donc « bla bla bla logi­ciel fourni bla bla bla aucune garan­tie bla bla bla à vos risques et périls ».

Confi­gu­rer le fire­wall

Et oui, sans fire­wal­ling, vos contai­ners vont avoir du mal à commu­niquer avec inter­net ! (sauf si vous les avez direc­te­ment 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 à chan­ger 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 main­te­nant lancer vos contai­ners :

# lxc-start -n vm0 -d

Les stop­per :

# 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_Contai­ners_to_set_up_virtual_networks