Outils personnels
Vous êtes ici : Accueil GNU / Linux Debian Installer et configurer Xen sur Debian 4.0 Etch et 5.0 Lenny
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Installer et configurer Xen sur Debian 4.0 Etch et 5.0 Lenny

Par Pierre-Yves Landuré - Dernière modification 06/03/2011 21:52

Xen est une solution de virtualisation libre et gratuite disponible dans les dépôts de Debian 4.0 Etch. Cet article vous guide au travers de l'installation, la configuration et l'utilisation de Xen sur Debian 4.0 Etch et 5.0 Lenny.

Pour information

Dans ce guide, je parlerai en permanence de machines virtuelles. Cependant, Xen a sa propre terminologie. Dans une configuration Xen, les machines virtuelles instanciées (c'est à dire démarrées) sont appelées "Domaines".

Une fois votre machine configurée pour faire fonctionner Xen, tous les systèmes d'exploitation tournent dans des "domaines". Le système d'exploitation d'origine, ou se trouvent installés les outils de contrôle de Xen, est appellé le "dom0" (pour domaine n°0). Tous les systèmes d'exploitation invités sont dit installés dans un "domU" (pour domaine utilisateur).

Comme je suis un peut pantouflard, je n'ai pas envie de m'imposer cette torsion mentale, et je ne parlerai que de machines virtuelles pour simplifier le schmilblick. Aussi, si vous lisez ce guide, ne hurlez pas à mort à cause des dénominations.

Prérequis

Ce guide fait usage des possibilités de LVM. Si vous ne savez pas ce que c'est ou que vous souhaitez mettre en place LVM sur votre machine, je vous conseille de lire l'article suivant:

LVM, une autre manière de partitionner.

De plus, nous allons avoir besoin de apg pour générer les mots de passe des utilisateurs des machines virtuelles:

command apt-get install apg

Installation

Installez l'hyperviseur Xen, le noyau Xen destiné au Dom0, et d'autres outils.

Remarque : Le bloc de commandes suivant détecte votre architecture, et votre version de Debian GNU / Linux (entre 4.0 Etch, 5.0 Lenny et Squeeze).

if [ -n "$(command grep -e "squeeze" "/etc/debian_version")" ]; then
  # The OS is a Debian 6.0 Squeeze.
  if [ "$(command uname --machine)" = "x86_64" ]; then
    command apt-get -y install xen-hypervisor-amd64 linux-image-2.6-xen-amd64 \
        linux-headers-2.6-xen-amd64 xen-utils-4.0 xen-tools bridge-utils
  else
    command apt-get -y install xen-hypervisor-i386 linux-image-2.6-xen-686 \
        linux-headers-2.6-xen-686 xen-utils-4.0 xen-tools bridge-utils
  fi
elif [ -n "$(command grep -e "^5.0" "/etc/debian_version")" ]; then
  # The OS is a Debian 5.0 Lenny.
  if [ "$(command uname --machine)" = "x86_64" ]; then
    command apt-get -y install xen-hypervisor-amd64 linux-image-2.6-xen-amd64 \
        linux-headers-2.6-xen-amd64 xen-utils-3.2-1 xen-tools bridge-utils
  else
    command apt-get -y install xen-hypervisor-i386 linux-image-2.6-xen-686 \
        linux-headers-2.6-xen-686 xen-utils-3.2-1 xen-tools bridge-utils
  fi
elif [ -n "$(command grep -e "^4.0" "/etc/debian_version")" ]; then
  # The OS is a Debian 4.0 Etch.
  if [ "$(command uname --machine)" = "x86_64" ]; then
    command apt-get -y install linux-image-2.6-xen-vserver-amd64 \
        linux-headers-2.6-xen-vserver-amd64 xen-hypervisor-3.0.3-1-amd64 \
        xen-tools bridge-utils
  else
    command apt-get -y install linux-image-2.6-xen-vserver-686 \
        linux-headers-2.6-xen-vserver-686 libc6-xen xen-hypervisor-3.0.3-1-i386-pae \
        xen-tools bridge-utils
  fi

  if [ -n "$(command grep -e "svm" -e "vmx" "/proc/cpuinfo")" ]; then
    # The processor has a ioemu support.
    command apt-get -y install xen-ioemu-3.0.3-1
  fi
fi

Si vous utilisez Grub 2 (paquet grub-pc), assurez-vous que les noyaux Xen sont mis en première position et désactivez la découverte automatique des OS pour ne pas ajouter vos DomU au boot Grub :

if  [ -d "/etc/grub.d" ]; then
  command mkdir "/etc/grub.d.disabled"
  if [ -f "/etc/grub.d/06_OVHkernel" ]; then
    command mv "/etc/grub.d/06_OVHkernel" "/etc/grub.d.disabled/06_OVHkernel"
  fi
  if [ -f "/etc/grub.d/10_linux" ]; then
    command mv "/etc/grub.d/10_linux" "/etc/grub.d.disabled/10_linux"
  fi
fi
echo '# Disable OS probing.
GRUB_DISABLE_OS_PROBER=true' >> /etc/default/grub

Ajoutez les lignes nécessaires à la configuration des noyaux Xen à votre fichier de configuration Grub :

if [ -e "/etc/default/grub" ]; then
  if [ -z "$(command grep "GRUB_CMDLINE_XEN" "/etc/default/grub")" ]; then
    echo '
# Xen kernels configuration
GRUB_CMDLINE_XEN_DEFAULT=""
GRUB_CMDLINE_XEN=""' >> "/etc/default/grub"
  fi
fi

Générez un nouveau fichier de configuration pour Grub :

command update-grub
Redémarrez votre serveur afin d'utiliser le noyau spécifique à l'hyperviseur Xen :
command reboot

Amélioration des performances

Afin de maximiser les performances de votre installation Xen, assignez en permanence au moins un processeur réel à votre dom0 :

CPU_COUNT="1"

Appliquez ce paramètre à la configuration de votre hyperviseur :

command sed -i -e "s/^[# ]*\((dom0-cpus\).*\().*\)\$/\1 ${CPU_COUNT}\2/" \
         /etc/xen/xend-config.sxp

Remarque : Cette configuration règle le problème de kernel panic à la création d'un domaine sous Debian 4.0 Etch (Source: Merci à Gerald Hochegger pour son e-mail Bug#410807: workaround: linux-image-2.6.18-4-xen-amd64: Kernel BUG at drivers/xen/core/evtchn.c:481)

Modifiez le fichier de configuration de Grub afin que le nombre de  limiter le volume de mémoire assigné à la machine virtuelle au boot :

if [ -e "/etc/default/grub" ]; then
  command sed -i -e "s/\(GRUB_CMDLINE_XEN_DEFAULT=.*\)\"/\1 dom0_max_vcpus=${CPU_COUNT} dom0_vcpus_pin=1\"/" \
         "/etc/default/grub"
fi
if [ -e "/boot/grub/menu.lst" ]; then
  command sed -i -e "s/\(xenhopt=.*\)/\1 dom0_max_vcpus=${CPU_COUNT} dom0_vcpus_pin=1/" \
         "/boot/grub/menu.lst"
fi

Appliquez cette modification aux noyaux listés par Grub :

command update-grub

Redémarrez votre serveur pour prendre en compte cette configuration :

command reboot

Erreurs liées à Xen

Problème de connexion aux machines virtuelles via le réseau

Au bout d'un certain temps, et d'un certain nombre de machines virtuelles créées, un bug apparait. L'un des symptôme de ce bug est l'apparition des messages suivants dans le syslog de la machine hôte (dom0):

xen_net: Memory squeeze in netback driver.

La correction de ce problème nécessite un redémarrage de l'hyperviseur.

Modifiez le fichier de configuration de Grub afin de limiter le volume de mémoire assigné à la machine virtuelle au boot :

if [ -e "/etc/default/grub" ]; then
  command sed -i -e 's/\(GRUB_CMDLINE_XEN_DEFAULT=.*\)"/\1 dom0_mem=256M"/' \
         "/etc/default/grub"
fi
if [ -e "/boot/grub/menu.lst" ]; then
  command sed -i -e 's/\(xenhopt=.*\)/\1 dom0_mem=256M/' \
         "/boot/grub/menu.lst"
fi

Appliquez cette modification aux noyaux listés par Grub :

command update-grub

Appliquez le même montant à la mémoire minimum disponible pour la machine hôte (dom0) :

command sed -i -e 's/^[# ]*\((dom0-min-mem\).*\().*\)$/\1 256\2/' \
         /etc/xen/xend-config.sxp

Redémarrez la machine pour prendre en compte ces modifications :

command reboot

Source: Merci à Crucial Paradigm pour leur article Xen Bug: xen_net: Memory squeeze in netback driver (32bit PAE).

Erreurs /dev/mem: mmap: Bad address dans les machines virtuelles (domU)

Ce message est une erreur affichée par dmidecode. dmidecode essaie d'accéder à des informations  bas niveau sur le matériel dans le but d'obtenir une configuration par défaut adéquate. Ceci ne fonctionne pas sous Xen, mais peut être ignoré sans soucis.

Source: Merci à MingsVille pour la réponse à la question When doing an apt-get or aptitude update I see an error like /dev/mem: mmap: Bad address; is this a cause for concern ? qu'il a obtenu dans les informations techniques pour les clients VPS de BitFolk.

Configuration du réseau

Xen propose plusieurs méthodes de configuration du réseau, ce guide en aborde 2. Pour faire un rapide résumé:

  • Mode bridge: les machines virtuelles sont des machines du réseau local de l'hôte Xen. C'est à dire qu'elles sont accessibles depuis d'autres ordinateurs que l'hôte Xen. C'est la configuration a préférer si votre ordinateur hôte (dom0) est dans un réseau local.
    Remarque : Le guide lui-même est normallement Bridge ready. Ce n'était pas le cas des premières version de ce guide :D.
  • Mode NAT: les machines virtuelles sont sur un réseau local virtuel. Elles ne sont accessibles que depuis l'ordinateur hôte, jusqu'à ce qu'une régle de routage NAT soit mise en place. C'est la configuration à préférer si votre ordinateur hôte (dom0) n'est pas dans un réseau local (serveur dédié, etc...).

Choix du mode de réseau

Si vous souhaitez utiliser vos machine virtuelles en mode NAT, que je recommande à moins que vous ne sachiez ce que vous faites, réglez le mode du réseau sur NAT :

XEN_NETWORK_MODE="nat"

Remarque : Si vous souhaitez utiliser le mode bridge (non recommandé si votre serveur est directement présent sur l'internet), il suffit de le spécifier à l'aide de :

XEN_NETWORK_MODE="bridge"

Configuration du réseau

Désactivez la configuration réseau précédente:

command sed -i -e 's/^(network-script .*).*$/# \0/' \
            -e 's/^(vif-script .*).*$/# \0/' \
         "/etc/xen/xend-config.sxp"

Activez la configuration adaptée au mode réseau de votre choix :

command sed -i -e "s/^#[ ]*\\((network-script.*network-${XEN_NETWORK_MODE}).*\\)\$/\\1/" \
            -e "s/^#[ ]*\\((vif-script.*vif-${XEN_NETWORK_MODE}).*\\)\$/\\1/" \
         "/etc/xen/xend-config.sxp"

Assurez-vous que le fichier hotplugpath.sh existe (ce problème peut apparaitre sur Debian 6.0 Squeeze) :

if [ ! -e "/etc/xen/scripts/hotplugpath.sh" ]; then
  command touch "/etc/xen/scripts/hotplugpath.sh"
fi

Redémarrez le démon Xen:

/etc/init.d/xend restart

Détection de l'adresse IP du Dom0

Récupérez l'adresse IP de notre Dom0. Dans une configuration en mode NAT, l'adresse est 10.0.0.128, mais dans le cas d'une configuration en mode Bridge, il est nécessaire d'utilisez l'adresse IP de l'interface physique (ici eth0):

MAINDOM_IP="10.0.0.128"
if [ $(command grep "^[^#]*bridge" /etc/xen/xend-config.sxp | command wc --lines) -gt 0 ]; then
  MAINDOM_IP=$(command ifconfig eth0 | command grep "inet " | command sed -e 's/^.*inet [^:]*:\([^ ]*\) .*$/\1/')
fi

Vérifiez l'adresse IP détectée à l'aide de la commande :

/bin/echo "L'adresse IP de ce serveur pour les DomU est : ${MAINDOM_IP}"

Remarque : Si l'adresse obtenue n'est pas correcte, renseignez une valeur correcte :

MAINDOM_IP="192.168.1.5"

Configuration du serveur SMTP de la machine hôte

Attention: Cette section est destinée à configurer le serveur SMTP de la machine hôte. Si vous avez déjà configuré le serveur SMTP par vous même, les lignes de commandes suivantes vont écraser votre configuration. Si cela vous pose problème, et que vous avez choisi le mode NAT pour le réseau des domU, veillez simplement à ce que votre serveur SMTP écoute sur l'adresse 10.0.0.128, et accepte le relais des emails en provenance de 10.0.0.0/24.

Il est important de surveiller les journaux et les mises à jour de sécurité de vos serveurs. De nombreux outils tels que cron-apt, logwatch, rkhunter se chargent de cela pour vous. Ils envoient leurs rapports par e-mail. Le pré-requis à leur bon fonctionnement est la présence d'un serveur SMTP configuré correctement. Si vous êtes un habitué des serveurs SMTP, je pense que cette section n'aura que peut d'intérêt pour vous, mais si ce n'est pas le cas, nous allons mettre en place un serveur SMTP dans la machine hôte (dom0) destiné à recevoir les emails des différentes machines virtuelles (domU) créées à l'aide de ce guide.

Configurez le domaine de mail de notre serveur SMTP. Il s'agit en général du nom de domaine du serveur. Chez OVH, il est assez simple de l'obtenir:

command echo "${HOSTNAME}" > /etc/mailname

Remarque: Cette adresse doit être un nom de domaine valide et fonctionnel (c.a.d. qu'elle doit répondre aux ping).

Renseignez l'adresse électronique destinée à recevoir les courriers envoyés par les machines virtuelles:

ADMIN_EMAIL="mon-email@yahoo.fr"

Remarque: utilisez de préférence votre adresse électronique habituelle.

Appliquez la configuration:

command sed -i -e '/^root/d' "/etc/aliases"
command echo "root: ${ADMIN_EMAIL}" >> "/etc/aliases"

Mettez en place le fichier de configuration d'Exim 4 correspondant à l'envoi direct d'email.

command mkdir --parent "/etc/exim4"
command wget "http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-xen-sur-debian-4-0-etch/update-exim4-conf.conf" \
    --output-document="/etc/exim4/update-exim4.conf.conf"

Remarque: Cette configuration correspond à un serveur dédié chez un fournisseur de services tel que OVH. Si vous hébergez votre serveur à domicile, vous devez l'adapter à votre fournisseur d'accès. Je ne donnerais pas d'exemple de configuration correspondant à ce besoin, car je n'en ai pas l'utilité moi-même. Mais si vous souhaitez faire une contribution, vous pouvez m'envoyer un email avec la configuration nécessaire en utilisant le bouton "contact" en haut à droite de ce site XD.

Nous mettons à jour notre configuration d'Exim 4 afin d'accepter les e-mails en provenance de nos machines virtuelles :

MAINDOM_RANGE=$(/bin/echo ${MAINDOM_IP} | /bin/sed -e 's/\(.*\)\.[0-9]*/\1/')
/bin/sed -i -e "s|dc_local_interfaces=.*\$|dc_local_interfaces='127.0.0.1;${MAINDOM_IP}'|" \
            -e "s|dc_relay_nets=.*\$|dc_relay_nets='${MAINDOM_RANGE}.0/24'|" \
         /etc/exim4/update-exim4.conf.conf

Nous pouvons maintenant installer Exim 4:

/usr/bin/apt-get install exim4

Remarque: si Exim 4 est déjà installé sur votre serveur, il vous suffit de mettre à jour la configuration avec la commande:

/usr/sbin/update-exim4.conf
/etc/init.d/exim4 restart

Nous allons maintenant tester votre nouvelle configuration. Pour ce faire, installez mailx:

/usr/bin/apt-get install mailx

Et lancez la commande suivante:

/bin/echo "test" | /usr/bin/mail -s "test" root

Résolution des problèmes

Si vous avez configuré Exim 4 correctement, vous devriez recevoir un email ayant pour sujet "test". Si au bout de quelques minutes vous n'avez rien reçu, vérifiez le résultat de la commande:

/usr/bin/mailq

et le contenu du fichier journal d'Exim:

tail -n 250 /var/log/exim4/mainlog

Si l'erreur rencontrée est du type :

root@my-hostname: Unrouteable address

Il s'agit d'un problème d'incohérence entre le contenu de la variable d'environement ${HOSTNAME} et le contenu du fichier /etc/hosts. Pour régler ce problème, il faut que le contenu du fichier /etc/mailname contienne "my-hostname.my-domain.lan". Pour ce faire, vous pouvez l'éditer manuellement, ou tenter cette ligne de commande (sans aucune garantie de succès) :

/bin/grep "${HOSTNAME}" /etc/hosts | /usr/bin/cut --field=2 | /usr/bin/tee /etc/mailname

Mettez à jour la configuration d'Exim4 :

/usr/sbin/update-exim4.conf
/etc/init.d/exim4 restart

Supprimer vos messages de tests gelés :

mailq | grep frozen | sed -e 's/.* \(.\{6\}-.\{6\}-.\{2\}\) .*/\1/' | xargs exim4 -Mrm

Et envoyez à nouveau un message de test :

/bin/echo "test" | /usr/bin/mail -s "test" root

Avec de la chance, cette nouvelle configuration a fonctionné. Pour le vérifier, il suffit de regarder si cette commande ne renvoie rien :

mailq

Configuration des sauvegardes

Ce guide met en place une architecture de sauvegardes relativement complexe basée sur l'utilisation de l'outil Backup Manager. Vos machines virtuelles (domU) rapatrieront leurs sauvegardes dans le dossier /var/archives de la machine hôte (dom0). Nous devons donc créer ce dossier:

/bin/mkdir /var/archives
/bin/chown root:backup /var/archives
/bin/chmod ug+rwx /var/archives

Une fois ceci-fait, votre machine hôte (dom0) peut recevoir les sauvegardes des machines virtuelles.

Installation de Backup Manager

Cela n'est toutefois pas suffisant puisque seules les machines virtuelles sont sauvegardées. Il faut aussi penser à sauvegarder la machine hôte. Pour ce faire je vous recommende d'installer Backup Manager en suivant mon guide:

Installer et configurer Backup Manager sur Debian 4.0 Etch

Une fois Backup Manager installé, nous devons le configurer afin que le dossier /var/archives puisse être inscriptible par les machines virtuelles, et que les archives des domU soient purgées en même temps que celles du dom0

/bin/sed -i -e 's/[#]*\(.*BM_REPOSITORY_GROUP=\).*$/\1"backup"/' \
            -e 's/[#]*\(.*BM_REPOSITORY_CHMOD=\).*$/\1"770"/' \
            -e 's/[#]*\(.*BM_ARCHIVE_STRICTPURGE=\).*$/\1"false"/' \
         /etc/backup-manager.conf

Je vous recommande de transférer vos archives sur un serveur tiers à l'aide de Backup Manager. Si vous utilisez un serveur OVH, cette société met à disposition des espaces de stockages FTP.

Configuration de la création des machines virtuelles par Xen Tools

Configuration par défaut

Par défaut, Xen Tools est configuré pour créer des machines virtuelles basées sur Debian 3.1 Sarge.Nous allons modifier cela. Utilisez la ligne de commande suivante pour faire en sorte de créer des machines virtuelles Debian 4.0 Etch ou 5.0 Lenny (suivant la distribution du Dom0) par défaut:

if [ "$(/bin/cat /etc/debian_version)" = "4.0" ]; then
  /bin/sed -i -e 's/^\(dist[ ]*=[ ]*\)[^ ]*\([ ]*#.*\)$/\1etch\2/' /etc/xen-tools/xen-tools.conf
else
  /bin/sed -i -e 's/^\(dist[ ]*=[ ]*\)[^ ]*\([ ]*#.*\)$/\1lenny\2/' /etc/xen-tools/xen-tools.conf
fi

De même, nous passons la taille par défaut du swap de 128Mo à 1Go (par sécurité, la plupart du temps, il n'est pas utilisé).

/bin/sed -i -e 's/^\(swap[ ]*=[ ]*\)[^ ]*\([ ]*#.*\)$/\11Gb\2/' /etc/xen-tools/xen-tools.conf

Remarque : Si vous disposez de peu d'espace disque, vous pouvez diviser par 2 la taille du swap et du root (c'est à dire passer respectivement de 1 Go et 4 Go à 512 Mo et 2 Go). Pour ce faire, utilisez cette commande :

/bin/sed -i -e 's/^\(size[ ]*=[ ]*\)[^ ]*\([ ]*#.*\)$/\12Gb\2/' \
            -e 's/^\(swap[ ]*=[ ]*\)[^ ]*\([ ]*#.*\)$/\1512Mb\2/' \
         /etc/xen-tools/xen-tools.conf

Nous déclarons que la méthode de création de machines virtuelles par défaut est "debootstrap":

/bin/sed -i -e 's/^[# ]*\(debootstrap[ ]*=\).*$/\1 1/' /etc/xen-tools/xen-tools.conf

Dans le cas ou nous utilisons le mode nat, nous confirons les paramètres réseau pour la création de machine virtuelles utilisant une adresse IP fixe:

if [ $(/bin/grep "^[^#]*nat" /etc/xen/xend-config.sxp | /usr/bin/wc --lines) -gt 0 ]; then
  /bin/sed -i -e 's/^[# ]*\(gateway[ ]*=\).*$/\1 10.0.0.128/' \
            -e 's/^[# ]*\(netmask[ ]*=\).*$/\1 255.255.255.0/' \
         /etc/xen-tools/xen-tools.conf
fi

Remarque : Dans le cas ou vous utilisez le mode bridge, vous pouvez configurer manuellement les paramètres de votre réseau local en éditant le fichier /etc/xen-tools/xen-tools.conf

Utilisation d'un volume LVM pour les disques

Nous allons maintenant configurer Xen pour utiliser un group de volumes LVM. Commencez par renseigner le nom du groupe de volumes à utiliser. La ligne de commande suivante trouve automatiquement le nom du premier groupe de volumes :

LVM_VG=$(/sbin/vgdisplay \
  | /bin/grep "VG Name" \
  | /usr/bin/head --lines=1 \
  | /usr/bin/cut --characters=25-)

Remarque : Si vous disposez de plus d'un groupe de volumes (cas relativement rare je pense), vous devriez spécifier manuellement le nom du groupe de volumes de destination :

LVM_VG=vhd3

Et modifiez la configuration de Xen:

/bin/sed -i -e "s/^# \(lvm = \).*/\1${LVM_VG}/" /etc/xen-tools/xen-tools.conf

Une fois ceci fait, nous configureons Xen Tools pour se baser sur le bon kernel lors de la création de machines virtuelles:

/bin/sed -i -e "s/^\(kernel =\).*\$/\1 \/boot\/vmlinuz-$(uname -r)/" \
            -e "s/^\(initrd =\).*\$/\1 \/boot\/initrd.img-$(uname -r)/" \
            /etc/xen-tools/xen-tools.conf

Configuration du miroir de téléchargement des paquets

Par défaut, le miroir APT utilisé est situé aux états unis. Il est préférable d'utiliser un miroir plus proche de chez vous:

APT_MIRROR=http://ftp.fr.debian.org/debian/

Remarque: si votre serveur est hébergé par OVH, vous pouvez utiliser le mirroir suivant:

APT_MIRROR=ftp://mir1.ovh.net/debian/

Appliquez la nouvelle configuration:

CLEAN_APT_MIRROR=$(/bin/echo $APT_MIRROR | sed -e 's/\//\\\//g')
/bin/sed -i -e "s/^\(mirror = \).*/\1$CLEAN_APT_MIRROR/" /etc/xen-tools/xen-tools.conf

Correction du problème "clocksource/0: Time went backwards"

Afin d'éviter que nos DomU deviennent inaccessibles après un redémarrage du Dom0 car leur CPU est occupé à 100%, et que le syslog se remplissent de messages "clocksource/0: Time went backwards", nous allons modifier le template Xen-Tools utilisé pour la création des fichiers de configuration des machines virtuelles, et y ajouter l'option "extra = 'clocksource=jiffies'" :

/bin/sed -i -e "/^on_crash/a\\
\\
# Preventing clocksource/0: Time went backwards\\
extra = 'clocksource=jiffies'" \
    /etc/xen-tools/xm.tmpl

Source : Merci à Anapivirtua pour son article clocksource/0: Time went backwards.

Création d'un rôle pour nos machines virtuelles

Afin de pouvoir gérer proprement nos machines virtuelles, nous allons créer un rôle qui effectue les manipulations suivantes sur chaque machines virtuelles que nous allons créer:

  • Installation de paquets locales, sudo, ntp, cron-apt, logwatch, rkhunter, chkrootkit, vim, screen, backup-manager et fail2ban
  • Création de l'utilisateur "xen-upgrade" avec sa clef ssh d'identification qui permettront d'automatiser les tâches de mise à jour (nous utilisons sudo pour cela).
  • Configuration de Backup Manager pour sauvegarder les machines virtuelles et copier les sauvegardes dans le dossier /var/archives de la machine hôte (dom0).

En premier lieu, nous téléchargeons le fichier de configuration de notre nouveau rôle "automatic":

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-xen-sur-debian-4-0-etch/automatic \
    --output-document=/etc/xen-tools/role.d/automatic
/bin/chmod +x /etc/xen-tools/role.d/automatic

Nous créons l'utilisateur xen-backup dans la machine hôte (dom0):

/usr/sbin/adduser --system --shell /bin/sh --home /var/lib/xen-backup --disabled-password xen-backup

Et nous l'ajoutons au groupe backup

/usr/sbin/adduser xen-backup backup

Nous allons créer les clefs SSL permettant l'identification SSH sans saisie de mot de passe. Pour ce faire, créez le dossier destiné à contenir ces clefs dans l'hôte:

/bin/mkdir /etc/xen-tools/ssh-keys

Et créez les clefs pour l'identification automatique dans le comptes "xen-upgrade" créé par le rôle "automatic" et "xen-backup" créé sur la machine hôte (dom0) pour le rapatriement des sauvegardes.

/usr/bin/ssh-keygen -t rsa -C "upgrade account key" -N "" -f /etc/xen-tools/ssh-keys/xen-upgrade-rsa
/usr/bin/ssh-keygen -t rsa -C "backup account key" -N "" -f /etc/xen-tools/ssh-keys/xen-backup-rsa

Nous configureons le compte xen-backup pour pouvoir être accédé facilement à l'aide de la clef que nous venons de créer:

/bin/mkdir /var/lib/xen-backup/.ssh
/bin/cat /etc/xen-tools/ssh-keys/xen-backup-rsa.pub \
    | /usr/bin/tee -a /var/lib/xen-backup/.ssh/authorized_keys
/bin/chown -R xen-backup:nogroup /var/lib/xen-backup/.ssh

Nous installons aussi le script permettant de mettre à jour les machines virtuelles (domU) depuis la machine hôte (dom0):

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-xen-sur-debian-4-0-etch/xen-apt-get \
    --output-document=/usr/bin/xen-apt-get
/bin/chmod +x /usr/bin/xen-apt-get

Ce script permet de mettre à jour toutes les machines virtuelles avec ces deux commandes:

xen-apt-get update
xen-apt-get upgrade

Ou une machine virtuelle spécifiques, vous obtiendrez plus d'information sur son utilisation avec la commande:

xen-apt-get

Accès facilité aux machines virtuelles (optionnel)

Si vous ne souhaitez pas utiliser l'identification par mot de passe pour les comptes root des machines virtuelles, vous pouvez créer une clef pour l'identification automatique de l'utilisateur root du dom0 dans le compte root des domU. Le rôle "automatic" en tiendra automatiquement compte si elle est présente. Veillez toutefois à la protéger par une passphrase. Utilisez la commande suivante pour créer une paire RSA pour votre utilisateur root si cela est nécessaire :

if [ ! -e ${HOME}/.ssh/id_rsa ]; then
  /usr/bin/ssh-keygen -t rsa -f ${HOME}/.ssh/id_rsa
fi

Configuration du squelette des machines virtuelles

Nous allons mettre en place quelque fichiers de configuration (Exim 4, bash et vim principalement) de façon à minimiser les configurations à modifier dans les machines virtuelles.

En premier lieu, nous créons l'arborescence des dossiers contenant les fichiers de notre squelette (il s'agit de l'arborescence standard de Linux: le squelette est copié tel quel dans la machine virtuelle):

/bin/mkdir --parent /etc/xen-tools/skel/root
/bin/mkdir --parent /etc/xen-tools/skel/root/.ssh
/bin/mkdir --parent /etc/xen-tools/skel/etc/default
/bin/mkdir --parent /etc/xen-tools/skel/etc/exim4
/bin/mkdir --parent /etc/xen-tools/skel/etc/cron.d
/bin/mkdir --parent /etc/xen-tools/skel/etc/apt/apt.conf.d
/bin/mkdir --parent /etc/xen-tools/skel/etc/xen-data
/bin/mkdir --parent /etc/xen-tools/skel/usr/bin

Nous copions les fichiers de configuration de la machine hôte que nous souhaitons voir appliqués dans la machine virtuelle (Bash, Vim, fuseau horaire, langue):

/bin/cp /root/.bashrc /etc/xen-tools/skel/root/
if [ -e /root/.vimrc ]; then
  /bin/cp /root/.vimrc /etc/xen-tools/skel/root/
fi
/bin/cp /etc/timezone /etc/xen-tools/skel/etc/
/bin/cp /etc/localtime /etc/xen-tools/skel/etc/
/bin/cp /etc/locale.gen /etc/xen-tools/skel/etc/
/bin/cp /etc/environment /etc/xen-tools/skel/etc/
/bin/cp /etc/default/locale /etc/xen-tools/skel/etc/default/

Remarque: Une partie de ceci est valide uniquement pour les machines virtuelles Debian 4.0 Etch et 5.0 Lenny (mais ca marche bien sur Ubuntu quand même XD).

Nous ajoutons le script de mise à jour de la base des signatures de fichiers de RkHunter après utilisation de Apt :

/bin/echo '// Update rkhunter file signatures databases after running dpkg.
DPkg::Post-Invoke {
  "if [ -x /usr/bin/rkhunter ]; then if [ $(/usr/bin/rkhunter --help | /bin/grep "propupd" | /usr/bin/wc -l) -gt 0 ]; then /usr/bin/rkhunter --propupd; fi; fi";
};' | /usr/bin/tee /etc/xen-tools/skel/etc/apt/apt.conf.d/90rkhunter

Nous y ajoutons la configuration d'Exim4 de façon à ce que tous les e-mails de la machine virtuelle (domU) soient redirigés vers le serveur Exim de la machine hôte (que nous avons configuré plus haut dans cette page):

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-xen-sur-debian-4-0-etch/update-exim4-conf-conf.xen \
    --output-document=/etc/xen-tools/skel/etc/exim4/update-exim4.conf.conf
/bin/sed -i -e "s/dc_smarthost=.*\$/dc_smarthost='${MAINDOM_IP}'/" \
         /etc/xen-tools/skel/etc/exim4/update-exim4.conf.conf
echo "root@$(/bin/cat /etc/mailname)" > /etc/xen-tools/skel/root/.email

Et nous ajoutons la clef publique de la machine hôte aux clefs autorisées du client SSH pour que les sauvegardes puissent se dérouler correctement:

/usr/bin/ssh-keyscan -H -t rsa ${MAINDOM_IP} | /usr/bin/tee /etc/xen-tools/skel/root/.ssh/known_hosts

De même, nous ajoutons la clef publique du compte root du dom0 aux clefs autorisées du compte root des domU:

if [ -e ${HOME}/.ssh/id_rsa.pub ]; then
    /bin/cat ${HOME}/.ssh/id_rsa.pub \
        | /usr/bin/tee -a /etc/xen-tools/skel/root/.ssh/authorized_keys
fi

Configuration des sauvegardes

Le rôle automatic installe l'outil de sauvegarde Backup Manager. La plupart des guides présents sur ce site seront mis à jour avec les informations nécessaires pour gérer les sauvegardes des données avec cet outil. Nous allons ici configurer la sauvegarde des données de nos machines virtuelles avec cet outil.

En premier lieu, nous ajoutons le script update-bm-folders présenté dans mon guide Installer et configurer Backup Manager sur Debian 4.0 Etch au squelette des machines virtuelles:

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-backup-manager-sur-debian-4-0-etch/update-bm-folders \
    --output-document=/etc/xen-tools/skel/usr/bin/update-bm-folders
/bin/chmod +x /etc/xen-tools/skel/usr/bin/update-bm-folders

Nous téléchargeons la configuration par défaut du Backup Manager pour les machines virtuelles:

/usr/bin/wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-et-configurer-xen-sur-debian-4-0-etch/backup-manager.conf \
    --output-document=/etc/xen-tools/skel/etc/backup-manager.conf
/bin/sed -i -e "s|[#]*\(.*BM_UPLOAD_SSH_HOSTS=\).*$|\1\"${MAINDOM_IP}\"|" \
         /etc/xen-tools/skel/etc/backup-manager.conf

Et enfin, nous ajoutons la clef privée d'identification du compte xen-backup de la machine hôte à notre squelette:

/bin/cp /etc/xen-tools/ssh-keys/xen-backup-rsa /etc/xen-tools/skel/etc/xen-data/

Création d'une machine virtuelle Xen

Installation du système de base

Nous allons maintenant créer notre première machine virtuelle Xen. En premier lieu, nous configurons son nom d'hôte:

XEN_HOSTNAME=xen-vm1

Renseignez la configuration réseau de votre machine virtuelle:

IP_ADDRESS=10.0.0.3

Puis créez la machine virtuelle en utilisant ces paramètres à l'aide des commandes ci-dessous.

Important: Ne perdez pas le mot de passe que vous saisissez dans ces commandes, il s'agit du mot de passe de vos machines virtuelles.

  • Pour la distribution par défaut (Debian 4.0 Etch ou 5.0 Lenny):
    /usr/bin/xen-create-image --hostname $XEN_HOSTNAME \
        --ip $IP_ADDRESS --passwd --role automatic
    

    Remarque: Pour créer une machine virtuelle obtenant son adresse IP par DHCP (ce qui peut être intéressant si vous utilisez le mode bridge pour le réseau des domU, vous pouvez utiliser la commande:

    /usr/bin/xen-create-image --hostname $XEN_HOSTNAME \
        --dhcp --passwd --role automatic
    
  • Pour Ubuntu 8.04 Hardy Heron:
    /usr/bin/xen-create-image --hostname $XEN_HOSTNAME \
        --ip $IP_ADDRESS --passwd --role automatic \
        --dist=hardy --mirror=http://archive.ubuntu.com/ubuntu/
    

    Remarque: Pour créer une machine virtuelle obtenant son adresse IP par DHCP (ce qui peut être intéressant si vous utilisez le mode bridge pour le réseau des domU, vous pouvez utiliser la commande:

    /usr/bin/xen-create-image --hostname $XEN_HOSTNAME \
        --dhcp --passwd --role automatic \
        --dist=hardy --mirror=http://archive.ubuntu.com/ubuntu/

Remarque : Les DomU sous Ubuntu posent parfois des problèmes de configuration des locales. Il y a deux actions a effectuer pour résoudre les problème. Générer vos locales:

locale-gen fr_FR.UTF-8

et modifier le fichier /etc/environment pour qu'il contienne "LANG=fr_FR.UTF-8". Une fois ces deux actions effectuées, redémarrez le domU pour les prendre en compte (il y a sans doute une autre méthode, mais celle la est la plus simple :)

Création d'une partition pour le /var

Une fois ceci fait, nous y ajoutons une partition /var de 10 Giga octets. Commencez par renseignez la taille souhaitée pour la partition :

VAR_SIZE=10g

Créez ensuite le volume logique de la partition et modifiez le domU pour l'utiliser :

LVM_VG=$(/bin/grep lvm /etc/xen-tools/xen-tools.conf | /bin/sed -e 's/lvm = //')
/sbin/lvcreate -n $XEN_HOSTNAME-var -L ${VAR_SIZE} $LVM_VG
/sbin/mkfs.ext3 /dev/$LVM_VG/$XEN_HOSTNAME-var
command umount "/dev/$LVM_VG/${XEN_HOSTNAME}-disk"
MOUNT_POINT=$(command mktemp -d)
command mount "/dev/${LVM_VG}/${XEN_HOSTNAME}-disk" "${MOUNT_POINT}"
DISK_TYPE="sda"
if [ -n "$(command grep -e "xvda" "${MOUNT_POINT}/etc/fstab")" ]; then
  DISK_TYPE="xvda"
fi
command echo "/dev/${DISK_TYPE}3   /var    ext3    defaults                0       1" >> "${MOUNT_POINT}/etc/fstab"
VAR_MOUNT_POINT=$(/bin/mktemp -d)
command mount "/dev/${LVM_VG}/${XEN_HOSTNAME}-var" "${VAR_MOUNT_POINT}"
command cp -a "${MOUNT_POINT}/var/"* "${VAR_MOUNT_POINT}"
command umount "${VAR_MOUNT_POINT}"
command umount "${MOUNT_POINT}"
if [ $(command grep "disk[\t ]*=.*\]" "/etc/xen/${XEN_HOSTNAME}.cfg" | command wc --lines) -eq 0 ]; then
  command sed -i -e "/^disk[\t ]*=.*/a\\
    'phy:${LVM_VG}\/${XEN_HOSTNAME}-var,${DISK_TYPE}3,w'," \
         "/etc/xen/${XEN_HOSTNAME}.cfg"
else
  command sed -i -e "s/^\(disk[\t ]*=.*\)\]/\1, 'phy:${LVM_VG}\/${XEN_HOSTNAME}-var,sda3,w' ]/" "/etc/xen/${XEN_HOSTNAME}.cfg"
fi

Démarrage de la machine virtuelle (domU)

Nous pouvons maintenant démarrer notre nouveau serveur virtuel (aka. domaine):

/usr/sbin/xm create /etc/xen/$XEN_HOSTNAME.cfg

Vous pouvez obtenir la liste des domaines démarré à l'aide de la commande:

/usr/sbin/xm list

Nous allons utiliser SSH pour nous connecter à notre nouvelle machine virtuelle:

/usr/bin/ssh root@$XEN_HOSTNAME

Remarque: Si vous avez créé une clef d'identification pour votre compte root, vous devez saisir le mot de passe de cette clef, et non celui du compte root du DomU Xen.

Accès "matériel" à la machine virtuelle

En cas de problème pour vous connectez en SSH à votre machine virtuelle, vous pouvez accéder à la console de votre domaine récemment créé:

/usr/sbin/xm console $XEN_HOSTNAME

Attention: La console Xen se comporte comme une console série réelle. Cela pose problème avec vim.

Pour quitter cette console, utilisez le raccourci clavier: <Ctrl> <Alt Gr> <]>.

Ouverture des ports des machines virutelles en mode NAT

Si vous souhaitez que vos machines virtuelles hébergent des serveurs (sinon, pourquoi créer des machines virtuelles XD), il est nécessaire d'ouvrir les ports à l'aide d'IP tables. En effet, configurer Xen en mode NAT revient à créer un pare-feu naturel. Il faut donc configurer le routage des ports en NAT à l'aide d'IP tables. Si vous avez déjà créé votre propre passerelle Internet, vous savez probablement de quoi je parle.

En premier lieu, si vous ne l'avez pas déjà fait, nous allons créer le fichier destiné à contenir les règles Iptables. Ces règles seront appliquées après le démarrage des interfaces réseaux:

if [ ! -e /etc/network/if-up.d/iptables ]; then
  echo '#!/bin/sh
# IpTables rules.

# Purging prerouting rules before reloading them
iptables -t nat -F PREROUTING' | /usr/bin/tee /etc/network/if-up.d/iptables
fi
/bin/chmod +x /etc/network/if-up.d/iptables

Nous autorisons le NAT sur le système :

sed -i -e 's/[# ]*\(net\.ipv4\.conf\.default\.forwarding=\).*/\11/g' \
       -e 's/[# ]*\(net\.ipv4\.ip_forward=\).*/\11/g' \
    /etc/sysctl.conf
echo 1 > /proc/sys/net/ipv4/ip_forward

Ouverture d'un port

En premier lieu, renseignez les paramètres du port que vous souhaitez ouvrir. C'est à dire, l'adresse IP de la machine virtuelle dont vous souhaitez ouvrir le port :

VM_IP=10.0.0.1

et le numéro du port à ouvrir :

VM_PORT=80

Vous pouvez maintenant ouvrir effectivement le port :

iptables -A PREROUTING -t nat -p tcp -i eth0 --dport $(echo ${VM_PORT} | command sed -e 's/-/:/') -j DNAT --to ${VM_IP}:${VM_PORT}

Et nous faisons en sorte qu'elle s'execute au démarrage du système :

echo "
# Opening port ${VM_PORT} for IP address ${VM_IP} :
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport $(echo ${VM_PORT} | command sed -e 's/-/:/') -j DNAT --to ${VM_IP}:${VM_PORT}" \
    | /usr/bin/tee -a /etc/network/if-up.d/iptables

Votre configuration iptables sera rechargée à chaque redémarrage par la suite.

A la fin de cette procédure, vous devrier pouvoir accéder au serveur hébergé par la machine virtuelle en saisissant pour adresse l'IP du serveur matériel.

Démarrage automatique des machines virtuelles

Si vous souhaitez que certaines de vos machines virtuelles démarrent automatiquement avec votre système (souhaitable si ce guide vous sert à mettre en oeuvre un serveur), il vous faut en premier lieu créer un dossier nommé auto:

/bin/mkdir --parent /etc/xen/auto

Une fois ceci-fait, placez les fichiers de configuration des machines virtuelles que vous souhaitez voir démarrées automatiquement dans ce dossier. Par exemple, pour la machine virtuelle "apache2", exécutez la commande:

/bin/mv /etc/xen/httpd.cfg /etc/xen/auto/

Quelques lignes de commandes

Dans certains cas il peut être utile d'appliquer une commande à tous les domU créés. Pour ce faire, vous pouvez utiliser cette ligne de commande (ici pour la commande destroy) :

xm list | tail -n +3 | cut -d " " -f 1 | xargs -I DOMU xm destroy DOMU

De même, si vous souhaitez lancez tous les domU devant être lancés automatiquement :

find /etc/xen/auto -name "*.cfg" -print0 | xargs -0 -I DOMU_CFG xm create DOMU_CFG

Ou encore copier un fichier sur tous les DomU existants :

xm list | tail -n +3 | cut -d " " -f 1 | xargs -I DOMU scp -pr sudoers DOMU:/etc/sudoers

Remerciements

Attachements

Bravo

Posté par laurent le 14/04/2009 23:12
Sympa ce tutoriel copier/coller
Quelques difficultés pour la config IP (message d'erreur au lancement de la machine virtuelle)
Permet une première approche de cette techno sans passer des heures sur la doc.

Super article et question

Posté par François le 12/05/2009 14:55
Bonjour,

Je voulais savoir si vous aviez tenté de mettre la Dom0 avec une interface graphique type Gnome pour pouvoir utiliser Virt-manager. Car après test avec le noyau Xen, je serveur Dom0 est extrèmement lent voir inutilisable. Je pensais utiliser de la sorte avouant avoir beaucoup de mal a voir le fonctionnement avec VNC.

interface gra.. heu, non, je ne connais pas ce mot la :)

Posté par lwolf le 12/05/2009 19:45
Bonjour,

personnellement, j'utilise la ligne de commande pour administrer mes vm... :)... gui ? pourquoi faire ? :)

bon courage dans votre quête toutefois.

Et avec Grub2

Posté par Ludovic le 05/02/2010 18:17
Bonjour pas de soucis avec grub 0.97 mais avec grub 2 cela ne marche pas (livré de base maintenant dans toutes les distribs)
Pourrait il y avoir une mise à jour de cet excellent tuto?
Merci :)

Erreur dans le script de détection de l'adresse du dom0

Posté par Thierry Guiot le 06/03/2011 21:11
Une erreur s'est glissée dans le script de détection de l'adresse ip du dom0: le script fait un "grep" sur "inet adr" au lieu de "inet addr". En effet le mot adresse prend deux d en anglais.

erreur corrigée

Posté par Pierre-Yves Landuré le 06/03/2011 21:52
l'erreur est corrigée, merci de l'avoir signalée.

BlogBang
Navigation
 

Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio