Atelier OpenVZ

Introduction

Le but de ce document est de permettre de faire l'atelier, pas à pas, en suivant les instructions, vous-même! En cas de problème, n'hésitez-pas à me demander de l'aide. Les personnes avancées peuvent soit aider les autres participants, soit lire les scripts, et documentations et références.

La première version de ce document était plus complexe. Avec l'arrivée de lenny en stable, et les améliorations au package CRIL openvz-support, les étapes sont vraiment simplifiées.

Etape 1: installation de Debian lenny

A l'aide du CD d'installation réseau (netinstall), installer par réseau une Debian lenny sans configuration particulière. Notez que si votre machine est compatible amd64/emt64 (c'est le cas de tous les AMD et Intel récents), vous pouvez bénéficier d'une installation en 64 bits. Les machines virtuelles OpenVZ pourront, elles, être utilisées en 32 ou 64 bits. Pour le moment, sauf cas spéciaux, je recommande un système de base en 64 bits, et des machines virtuelles 32 bits.

  • Choose a language: C; choose a country: Europe/Switzerland; Keymap Swiss/French

  • DHCP: Hostname: vzhost1; domain: alphanet.ch

  • Partitionning: Guided, use entire disk; All files in a single partition; Finish partitionning; Yes.

  • Root password: demo; User: demo, demo, password demo.

  • Package survey: à ce moment ALT-F2, chroot /target; vi /etc/apt/sources.list, insérer avant ftp.ch.debian.org mirror local si utilisé; apt-get update; exit

  • Software selection
    • dans tous les cas: Standard system
    • si désiré Desktop environment

Connexion et installation de quelques packages utiles
  • vi /etc/apt/sources.list, commenter le CD si pas déjà fait
  • apt-get update && apt-get -u dist-upgrade
  • apt-get install tcpdump ltrace strace telnet ssh rsync
  • apt-get clean

NB: on aurait pu utiliser FAI ou du preseeding, mais il y a peu de choses à faire, on a donc installé manuellement, plutôt que de dupliquer sur les 5 autres machines avec dd ou tar et ensuite de modifier juste le nom de la machine /etc/hostname, /etc/hosts, /etc/mailername et s'occuper de z25 (alias carte réseau).

Avancés
  • il pourrait être intéressant d'utiliser LVM et d'installer chacune des machines virtuelles dans son propre volume logique (LV), ce qui permet de supprimer la gestion des quotas machines OpenVZ.
  • pour configurer les jeux de caractères selon le standard CRIL, faire comme suit
    • dpkg-reconfigure locales
      • ne générer que fr_CH.ISO-8859-1
      • laisser la locale à C
    • cat >> /etc/environment < EOF
      LANG="C"
      LC_CTYPE="fr_CH.ISO-8859-1"
      LC_COLLATE="fr_CH.ISO-8859-1"
      EOF
      

Etape 2: ajout des sources d'installation CRIL, du bon kernel et du package openvz-support et des outils

Sous root:
echo >> /etc/apt/sources.list deb http://packages.cril.ch/cril/debian/packages/ etch cril
wget -O - http://www.cril.ch/pub/CRIL/WebHome/3D79EDCA.asc | apt-key add -
apt-get update && apt-get -u dist-upgrade

# NB: remplacer amd64 par i386 si vous avez installé Debian lenny i386
# (va également installer les outils openvz)
apt-get install linux-image-2.6-openvz-amd64

# redémarrer à ce stade et vérifier que les commandes suivantes fonctionnent:
#   uname -a # doit indiquer un kernel openvz
#    vzlist # ne doit pas indiquer d'erreur

apt-get install openvz-support
# il faut copier la configuration attachée à ce topic dans /etc/default/openvz-support
/usr/lib/openvz-support/scripts/install-openvz --complete
# à ce stade, redémarrer, ou lancer /etc/init.d/openvz-support start

Cette dernière procédure préconfigure le réseau pour notre utilisation, ainsi que des redirections de ports de 2222 à 2231 (pour 192.168.100.100:22 à 192.168.100.109:22), utile par exemple pour accéder via l'adresse publique. Consultez /etc/rc.local pour voir ce que fait ce script.

  • openvz-support: Default openvz-support config
    • vérifier: pas 64 bits pour les VZ!

Avancés
  • le kernel OpenVZ de lenny ne supporte pas certaines fonctions, comme par exemple l'allocation de temps CPU. Il est possible d'installer un kernel "officiel" OpenVZ, consulter leur Wiki et surtout http://bugzilla.openvz.org/show_bug.cgi?id=909. C'est peu recommandé.

Etape 3: création de templates à l'aide du support

L'idée est de préparer une version de base d'un OS (ici Debian) à utiliser comme template lors de la création de nouvelles machines virtuelles. Cette génération se fait notamment grâce à l'outil debootstrap et une archive Debian.

Sous root:
apt-get install debootstrap
/usr/lib/openvz-support/scripts/create-template

Attention: le numéro de VM 777 est réservé pour la création de templates. Cette création prend environ 10 minutes sur une machine Phoenix avec une bonne connexion réseau. Utilisez ce temps à lire les manuels systèmes concernant les commandes (voir étape 6 ci-dessous).

(voir aussi http://wiki.openvz.org/Debian_template_creation)

En cas de nécessité (arrêt au milieu de l'installation), faire:
vzctl stop 777; rm -rf /etc/vz/conf/777.conf  /var/lib/vz/private/777
et réessayer.

Etape 4: création d'une machine virtuelle à l'aide du support

Nous allons créer une machine virtuelle portant le numéro 100. Par convention, elle sera également accessible en 192.168.100.100 (p.ex. ses services: ssh, etc). Voir /etc/default/openvz-support pour cette configuration et /etc/rc.local.

Nous allons définir que cette VM prendra la moitié des ressources de la machine, cela se fait à l'aide de l'outil vzsplit. Une configuration plus fine est certes possible, mais en général utiliser cet outil est plus fiable que de deviner des limites à la main.

/usr/lib/openvz-support/scripts/vz-instanciate 100

vzlist -a

# Appliquer les limites
# (pour être propre, éditer ensuite le fichier et supprimer les doublons!)
vzsplit -n 2 >> /etc/vz/conf/100.conf

Si nécessaire, vous pouvez détruire la VM 100:
vzctl stop 100
vzctl destroy 100

Etape 5: manipulations

Essayez-vous aux diverses opérations suivantes:

  • démarrer et stopper une VM: vzctl start 100, vzctl stop 100

  • liste des processus depuis le système englobant: ps auxw | more

  • liste des processus depuis la machine hébergée (VM): vzctl exec 100 ps auxw | more

  • mémoire libre et espace disque dans les deux cas (free, df))

  • n'hésitez pas à consulter les manpages: vzctl(8), vz p.ex. man 8 vzctl, man vz, ainsi que toutes les manpages associées (voir man -k vz), notamment vzsplit(8)), vzlist et exécutez ces diverses commandes après avoir lu le manuel!

  • connectez-vous en ssh sur la VM 100
    • lancez le programme perl -e 'while (1) { }' et déterminez combien de CPU est utilisé sur la machine hébergée (VM) et la machine hôte. Modifiez éventuellement le CPU alloué à la VM à l'aide de la commande vzctl set 100 --cpulimit 25%. Est-ce que cela change en temps réel ? A quoi pourrait servir l'option --save dans le changement de paramètres ? Quels paramètres peuvent-être modifiés ? (voir vzctl set), Terminez le programme avec CTRL-C.
      • NB: ne fonctionnera pas avec le kernel openvz de lenny (toujours 100% des ressources)
    • essayez d'augmenter la mémoire disponible et l'espace disque (cf http://wiki.openvz.org/UBC_parameters)
    • installez le package apache2 et vérifiez qu'il fonctionne (port 80 de l'adresse IP de 100)
      • si apache ne démarre pas (ps auxw | grep apache, dans la VM!), faites tail /var/log/apache2/error.log
        • modifiez /etc/apache/apache2.conf
          • diminuez le nombre de thread dans IfModule mpm_worker_module

  • nous allons crée une copie de la VM 100 dans la VM 101:
    • dupliquez la VM 100 dans la VM 101 comme suit:
      cp /etc/vz/conf/100.conf /etc/vz/conf/101.conf
      vzctl create 101
      vzctl stop 100 # pas on-line
      rsync -aH --delete /var/lib/vz/private/100/. /var/lib/vz/private/101/.
      vzctl start 100
      
    • changez la configuration IP et p.ex. de nom de la machine via vzctl set
      (indications
      utiliser --save et --ipdel 192.168.100.100 et --ipadd 192.168.100.101)
    • démarrez cette VM et testez qu'Apache répond également.
    • faites date > /var/www/bla dans cette VM et contrôlez qu'Apache sur cette VM liste ce fichier, mais pas sur l'autre VM 100; p.ex. avec
      w3m http://192.168.100.101/bla
    • faudrait-il changer la clé SSH privée de machine de cette nouvelle VM ? y-a-t-il d'autres choses qui peuvent être à faire dans le cas d'une telle copie ?
    • imaginez ce qu'il faudrait faire pour intégrer une machine réelle comme VM

  • documentez-vous sur la commande vzmigrate. Qu'est-ce que la migration on-line ?
    • connectez-vous en SSH sur la VM 100 depuis le host: ssh 192.168.100.100 -l root
    • suspendez la VM: vzctl 100 checkpnt
    • faites vzlist -a
    • confirmez que la session SSH est coincée
    • n'attendez pas trop (timeout règles firewall p.ex.) et faites: vzctl 100 restore
    • la session SSH continue-t-elle ?
    • où est stocké l'état de la VM pendant "suspend" (deux endroits) ?
    • comment feriez-vous pour une migration transparente entre deux machines physiques d'une VM ?

  • sur le modèle de /etc/rc.local, ajoutez une redirection de port sur l'adresse publique de votre système de manière à ce que l'Apache de chaque machine virtuelle soit accessible sous 10080 + 100 * (adresse - 100)

  • consultez /proc/user_beancounters et déterminez si des dépassements de ressource ont eu lieu; si oui que proposez-vous ?

  • on aimerait pouvoir utiliser sshfs, encfs ou d'autres systèmes de fichiers basés sur fuse. Pour ce faire il faut charger le module kernel fuse: modprobe fuse (dans l'hôte), et autoriser ce périphérique dans la VM (cf --devices dans vzctl(8)).

  • comparez ce script: stgraber-ubuntu-template: Script de création de template pour Ubuntu au script dans le package openvz-support.

  • comment fonctionne les "hooks" permettant de créer des VZ dans des LV indépendants (volumes logiques) (indication: /etc/openvz-support/run-part.d/sample*)

Indications
  • si vous voulez depuis une machine qui n'a PAS de sous-réseau 192.168.100 local accéder au sous-réseau 100 de la machine 192.168.1.193, faire:
    route add -net 192.168.100.0/24 gw 192.168.1.193
    

Quelques conseils

  • travailler en mode NAT est plus flexible, mais plus complexe: dans certains cas, travailler en mode "quasi-bridge" est soit nécessaire (support des broadcast pour le voisinage réseau Microsoft), soit plus simple, en particulier s'il y a plusieurs adresses IP, ou le besoin d'auto-accès (des services de la VM accèdent à des services locaux sous certaines adresses IP)

  • si la version de GNU/Linux en VZ n'est pas la même que celle du host (en particulier le kernel), il peut y avoir de petits problèmes de compatibilité. Testez en particulier bien: votre IDENTd, Asterisk.

  • si vous utilisez un filesystem par VZ (p.ex. extX sur LVM), désactivez la gestion des quotas (DISK_QUOTA=no), c'est plus performant

  • pour transformer une machine réelle en machine virtuelle
    • faire une archive du filesystem
    • créer une VZ (vzctl create ou via openvz-support)
      • on peut travailler avec un template incorrect, mais alors modifier /etc/vz/conf/10X.conf pour que l'OS soit correct (cf dpkg -L vzctl), p.ex. debian-5.0, ainsi openvz pourra correctement modifier le hostname, les adresses IP et autres.
    • extraire les données (-p --numeric-owner ou -aH --numeric-ids avec rsync)
    • évt. faire quelques patches si nécessaire, p.ex.
      #! /bin/bash
      
      VEID=101
      . /etc/vz/vz.conf
      
      vzctl stop $VEID
      
      cat >> $VE_PRIVATE/tmp/sh-script <<"EOF"
      #! /bin/bash
      
      # handled by host
      dpkg --purge ntpd
      
      mv /etc/init.d/checkroot.sh /etc/init.d/checkroot.sh.DIS \
         && cat > /etc/init.d/checkroot.sh << "END"
      # placeholder in VZ mode
      
      mkdir -p /dev/pts
      mount none -t devpts /dev/pts
      
      mkdir -p /proc
      mount /proc
      
      mkdir -p /sys
      mount -t sysfs none /sys
      END
      
      sed --in-place 's/^\(.* tty[0-9]\)$/#\1/' /etc/inittab 
      
      EOF
      
      cp -a /dev/. $VE_PRIVATE/dev
      mv $VE_PRIVATE/etc/rcS.d/S10checkroot.sh $VE_PRIVATE/etc/rcS.d/S01checkroot.sh
      rm $VE_PRIVATE/etc/mtab
      
      chmod a+rx $VE_PRIVATE/tmp/sh-script
      
      chroot $VE_PRIVATE /tmp/sh-script
      
      

  • excluez /var/lib/vz/root des sauvegardes, de find/locate, etc.
    • vous pouvez y monter des filesystem via un /etc/vz/conf/10X.mount script.

  • pour sauvegarder les VZ
    • système et données (/var/lib/vz/private/10X): tar ou rsync
    • données "actives" (bases de données, fichiers DBM indexés, repository SVN, etc): faire des dumps réguliers avec historique, sous forme de fichiers textes et/ou compressés, sauvegardés dans la sauvegarde système
      • on peut aussi lancer des scripts via vzctl exec 10X "au bon moment".

-- MarcSCHAEFER - 30 Dec 2008
Topic attachments
I Attachment Action Size Date Who Comment
atelier-openvz.pdfpdf atelier-openvz.pdf manage 86.2 K 09 Jan 2009 - 15:44 MarcSCHAEFER Version imprimable
stgraber-ubuntu-templateEXT stgraber-ubuntu-template manage 2.6 K 06 Jan 2009 - 20:27 MarcSCHAEFER Script de création de template pour Ubuntu
Topic revision: r9 - 04 Aug 2011, MarcSCHAEFER
 

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback