1) Préparation de la VM

Nous sommes sur le serveur hôte (donc en Archlinux)

on crée le disque virtuel de la future VM :
qemu-img create -f qcow2 lenny.qcow2 50G

On vas travailler depuis la VM, en se connectant à l'ip failover, qui sera celle de la VM. Pour ça il nous faut préparer le réseau au niveau de l'hôte :
tunctl -d tap0
tunctl -t tap0 -u 0 -g 0
ip link set tap0 up
ip route add IP_FAILOVER dev tap0


ajouter :
net.ipv4.conf.tap0.proxy_arp=1
à /etc/sysctl.conf puis :
sysctl -p /etc/sysctl.conf

arp -Ds IP_FAILOVER eth0 pub

Ensuite il nous faut de quoi booter notre VM, télécharger finnix ici.
On peux maintenant démarrer votre VM en mode "install" = on boot sur le cd.

Dans un screen (comme ça on as accès au monitor au cas ou) :

screen

kvm -enable-kvm -k fr -cpu host \
-smp 1 \
-m 2048 \
-cdrom finnix-101.iso \
-hda lenny.img \
-boot "once=d,menu=off" \
-net nic,model=e1000,vlan=0 \
-net tap,script=no,ifname=tap0,vlan=0 \
-monitor stdio \
-vnc :10  \
-serial none \
-parallel none \
-localtime


tapez sur CTRL+A+D pour détacher le screen

Nous avons maintenant une VM qui à démarrée sur l'iso finnix mais qui est bloquée sur le boot screen.

Avec un client vnc (j'utilise krdc) connectez une console vnc à localhost:5910 si vous n'avez pas de bureau distant sur votre serveur , vous trouverez ici quelques moyens d'accéder à un vnc à distance.

Vous avez donc devant vous le boot screen de la finnix, selectionnez le premier menu (finnix en 32bit) puis quand vous avez la console, tapez :

loadkeys fr
passwd
service ssh start
ifconfig eth0 IP_FAILOVER netmask 255.255.255.255

route add -host GATEWAY_HOST dev eth0
up route add default gw GATEWAY_HOST

Tout ceci nous permet de nous connecter directement à la VM.

Fermer votre vnc, puis connetez vousà la vm via ssh :
ssh root@P_FAILOVER

On peux poursuivre de façon plus aisée. Il faut partitionner le disque virtuel de façon identique à l'original (même nb de partition)

Dans la VM, tapez :
cfdisk /dev/sda

Créez vos partitions puis puis formattez de la même façon que l'original (même fs). Ensuite :
 
mkdir /lenny
mount /dev/sda1 /lenny
(par exemple si vous n'aviez qu'une seule partoche)

installez quelques trucs (on est dans finnix, qui est un debian-like):
apt-get update
apt-get install rsync screen


Et voilà, notre vm est prête pour le rsync.

Il faut préparer les clés pour le transfert de fichier :

ssh-keygen -t rsa

puis copier la clé publique sur le serveur à virtualiser :

scp .ssh/id_rsa.pub root@IP_SERVEUR_A_VIRTUALISER:~/.ssh/authorized_keys

2) Préparation du serveur original

Nous sommes sur le serveur physique  à virtualiser (donc en Debian Lenny).

Installez puis démarrer rsyncd sur le debian à virtualiser
aptitude install rsync
/etc/init.d/rsync start

stopper tout les services sauf ssh sur le debian à virtualiser puis on monte / en lecture seule (pour être sur qu'aucune écriture ne se fera pendant le transfert) :
mount -o remount,ro /

3) RSYNC

