Table des matières

OpenVZ

Introduction

Wikipédia :

OpenVZ est une technologie de paravirtualisation de niveau système d'exploitation basée sur le noyau Linux.
OpenVZ permet à un serveur physique d'exécuter de multiples instances de systèmes d'exploitation isolés, connus sous le nom de serveurs privés virtuels (VPS) ou environnements virtuels (VE).

En comparaison aux machines virtuelles telles que VMware et aux technologies de paravirtualisation telles que Xen, OpenVZ offre moins de flexibilité dans le choix du système d'exploitation : le système d'exploitation invité et hôte doivent être de type Linux (bien que les distributions de Linux peuvent être différentes dans des VEs différents).

Cependant, la virtualisation au niveau OS d'OpenVZ offre :

Selon le site Web d'OpenVZ, cette méthode de virtualisation introduirait une très faible pénalité sur les performances : 1 à 3% de pertes seulement par rapport à un ordinateur physique.

OpenVZ est la base de Virtuozzo, un produit propriétaire fourni par SWsoft, Inc. OpenVZ est distribué sous la Licence publique générale GNU version 2.

OpenVZ comprend le noyau Linux et un jeu de commandes utilisateurs.

Ajout du dépôt

En théorie, cette étape est inutile.
Je la mets sans l'avoir validée et juste à titre de mémo.

Dans le fichier sources.list on ajoute le dépôt :

 http://download.openvz.org/debian-systs lenny openvz

On télécharge la clef et on fait la mise à jour :

wget -q http://download.openvz.org/debian-systs/dso_archiv_signing_key.asc -O- | apt-key add - && apt-get update

Installation du bon kernel et des softs de contrôle des machines virtuelles (VE)

Kernel OpenVZ

Un kernel OpenVZ, ce n'est ni plus ni moins qu'un kernel classique qui a été patché afin d'améliorer le principe de chroot.

Utilité de vzctl et vzquota

vzctl

Un utilitaire pour contrôler les VE (création, destruction, démarrage, arrêt, etc.) 

vzquota

 Un programme pour gérer les quota des VE.
 Très souvent utilisé indirectement et implicitement (grâce à vzctl). 

Installation des paquets utiles

apt-get install iproute libatm1 linux-image-2.6.26-2-openvz-686 linux-image-openvz-686 rsync vzctl vzquota

Si le paquet linux-image-openvz-686 ou linux-image-2.6.26-2-openvz-686 n'existe pas, alors un simple :

apt-cache search openvz | grep 686 | grep image

suffira pour déterminer le bon kernel à installer.

Avant de rebooter, vérifiez votre grub.
Dans grub :

/boot/grub/menu.lst

Dans grub2 :

 En attente...

ce dernier doit pointer sur le kernel OpenVZ. Après vérification, on reboot.

Principe de OpenVZ

Très simplement, OpenVZ c'est du chroot très fortement optimisé et amélioré.

Après le reboot

uname -a

Une réponse de ce type doit alors apparaître :

retour de la commande
2.6.26-2-openvz-686
ps ax | grep vz

On doit obtenir quelque chose de ce genre :

retour de la commande
2349 ?        S      0:00 [vzmond]
nano /etc/sysctl.conf
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
 
## Ligne à rajouter (oubliée dans les tutoriels que l'on trouve sur le net).
 
net.ipv4.ip_forward = 1 
sysctl -p

Activer NAT

On va maintenant créer un script qui va activer la NAT dans iptables pour que les VE puissent accéder a internet (Exemple avec la carte Eth0 sur le serveur) :

nano $HOME/nat_VE.sh
chmod 700 $HOME/nat_VE.sh
#!/bin/bash
# Active les Nattage au reboot
 
# Toutes les VE accède au NET
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to IP_DU_SERVEUR
crontab -e
 @reboot /root/nat_VE.sh

Egalement, pour des raisons de simplification sur d'éventuels tutoriels trouvés sur Internet :

ln -s /var/lib/vz /vz

Création des machines virtuelles (VE)

On attaque enfin la partie intéressante :-P

Template

Bon, tout d'abord la notion de template.

Notion de template

Très simplement, un template est une archive tar.gz (généralement) qui va contenir la base du système d'exploitaition de votre machine virtuelle. Elles se trouvent dans :

 /vz/template/cache

Vous pouvez en obtenir ici :
http://download.openvz.org/contrib/template/precreated/

J'en ai testée pas mal, et à part celle de ubuntu, debian, et gentoo, le reste c'est un peu galère…
Je mettrai plus tard à disposition des VE toutes prêtes qui intègrent des services comme un :

 VE-serveur-ftp,
 une VE-serveur-nagios,
 etc…

Bon, j'ai téléchargé mes templates, qu'est-ce que je fais maintenant ?

Création de la machine virtuelle

Assez papoté :-P

On créé notre machine virtuelle :

 vzctl create $numero_de_la_machine --ostemplate $votre_template_sans_extensions

→ $numero_de_la_machine sera la numéro de votre machine virtuelle. La valeure minimale est 100
→ $votre_template_sans_extension sera le nom de l'archive que vous avez placée dans /vz/template/cache mais sans l'extension (ne marche pas avec tar.bz2 je crois).

Scripts de création de VE

Un script perso de création de machines virtuelles.

Des questions vont vous être posées comme l'allocation de RAM, d'espace disque ou de CPU.

Je n'offre aucune garantie sur le fonctionnement de ce script.
nano $HOME/creation_VE.sh
chmod 700 $HOME/creation_VE.sh
creation_VE.sh
#!/bin/bash
 
clear
 
##################################
#### Affichage des VE actives ####
##################################
 
echo "    --------Les differents VE en cours d'utilisation-------"
vzlist
 
################################
#### Selection du templates ####
################################
 
PS3="Selection -> "
echo "Selectionner l'OS de votre template"
select template in "Ubuntu-8.04-x86" "Debian-5.0-x86"; do
 
#########################
#### En cas d'erreur ####
#########################
 
if [ -z "$template" ]
then
    echo "Erreur: entrez un des chiffres proposes." 1>&2
 
##############################
#### Cas du premier choix ####
##############################
 
elif [ "$REPLY" -eq 1 ]
then
    template=ubuntu-8.04-x86-minimal
    break
 
#############################
#### Cas du second choix ####
#############################
 
elif [ "$REPLY" -eq 2 ]
then
    template=debian-5.0-x86-minimal
    break
fi
done
 
########################################
#### Numero de la machine virtuelle ####
########################################
echo -n "Entrez le numero du VPS (min=100) : "
read numero
 
##################################
#### Nom d'hôte de la machine ####
##################################
echo -n "Entrez son hostname : "
read hostname
 
######################################################################################################
#### Ip de la machine, je vous conseille de choisir un sous-réseau (on verra le nattage plus tard ####
######################################################################################################
echo -n "Entrez l'adresse IP du VPS : "
read adresseip
 
##############################
#### Serveur DNS de la VE ####
##############################
echo -n "Entrez le serveur de nom : "
read serveurdns
 
##############################################################
#### Nettoyage de l'affichage et affichage des partitions ####
##############################################################
clear
df -h
 
########################################
#### Taille à allouer à la VE en Mo ####
########################################
 
echo -n "Entrez le seuil d'alerte d'utilisation du disque dur en Mo : "
read diskutil
 
echo -n "Entrer la limite d'utilisation du disque dur en Mo : "
read diskmax
 
clear
 
#############################
#### Limitation du CPU ? ####
#############################
echo -n "Entrer l'utilisation CPU maximum en % /!\1cpu= /100% 2cpu= /200%...(0=unlimited): "
read cpulimit
 
##############################
#### Des stats sur les VE ####
##############################
vzcpucheck -v
 
###########################
#### Ressources des VE ####
###########################
echo -n "Entrer la capacite max d'utilisation CPU en unites de temp : "
read cpuunits
 
###########################
#### Création de la VE ####
###########################
vzctl create "$numero" --ostemplate "$template"
 
######################################
#### Etablissement des paramètres ####
######################################
 
vzctl set "$numero" --nameserver "$serveurdns" --hostname "$hostname" --ipadd "$adresseip" --onboot yes --diskspace "$diskutil"M:"$diskmax"M --kmemsize unlimited --oomguarpages unlimited  --privvmpages unlimited --vmguarpages unlimited --numproc unlimited --numtcpsock unlimited --numothersock unlimited --lockedpages unlimited --numpty unlimited --numiptent unlimited --shmpages unlimited --numsiginfo unlimited --numflock unlimited --numfile unlimited --cpuunits  "$cpuunits" --cpulimit "$cpulimit" --tcpsndbuf unlimited --tcprcvbuf unlimited --othersockbuf unlimited --dgramrcvbuf unlimited --dcachesize unlimited --diskinode unlimited --physpages unlimited --save
 
############################
#### Demarrage de la VE ####
############################
vzctl start "$numero"

Configuration de la machine virtuelle

