Introduction
Dans le cadre d'une recherche d'expertise sur le sujet de la virtualisation avec Xen, j'ai appris et créé des machines CentOS6 sous Debian.
Ma machine physique 64bits avec 4Go de mémoire vive comprend une carte mère : Asus P5KPL avec un processeur : Intel(R) Core(TM)2 Duo CPU E8200 à 2.66GHz.
Je place içi le résulat de ifconfig -a de ma machine :
eth0 Link encap:Ethernet HWaddr aa:00:04:00:0a:04
inet adr:192.168.1.7 Bcast:0.0.0.0 Masque:255.255.255.0
adr inet6: fe80::a800:4ff:fe00:a04/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5336 errors:0 dropped:0 overruns:0 frame:0
TX packets:5618 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:5005800 (4.7 MiB) TX bytes:1152601 (1.0 MiB)
lo Link encap:Boucle locale
inet adr:127.0.0.1 Masque:255.0.0.0
adr inet6: ::1/128 Scope:Hôte
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4763 errors:0 dropped:0 overruns:0 frame:0
TX packets:4763 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:273921 (267.5 KiB) TX bytes:273921 (267.5 KiB)
Paquets à installer
apt-get install linux-image-2.6.32-5-xen-amd64 xen-tools xen-utils-4.0 xenstore-utils \
xen-linux-system xen-qemu-dm-4.0 xen-tools xenwatch
Une fois installés et que votre boot est mis à jour, redémarrez sur le noyaux amd64....: Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64
Configuration de Xen
Tout d'abord le fichier à configurer est : /etc/xen/xend-config.sxp
La partie chez moi est configurer ainsi
##
# To bridge network traffic, like this:
#
# dom0: ----------------- bridge -> real eth0 -> the network
# |
# domU: fake eth0 -> vifN.0 -+
#
# use
#
# (network-script network-bridge)
#
# Your default ethernet device is used as the outgoing interface, by default.
# To use a different one (e.g. eth1) use
#
# (network-script 'network-bridge netdev=eth1')
#
# The bridge is named xenbr0, by default. To rename the bridge, use
#
(network-script 'network-bridge bridge=ixen0')
La ligne à remarquer est : (network-script 'network-bridge bridge=ixen0')
le résultat de la commande :
grep "^(" /etc/xen/xend-config.sxp
root@debian:~# grep "^(" /etc/xen/xend-config.sxp
(logfile /var/log/xen/xend.log)
(loglevel DEBUG)
(network-script 'network-bridge bridge=ixen0')
(dom0-min-mem 512)
(enable-dom0-ballooning yes)
(total_available_memory 0)
(dom0-cpus 0)
(vncpasswd '')
Le service xend (qu'il faut relancer service xend restart )prend alors en charge la configuration du réseau et ifconfig -a devient :
ixen0 Link encap:Ethernet HWaddr aa:00:04:00:0a:04
inet adr:192.168.1.7 Bcast:0.0.0.0 Masque:255.255.255.0
adr inet6: fe80::a800:4ff:fe00:a04/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5336 errors:0 dropped:0 overruns:0 frame:0
TX packets:5618 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:5005800 (4.7 MiB) TX bytes:1152601 (1.0 MiB)
lo Link encap:Boucle locale
inet adr:127.0.0.1 Masque:255.0.0.0
adr inet6: ::1/128 Scope:Hôte
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4763 errors:0 dropped:0 overruns:0 frame:0
TX packets:4763 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:273921 (267.5 KiB) TX bytes:273921 (267.5 KiB)
peth0 Link encap:Ethernet HWaddr aa:00:04:00:0a:04
adr inet6: fe80::a800:4ff:fe00:a04/64 Scope:Lien
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:152867 errors:0 dropped:0 overruns:0 frame:0
TX packets:94493 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:224413958 (214.0 MiB) TX bytes:7250172 (6.9 MiB)
Interruption:18 Adresse de base:0x4c00
tmpbridge Link encap:Ethernet HWaddr ba:3e:bf:4f:84:34
inet adr:192.168.1.7 Bcast:0.0.0.0 Masque:255.255.255.0
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
vif1.0 Link encap:Ethernet HWaddr fe:ff:ff:ff:ff:ff
adr inet6: fe80::fcff:ffff:feff:ffff/64 Scope:Lien
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:88570 errors:0 dropped:0 overruns:0 frame:0
TX packets:147351 errors:0 dropped:47 overruns:0 carrier:0
collisions:0 lg file transmission:32
RX bytes:4826481 (4.6 MiB) TX bytes:218987255 (208.8 MiB)
La carte "eth0" à disparue au profit de "ixen0" la carte indiqué dans le fichier xend-config.sxp. Par ailleurs les cartes "tmpbridge" et "peth0" sont créées par xend...
La carte "ixen0" sera utilisée par les fichiers de configuration des machines virtuelles...
Le résultat de la commande iptables-save :
root@debian:~# iptables-save
# Generated by iptables-save v1.4.8 on Mon Mar 11 21:44:24 2013
*filter
:INPUT ACCEPT [427695:510948244]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [256993:26616905]
-A FORWARD -m state --state RELATED,ESTABLISHED -m physdev --physdev-out vif1.0 -j ACCEPT
-A FORWARD -p udp -m physdev --physdev-in vif1.0 -m udp --sport 68 --dport 67 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -m physdev --physdev-out vif1.0 -j ACCEPT
-A FORWARD -s 192.168.1.10/32 -m physdev --physdev-in vif1.0 -j ACCEPT
-A FORWARD -j ACCEPT
COMMIT
# Completed on Mon Mar 11 21:44:24 2013
la commande
grep forward /etc/sysctl.conf
root@debian:~# grep forward /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
# Uncomment the next line to enable packet forwarding for IPv6
net.ipv6.conf.all.forwarding=1
Les modules à charger
cat /etc/modules
xen-blkfront xen-fbfront xen-netfront xen-kbdfront
Création de l'environnement d'une machine virtuelle
Pour créer une machine il faut créer un fichier de configuration d'installation....
Par exemple : /etc/xen/centos6-install
kernel = "/media/data2/MountISO/XEN/Centos/isolinux/vmlinuz"
ramdisk = "/media/data2/MountISO/XEN/Centos/isolinux/initrd.img"
name = "centos6"
memory = "512"
disk = [ 'file:/media/data2/MountISO/XEN/centos6.img,xvda,w', 'file:/media/data2/MountISO/NotreApplication-CentOS/CentOS-6.4-x86_64-netinstall.iso,xvdc:cdrom,r' ]
vif = [ 'bridge=ixen0 , ip=192.168.1.10', ]
bootloader="/usr/bin/pygrub"
extra = "text ip=192.168.1.10 netmask=255.255.255.0 gateway=192.168.1.254 dns=192.168.1.5 ksdevice=bootif ks=http://192.168.1.5/kickstart-centos6-x86_64.cfg"
vcpus=1
on_reboot = 'destroy'
on_crash = 'destroy'
On peut récupérer vmliuz et initrd.img ici : http://mirror.centos.org/centos/6/os/x86_64/isolinux/
On crée l'image disque centos6.img de 50Go par
dd if=/dev/zero of=/media/data2/MountISO/XEN/centos6.img oflag=direct bs=1M seek=51200 count=1
L'image iso : http://centos.mirror.fr.planethoster.net/6.4/isos/x86_64/CentOS-6.4-x86_64-netinstall.iso
En suite il faut créer un fichier kickstart si l'on ne veut pas répondre interactivement à l'installation. Un fichier minimal est disponible ici : http://grantmcwilliams.com/files/kickstart-minimal6-x86_64.cfg
Merci à Mc William : http://grantmcwilliams.com/item/538-centos-6-virtual-machine-64-bit-installation-on-xen
En suite il faut l'héberger sur un serveur web : http://192.168.1.5/kickstart-centos6-x86_64.cfg ou à partir de http://grantmcwilliams.com/files/kickstart-minimal6-x86_64.cfg
Voici le mien :
# Kickstart file automatically generated by anaconda.
# Modified for Notre Application installation on CentOS 6.x
# Destroyed by lolo but works well ! 🙂
#version=DEVEL
install
cdrom
lang fr_FR.UTF-8
keyboard fr-latin9
timezone --utc Europe/Paris
network --onboot yes --device eth0 --mtu=1500 --bootproto dhcp --hostname application
rootpw --iscrypted XLd7qu85Sl8Og
text
firewall --service=http --service=ssh
authconfig --useshadow --passalgo=sha512
bootloader --location=mbr --driveorder=xvda --append="quiet biosdevname=0"
clearpart --initlabel --drives=xvda
part / --fstype=ext4 --fsoptions="noatime" --size=5120
part swap --size=2048
part /home --fstype=ext4 --fsoptions="noatime" --size=10240
part /var --fstype=ext4 --fsoptions="noatime" --size=1 --grow
selinux --disabled
services --enabled=sshd,httpd,mysqld,memcached,munin-node --disable=kdump,postfix
%packages
@Base
@Core
glibc.i686
httpd
httpd-devel
memcached
mysql-bench
mysql-test
mysql
openssh-server
php
php-ldap
php-mysql
php-cli
php-xml
php-mbstring
php-intl
php-xsl
php-zip
php-iconv
php-pdo_mysql
php-pdo
php-devel
php-pear
php-posix
php-gd
php-pgsql
php-intl
php-soap
php-eaccelerator
vim-enhanced
at
bc
pm-utils
procmail
hdparm
lsof
acpid
anacron
info
man-pages
sharutils
strace
sudo
tree
xdg-user-dirs-gtk
wget
screen
zip
unzip
samba-client
mc
rsync
ntp
gcc
make
sysstat
zlib-devel
ntp
ntpdate
htop
iozone
phpMyAdmin
mod_ssl
openssl
munin
munin-node
ftp.x86_64
%end
%pre
echo -e "$VERT" "- Vérification de l'intégrité du CDROM" "$NORMAL"
( cd /mnt/stage2 && md5sum -c MD5SUM.APPLICATION > /dev/null ) || ( echo -e "$ROUGE" "Erreur lors de la vérification de l'intégrité du CDROM, veuillez contacter le support technique de Notre Application par téléphone au 04 26 10 06 36 ou par courriel à l'adresse support@application.com." "$NORMAL" ; bash )
echo -e "$VERT" "- Vérification de la place disque" "$NORMAL"
(
TAILLE=$(sfdisk -s | grep xvda | head -n1 | cut -d":" -f2)
TAILLEHUM=$(expr $TAILLE / 1024 / 1024)
if [[ $TAILLEHUM -lt 50 ]]
then
echo -e "$ROUGE" "Taille de $TAILLEHUM Go insuffisante pour l'installation de Notre Application ! Veuillez contacter le support technique de Notre Application par téléphone au 04 26 10 06 36 ou par courriel à l'adresse support@application.com." "$NORMAL" && bash
elif [[ $TAILLEHUM -lt 100 ]]
then
echo -e "$ORANGE" " ---> Pré-requis de 100 Go, votre disque dur à une taille de $TAILLEHUM Go." "$NORMAL"
echo -e "$ORANGE" " ---> Nous vous recommandons une taille de disque dur de 100 Go pour l'installation de Notre Application." "$NORMAL"
fi
)
echo -e "$VERT" '- Installation du systÚme' "$NORMAL"
# Crée une table de partition msdos vide
for DISKNAME in $(ls /dev/xvd[a-z])
do
dd if=/dev/zero of=$DISKNAME bs=512 count=1
parted -s $DISKNAME mklabel msdos
done
%end
%post --nochroot
# Copie des scripts dans les bons répertoires
echo -e "$VERT" '- Copie des fichiers nécessaires à Notre Application' "$NORMAL"
mkdir /mnt/sysimage/root/.logs
cp -rv --no-preserve=all /mnt/source/data/* /mnt/sysimage/ >> /mnt/sysimage/root/.logs/Install-application.log 2>&1
%end
%post --logfile /root/.logs/post-chroot.log
echo -e "$VERT" '- Installation de Notre Application, veuillez patienter...' "$NORMAL"
bash /var/tmp/application/install_application.sh 0 >> /root/.logs/Install-application.log 2>&1 || ( touch /var/tmp/erreur_application && exit 1 )
# Modification de la base de données application
# Modification du mot de passe root
if mysqladmin -u root -h localhost password "thisisnotthepassword" &&\
mysql -uroot -pthisisnotthepassword -D mysql -e "update user set password='201ea7e46165207b' where user='root'"
then
echo "";
else
echo -e "$ROUGE ProblÚme lors de la configuration de MySQL $NORMAL";
fi
%end
%post --nochroot
if [ -f /var/tmp/erreur_application ]
then
echo
echo -e "$ROUGE" 'Erreur d'"'"'installation. Veuillez contacter le support technique de Notre Application par téléphone au xx xx xx xx xx ou par courriel à l'"'"'adresse support@application.com.' "$NORMAL"
else
chroot /mnt/sysimage eject
echo -e "$VERT" 'Appuyez sur la touche Entrée pour redémarrer' "$NORMAL"
read
kill -9 $(pidof python)
for i in $(seq 1 30);do echo > /dev/tty1;done
reboot
fi
%end
Création de la machine virtuelle
# xm create /etc/xen/centos6-install -c
Si tout est bien paramétré : on obtient le boot, l'installation puis le redémarrage
Le démarrage de la machine virtuelle
Il faut créer un fichier presque identique à celui de l'installation, mais l'on ne spécifie pas le vmlinuz et initrd ni le kickstart...
Voici le miens : /etc/xen/centos6
name = "centos6"
memory = "512"
disk = [ 'file:/media/data2/MountISO/XEN/centos6.img,xvda,w', ]
vif = [ 'bridge=ixen0 , ip=192.168.1.10', ]
bootloader="/usr/bin/pygrub"
vcpus=1
on_reboot = 'restart'
on_crash = 'restart'
Pour lancer la machine tout en voyant la console :
xm create /etc/xen/centos6 -c
Et voici :
Ce qui donne pour l'application distribuée par mon entreprise :
Il reste quelques zones d'ombres :
- pourquoi ai-je tant peiné pour le réseau et le pont !?
- comment avoir plusieurs tty en virtu sous Xen ?
- etc.
Sinon bonne virtu !
- Fin -
2 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.
J’ai réussi à créer une machine virtuelle via Xen grâce à une vidéo sur http://www.alphorm.com/tutoriel/formation-en-ligne-xensources. En tout cas, je vais essayer aussi ce tutoriel pour créer une VMs avec Xen sous Debian. Merci pour ce partage.
Super tuto. Depuis ma formation sur http://www.alphorm.com/tutoriel/formation-en-ligne-xensources ma machine est sous XENSources. Ça ne m’empêche pas de voir d’autres tutoriels comme le tien que je trouve très instructif.