On retourne dans la VM, ouvrez un screen puis tapez  voici la fameuse commande :
cd /lenny
rsync -avH --rsh 'ssh -p 4242' --exclude dev/ --exclude sys/ --exclude proc/ --exclude tmp/ --exclude lost+found/ root@IP_DEBIAN_A_VIRTUALISER:/* .


Pendant ce temps, allez boire un café, regarder Columbo sur la vod, autre....

4) CHROOT

Maintenant que le transfer est fait, on vas finir la conf de la VM.

Donc, toujours dans la VM, tapez :

for i in dev proc sys ; do mount -o bind /$i /lenny/$i ; done
chroot /lenny /bin/bash


et là vous ềtes dans le chroot Lenny \o/!

5) MISE A JOURS DES CONFS

Il faut remettre les bons UUIDs des partitions dans les conf.

un ls -la /dev/disks/by-uuid/ vous donnera les UUID à remplacer dans  :
/etc/fstab
/boot/grub/menu.lst

il faut regénérer le initrd :
dpkg-reconfigure linux-image-2.6.32-bpo.4-686-bigmem
puis reinstaller grub :
/usr/bin/grub-install /dev/sda

mise à jours de la conf réseau :

vi /etc/network/interface

dans la section eth0 :

auto eth0
iface eth0 inet static
    address IPFAILOVER
    netmask 255.255.255.255

up route add -host GATEWAY_HOST dev eth0
up route add default gw GATEWAY_HOST

la résoluion DNS dans /etc/resolv.conf :
nameserver 8.8.8.8
nameserver 4.2.2.2


(ou ceux du serveur hôte)

autres :
remplacer les ip par IP_FAILOVER dans vos différents services (/etc/hosts, apache, mysql, postgresql, etc...)

5) FIN

on peux éteindre la vm :

exit
umount /lenny/{proc,sys,dev}
umount /lenny
halt


Mais il faut préparer le serveur hôtet.

Pour archlinux, modifiez /etc/rc.conf et ajouter tun à la liste des modules.
Créez deux scripts. le premier, prépare le réseau puis lance le script qemu.
premier script : initqemu.sh
#!/bin/sh
# script d'init de la vm lenny

# reseau :
tunctl -d tap0
tunctl -t tap0 -u 0 -g 0
ip link set tap0 up
ip route add IP_FAILOVER dev tap0

# qemu
# utilisation d'un screen pour avoir le monitor en console
screen -dmS lenny-qemu runvm.sh

# fin init reseau :
ip route add IP_FAILOVER dev tap0
sysctl -p /etc/sysctl.conf

arp -Ds IP_FAILOVER eth0 pub


deuxième script : runvm.sh
kvm -enable-kvm \
-k fr \
-smp 1 \
-m 2048 \
-hda /home/virtuals/IMGs/obm.img \
-net nic,model=e1000,vlan=0 \
-net tap,script=no,ifname=tap0,vlan=0 \
-pidfile /home/virtuals/PIDs/obm.pid \
-name obm \
-monitor stdio \
-vnc :10  \
-serial none \
-parallel none \
-localtime


et vous placez initqemu.sh dans /etc/rc.local pour relancer automatiquement votre vm au démarrage du host.

Si vous stoppez votre vm, vous pouvez la relancer via runvm.sh.

Si vous publiez des services, pensez à mettre à jours vos domaines. Pensez aussià checker les logs pour voir si des droits n'ont pas sautés, etc..
ex : j'avais eu des ratés avec cyrus, le log /var/log/mail.err à permis de remttre les bon drois dans la vm.

Bon, c'est clairement une solution artisanale, qui à ces inconvenient si on a pleins de VM mais c'est pas mon cas. Et puis les choses sont simples :

j'ai un hôte avec son ip sur eth0 et j'ai une VM avec l'IP FAILOVER de l'hôte qui est sut tap0 (le routage est donc simple). Je peux ainsi configurer le firewall de l'hôte pour protéger la VM (une zone par interface eth0 ou tap0).
Je peux aussi publier des services sur l'hôte à destination exclusive de la VM (ex : mysql/pgsql/nfs).

Comme d'habitudes, je suis à l'écoute de toutes critiques/corrections/insultes éventuelles :-)