Si vous n'avez pas envie de passer par mon script, voici un fichier de configuration tout prêt (explications ci-dessous) :

 cat /etc/vz/conf/100.conf

Résultat :

ONBOOT="yes"
 
# UBC parameters (in form of barrier:limit)
KMEMSIZE="2147483647:2147483647"
LOCKEDPAGES="2147483647:2147483647"
PRIVVMPAGES="2147483647:2147483647"
SHMPAGES="2147483647:2147483647"
NUMPROC="2147483647:2147483647"
PHYSPAGES="2147483647:2147483647"
VMGUARPAGES="2147483647:2147483647"
OOMGUARPAGES="2147483647:2147483647"
NUMTCPSOCK="2147483647:2147483647"
NUMFLOCK="2147483647:2147483647"
NUMPTY="2147483647:2147483647"
NUMSIGINFO="2147483647:2147483647"
TCPSNDBUF="2147483647:2147483647"
TCPRCVBUF="2147483647:2147483647"
OTHERSOCKBUF="2147483647:2147483647"
DGRAMRCVBUF="2147483647:2147483647"
NUMOTHERSOCK="2147483647:2147483647"
DCACHESIZE="2147483647:2147483647"
NUMFILE="2147483647:2147483647"
AVNUMPROC="180:180"
NUMIPTENT="2147483647:2147483647"
 
# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="25360000:25872000"
DISKINODES="2147483647:2147483647"
QUOTATIME="0"
 
# CPU fair sheduler parameter
CPUUNITS="100000"
 
 
VE_ROOT="/var/lib/vz/root/$VEID"
VE_PRIVATE="/var/lib/vz/private/$VEID"
OSTEMPLATE="debian-5.0-x86"
ORIGIN_SAMPLE="vps.basic"
IP_ADDRESS="192.168.0.1"
HOSTNAME="iroffer"
NAMESERVER="208.67.222.222"
CPULIMIT="0"

Explications des valeurs importantes de ce fichier :

→ CPULIMIT : pas de limitation CPU dans la VE
→ NAMESERVER : le serveur DNS
→ HOSTNAME : le nom d'hôte de la VE
→ IP_ADDRESS : adresse IP de la VE
→ OSTEMPLATE : template sur lequel à été créé la VE

VE_ROOT=”/var/lib/vz/root/$VEID”
VE_PRIVATE=”/var/lib/vz/private/$VEID” ← chemin du contenu de la VE
DISKSPACE=“25360000:25872000” : espace disque alloué (ici 25 Go)
KMEMSIZE=“2147483647:2147483647” : RAM allouée (ici 2 Go)

ONBOOT=“yes” : démarrage automatique de la VE au reboot du serveur Physique.
Routage des ports extérieurs sur les VE

Rediriger les ports

Ensuite il faut rediriger des ports pour que les VE soit accessible de l'extérieur.

Le script suivant évitera de passer par les fastidieuses commandes iptables.
Il inscrira les “routes” additionnelles dans le script ”/root/natVE.sh” créé lors de l'installation.

nano /root/natVE.sh
chmod 700 /root/natVE.sh
#!/bin/bash
 
#################################
#### Afficher la conf reseau ####
#################################
 
echo "    ---------Configuration réseau------------"
cat /etc/network/interfaces
 
#################################
#### Afficher les VE activés ####
#################################
 
echo "    ----------Les différents VE en cours d'utilisation-------------"
vzlist
 
##########################################
#### Selection du protocole : TCD/UDP ####
##########################################
 
PS3="Selection -> "
echo "Sélectionner le type de port"
select porttype in "udp" "tcp"; do
 
#########################
#### En cas d'erreur ####
#########################
 
if [ -z "$porttype" ]
then
   echo "Erreur: entrez un des chiffres proposés." 1>&2
 
##############################
#### Cas du premier choix ####
##############################
 
elif [ "$REPLY" -eq 1 ]
then
    porttype=udp
    break
 
#############################
#### Cas du second choix ####
#############################
 
elif [ "$REPLY" -eq 2 ]
then
   porttype=tcp
   break
fi
done
 
##################################
#### Selection de l'Interface ####
##################################
 
PS3="Selection -> "
echo "Sélectionner l'interface réseau du serveur accessible depuis internet"
select ethtype in "eth0" "eth1" "wlan0"; do
 
#########################
#### En cas d'erreur ####
#########################
if [ -z "$ethtype" ]
then
   echo "Erreur: entrez un des chiffres proposés." 1>&2
 
##############################
#### Cas du premier choix ####
##############################
 
