Par Artisan Numérique, le 24/07/2008 à 02:50.
Que ce soit pour tester de nouvelles distributions, des environnements de production, avoir un WilainOS sous la main en cas de besoin, ou garder son bureau GNU/Linux et malgré tout pouvoir développer en environnement "clientèle", la virtualisation est un outil indispensable aujourd'hui. Il existe de nombreuses solutions fonctionnelles sous Linux pour permettre de virtualiser un environnement. Mais malgré tout le bien que je pense de VirtualBox ou Qemu, VMWare reste de loin le plus stable et le plus efficient de tous. Au point d'avoir pu l'utiliser pendant un an en continu comme station de travail principale pour des développements lourd.
Maintenant VMWare Workstation reste payant. Alors voici comment utiliser VMPlayer qui lui est gratuit pour faire rigoureusement la même chose avec juste un peu plus d'huile de coude.
Introduction
VMWare est un fantastique outil permettant d'exécuter des OS guest sur un OS host. Vous pouvez ainsi lancer Windows dans Linux, Linux dans Linux,
ReactOS
dans linux, etc...
Contrairement à d'autres systèmes, VMWare n'émule pas le processeur. Le code est exécuté nativement sur l'unité physique permettant des performances totalement comparables à un environnement natif. Le pendant de cette approche est que seul les OS i86 peuvent devenir des guests.
La couche matérielle, est elle émulée. C'est là la principal perte de performance de la plateforme. Perte limitée par l'utilisation des pilotes optimisés contenus sur les Guest Tools. Limitée aussi si l'on utilise un disque physique dédié comme espace de stockage plutôt qu'un disque virtuel.
Installation de VMPlayer
VMPlayer s'installe comme n'importe quel autre logiciel en téléchargeant le paquet et en l'installant via un urpmi VMPlayer.XXX.rpm. Ceci fait, il va nous falloir compiler les modules kernels de VMWare nécessitant le téléchargement préalable des sources du votre kernel. Ensuite, un simple vmware-config.pl suffit à lancer l'assistant qui vous poser divers questions pour finir par construire les modules. Après cela, VMWare devient le service /etc/init.d/vmware que l'on peut lancer (service vmware start) ou arrêter à loisir.
Création de la machine virtuelle
Pour fabriquer la machine virtuelle, rien de plus simple. Choisissez un emplacement approprié sur votre disque et créez un nouveau dossier. Allez dans ce dossier et créez un fichier vm.vmx.
J'ai commenté ce fichier de sorte à ce qu'il soit le plus compréhensible possible et restant facilement copiable :
vm.vmx
# Ces versions indiquent que notre VM est conçue une version 6 de VMWare Worstation
# et qu'elle est donc optimum pour VMPlayer 2.x. Placez un virtualHW.version="4" pour une
# Workstation 5.x.
#
config.version = "8"
virtualHW.version = "6"
# Le petit nom de note VM, il sera affiché dans la barre de titre du player
#
displayName = "VM Native"
# La définition de l'OS "invité". Personnellement je n'ai jamais vu ce que changeait
# cette valeur. Et comme j'utilise le même VMX pour plusieurs OS en multi boot
# comme nous le verrons plus loin, il semble bien que cela n'empêche pas un Linux de
# fonctionner très bien avec ce paramètre.
#
guestOS = "winxppro"
# Ici nous définissons le nombre de processeur à simuler. Ce nombre ne peut dépasser 2, et ne doit
# dans tous les cas pas être supérieur au nombre réel de processeur.
#
numvcpus="1"
# Taille de la mémoire à allouer à VMWare. Il faut raisonner comme pour une machine physique. Ainsi ne tentez pas
# de faire fonctionner Vista avec 512mo de RAM, ça ne marchera pas pas mieux que dans la vraie vie 
#
memsize = "1024"
# Avec ce paramètre à TRUE, vous autorisez le player à diminuer la mémoire physique réellement
# utilisée en fonction de son utilisation par le guest. Ainsi si vous avez déclaré un memsize à
# 1Go, et que vous autorisez le scaleDown, la mémoire réellement consommée peut être moindre.
# La contepartie c'est que pour regagner la mémoire rendu, il peut y avoir de la latence de la part
# de l'OS host.
#
# Le MemTrimRate permet de définir le rythme de désallocation de la mémoire. A ce que j'ai compris les deux paramètres
# vont de paire mais je n'ai pas trouvé d'information sur l'unité (seconde, milli ? )
#
MemAllowAutoScaleDown = "FALSE"
MemTrimRate = "-1"
# Le page sharing consiste pour VMWare à utiliser une seule page mémoire sur le host lorsque le guest en a deux ou plus
# d'identique. Cela peut certe réduire la consommation sur le host, mais réduit aussi les performances.
#
sched.mem.pshare.enable=FALSE
# Permet de créer un ID unique à la machine virtuelle au démarrage de celle-ci.
#
uuid.action = "create"
# Réglage des outils de base
#
tools.remindInstall = "TRUE" # vous préviens si les Guest Tools ne sont pas installés
tools.upgrade.policy = "upgradeAtPowerCycle" # vous préviens si une mise à jour est disponible
tools.syncTime = "TRUE" # Synchronise l'heure entre le guest et le host
# Ces paramètres permettent d'activer toutes les interactions entre le guest et le host.
# Ces fonctions nécessitent l'installation des Guest Tools
#
isolation.tools.hgfs.disable = "FALSE" # Permet à la souris de sortir de la VM sans CTRL+ALT
isolation.tools.dnd.disable = "FALSE" # Autorise le Glisser-Déposer
isolation.tools.copy.enable = "TRUE" # Autorise le Copier
isolation.tools.paste.enabled = "TRUE" # Autorise le Coller
# Configuration de la carte son. Ici nous émulons une Ensonic ES1371. Il est possible d'utiliser
# aussi une Sound Blaster 16 en utilisant la valeur SB16. Mettre .present à false pour désactiver le son.
# D'un point de vue général, les périphériques peuvent activées ou désactivées en utilisant la barre
# d'outils du player.
#
sound.present = "TRUE"
sound.virtualdev = "es1371"
sound.synth.operational = "TRUE"
# Configuration du port série n°1, on laisse ici le player trouver
# le device correspondant. Si vous voulez l'activer, positionnez
# .present à "TRUE", de même pour le second port.
#
serial0.present = "FALSE"
serial0.fileName = "Auto Detect"
serial0.autodetect = "TRUE"
serial0.hardwareFlowControl = "TRUE"
serial1.present= "FALSE"
# Configuration du port parralèle. Même chose que pour le port série,
# désactivé par défaut.
#
parallel0.present = "FALSE"
parallel0.fileName = "Auto Detect"
parallel0.autodetect = "TRUE"
parallel0.bidirectional = "TRUE"
# Configuration du lecteur de disquette, là aussi désactivé, ces bêtes là deviennent rares 
#
floppy0.present = "FALSE"
floppy0.startConnected = "FALSE"
# Configuration de l'USB. Là ça peut être utile. La configuration est assez simple mais
# vous notez la présente d'un .present ET d'un usb.generic.autoconnect. Ce dernier indique
# que par si le port USB est bien reconnu par VMPlayer, les périphériques qui y sont connectés
# ne sont pas automatiquement connectées. Elle pourront l'être de manière dynamique
# par la barre d'outils de VMPlayer qui prendra ainsi la main sur une clef USB ou une souris.
#
# Notez que si le player prend la main sur une périphérique USB, le host n'en dispose plus. Faites donc
# attention si vous avez l'idée de connecter votre souris ou clavier par exemple ;-)
usb.present = "TRUE"
usb.generic.autoconnect = "FALSE"
mks.enable3d = "FALSE"
# Là c'est important, le paramétrage du réseau. L'adresse indiquée sera l'adresse MAC de votre machine.
# Pensez donc à la modifier d'une machine à l'autre, et ne pas utiliser la même chose qu'une machine
# physique.
# Ensuite vient le virtualDev qui correspond (comme pour la carte son), à la carte réseau émulée. La valeur
# peut être e1000 pour une Intel Pro Gigabit, vlance pour la carte du même nom, ou vmxnet pour une carte
# VMWare.
# Comme pour serial0/1, il est possible d'avoir deux cartes réseau auquel cas il faut dupliquer les paramètres
# d'ethernet0 pour ethernet1 et biensur changer l'adresse MAC.
#
ethernet0.present = "TRUE"
ethernet0.connectionType = "nat"
ethernet0.addressType = "generated"
ethernet0.generatedAddress = "00:0c:29:59:aa:eb"
ethernet0.virtualDev = "e1000"
ethernet0.generatedAddressOffset = "0"
ethernet1.present="FALSE"
# Originellement il était possible de choisir entre SCSI et IDE. Pour les tests que j'avais fait
# il n'y avait aucun gain de performances en passant de l'un à l'autre. Donc j'opte pour le plus
# simple : IDE.
#
# La VM disposent de deux contrôleurs IDE pouvant recevoir deux disques chacun. Nous allons
# donc coller sur le deuxième contrôleur, deux lecteurs de CD-ROM. Le premier sera relié au lecteur
# physique, le second à une image ISO.
#
# Le problème du player, est qu'il n'y a pas de moyen de changer l'image ISO à chaud comme avec
# la version workstation. L'astuce consiste donc à utiliser un fichier cdrom.iso dans le même dossier
# que le fichier .vmx. Et de faire des liens symboliques entre la véritable image ISO et ce fichier. Cela
# permet d'installer un Linux sur 3 CD-ROM sans problèmes.
#
ide1:0.present = "TRUE"
ide1:0.deviceType = "cdrom-raw"
ide1:0.startConnected = "FALSE"
ide1:0.fileName = "auto detect"
ide1:0.autodetect = "TRUE"
ide1:1.present = "TRUE"
ide1:1.fileName = "cdrom.iso"
ide1:1.deviceType = "cdrom-image"
ide1:1.startConnected = "FALSE"
# Nous arrivons enfin au plus important, le disque de stockage
# Ici, seul un disque est monté sur le contrôleur IDE, mais l'autre peut
# être facilement activé.
#
# Je ne vais pas rentrer dans les détails du independent-persistent, disons
# que ce mode est sensé être le plus proche d'un fonctionnement physiques. En tout cas
# c'est pour moi le mode le plus efficace.
#
# Pour ce qui est du fichier native.vmdk, c'est tout l'objet du prochain chapitre.
ide0:0.present = "TRUE"
ide0:0.fileName = "disque_dur.vmdk"
ide0:0.mode = "independent-persistent"
ide0:0.deviceType = "rawDisk"
ide0:0.redo = ""
ide0:0.writeThrough = "TRUE"
ide0:0.startConnected = "TRUE"
ide0:1.present = "FALSE"
Création de l'espace de stockage
Utilisation d'un disque virtuel
Cette approche est sans doute la plus simple. L'avantage du disque virtuel est qu'il n'occupe que la place utilisée par le guest. Ainsi à sa création, il n'occupe que 1.4mo.
Pour créer ce disque nous allons utiliser l'utilitaire qemu-img provenant du paquet du même nom. La syntaxe est trés simple :
qemu-img create -f vmdk disque_dur.vmdk 10G
Et voilà, nous avons cré un disque de 10G qui pour l'instant en occupe beaucoup moins vu qu'il est vide.
A partir de là, notre VM est déjà utilisable, et nous pouvons la lancer par un
Votre machine virtuelle devrait normalement démarrer sans encombre. Vous pouvez alors aller (F2) dans le BIOS pour régler les priorités sur les disques pour démarrer sur un CD-ROM et commencer une installation.
A ce stade CTRL+ALT permette de dégager la souris de la fenêtre du player, CTRL+ALT+Entrée permet de basculer en plein écran et CTRL+ALT+ESPACE, relachement d'espace suivi de F1, permet de simuler le CTRL-ALT-F1.
Maintenant, un disque virtuel n'est pas ce que l'on fait de mieux pour une utilisation quotidienne de VMPlayer. En effet, soit parce que l'on désire utiliser une installation physique existante, soit pour des raisons de performances, nous pouvons préférez un bon vieux disque physique.
Utilisation d'un disque dédié
Cette technique, de par l'accès offert aux données physiques, n'est par nature pas sans risques. Faites donc attention à ce que vous faites pour ne pas flinguer les partitions ou le contenu même du support. Vous êtes prévenu.
Pour se donner une idée des performances d'un disque physique contre un disque virtuel, il faut garder tête que pour un disque physique ayant un débit en lecture sur le host de 59MB/s, donnera utilisé en virtuel environ 12MB/S. Le même disque physique mais utilisé à travers la VM donnera 34MB/s. Il est donc clairement plus performant de dédier un disque à VMWare dés que l'on utilise cet outil pour travailler sur du long terme.
L'autre cas d'utilisation d'un disque physique peut être de virtualiser une installation existante. Personnellement j'ai adopté la double approche d'un disque physique dédié qui est donc bootable en directe par la machine physique et utilisable en virtualisé par VMPlayer. Sur ce disque j'installe tranquillement toutes mes VM, chacune sur sa ou ses partitions avec un GRUB pour gérer le multi-boot.
Quel que soit votre usage, le travail préalable reste le même et consiste à créer un fichier vmdk qui va reprendre les caractéristiques du disque physiques.
En simplifiant un peu, un disque dur est composé de plateaux avec une têtes pour chacun. Les plateaux sont découpés en cercles concentriques, les pistes (tracks). Une même piste forme un cylindre pour l'ensemble des plateaux. La piste est découpée en secteurs, historiquement de 512 octets. Le nombre de cylindres, le nombre de secteur par piste, et le nombre de têtes (et donc de plateaux) par cylindre, forment la géométrie du disque.
Pour connaître cette géométrie, le mieux est d'utiliser l'utilitaire parted. Par exemple si l'on désire utiliser le disque /dev/hda, cela nous donne :
# parted /dev/hda
(parted) unit cyl
(parted) print
ST3200822A (ide)
Disque /dev/hda : 24321cyl
Taille des secteurs (logiques/physiques): 512B/512B
BIOS cylindre,tête,secteur géométrie : 24321,255,63. Chaque cylindre est 8225kB.
...
Les valeurs peuvent surprendre. 255 têtes impliquent 255 plateaux, ce qui semble un peu volumineux pour un si petit disque... En fait, pour des raisons un peu longuètes à expliquer, le disque ne donne jamais son véritable nombre de têtes, pour préférer quelque chose de plus assimilable par la couche logicielle. Et au fond, on s'en moque. Notre disque dispose donc de 255 têtes, 63 secteurs par piste, et 24321 cylindres. Ce qui nous donne un espace disque de 512 (taille d'un secteur) x 255 (têtes par cylindre) x 63 (secteurs par piste) x 24321 (cylindres) = 200Go. Le compte est bon
Maintenant ce qu'il nous faut, c'est la taille du disque en secteurs. Pour cela, nous allons encore utiliser parted mais cette fois en changeant l'unité de cylinder à sector.
(parted) unit s
(parted) print
ST3200822A (ide)
Disque /dev/hda : 390721968s
...
En vert, nous avons la taille du disque en secteurs. Il ne nous reste donc plus qu'à reporter ces informations pour créer notre fichier disque_dur.vmdk
version=1
CID=400b3894
parentCID=ffffffff
createType="fullDevice"
RW 390721968 FLAT "/dev/hda" 0
ddb.geometry.cylinders = "24321"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.virtualHWVersion = "4"
ddb.adapterType = "ide"
ddb.toolsVersion = "6530"
Notez qu'il est possible de faire des fichiers vmdk beaucoup plus évolués que celui-là en créant un disque composé de partitions qui ne se suivent pas, et même d'images de partitions sockés sur le disque sous la forme d'un fichier. Mais même si vous n'utilisez cette technique que pour une seule partition, autant inclure le disque en entier, secteur de démarage compris. Le seul risque de cette approche est que la machine virtuel aura un accès en écriture sur l'ensemble du disque, c'est à vous de voir.
Les bons droits
Normalement, le disque /dev/hda (ou quel que soit le votre) n'est pas accessible en écriture (et même en lecture d'ailleurs) à un utilisateur Lambda. Et comme me l'a très justement fait remarquer Malic, lancer VmPlayer en root n'est pas une idée de génie. La solution consiste donc à changer les droits de /dev/hda pour les mettre en accord avec le ou les utilisateurs amenés à utiliser cette machine.
Sous Mandriva, les disques appartiennent à root et au groupe disk. Dans ce cas, une version simple consiste à modifier /etc/group et à ajouter le ou les utilisateurs à la fin de la ligne correspondante.
Ensuite, il faut donner les droits d'écritures sur le disque au groupe en question par la commande chmod g+rw /dev/hda. Ceci fait, il devrait suffire d'ouvrir une nouvelle console au nom de l'utilisateur cible pour pouvoir lancer VmPlayer. Le souci avec les distributions modernes, c'est qu'il y a un nouveau démon, console-kit-daemon, dont le but dans la vie est d'unifier les accès aux consoles (à ce que j'ai compris) et qui empêche du coup, de récupérer les bons droits directement. La seule parade que j'ai trouvée est de quitter X, puis se re-connecter pour bénéficier du nouveau groupe ainsi pouvoir lancer la VM sans problèmes.
Installation des Guest Tools
Les guest tools sont des images ISO, une par OS host donc, permettant l'installation d'utilitaires et de pilotes DANS la VM. Le problème est que ces ISO ne sont pas fournies avec le player. La solution est donc simplement de retourner sur le site de VMWare, télécharger la version d'évaluation de VMWare Workstation en rpm. Plus de décompresser le paquet par la commande suivante :
mkdir tmp
cd tmp
rpm2cpio VMWare-XXXX.rpm | cpio -div `*.spec`
find . -name "*.iso"
La commande find, est une recherche simple des fichiers .iso qui nous permet de découvrir une série de fichier avec des noms d'OS (windows.iso, linux.iso, etc...). Ce sont les ISO Guest Tools. Il suffit alors de recopier ses fichiers où bon vous semble. Ensuite vous devez monter le fichier correspondant à l'OS host sur le lien du CD-ROM. Une fois le tout installé, les performances sont transfigurées.
Conclusion
Comme je le disais en introduction, j'ai utilisé pendant 1 ans VMWare comme environnement principal de développement, et ce pour faire du Delphi/COM/DCOM. Pas réputé pour être d'une grande légereté. Cet outil m'est devenu aujourd'hui absoluent indispensable.
Dernier truc avant de partir, ma découverte du jour,
Ext2 IFS For Windows. Un pilote natif Windows qui permet d'attaquer en lecture ET en écriture des partitions ETX2/EXT3 et EXT4. Le tout avec les mêmes performances que sous Linux, très bon