Le Blog Maniatux

Bienvenue sur internet

Virtualisation

Aperçu de bhyve - Episode 1 vmrun.sh

Rédigé par Xavier - - aucun commentaire

bhyve est un hyperviseur pour FreeBSD qui utilise les capacités de virtualisation du CPU (VT-x + EPT chez Intel et AMD-V + RVI chez AMD) et fourni des périphériques virtuels VirtIO aux systèmes invités. En un sens c'est une alternative à Linux-KVM pour FreeBSD. Cette solution vient en complément des jails qui se limitent à faire tourner du FreeBSD. bhyve supporte déjà des systèmes invités Linux, FreeBSD et OpenBSD. On ne sait pas encore si Windows sera supporté, mais c'est très probable. bhyve n'émule pas encore de bios ni de carte VGA, ce qui signifie que vous allez devoir travailler en mode texte, exactement comme pour les jails.

Il est intéressant de noter que bhyve est déjà pris en charge par libvirt, ce qui vous permet de gérer et piloter vos VM grâce à cette API, en local ou via une console distante (virt-manager). Je testerai cela probablement dans un prochain article.

Du virtuel dans du virtuel

Je n'ai pas de machine physique libre ayant les pré requis pour bhyve, c'est à dire avec un processeur suffisamment récent pour supporter à la fois VT-x et EPT. J'ai donc utilisé mon ordinateur portable de 2012 équipé d'un i5, sur lequel tourne Windows 7 (pour le travail) et sur lequel j'installe VMware Workstation. Pourquoi VMware ? Parce qu'il fourni une fonctionnalité intéressante : le support de nested VT-x. En gros la machine virtuelle que vous faites tourner peut elle-même faire tourner des machines virtuelles. Donc je vais pouvoir créer dans VMware une machine virtuelle FreeBSD, puis exécuter bhyve dans cette dernière afin de faire tourner d'autres VM dedans.

A noter que VirtualBox ne supporte pas le nested VT-x, ce qui signifie que votre VM FreeBSD ne pourra pas exécuter bhyve car absence d'accès aux instructions VT-X + EPT du CPU hôte.

Allons-y

Le site du projet bhyve fourni un lien vers un fichier texte contenant les instructions. Donc je me contente de les suivre pour le moment.

Charger les modules

Pour charger les modules de manière volatile :

# kldload vmm
# kldload if_tap

Note : Si une erreur s'affiche au chargement du module vmm, il est probable que votre processeur ne soit pas supporté, ou qu'il ne dispose pas des instructions VT-x ou EPT.

Pour charger les modules de manière persistante (au reboot), éditez le fichier /boot/loader.conf

vmm_load="YES"
if_tap_load="YES"

Récupérer le script d’exécution

Le script d’exécution devrait être présent dans /usr/share/examples/bhyve/vmrun.sh mais il est également possible de le récupérer à cette adresse :

# fetch http://people.freebsd.org/~neel/bhyve/vmrun.sh

Ce script va gérer la création de la VM, le montage de l'iso ,d'un périphérique de stockage et d'une interface réseau. Rendons-le exécutable :

# chmod +x vmrun.sh

Guest FreeBSD

Récupérer une ISO de FreeBSD 10 :

fetch http://people.freebsd.org/~neel/bhyve/release.iso.iso

Démarrer la VM :

./vmrun.sh vm1

Le bootloader du FreeBSD invité devrait alors s'afficher.

Après le chargement du kernel, on obtient une magnifie erreur de point de montage root non trouvé :

J'ai trouvé ce fil de discussion qui explique une solution de contournement, mais le problème c'est que je ne peux rien saisir au clavier, les caractères ne sont pas pris. Bug ? Limitation due à l'utilisation de VMware ? Il semblerait plutôt que ce soit un problème de console non adaptée.

Bon, faisons un deuxième essai. La FAQ de Bhyve mentionne l'existence d'images RAW de FreeBSD11-CURRENT conçues exprès pour démarrer dans Bhyve. Commencez par visiter le FTP avec l'adresse suivante : http://ftp.freebsd.org/pub/FreeBSD/snapshots/VM-IMAGES/11.0-CURRENT/amd64/Latest/ afin de repérer le nom de l'image. Ensuite récupérez cette image avec fetch (commande non détaillée car l'URL est trop longue).

Ensuite supprimons le fichier release.iso pour ne pas qu'il soit capturé par vmrun.sh, décompressons notre image RAW, et démarrons le tout :

# rm release.iso
# unxz FreeBSD-11.0-CURRENT-amd64-20140714-r268622.raw.xz
# ./vmrun.sh -d FreeBSD-11.0-CURRENT-amd64-20140714-r268622.raw vm1

Et cette fois ça marche. On arrive au login, il suffit d'entrer "root" sans mot de passe, et on accède à notre système virtuel FreeBSD 11 :

Pas d'accès au réseau pour le moment, mais c'est normal car la carte tap0 crée par le script vmrun.sh n'est reliée à rien (ni bridge ni routage). Il ne semble pas possible pour le moment de "sortir" de la vm ou de l'éteindre avec la commande shutdown. Cette dernière commande ne fera qu'arrêter le système guest, mais bhyve continuera de fonctionner. La solution constite à passer sur un autre tty (ALT+F2) et utiliser la commande suivante :

# bhyvectl --destroy --vm=vm1

Bhyve fonctionne plutôt bien mais est extrêmement basique, beaucoup de choses se font manuellement et l'émulation d'un CDROM ne semble pas vraiment au point puisque FreeBSD10 n'a pas réussi à booter. L'utilisation d'une image FreeBSD-11 toute prête a permis de contourner le problème, le boot s'est déroule bien et le clavier est pris en charge.

J'ai expliqué mon problème de FreeBSD10 qui ne boote pas sur irc (#bhyve), on m'a recommandé d'utiliser vmrc. Cela fera peut-être l'objet d'un prochain article.

Guest Linux

bhyve affirme supporter les guest Linux. Faisons donc un essai avec Debian Wheezy.

# fetch http://cdimage.debian.org/debian-cd/7.6.0/amd64/iso-cd/debian-7.6.0-amd64-netinst.iso

Ensuite démarrons cette VM à l'aide du script vmrun.sh mais en spécifiant cette fois l'emplacement de l'ISO :

# ./vmrun.sh -I debian-7.6.0-amd64-netinst.iso vm2

Le test va être rapide car cela ne marche pas du tout :

En l'absence de BIOS ou UEFI, bhyve n'est pas capable de booter tout seul. La FAQ de bhyve indique la nécessité d'utiliser sysutils/grub2-bhyve. On va s'arrêter là et miser sur vmrc dans un prochain article car il parait que tout ceci est alors automatisé.

Conclusion

Cette première découverte de bhyve est très intéressante. L'idée est bonne, utiliser la virtualisation matérielle VT-x + EPT et VirtIO pour les périphériques, ce qui assure en théorie le maximum de performances. Malheureusement son utilisation n'est vraiment pas évidente, on sent le côté expérimental de la chose. bhyve est un produit encore brut qu'il faudra exploiter avec de meilleurs outils.

Découverte de XEN sur Debian Wheezy

Rédigé par Xavier - - 3 commentaires

XEN n'est pas nouveau pour moi, j'en parlais sur ce blog en 2011. Mais à l'exception de la solution XenServer, c'était relativement obscur, compliqué, et déprécié par les distributions Linux au profil de solutions alternatives (KVM et LXC). Je pensais vraiment que Xen allait disparaitre ou sombrer dans l'oubli. En fait non car en 2014 non seulement XEN est toujours très utilisé (par exemple chez AWS, le cloud Amazon), mais il est en plus upstream dans le kernel Linux et géré par la Linux Fundation. Il est donc revenu en force dans toutes les distributions Linux. J'ai été surpris de constater que maintenant on peut l'installer et l'utiliser très facilement sur Debian Wheezy, je vais partager mon expérience sur cet article ;)

Notions Dom0 et DomU

Sur des hyperviseurs comme Hyper-V ou VMware nous sommes habitués à exécuter des machines virtuelles depuis l'hôte. Or sur XEN cette notion est différente, l'hôte devient une machine virtuelle XEN avec des privilèges d'administration nommée Dom0. Donc au démarrage votre serveur doit démarrer XEN et ensuite le Dom0 sur lequel vous vous connectez. On peut limiter la RAM et les vcpus de Dom0 comme pour les autres.

Les autres VMs que l'on va faire tourner sur XEN, et qui elles n'ont pas de privilèges particuliers, sont nommés DomU. Voici un schéma pour récapituler :

Dans le cas de cet article, le Dom0 est Debian Wheezy. Cela peut paraître assez abstrait comme ça, mais si vous le mettez en oeuvre, vous comprendrez !

Installation de Debian

L'installation se fait à partir d'une ISO tout à fait normale de Debian. Personnellement je suis parti sur une Wheezy amd64 en netinstall, donc la debian-7.4.0-amd64-netinst.iso. Il est possible d'utiliser LVM avec XEN, mais je préfère faire simple pour le moment, je choisis donc un partitionnement assisté avec tout dans une même partition.

Installation de XEN

Sur une Debian Wheezy fraichement installée, il suffit d'installer le paquet xen-hypervisor :

# apt-get install xen-hypervisor

Boot automatique sur Xen

Passer Xen en priorité dans grub :

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

Configuration du réseau (bridge)

Il suffit de modifier le fichier /etc/network/interfaces pour avoir un Bridge. Exemple pour moi qui suis en DHCP :

#The loopback network interface
auto lo
iface lo inet loopback

iface eth0 inet manual

auto xenbr0
iface xenbr0 inet dhcp
   bridge_ports eth0

Note : Si comme moi vous faites vos essais dans VirtualBox, méfiance. Si on utilise déjà un pont dans VirtualBox, xenbr0 ne fonctionnera pas correctement (les domU peuvent pinger dom0 mais pas internet). J'ai pas mal bloqué sur ce problème et finalement la solution consiste à laisser VirtualBox en NAT.

Installation des Xen Tools

Xen-tools permet de créer facilement des domU à partir de templates, et c'est la solution la plus simple :

# apt-get install xen-tools

Configuration du template Xen Tools

On édite le fichier /etc/xen-tools/xen-tools.conf. Voici les lignes à modifier pour notre cas :

dir = /home/xen
size   = 10Gb      # Disk image size.
fs     = ext4     # use the EXT4 filesystem for the disk image.
bridge = xenbr0
ext4_options     = noatime,nodiratime,errors=remount-ro

Et voilà.

Déploiement d'un DomU Debian

Note : Il faut prendre soin de rebooter après les manipulations précédentes, afin d'avoir Xen et le Dom0 opérationnels avant d'aller plus loin.

Voici la commande pour créer un hôte de type Debian Wheezy qui sera nommé Wheezy :

# xen-create-image --hostname wheezy --dhcp --vcpus 1 --pygrub --dist wheezy

WARNING
-------

  You appear to have a missing vif-script, or network-script, in the
 Xen configuration file /etc/xen/xend-config.sxp.

  Please fix this and restart Xend, or your guests will not be able
 to use any networking!


General Information
--------------------
Hostname       :  wheezy
Distribution   :  wheezy
Mirror         :  http://ftp.fr.debian.org/debian/
Partitions     :  swap            128Mb (swap)
                  /               10Gb  (ext4)
Image type     :  full
Memory size    :  128Mb
Kernel path    :  /boot/vmlinuz-3.2.0-4-amd64
Initrd path    :  /boot/initrd.img-3.2.0-4-amd64

Networking Information
----------------------
IP Address     : DHCP [MAC: 00:16:3E:EB:96:45]


Creating swap on /dev/vg0/wheezy-swap
Done

Creating ext4 filesystem on /dev/vg0/wheezy-disk
Done
Installation method: debootstrap
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done

No role scripts were specified.  Skipping
Setting up root password
Generating a password for the new guest.
All done


Logfile produced at:
	 /var/log/xen-tools/wheezy.log

Installation Summary
---------------------
Hostname        :  wheezy
Distribution    :  wheezy
IP-Address(es)  :  dynamic
RSA Fingerprint :  83:21:28:49:d9:93:38:ae:5a:11:41:23:fa:3a:6e:05
Root Password   :  UzNRAZe4

Pour démarrer notre DomU :

# xm create wheezy.cfg 
Using config file "/etc/xen/wheezy.cfg".
Started domain wheezy (id=2)

Pour se connecter à ce DomU, deux possibilités : avec SSH si on connaît l'IP, ou avec la commande xm console :

# xm console wheezy

Pour en sortir, arrêter la VM, ou utiliser la combinaison CTRL+]

Pour arrêter le DomU depuis le Dom0, utiliser la commande xen-delete-image :

# xm destroy wheezy

Note : la commande xm destroy va provoquer l'arrêt brutal du domU.

Déploiement d'un DomU NetBSD

Bon un DomU en Debian c'était facile parce qu'on peut utiliser xen-tools qui automatise tout. Maintenant la même chose avec NetBSD, qu'il va falloir installer à la main. Tout d'abord, on télécharge et on extrait la version installable et la version normale de NetBSD version Xen :

# wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-6.1.3/amd64/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz
# wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-6.1.3/amd64/binary/kernel/netbsd-XEN3_DOMU.gz
# gunzip netbsd-INSTALL_XEN3_DOMU.gz
# gunzip netbsd-XEN3_DOMU.gz

Ensuite on doit créer un fichier une image qui servira de support de stockage pour le DomU :

# mkdir -p /home/xen/domains/netbsd
# dd if=/dev/zero of=/home/xen/domains/netbsd/disk.img bs=1 count=0 seek=10G

Création d'un fichier de configuration pour notre domU NetBSD (il est possible de copier celui du domU Wheezy précédemment créé pour aller plus vite puis le modifier) :

# vi /etc/xen/netbsd.cfg
kernel = "/root/netbsd-INSTALL_XEN3_DOMU"
memory = '128'
disk = [
'file:/home/xen/domains/netbsd/disk.img,xvda1,w';
]
name = 'netbsd'
dhcp = 'dhcp'
vif = [ 'mac=00:16:3E:EB:96:41,bridge=xenbr0' ]

