Outils pour utilisateurs

Outils du site


tutoriels:xen

XEN : Hyperviseur Open Source

Xen

Mise en place de XEN sur Wheezy

m( Pour mes besoins, j'utilise Xen en mode “route” et non “bridge” au niveau réseau.

Installation

Install

  • Installer les paquets suivants:

aptitude install xen-linux-system-3.2.0-4-amd64 xen-hypervisor-4.1-amd64 lvm2

  • Ajuster la conf du grub pour prioriser l'entrée du kernel Xen:

dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen

  • Mettre à jour le grub.cfg:

update-grub

  • Afin de préserver les options de configuration comme l'allocation de la RAM ou le nombre de CPU assignés au Dom0 :

vi /etc/default/grub

# Xen boot parameters for non-recovery Xen boots (in addition to GRUB_CMDLINE_XEN)
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M dom0_max_vcpus=1 dom0_vcpus_pin"
# Dissable OS prober to prevent virtual machines on logical volumes from appearing in the boot menu.
GRUB_DISABLE_OS_PROBER=true

Ces instructions permettent de conserver les déclarations lors de update du Grub.

  • Tester et vérifier la conf du grub du dom0:

update-grub2
cat /boot/grub/grub.cfg

  • Et après reboot:

xm vcpu-lists
xm list

Conf réseau

LAN

  • Afin de router le paquet par l'interface de l'hyperviseur, activer le routage et le proxy ARP:

vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp=1
sysctl -p

Conf LVM

LVM Pour la gestion des disques des Vm, je privilégie l'utilisattion de LVM pour éventuellement effectuer des resize en fonction du besoin.

  • En partant du principe qu'il vous reste un HDD ou RAID prévue à cet effet, créer une partition de type LVM:

fdisk /dev/sdc

  • Créer le volume physique (PV):

pvcreate /dev/sdc

  • Créer le groupe de volumes (VG):

vgcreate VG1 /dev/sdc1

8-O Stop ! Les LVM seront créés par la suite avec les xen-tools…

Conf Xen

  • Editer le fichier de conf du daemon XEN:

vi /etc/xen/xend-config.sxp 
(logfile /var/log/xen/xend.log)
(loglevel DEBUG)
(xend-unix-path /var/lib/xend/xend-socket)
(network-script 'network-route netdev=eth0')
(vif-script     vif-route)
(dom0-min-mem 512)
(enable-dom0-ballooning no)
(total_available_memory 0)
(dom0-cpus 1)
:!: Have a look: http://wiki.xen.org/wiki/Xen_Best_Practices

Conf des xen-tools

  • Installer le package approprié:

aptitude install xen-tools

  • Editer le fichier de configuration pour les paramètres de création par défaut:

vi /etc/xen-tools/xen-tools.conf
lvm = VG1
install-method = debootstrap
size   = 8Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 512Mb    # Swap size
fs     = ext4     # use the EXT3 filesystem for the disk image.
dist   = wheezy # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
gateway    = 192.168.1.183
netmask    = 255.255.255.255
nameserver = 192.168.1.1
passwd = 1
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
arch = amd64
mirror = `xt-guess-suite-and-mirror --mirror`
mirror_wheezy = http://debian.ens-cachan.fr/ftp/debian/
ext3_options     = noatime,nodiratime,errors=remount-ro
ext2_options     = noatime,nodiratime,errors=remount-ro
xfs_options      = defaults
reiserfs_options = defaults
btrfs_options    = defaults
serial_device = hvc0 #default
disk_device = xvda #default
output    = /etc/xen
extension = .cfg
nohosts = 1 # default
copyhosts = 0 # default

Création de domU (VM)

  • Création d'une VM wheezy basique :

xen-create-image --install-method=debootstrap --pygrub --size=8G --swap=512M --vcpus=1 --arch=amd64 --dist=wheezy --hostname=vm01.test.local --ip 192.168.1.185

  • Booter la VM :

xm create -c vm01.test.local.cfg

  • Ajuster la conf réseau en donnant pour route par défaut, l'interface du dom0:

vi /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.1.185
        netmask 255.255.255.255

# ROUTE
post-up route add -host 192.168.1.184 dev eth0
post-up route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.184 dev eth0
post-down route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.184 dev eth0
post-down route del -host 192.168.1.184 dev eth0

Tips & Tricks

Xen astuces

Boot auto des VM

  • Vérifier que l'option est activée:

grep -ir "XENDOMAINS_AUTO" /etc/default/xendomains

  • Créer le dossier auto:

mkdir /etc/xen/auto

  • Créer des liens symboliques pointant vers les confs des VM:

ln -s /etc/xen/vm01.test.local.cfg  /etc/xen/auto/

Console hvc0

hvc0 Suite à des migrations de VM entre hyperviseur, j'ai rencontré des difficultés avec le mapping de la console.
Je pouvais voir le boot de la VM mais le terminal n'affichait plus rien au moment du login !

  • Dans la configuration de la machine virtuelle (monter le LVM de la VM au niveau dom0):

vi /etc/inittab
Remplacer le tty1 par hvc0.
sed –i  "s#1:2345:respawn:/sbin/getty 38400 tty1#1:2345:respawn:/sbin/getty 38400 hvc0#g" /etc/inittab
m(

Créer un réseau virtuel privée

  • Créer le switch virtuel sur le dom0:

brctl addbr br0

  • Ajouter le switch dans la config réseau:

vi /etc/network/interfaces
# ETH0
auto eth0
iface eth0 inet static
        address 192.168.1.184
        netmask 255.255.255.0
        gateway 192.168.1.1
# LOOPBACK
auto lo
        iface lo inet loopback
# SWITCH VIRTUEL
auto br0
        iface br0 inet static
        bridge-stp 0
        address 10.10.10.1
        netmask 255.255.255.0
        network 10.10.10.0
        broadcast 10.10.10.255

pre-up brctl addbr br0

  • Ajouter une interface bridgée à une VM:

vi /etc/xen/vm01.test.local.cfg
#  Networking
vif = [ 'ip=192.168.1.185, mac=00:16:3E:6A:29:1D, script=vif-route', 'ip=10.10.10.2, mac=00:AB:CD:EF:01:23, script=vif-bridge, bridge=br0' ]

  • Eteindre la VM et recréer le domU avec les nouveaux paramètres:

xm shutdown vm01.test.local
xm create -c vm01.test.local.cfg

  • Une fois loggé sur la VM, vérifier la présence de la seconde interface:

ip link show

  • Ajouter la configuration IP de la 2eme carte réseau:

vi /etc/network/interfaces
auto eth1
iface eth1 inet static
        address 10.10.10.2
        netmask 255.255.255.0

  • Monter l'interface et tester par ping:

ifup eth1

  • Sur le dom0, vérifier les interfaces réseau liés au switch:

brctl show

Création de rôle

Grace au xen-tools, il est possible de définir un rôle. Autrement dit, un enchaînement de procédure pour effectuer un déploiement optimisé.

  • Création du rôle :

vi /etc/xen-tools/roles.d/perso
#!/bin/sh
#
#  Configure the new image with some extra stuff

prefix=$1

#  Source our common functions - this will let us install a Debian package.
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
    . /usr/lib/xen-tools/common.sh
else
    echo "Installation problem"
fi




#  Install some new packages - do this first to avoid dependency errors.
#
installDebianPackage ${prefix} vim
installDebianPackage ${prefix} ntp
installDebianPackage ${prefix} locate
installDebianPackage ${prefix} unzip
installDebianPackage ${prefix} linuxlogo
installDebianPackage ${prefix} build-essential
installDebianPackage ${prefix} postfix

#  Remove some standard packages.
#
# removeDebianPackage ${prefix} package


# Log our start
#
logMessage Script $0 starting

# Create Guest's /root/.bashrc :
#
cat <<BASHRC_EOF >${prefix}/root/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.

umask 022
PS1='\[\033[1;31m\]\u\[\033[1;34m\]@\[\033[1;32m\]\h\[\033[0;0m\] >\[\033[0;35m\]\w\[\033[1;34m\]\$\[\033[0;0m\] '

# You may uncomment the following lines if you want ls to be colorized:
export EDITOR='vi'
export LS_OPTIONS='--color=auto'
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

# Some more alias to avoid making mistakes:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
BASHRC_EOF

# Create Guest's /root/.vimrc :
#
echo "syntax on" >${prefix}/root/.vimrc

# Configure NTP
#
sed -i 's|server 0.debian.pool.ntp.org iburst|server 0.fr.pool.ntp.org|g' ${prefix}/etc/ntp.conf
sed -i 's|server 1.debian.pool.ntp.org iburst|server 1.fr.pool.ntp.org|g' ${prefix}/etc/ntp.conf
sed -i 's|server 2.debian.pool.ntp.org iburst|server 2.fr.pool.ntp.org|g' ${prefix}/etc/ntp.conf
sed -i 's|server 3.debian.pool.ntp.org iburst|server 3.fr.pool.ntp.org|g' ${prefix}/etc/ntp.conf

# Configure /etc/network/interfaces
#
sed -i '/gateway.*$/d' ${prefix}/etc/network/interfaces
cat <<NETWORK_EOF >>${prefix}/etc/network/interfaces

# ROUTE
post-up route add -host 192.168.1.184 dev eth0
post-up route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.184 dev eth0
post-down route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.184 dev eth0
post-down route del -host 192.168.1.184 dev eth0
NETWORK_EOF

# Check update on domU
#
chroot ${prefix} /usr/bin/aptitude update
chroot ${prefix} /usr/bin/aptitude safe-upgrade -y
chroot ${prefix} /usr/bin/aptitude clean && /usr/bin/aptitude update

#  Log our finish
#
logMessage Script $0 finished

  • Appel du rôle défini dans la création de VM:

xen-create-image --install-method=debootstrap --pygrub --size=8G --swap=512M --vcpus=1 --arch=amd64 --dist=wheezy --hostname=vm03.test.local --ip 192.168.1.187 --role=perso

Xen HVM

  • HVM : Hardware Virtual Machine
  • PV : Paravirtualized Guests

Xen permet de virtualiser des invités HVM tels que des systèmes propriétaires Windows sous conditions que votre processeur supporte les instructions de type Intel VT-x ou AMD-V. A la différence des PV dont l'ensemble des composants matériels et firmware ne sont pas émulés.


Dans mon contexte veille techno, mon dom0 Xen est lui même vitualisé sur VMware Workstation. Pour activer le support HVM, j'ai upgradé Workstation en 8.0.6 ainsi que la VM en version 8. Dans le fichier .vmx, j'ai ajouté cette ligne:

vhv.enable = "TRUE"

  • En résumé graphique:

VMware HVM support

  • Au reboot du dom0, voici comment vérifier le support HVM activé:

xm dmesg | grep -i hvm
(XEN) HVM: ASIDs enabled.
(XEN) HVM: SVM enabled
(XEN) HVM: Hardware Assisted Paging (HAP) detected
(XEN) HVM: HAP page sizes: 4kB, 2MB

Création du HVM

Here, we go… C'est parti pour l'install d'un Windows 2003 R2.
N'ayent pas d'interface graphique, j'utiliserais le protocole VNC pour intéragir avec le système invité.

  • Création du volume logique (le futur C:\):

lvcreate -L20G  -n w2k3.test.local-disk VG1

  • Création du fichier de configuration de la VM:

# Kernel image file
kernel = '/usr/lib/xen-4.1/boot/hvmloader'

# The domain build function. HVM domain uses 'hvm'
builder = 'hvm'

# Use QEMU-DM tools for device emulation
device_model = 'qemu-dm'

# A name for your domain. All domains must have different names
name = 'w2k3.test.local'

# Initial memory allocation (in megabytes) for the new domain.
# WARNING: Creating a domain with insufficient memory may cause out of
#          memory errors. The domain needs enough memory to boot kernel
#          and modules. Allocating less than 32MBs is not recommended.
memory = 2048

# Shadow pagetable memory for the domain, in MB.
# If not explicictly set, xend will pick an appropriate value.
# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
# shadow_memory = 8

# The number of cpus guest platform
vcpus = 1

# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
# Each disk entry is of the form phy:UNAME,DEV,MODE
# where UNAME is the device, DEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write.
disk = ['phy:/dev/VG1/w2k3.test.local-disk,hda,w','file:/opt/W2K3_R2_SP2.iso,hdc:cdrom,r']

# Define Boot Order
# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d)
# default: hard disk, cd-rom, floppy
boot = 'dc'

#  Enable Xen PVHVM drivers for the guest
xen_platform_pci=1

# Enable/disable HVM guest ACPI
# acpi = 1

# Enable/disable HVM APIC mode, default=1 (enabled)
# Note that this option is ignored if vcpus > 1
# apic = 1

# Optionally define mac and/or bridge for the network interfaces.
# Random MACs are assigned if not given.
# type=ioemu specify the NIC is an ioemu device not netfront
# vif = [ 'type=ioemu, bridge=br0' ]

# enable SDL library for graphic
sdl = 0

# enable VNC library for graphic
vnc = 1

# default is depents on vncpasswd in xend-config.sxp
vncpasswd = ''

# set VNC display number, default = domid
#vncdisplay = 1

# enable spawning vncviewer for domain's console
# (only valid when vnc=1)
vncconsole = 1

# enable stdvga
stdvga = 0

#   serial port re-direct to pty deivce, /dev/pts/n
#   then xm console or minicom can connect
serial = 'pty'

#    set the real time clock to local time [default=0 i.e. set to utc]
localtime = 1

#    set the real time clock offset in seconds [default=0 i.e. same as dom0]
#rtc_timeoffset = 3600

#    start in full screen
#full-screen = 1

#   Qemu Monitor, default is disable
#   Use ctrl-alt-2 to connect
#monitor = 1


#   enable sound card support, [sb16|es1370|all|..,..], default none
#soundhw = 'sb16'

#   Enable USB support (specific devices specified at runtime through the
#                       monitor window)
usb = 1

#   Enable USB mouse support (only enable one of the following, `mouse' for
#                             PS/2 protocol relative mouse, `tablet' for
#                             absolute mouse)
#usbdevice='mouse'
usbdevice = 'tablet'

#   Set keyboard layout, default is en-us keyboard.
keymap = 'fr'

  • Après upload de l'iso (dans /opt pour l'exemple), booter la VM :

xm create w2k3.test.local.cfg

  • Depuis mon client VNC, le script pour obtenir l'interface graphique au travers d'un tunnel SSH:

#!/bin/bash
ssh -f -p 22 -N -L 5901:localhost:5900 root@192.168.1.184
vncviewer 127.0.0.1:5901

Résultat : Xen VNC

  • Une fois l'installation terminée, modifier l'ordre de boot:

vi /etc/xen/w3k3.test.local
boot = 'c'

  • Configurer ensuite votre adressage IP fixe directement dans Windows (ne pas indiquer de GATEWAY pour le moment):

Dans mon contexte, le switch br0 (10.10.10.1) fournit un réseau privée 10.10.10.0/24.
Donc pour le moment,le HVM adressé en 10.10.10.10 n'a pas d'accès Internet.
:!: Attention, si vous renseignez la gateway, vous ne pourrez pas communiquer avec votre adressage privée of course mais vous vous exposerez à une coupure de l'interface publique par le DataCenter.

  • Au besoin, il est possible d'ajouter un NAT sur l'interface publique du dom0 (uniquement pour l'IP source souhaitée) vu que le routage est activé :

iptables -t nat -A POSTROUTING -s 10.10.10.10/32 -o eth0 -j MASQUERADE

  • Vérifier avec la règle:

iptables -t nat -L

  • Une fois le NAT positionné, configurer l'IP privée du switch br0 du dom0 (10.10.10.1) en gateway de l'interface privée du domU !

LOL Cette technique a l'avantage de vous fournir Internet sans qu'Internet puisse joindre le domU HVM directement. Toutefois, avec une publication via iptables sur l'IP publique du dom0, il est possible de donner accès à des services de votre domU HVM…

tutoriels/xen.txt · Dernière modification: 15/04/2016 à 21:15 (modification externe)

Outils de la page