Installer OpenVZ

OpenVZ est une solution de virtualisation pour GNU/Linux basée sur des “conteneurs”. Il s'agit de “chroot” avec des fonctionnalité avancée : réseau, quotas disque/mémoire, possibilité d'avoir des distristributions différrentes, etc. Par contre, on ne peut avoir que GNU/Linux dans un conteneur, pour virtualiser d'autres systèmes, il faudra passer par d'autres solutions comme qemu, Xen ou KVM.

Cet article présente comment mettre en place OpenVZ sur Debian Squeeze.

Packages requis

Installer le noyau OpenVZ :

# aptitude install linux-headers-2.6-openvz-amd64 linux-image-2.6-openvz-amd64

Et les outils :

# aptitude install vzctl vzdump vzquota

Espace de stockage

Pas mal de choses vont être stockées dans /var/lib/vz, on va donc dédier une partition pour OpenVZ et la monter sur /var/lib/vz. En considérant qu'une telle partition soit disponible, voici la procédure à suivre :

  1. Faire une sauvegarde du contenu de /var/lib/vz, en utilisant tar (et sont option -p qui permet de conserver les propriétaires et permissions des fichiers)
  2. Supprimer le contenu de /var/lib/vz
  3. Ajouter une entrée dans /etc/fstab pour la partition
  4. Monter la partition dédiée sur /var/lib/vz
  5. Mettre à jour les permissions et le propriétaire si nécessaire
  6. Déballer le tar de sauvegarde

Voici un exemple utilisant un volume logique appelé openvz (volume group sys) :

# lvcreate -L 50G -n openvz sys
# mkfs.ext3 -m 0 /dev/sys/openvz
# cd /var/lib
# tar -cpzf ~/vz.tgz vz
# rm -rf vz/*
# mount /var/lib/vz 
# tar -xpzf ~/vz.tgz

Avec la ligne qui convient dans /etc/fstab :

/dev/mapper/sys-openvz  /var/lib/vz  ext3  defaults  0  2

Enfin, la plupart des documentations disponibles sur le net pour OpenVZ utilisent plutôt /vz que /var/lib/vz. Pour éviter les copier-coller hasardeux, on peut faire un lien symbolique :

# ln -s /var/lib/vz /vz

Configuration

Noyau

Il faut modifier la configuration du noyau pour certains paramètres réseau. On ajoute donc un fichier /etc/sysctl.d/openvz.conf avec les sysctl nécessaires à OpenVZ :

# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled

net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.ip_forward=1

# Enables source route verification
net.ipv4.conf.all.rp_filter = 1

# we do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0

Pour activer les paramètres sans rebooter, il suffit d'exécuter :

# sysctl -p /etc/sysctl.d/openvz.conf

Réseau

Sous-réseau dédié

Par la suite, on utilisera un réseau privé dédié à nos machine openvz. Par exemple, choisissons le réseau 10.100.0.0/24, avec 10.100.0.1 comme adresse IP pour la machine physique. Il faut donc lui assigner cette IP :

# ifconfig venet0 inet 10.100.0.1

Pour garder cette configuration disponible après de futurs reboot, on ajoute une entrée dans /etc/network/interfaces :

auto eth0:0
iface eth0:0 inet static
	address 10.100.0.1
	netmask 255.255.255.255

<note>Si vous utilisez wicd, l'alias sera écrasé par les changements de connexions effectués par cet outils. Il faudra refaire la configuration à la main.</notes>

DNS

Pour faciliter la gestion des noms de machines, on installe dnsmasq qui va nous permettre de facilement fournir un service DNS aux machines. Il suffira d'ajouter la correspondance IP ↔ nom dans /etc/hosts ou un fichier de son choix par la suite.

Par la suite, on va placer tout les conteneurs dans un domaine DNS géré par notre dnsmasq, pour les besoins de l'article, on choisit un domain n'existant nul part ailleurs que la machine locale, par exemple : vz.lo.

  1. On installe donc dnsmasq :
    # aptitude install dnsmasq
  2. On édite /etc/dnsmasq.conf pour indiquer que son domaine local est vz.lo :
    local=/vz.lo/
  3. On ajoute une entrée dans /etc/hosts pour la machine local dans le réseau OpenVZ :
    10.100.0.1	hw.vz.lo
  4. On modifie /etc/resolv.conf pour passer par dnsmasq en ajoutant cette 127.0.0.1 comme premier serveur de nom :
    nameserver 127.0.0.1
  5. Si on utilise du DCHP pour eth0, il faut modifier la configuration du client DHCP pour éviter un écrasement de notre configuration de /etc/resolv.conf. On édite donc /etc/dhcp/dhclient.conf pour décommenter :
    prepend domain-name-servers 127.0.0.1;

Enfin, il faut redémarre le service dnsmasq à chaque modification de sa configuration ou de /etc/hosts :

# invoke-rc.d dnsmasq restart
Restarting DNS forwarder and DHCP server: dnsmasq.

Accès à Internet pour les VM