On démarre notre domU NetBSD créé (cette fois l'argument c va directement connecter la console) :

# xm create -c netbsd.cfg

On obtient ceci :

Il faut maintenant procéder à une installation personnalisée, en sélectionnant uniquement base et system (pas besoin du kernel qui ne sera pas utilisé car GENERIC) et une source HTTP ou FTP (l'équivalent du netinstall) pour récupérer les paquets.

Si tout se passe bien :

Une fois l'installation terminée, il faut modifier le netbsd.cfg pour utiliser l'autre kernel :

# vi /etc/xen/netbsd.cfg
kernel = "/root/netbsd-XEN3_DOMU"

Il est maintenant possible de booter sur NetBSD :

# xm create -c netbsd.cfg

Conclusion

Xen est relativement simple à utiliser sur Debian Wheezy, grâce à Xen-tools qui facilite la création de domU à partir d'un template. Quand il s'agit de créer un domU "exotique" comme NetBSD, la procédure est un peu plus longue mais reste simple et logique. Il se positionne donc comme une solution intéressante pour les serveurs n'ayant pas le support de la virtualisation complète (Intel VT-X / AMD-V). Néanmoins lorsque ces instructions sont disponibles, les solutions alternatives telles que KVM ou ses concurrents propriétaires (Hyper-V, VMware...) me semblent toujours beaucoup plus simples à administrer et offrent des performances excellentes. Y a-t-il toujours un avenir à la paravirtualisation, qui est à mi chemin entre les containers (LXC, jails...) et la virtualisation complète ? A voir...

Mon bilan est positif sur l'utilisation, mais je me questionne toujours sur la pertinence de Xen en 2014.

Ressources

VirtualBox : P2V

Rédigé par Xavier - - 1 commentaire

Un P2V (Physical to Virtual) est une opération qui consiste à transférer le système d'exploitation d'un ordinateur physique vers une machine virtuelle. C'est très pratique lorsque le hardware est défaillant ou sous-dimensionné et que vous souhaitez redonner un peu de patate à un serveur ou un poste de travail. Dans mon cas il s'agit d'un poste sous Windows XP que je souhaite virtualiser afin de l'utiliser sur une autre machine plus récente équipée de Windows 7. Voici la procédure.

Etape 1 : Génération du fichier VHD

Téléchargez l'utilitaire Disk2vhd sur la machine cible et exécutez-le en administrateur. Pensez à stopper l'antivirus et tous les services pouvant ralentir l'opération. Sélectionnez votre disque C:\ puis décochez la case "Use VhdX" (VirtualBox supporte mal) et sélectionnez l'emplacement du fichier cible (qui peut très bien être en local).

Exécutez l'opération, et patientez. Pour information, 40GB de vhd prennent à peu près 1 heure. Lorsque le fichier est complète généré, transferez-le sur votre machine qui va exécuter VirtualBox. Privilégiez un réseau 1000Mbps sinon cela risque d'être long (quasiment 1h20 pour mon fichier vhd de 40GB!).

Etape 2 : Création de la VM

Sur la machine qui exécute VirtualBox cliquez sur le bouton pour créer une nouvelle VM. Donnez-lui un nom, sélectionnez le type d'OS adapté dans la liste, allouez de la RAM (2GB pour XP 32 bits est suffisant) et sélectionnez "Utiliser un fichier de disque dur virtuel existant" et allez chercher votre fichier vhd. Pour finir, cliquez sur "créer".

Etape 3 : Configuration

Pour ma machine virtuelle en Windows XP j'ai du activer IO-APIC et PAE/NX. Pour cela sélectionnez votre VM puis cliquez sur "Configuration". IOi-APIC se situe dans la catégorie "Système" puis onglet "Carte mère". PAE/NX se situe dans l'onglet "Processeur".

Exécuter la VM

Plus qu'à cliquer sur le bouton "Démarrer" ! Attention si votre Windows XP était enregistré sur un domaine, pensez à le renommer pour éviter les conflits sur l'A.D.

Installer VMware Workstation sous Fedora

Rédigé par Xavier - - aucun commentaire

L'installation de VMware Player/Workstation sous Linux est assez simple puisqu'il suffit de lancer le package fourni en root. Or sous Fedora la compilation des modules ne passe pas, il y a quelques manipulations à faire.

Dépendances

# yum install kernel-devel* make gcc

Installation VMware

# ./VMware-Workstation-Full-9.0.1-894247.x86_64.bundle

Compilation des pilotes

Ci dessous un petit fix sinon la compilation échouera :

# cp /usr/src/kernels/`uname -r`/include/generated/uapi/linux/version.h \
/lib/modules/`uname -r`/build/include/linux

Puis on lance la génération des pilotes :

# /usr/bin/vmware-modconfig --icon="vmware-workstation" --appname="VMware"

La compilation des pilotes (fix + modconfig) est à faire à chaque mise à jour du kernel Fedora.

Windows 8 sur Linux-KVM et Virt-Manager

Rédigé par Xavier - - 4 commentaires

Si vous essayez d'installer Windows 8 dans Linux-KVM vous allez rencontrer le bug suivant :

Your PC needs to restart.
Please hold down the power button
Error Code: 0x0000005D
Parameters:
0x03060203
0x756E6547
0x49656E69
0x6C64746E

Il s'agit d'une réaction au type de CPU affiché par Linux-KVM (Qemu Processur), la solution consiste à copier la configuration du CPU hôte afin que ce dernier s'y retrouve. Pour cela ouvrez les paramètres de votre VM, allez dans "Processor" puis "Configuration" et cliquez sur "Copier la configuration CPU de l'hôte".

Vous pouvez maintenant virtualiser Windows 8 sous Linux sans devoir installer VirtualBox ou VMware !

Merci à Regardt van de Vyver