Archives pour mai, 2012

Debian : configuration du bridge réseau pour Xen

Les packages Xen de Debian ne touche en rien la configuration réseau du système, ceci légitimement pour éviter une perte d’accès. Dans le cas d’une configuration en bridge, le script network-bridge de Xen permet de créer un pont réseau nommé eth0, ce qui n’est pas très standard. Ayant eu quelques problèmes avec ce script (erreurs de configuration au démarrage + la non prise en charge d’IPv6), la solution la plus sûre et stable consiste à le désactiver. Le bridge réseau peut dans ce cas être configuré de cette façon :

root@manjula:/etc/xen# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.100.5
        netmask 255.255.255.0
        network 192.168.100.0
        broadcast 192.168.100.255
        gateway 192.168.100.254
        up ip -6 addr add fdcb:9921:3552:afd6::5/64 dev br0
        up ip -6 route add default via fdcb:9921:3552:afd6::1
        down ip -6 addr del fdcb:9921:3552:afd6::5/64 dev br0
        down ip -6 route del default via fdcb:9921:3552:afd6::1
        bridge_maxwait 5
        bridge_ports noregex eth0 regex vif.*
        bridge_stp off
        bridge_fd 0

Au niveau de Xen, le script réseau se désactive de cette façon :

root@manjula:/etc/xen# cat /etc/xen/xend-config.sxp
#(network-script 'network-bridge bridge=xenbr0 antispoof=yes')
(vif-script vif-bridge)

Au niveau de chaque domU, il faut évidemment spécifier le nom du bridge à utiliser :

root@manjula:~# cat /etc/xen/sandeep

 

name = 'sandeep'
kernel = '/usr/lib/xen-4.0/boot/hvmloader'
builder = 'hvm'
device_model = '/usr/lib/xen-4.0/bin/qemu-dm'

memory = 2048
shadow_memory = 8
vcpus = 1
pae = 1
acpi = 1
apic = 1

vif = [ 'bridge=br0,type=paravirtualised' ]

disk = [ 'phy:/dev/vg/xen_sandeep,xvda,w' ]

on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

vnc = 1
usbdevice = 'tablet'

stdvga = 0
serial = 'pty'
ne2000 = "0"

SWT : scrolling automatique avec un composant StyledText

L’astuce consiste à effectuer une sélection vide (invisible) du dernier caractère en appelant la méthode setSelection :

StyledText styledOutput;

// ...

styledOutput.append("texte à ajouter");

styledOutput.setSelection(styledOutput.getCharCount());

A noter qu’avec setSelectionRange, seul le positionnement du curseur est effectué pas le scolling.

Xen 4 : patch pour une configuration bridge IPv6

Le script de configuration réseau en mode bridge de Xen (/etc/xen/scripts/network-bridge) ne prend en compte que les adresses au format IPv4. Ceci est problématique puisque Xen ne se chargera pas et au final vos domU ne pourront démarrer automatiquement.

Ce patch vous sera alors nécessaire pour prendre en compte l’adressage IPv6 :

--- network-bridge.old    2012-05-03 19:45:13.890075051 +0200
+++ network-bridge    2012-05-03 20:03:54.362049925 +0200
@@ -105,6 +105,10 @@
get_ip_info() {
addr_pfx=`ip addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet //' -e 's/ .*//'`
gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
+    # HB: fix IPv6 bridge
+    addr_pfx_6=`ip -6 addr show dev $1 | egrep -m 1 '^ *inet' | sed -e 's/ *inet6 //' -e 's/ .*//'`
+    gateway_6=`ip -6 route show dev $1 | fgrep default | sed -e 's/default via //' -e 's/ .*//'`
+    echo "DEBUG: $addr_pfx_6 $gateway_6"
}

do_ifup() {
@@ -119,6 +123,19 @@
fi
}