Utiliser un adressage réseau différent pour nos machines permet d'isoler les conteneurs du reste du réseau, ce qui est pratique pour ne pas gêner. Par contre, les conteneurs ne voient pas non plus le reste du réseau (seulement la machine physique) il faut donc ajouter une petit règle Netfilter pour leur permettre de joindre le reste du monde :

# iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o eth0 -j SNAT --to `ifconfig eth0 | awk '/inet addr:/ { print substr($2,6) }'`

Pour rendre cette configuration automatique, on peut modifier la configuration de l'interface réseau, dans /etc/network/interfaces :

allow-hotplug eth0
iface eth0 inet dhcp
	post-up iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o eth0 -j SNAT --to `ifconfig eth0 | awk '/inet addr:/	{ print	substr($2,6) }'`
	pre-down iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o eth0 -j SNAT --to `ifconfig eth0 | awk '/inet addr:/ { print substr($2,6) }'`

Configuration basique

FIXME organisation de la conf

Création d'un conteneur

Préparation

il faut debootstrap

# debootstrap --arch amd64 squeeze /var/lib/vz/private/101 http://localhost:9999/debian/
# vzctl set 101 --applyconfig basic --save
WARNING: /etc/vz/conf/101.conf not found: No such file or directory
Saved parameters for CT 101

on obtient un fichier /etc/vz/conf/101.conf

Ajouter

OSTEMPLATE=debian-6.0

Paramétrer le réseau :

# vzctl set 101 --ipadd 10.100.0.2 --save
# vzctl set 101 --nameserver 10.100.0.1 --save
# vzctl set 101 --hostname squeeze.vz.lo --save
# vzctl set 101 --searchdomain vz.lo --save

Ajouter une entrée DNS :

  • dans /etc/hosts :
    10.100.0.2	squeeze.vz.lo
  • relancer dnsmasq :
    # /etc/init.d/dnsmasq restart

Démarrer le conteneur :

# vzctl start 101
Starting container ...
Initializing quota ...
Container is mounted
Adding IP address(es): 10.100.0.1
Setting CPU units: 1000
Set hostname: squeeze.vz.lo
File resolv.conf was modified
Container start in progress...

Entrer dans le conteneur :

# vzctl enter 101
entered into CT 101
squeeze:/#

Un fois dans le conteneur, on peut le configurer.

Configuration

Ajouter les sources de paquets, /etc/apt/sources.list :

deb http://debian.ens-cachan.fr/ftp/debian squeeze main contrib
deb-src http://debian.ens-cachan.fr/ftp/debian/ squeeze main contrib

# Ces dépots seront disponibles lorsque squeeze sera stable
#deb http://security.debian.org/ squeeze/updates main contrib
#deb-src http://security.debian.org/ squeeze/updates main contrib

Mettre à jour :

# aptitude update
# aptitude safe-upgrade

Installer quelques paquets indispensables :

# aptitude install dnsutils build-essential openssh-client openssh-server less vim locales sudo

Configurer les locales, choisir les locales fr_FR :

# dpkg-reconfigure locales
Generating locales (this might take a while)...
  fr_FR.ISO-8859-1... done
  fr_FR.UTF-8... done
  fr_FR.ISO-8859-15@euro... done
Generation complete

Supprimer les terminaux physiques, éditer /etc/inittab :

#1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

Configurer le fuseau horaire :

# dpkg-reconfigure tzdata

Transformer un conteneur en template

Au lieu de refaire l'étape debootstrap et configuration, on peut créer des templates qui serviront de base à la création d'autres conteneurs. Il s'agit de simples archives tar à placer dans /var/lib/vz/template/cache/.

Créer un template

Pour créer un template, on suit la procédure suivante :

  1. Stopper le conteneur s'il est en cours d'exécution :
    # vzctl stop 101
  2. Supprimer les fichiers spécifiques à l'installation :
    # cd /var/lib/vz/private/101
    # rm etc/hostname etc/resolv.conf etc/ssh/ssh_host_*
  3. Archiver le conteneur, attention au nommage qui doit refletter les paramètres de version et architecture utilisé lors du debootstrap :
    # cd /var/lib/vz/private/101
    # tar --numeric-owner -zcf /var/lib/vz/template/cache/debian-6.0-amd64-minimal.tar.gz .

Enfin, il faut vérifier que le répertoire /etc/vz/dists contient un fichier debian-6.0.conf. S'il n'existe pas, on copie le fichier debian.conf en debian-6.0.conf.

Utiliser un template pour créer un conteneur

Créer le conteneur :

# vzctl create 203 --ostemplate debian-6.0-amd64-minimal

Configurer le réseau :

  1. Ajouter une entrée dans /etc/hosts et relancer dnsmasq
  2. Utiliser vzctl pour configurer :
    # vzctl set 203 --ipadd 10.100.0.5 --save
    # vzctl set 203 --nameserver 10.100.0.1 --save
    # vzctl set 203 --hostname andesi.vz.lo --save
    # vzctl set 203 --searchdomain vz.lo --save

Démarrer le conteneur :

# vzctl start 203

Regénérer les clés du serveur SSH :

# vzctl exec 203 dpkg-reconfigure openssh-server

Customization

  • postcreate avec dpkg-reconfigure openssh-server
  • config ve-name.conf.sample