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 :
- Faire une sauvegarde du contenu de
/var/lib/vz, en utilisanttar(et sont option-pqui permet de conserver les propriétaires et permissions des fichiers) - Supprimer le contenu de
/var/lib/vz - Ajouter une entrée dans
/etc/fstabpour la partition - Monter la partition dédiée sur
/var/lib/vz - Mettre à jour les permissions et le propriétaire si nécessaire
- 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.
- On installe donc dnsmasq :
# aptitude install dnsmasq
- On édite
/etc/dnsmasq.confpour indiquer que son domaine local estvz.lo:local=/vz.lo/
- On ajoute une entrée dans
/etc/hostspour la machine local dans le réseau OpenVZ :10.100.0.1 hw.vz.lo
- On modifie
/etc/resolv.confpour passer par dnsmasq en ajoutant cette 127.0.0.1 comme premier serveur de nom :nameserver 127.0.0.1
- 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.confpour 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
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 :
- Stopper le conteneur s'il est en cours d'exécution :
# vzctl stop 101
- Supprimer les fichiers spécifiques à l'installation :
# cd /var/lib/vz/private/101 # rm etc/hostname etc/resolv.conf etc/ssh/ssh_host_*
- 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 :
- Ajouter une entrée dans
/etc/hostset relancer dnsmasq - Utiliser
vzctlpour 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