+# HB: fix IPv6 bridge
+do_ifup_6() {
+    if [ $1 != "${netdev}" ] || ! ifup $1 ; then
+           if [ -n "$addr_pfx_6" ] ; then
+            # use the info from get_ip_info()
+            ip -6 addr flush $1
+        ip -6 addr add ${addr_pfx_6} dev $1
+            ip -6 link set dev $1 up
+            [ -n "$gateway_6" ] && ip route add default via ${gateway_6}
+        fi
+    fi
+}
+
# Usage: transfer_addrs src dst
# Copy all IP addresses (including aliases) from device $src to device $dst.
transfer_addrs () {
@@ -249,6 +266,8 @@
fi
add_to_bridge2 ${bridge} ${pdev}
do_ifup ${bridge}
+    # HB: fix IPv6 bridge
+    do_ifup_6 ${bridge}

if [ ${antispoof} = 'yes' ] ; then
antispoofing
@@ -280,6 +299,8 @@
ip link set ${bridge} name ${tdev}
ip link set ${pdev} name ${netdev}
do_ifup ${netdev}
+    # HB: fix IPv6 bridge
+    do_ifup_6 ${netdev}

brctl delbr ${tdev}

Xen 4 : installation d’une VM Windows serveur 2008

Alors aujourd’hui c’est ma fête et à quoi j’ai droit ? Installer deux VM Windows. Merci, vraiment merci. Donc çà ne méritera pas plus qu’un article type copié/collé tout bête et deux / trois images pour mettre de la couleur. Allez, la mission du jour, l’installation d’un serveur Xen 4 sous Debian 6 / Squeeze et la configuration d’une VM paravirtualisée sous Windows Server 2008.

Installation des packages

# apt-get install linux-image-2.6.32-5-xen-amd64 xen-hypervisor-4.0-amd64 xen-qemu-dm-4.0 genisoimage

Il faut évidemment installer le noyau correspondant à l’architecture matérielle de votre serveur.

# dpkg -l | grep '^ii' | grep xen
ii  libxenstore3.0                      4.0.1-4                      Xenstore communications library for Xen
ii  linux-image-2.6.32-5-xen-amd64      2.6.32-41squeeze2            Linux 2.6.32 for 64-bit PCs, Xen dom0 support
ii  xen-hypervisor-4.0-amd64            4.0.1-4                      The Xen Hypervisor on AMD64
ii  xen-qemu-dm-4.0                     4.0.1-2+squeeze1             Xen Qemu Device Model virtual machine hardware emulator
ii  xen-utils-4.0                       4.0.1-4                      XEN administrative tools
ii  xen-utils-common                    4.0.0-1                      XEN administrative tools - common files
ii  xenstore-utils                      4.0.1-4                      Xenstore utilities for Xen

Configuration de GRUB

Pour booter sur le noyau xenifié (dom0), l’ordre de détection du noyau Xen par Grub doit être modifié afin que l’entrée correspondante dans le menu de démarrage soit positionnée en premier :

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

Grub se chargeant de détecter les OS installés, cette fonction est à proscrire pour ne pas polluer le menu de démarrage :

# Disable OS prober to prevent virtual machines on logical volumes from appearing in the boot menu.
GRUB_DISABLE_OS_PROBER=true

L’installation peut être enfin être lancée avec la nouvelle configuration :

# update-grub

Configuration de l’hyperviseur Xen

La configuration globale de Xen est à adapter pour faire joujou (l’accès réseau serait inopérant) :

# nano /etc/xen/xend-config.sxp
(network-script 'network-bridge bridge=eth0 antispoof=yes')
(vif-script vif-bridge)
(dom0-min-mem 1024)
(enable-dom0-ballooning yes)
(keymap 'fr')
# shutdown -r now

Suite au redémarrage, on vérifie que le noyau Xen est actif, que l’hyperviseur de Xen est chargé et que le bridge réseau eth0 et son interface physique peth0 (conventions Debian) sont présents :

# uname -a
Linux manjula 2.6.32-5-xen-amd64 #1 SMP Thu Mar 22 21:14:26 UTC 2012 x86_64 GNU/Linux
# xm info
host                   : manjula
release                : 2.6.32-5-xen-amd64
version                : #1 SMP Thu Mar 22 21:14:26 UTC 2012
machine                : x86_64
nr_cpus                : 8
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 2
cpu_mhz                : 2533
hw_caps                : bfebfbff:28100800:00000000:00001b40:0098e3fd:00000000:00000001:00000000
virt_caps              : hvm hvm_directio
total_memory           : 16343
free_memory            : 613
node_to_cpu            : node0:0-7
node_to_memory         : node0:613
node_to_dma32_mem      : node0:609
max_node_id            : 0
xen_major              : 4
xen_minor              : 0
xen_extra              : .1
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : placeholder
cc_compiler            : gcc version 4.4.5 (Debian 4.4.5-8)
cc_compile_by          : waldi
cc_compile_domain      : debian.org
cc_compile_date        : Thu Jun  9 18:38:03 UTC 2011
xend_config_format     : 4
# brctl show

Configuration de la VM Windows

Le stockage des VM repose sur des volumes logiques LVM. Un volume de 20 Go devrait être suffisant pour cette VM (qui a dit qu’on faisait rien de toute façon sous Windows ?!) :

# lvcreate -L20G -npria vg

Au tour ensuite du fichier de configuration de la VM ; ici le serveur s’appellera pria :

# nano /etc/xend/pria
name = 'pria'
kernel = '/usr/lib/xen-4.0/boot/hvmloader'
builder = 'hvm'
device_model = '/usr/lib/xen-4.0/bin/qemu-dm'

memory = 2048
shadow_memory = 8
vcpus = 1
pae = 1
acpi = 1
apic = 1

vif = [ 'bridge=eth0' ]

disk = [ 'phy:/dev/vg/xen_pria,hda,w','file:/opt/win2008.iso,hdc:cdrom,r','file:/opt/win2008_drivers.iso,hdd:cdrom,r' ]
boot='dc'

usbdevice = 'tablet'

vnc=1
vnclisten = '0.0.0.0'
vncunused = 0
vncconsole = 1
vncviewer = 0
sdl = 0

stdvga = 0
serial = 'pty'
ne2000 = "0"

on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

J’utilise deux lecteurs CD : un pour l’image d’installation de l’OS et l’autre pour les drivers paravirtualisés. Cela évitera 1 redémarrage … Les drivers paravirtualisés ont pour intérêt de faire dialoguer directement le domU avec l’hyperviseur Xen et non plus avec le dom0. Pour Windows, des drivers GPL sont disponibles ici :

http://wiki.univention.de/index.php?title=Installing-signed-GPLPV-drivers

Seuls des packages MSI étant proposés, il faut créer une ISO CD avec genisoimage :

# genisoimage -o win2008_drivers.iso gplpv_Vista2008x32_signed_0.11.0.356.msi

Les ISO nécessaires sont donc copiées dans /opt. Pour mémoire, l’option usbdevice permet de corriger le problème de placement du pointeur de la souris dans la console VNC.

Installation de Windows

Pour débuter l’installation de Windows, un accès VNC est requis. Pour ce faire, je lance une redirection locale par SSH du port 5900 distant afin d’accéder à la console VNC de la VM :

$ ssh root@manjula -N -L 5900:127.0.0.1:5900

Un client VNC local est ensuite lancé depuis mon poste sur localhost:5900.

Installation des drivers paravirtualisés

L’ISO des drivers correspond donc au deuxième lecteur CD que je monte dans la VM, il reste à lancer le package MSI d’installation.

Une fois redémarré, une nouvelle carte réseau fait son apparition ; il s’agit de la carte paravirtualisée. La VM doit être reconfigurée pour utiliser cette carte réseau par défaut, ce qui désactivera la seconde carte (non paravirtualisée). Les deux lecteurs CD peuvent aussi à cet instant être supprimés :

vif = [ 'bridge=eth0,type=paravirtualised' ]
disk = [ 'phy:/dev/vg/xen_pria,hda,w' ]

Une fois l’adressage réseau effectué, l’accès VNC est évidemment à désactiver au profit de l’utilisation de l’accès RDP.

PHP : default_socket_timeout

Encore une connerie PHP – mais qui ne sera jamais la dernière alors soyons heureux – au niveau de la configuration par défaut du timeout des opérations réseau (lecture/écriture) que voici :

; Default timeout for socket based streams (seconds)
; http://php.net/default-socket-timeout
default_socket_timeout = 60

L’option default_socket_timeout est fixée par défaut à 60 secondes alors que la durée maximale d’exécution d’un script (option max_execution_time), est de 30 secondes…Vive la gestion des erreurs !

Bref, tout cela pour en venir au fait que 30 secondes c’est beaucoup trop et 15 suffisent largement. A noter que l’extension SOAP a un timeout spécifique pour l’établissement de la connexion.

hbIRCS : build 20120429

Nouveau build pour mon serveur de discussions IRC. Au niveau des nouveautés, l’ajout du support des semi-opérateurs de salon (half ops). Un utilisateur possédant les droits halfop peut alors voicer / kicker / bannir et changer le topic du salon. La commande pour accorder les droits halfop à un utilisateur sur un salon est la suivante :

/mode +h user

Selon le client IRC, les utilisateurs halfop peuvent être mis en évidence graphiquement ou textuellement par le préfixe %.

Ce mode étant hors spécification RFC, il est possible de le désactiver avant compilation en modifiant le flag présent dans la classe fr.hbis.hbircs.Define:

/**
* Flag to set RFC compliance with channel modes.
*
* If this option is enabled, non RFC channel modes are allowed like half
* operator status.
*/
public static final boolean RFC_STRICT_CHANNEL = false;

Le projet prenant poussière depuis près de trois ans, je me suis enfin décidé à libérer le code source. Rendez-vous donc sur la page de mon dépot github ou sur la page d’informations présente sur ce site. L’objectif actuel de développement est la mise en place basique du support multi-serveurs.

Haut de page