elif [ "$REPLY" -eq 1 ]
then
   ethtype=eth0
   break
 
#############################
#### Cas du second choix ####
#############################
 
elif [ "$REPLY" -eq 2 ]
then
   ethtype=eth1
   break
 
################################
#### Cas du troisieme choix ####
################################
elif [ "$REPLY" -eq 3 ]
then
   ethtype=wlan0
   break
fi
done
 
########################################
#### Infos diverses pour le nattage ####
########################################
 
echo -n "Entrez le numéro de la VE : "
read numero
 
echo -n "Entrer l'adresse IP du VE : "
read adresseipve
 
echo -n "Entrer l'adresse IP de la carte réseau lan du serveur : "
read adresseipserv
 
##########################
#### Saisie des ports ####
##########################
 
echo -n "Etrez le port de destination sur le VE : "
read portve
 
echo -n "Etrez le port source (coté serveur) : "
read portserv
 
########################################
#### Création de la règles iptables ####
########################################
 
iptables -t nat -A PREROUTING -p "$porttype" -d "$adresseipserv" --dport "$portserv"   -i "$ethtype" -j DNAT --to-destination "$adresseipve":"$portve"
 
######################################
#### Copie de la règle de nattage ####
######################################
 
echo "#### Nat sur VE "$numero" port "$adresseipserv":"$portserv" -> "$adresseipve":"$portve"" >> /root/nat_VE_Reboot.sh
echo "/sbin/iptables -t nat -A PREROUTING -p "$porttype" -d "$adresseipserv" --dport "$portserv" -i "$ethtype" -j DNAT --to-destination "$adresseipve":"$portve"" >> /root/natVE.sh
 echo "alias natVE='/root/scripts/natVE.sh'" >> /root/.bashrc
 natVE

Pour faire les choses proprement, vous devrez ajouter ces lignes en début de votre script :

#!/bin/bash
 
# Vider les tables actuelles
/sbin/iptables -t filter -F
 
# Vider les regles personnelles
/sbin/iptables -t filter -X
 
# Vider les regle de nattage
/sbin/iptables -t nat -X
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -X
/sbin/iptables -t mangle -F
 
# Ne pas casser les connexions etablies
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# Interdire toute connexion entrante et sortante
/sbin/iptables -t filter -P INPUT DROP
/sbin/iptables -t filter -P FORWARD ACCEPT
/sbin/iptables -t filter -P OUTPUT ACCEPT
 
# Autoriser loopback
/sbin/iptables -t filter -A INPUT -i lo -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -o lo -j ACCEPT
 
#Autoriser le net au VE
/sbin/iptables -t filter -A INPUT -i venet0 -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -o venet0 -j ACCEPT
 
#Autoriser tout en sortie
/sbin/iptables -t filter -A OUTPUT -o eth0 -j ACCEPT
 
# ICMP (Ping)
/sbin/iptables -t filter -A INPUT -p icmp -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -p icmp -j ACCEPT
 
### Quand les VE accedent au net c'est l'@ip publique qui est vue
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to IP_SERVEUR

Clonage d'une VE

Soit 222 l'id de l'ancienne ve et 333 l'id de la nouvelle ve à créer:

OLDVE=222 
NEWVE=333 
vzctl stop $OLDVE
mkdir /vz/root/$NEWVE
cp /etc/vz/conf/$OLDVE.conf /etc/vz/conf/$NEWVE.conf
mkdir /vz/private/$NEWVE
pushd /vz/private/$OLDVE; tar c --numeric-owner * | tar x --numeric-owner -C /vz/private/$NEWVE; popd
vi /etc/vz/conf/$NEWVE.conf # Change the IP_ADDRESS
vzctl start $NEWVE; vzctl start $OLDVE

Commandes utiles

→ vzlist : liste les VE actives
→ vzlist -a : liste toutes les VE existantes
→ vzctl start $numero : demarre la VE possedant ce $numero
→ vzctl stop $numero : stop la VE possedant ce $numero
→ vzctl restart $numero : redemarre la VE possedant ce $numero
→ vzctl destroy $numero : detruit la VE possedant ce $numero. La VE doit être au préalable éteinte.
→ vzctl exec $numero ma_commande : exécute ma_commande dans la VE n° $numéro
→ vzctl create $numero –ostemplate $template_name : créé une VE à partir du $template_name se trouvant dans /vz/template/cache
→ vzctl chkpnt $numero [–dumpfile <name>] : prend un snapshot de la VE
→ vzctl restore $numero [–dumpfile <name>] : restaure à partir d'un snapshot

Création d'une template

Cet exemple est pour une Ubuntu Hardy 8.04

Pre-requis, debootstrap :

apt-get install debootstrap
cd /vz/private
mkdir hardy-chroot
debootstrap [--arch ''ARCH''] hardy hardy-chroot
mv /vz/private/hardy-chroot /vz/private/777
chown -Rv root /vz/private/777
vzctl set 777 --applyconfig vps.basic --save
echo "OSTEMPLATE=ubuntu-8.04" | sudo tee -a /etc/vz/conf/777.conf >/dev/null
vzctl set 777 --ipadd x.x.x.x --save
vzctl set 777 --nameserver x.x.x.x --save
rm /vz/private/777/etc/rcS.d/S10udev /vz/private/777/etc/rc2.d/S11klogd
vzctl start 777
vzctl enter 777

<note importante>Attention !! Vérifiez bien que vous êtes dans la VE. Je ne serais pas tenu responsable des éventuels dégats que vous causerez sur votre machine autrement.

apt-get remove --purge busybox-initramfs console-setup dmidecode eject \
ethtool initramfs-tools klibc-utils laptop-detect libiw29 libklibc \
libvolume-id0 mii-diag module-init-tools ntpdate pciutils pcmciautils ubuntu-minimal \
udev usbutils wireless-tools wpasupplicant xkb-data tasksel tasksel-data
apt-get remove --purge --auto-remove dhcp3-client dhcp3-common
rm -fr /lib/udev
initctl stop tty1
initctl stop tty2
initctl stop tty3
initctl stop tty4
initctl stop tty5
initctl stop tty6
rm /etc/event.d/tty*
rm /etc/init/tty*
chmod 700 /root
usermod -p ‘!’ root
ln -s /bin/true /sbin/modprobe
cat >/etc/apt/sources.list <<EOF
# Binary
deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse
deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu hardy-security main restricted universe multiverse
 
# Binary Canonical
# deb http://archive.canonical.com/ubuntu hardy partner
 
# Binary backport
# deb http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
 
# Source
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted universe multiverse
 
# Source backport
# deb-src http://${COUNTRY}archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
 
# Source Canonical
# deb-src http://archive.canonical.com/ubuntu hardy partner
apt-get update && apt-get upgrade

On installe des paquets utiles :

apt-get install ssh quota
rm -f /etc/ssh/ssh_host_*
cat << EOF > /etc/rc2.d/S15ssh_gen_host_keys
#!/bin/sh
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''
rm -f \$0
chmod a+x /etc/rc2.d/S15ssh_gen_host_keys
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
update-rc.d -f mtab.sh remove
update-rc.d -f klogd remove
echo "localhost" > /etc/hostname
echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
cd /dev && /sbin/MAKEDEV ptyp
echo "" > /etc/resolv.conf
apt-get clean
echo "" > /var/log/messages; > /var/log/auth.log; > /var/log/kern.log; > /var/log/bootstrap.log; \
> /var/log/dpkg.log; > /var/log/syslog; > /var/log/daemon.log; > /var/log/apt/term.log; rm -f /var/log/*.0 
/var/log/*.1
exit

Préparation de la compression du template.

On supprime l'ip temporaire qu'on lui a affecté.

vzctl set 777 --ipdel all --save
vzctl stop 777
cd /vz/private/777
tar czfv /vz/template/cache/ubuntu-8.04-<arch>-minimal.tar.gz

.

vzctl destroy 777
rm -f /etc/vz/conf/777.conf.destroyed

Proxmox

Introduction

Proxmox Virtual Environment est un logiciel libre de virtualisation, plus précisément un hyperviseur de machine virtuelle. Il est développé et maintenu par Proxmox Server Solutions GmbH avec un support financier de l'Internet Foundation Austria (IPA).

Proxmox VE installe les outils complets du système d'exploitation et de gestion en 3 à 5 minutes (dépend du matériel utilisé).

Ce logiciel est un « système à nu ». Le terme de « système à nu » signifie que vous commencez à partir d'un serveur vide et qu'il n'y a donc nul besoin d'installer un système d'exploitation auparavant.

Le logiciel inclut :

source : Wikipédia on Proxmox :-P

Bon, plus simplement, ça va vous permettre de faire tout ce que vous faisiez avec OpenVZ (voir même plus vu que ça gère du KVM et du Qemu). Screenshots

Ca vaut toujours mieux qu'un long discours :-P :

Informations générales :
openvz-proxmox2.jpg



1)
N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !