Bhyve est l'hyperviseur de FreeBSD disponible à partir de sa version 10.0. C'est un hyperviseur de niveau 2, c'est-à-dire qu'il s'agit d'un logiciel, s'exécutant sur un système d'exploitation hôte, qui simule une machine physique. On peut ainsi exécuter un ou plusieurs système(s) d'exploitation invité(s) sur une même machine.
Contrairement à certains hyperviseurs (comme QEMU), Bhyve ne virtualise pas tous les composants de la machine virtuelle. En effet, il s'appuie sur des fonctions de virtualisation présentes sur le CPU de la machine physique. Ces fonctions sont présentes sur les CPU récents de chez Intel (Extended Page Tables) et de chez AMD (Rapid Virtualization Indexing). En clair, votre CPU est aujourd'hui capable d'exécuter plusieurs systèmes d'exploitation à la fois (et sans les mains !).
Concernant les périphériques, Bhyve présente aux systèmes invités des périphériques nécessitant un pilote spécifique appelé virtio. Ce pilote définit une interface générique entre l'hyperviseur et les systèmes invités afin de faciliter l'intégration de nouveaux systèmes. À l'heure où j'écris ces lignes, seulement trois systèmes d'exploitation tournent sur Bhyve : FreeBSD, OpenBSD et Linux - c'est déjà pas mal ! Néanmoins en théorie, tout système possédant des pilotes virtio et une prise en charge des interruptions MSI(-X) devrait fonctionner dans Bhyve. Grâce à la communauté qui est très active, nous devrions voir prochainement le support de NetBSD, ainsi que d'Illumos.
Bon, assez de blabla, on est quand même ici pour apprendre et comprendre comment ce bouzin^Wpetit bijou fonctionne !
1. Préparation de l'environnement (pour FreeBSD)
Tout d'abord, il va nous falloir du matos :
- un ordinateur pas trop vieux (pour avoir les supports de virtualisation susnommés) ;
- une installation de FreeBSD 10.0 (amd64) toute fraîche ;
- les droits root sur cette machine ;
- une connexion Internet (pour télécharger les images des distributions) ;
- autre ?
Pour être certain d'avoir un processeur compatible, vous pouvez vérifier la présence de l'option POPCNT dans sa liste de features :
$ dmesg | grep POPCNT
Maintenant qu'on est prêt, on va pouvoir se lancer !
Pour commencer, on va créer un répertoire de travail nommé /usr/local/vmrc/vm. On stockera là-dedans les fichiers nécessaires de nos VM :
# mkdir -p /usr/local/vmrc/vm; cd /usr/local/vmrc/vm
On crée un répertoire pour notre machine FreeBSD :
# mkdir freebsd_ten0; cd freebsd_ten0
On va ensuite charger le cœur de Bhyve, à savoir le module noyau permettant l'exécution des machines virtuelles. Car oui, Bhyve n'est qu'une sorte de frontend au « Gestionnaire de machines virtuelles » (*VMM*) du noyau de FreeBSD. Chargeons ledit module :
# kldload vmm
Maintenant, nous allons pouvoir créer et exécuter notre première machine virtuelle. Pour commencer, nous exécuterons une instance de FreeBSD 10. Téléchargez l'image d'installation (ici : ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.0/FreeBSD-10.0-RELEASE-amd64-disc1.iso). Pour que ce soit plus simple, créez un lien vers le fichier téléchargé :
# ln -s path_to_freebsd_10.iso freebsd10.iso
Il faut aussi créer un disque dur virtuel. Pour ce faire, nous utiliserons un fichier vide de la taille du disque souhaité :
# truncate -s 4G freebsd_ten0.img
Voilà, nous obtenons un disque dur de 4 Gi pour notre machine virtuelle (vous pouvez adapter la taille comme bon vous semble). Il serait aussi intéressant de donner un accès à Internet à notre VM. Nous allons pour cela créer une interface virtuelle tap, que nous brancherons à notre interface physique (celle qui nous permet d'accéder à l'extérieur) en utilisant un bridge. Chargeons les modules nécessaires :
# kldload if_bridge kldload if_tap
On crée ensuite notre interface virtuelle :
# ifconfig tap0 create up
On modifie une variable du système pour ne pas avoir à monter l'interface tap à la main :
# sysctl net.link.tap.up_on_open=1 # ensure tap0 is up and working on open !
Puis, on crée un bridge reliant les deux interfaces.
Mon interface physique est ici alc0. Vous devrez sans doute adapter les commandes avec votre propre nom d'interface.
# ifconfig bridge0 create up
# ifconfig bridge0 addm tap0 addm alc0
Un petit ifconfig nous montrera que tout est bien configuré.
Remarque : l'interface tap0 n'aura jamais d'adresse IP assignée. En effet, c'est l'hyperviseur qui « s'attachera » à cette interface et lira/écrira les paquets réseau envoyés/reçus par la VM. Lorsque notre VM sera lancée, le PID de l'instance de Bhyve sera affiché dans les informations de tap0.
2. Notre première machine virtuelle
Il est maintenant l'heure d'exécuter la machine virtuelle. Nous procéderons en deux étapes :
- Chargement du noyau invité,
- Exécution du système.
La première étape consiste à charger et initialiser le système afin qu'un système d'exploitation puisse s'exécuter. C'est, en quelque sorte, tout ce qui se passe avant que l'OS ne démarre : BIOS, exécution du bootloader stocké sur les premiers secteurs du disque (eg. GRUB, Lilo, ou bien le bootloader de l'OS directement). Pour le moment, Bhyve ne supporte pas les chaînages de bootloaders, ainsi nous resterons sur des configurations simples avec un seul bootloader. L'objectif du bootloader est de charger le noyau en mémoire et de tout préparer afin qu'il puisse s'exécuter correctement.
Chargeons donc le noyau de l'ISO téléchargée précédemment avec 1024 Mi de mémoire vive. La commande à utiliser s'appelle bhyveload. On peut lui passer quelques paramètres, comme la taille de la mémoire vive ou bien le disque d'amorçage (ici, le disque d'amorçage est l'image ISO) :
# bhyveload -m 1024M -d freebsd10.iso freebsd_ten0
Vous devriez voir le loader de FreeBSD s'afficher. Vous pouvez interagir avec lui et modifier des variables de boot. Si vous ne touchez à rien avant la fin du décompte, ou que vous appuyez sur <Entrée>, vous allez retomber sur votre shell. En réalité, votre machine virtuelle a été créée dans le VMM et est prête à être exécutée ! Pour s'en assurer, listez les VM à l'aide la commande suivante :
# ls -l /dev/vmm
crw------- 1 root wheel 0, 168 Jul 2 10:14 freebsd_ten0
La commande permettant l'exécution de la VM s'appelle bhyve (étonnant !), voyons rapidement comment elle fonctionne :
Usage: bhyve [-aehAHIPW] [-g ] [-s ] [-S ] [-c vcpus] [-p pincpu] [-m mem] [-l ]
Tout d'abord les options de base :
- -c # définit le nombre de CPU virtuels attachés à la VM,
- -m définit la taille de la mémoire vive allouée,
- -A crée une table ACPI (utile pour certains systèmes d'exploitation voulant interagir avec le matériel).
Plus en détails, il est possible d'assigner les CPU virtuels à des numéros de CPU physiques, de forcer l'utilisation de MSI au lieu d'MSI-X (pour les systèmes ne supportant pas MSI-X), ou encore de définir des périphériques PCI. Cette dernière option est très intéressante, car un système d'exploitation sans périphérique n'a pas beaucoup d'intérêt... Voyons comment définir ces périphériques avec l'option -s slot,driver :
- Le slot est ici un numéro de 0 à 31, suivi d'un numéro de fonction optionnel (de 0 à 7). Ces numéros correspondent aux ports PCI sur votre carte mère. En pratique, ils ont peu d'importance, le tout étant que chaque périphérique ait un numéro différent des autres.
- Le driver est le type de périphérique à émuler. On a le choix entre :
- hostbridge ou amd_hostbridge : il s'agit du composant permettant la configuration des bus PCI par le guest ;
- passthru : accès direct depuis le guest vers un bus PCI de l'host (on ne l'utilisera pas) ;
- virtio-net : interface réseau (VirtIO) ;
- virtio-block : disque dur (VirtIO) ;
- ahci-cd : lecteur CD ;
- ahci-hd : disque dur SATA ;
- lpc : port série.
Ensuite, nous pouvons configurer les périphériques. L'ensemble des options de chaque périphérique est disponible dans le man de Bhyve. Avec tout ça en tête, on va être capable de créer notre machine virtuelle avec une interface réseau, un disque dur (pour y installer notre système), un lecteur CD avec l'ISO d'installation, et ça sera déjà bien pour commencer. On va construire la ligne de commandes pas à pas pour bien tout comprendre et, dans la suite de l'article, j'expliquerai juste les variantes de cette commande :
Commande |
Description |
-c 2 |
2 CPU virtuels |
-m 1024M |
1024 Mi de mémoire vive |
-A |
FreeBSD aime bien avoir sa table ACPI |
-H |
permet de ne pas utiliser 100 % du CPU host |
-s 0:0,hostbridge |
configure un hostbridge |
-s 1:0,lpc |
configure un port série (pour y brancher la sortie standard de Bhyve et voir la console de la VM dans notre terminal) |
-s 2:0,virtio-net,tap0 |
configure une interface réseau branchée sur tap0 |
-s 3:0,virtio-blk,freebsd_ten0.img |
branche un disque dur virtuel sur la VM, ce disque dur est en réalité le fichier freebsd_ten0.img créé précédemment |
-s 31:0,ahci-cd,freebsd10.iso |
branche un disque dur virtuel sur la VM, ce disque dur est en réalité le fichier freebsd_ten0.img créé précédemment |
-l com1,stdio |
branche le port série COM1 sur notre terminal |
Et quand on assemble le tout :
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,freebsd_ten0.img -s 31:0,ahci-cd,release.iso -l com1,stdio -W freebsd_ten0
Voilà ! Maintenant, vous devriez voir l'installeur de FreeBSD démarrer, puis vous afficher le prompt d'installation. Installez le système jusqu'à ce qu'il vous propose d'exécuter un shell à la fin. On va régler la console afin qu'elle fonctionne correctement au redémarrage :
# echo 'console "/usr/libexec/getty std.9600" vt100 on secure' >>/mnt/etc/ttys
Si vous voulez vous connecter en SSH avec le compte root, vous devrez aussi modifier votre configuration SSH :
# /usr/bin/sed -i '' -E 's,#?(PermitRootLogin) no,\1 yes,' /mnt/etc/ssh/sshd_config
Vous pouvez maintenant redémarrer le système (guest hein ! Ne redémarrez pas votre machine physique, ce serait dommage). Une fois le système arrêté, vous aurez la main sur votre shell. Il va falloir nettoyer les restes de notre machine virtuelle avant de pouvoir la relancer (car non, ce n'est pas automatique). On pourrait très bien en créer une nouvelle, mais c'est mieux de recycler (enfin, c'est ce qu'on m'a appris).
# bhyvectl --vm=freebsd_ten0 --destroy
J'en profite pour vous parlez rapidement de bhyvectl, qui permet d'interagir avec le VMM afin de récupérer des infos sur vos machines virtuelles en cours d'exécution, voire de les modifier (par exemple, en les détruisant). N'hésitez pas à regarder les options disponibles pour cette commande !
Il est possible d'accéder au disque dur de la VM depuis l'environnement host. Il est fortement déconseillé de faire ceci en production ; en effet, une modification du système de fichiers du guest peut faire planter la VM, mais de plus, cela rompt l'isolation entre le guest et l'host ! Sur FreeBSD, on utilise la commande mdconfig qui permet de configurer un espace de stockage, ici un disque dur :
# mdconfig -f freebsd_ten0 -t vnode -u 0
L'option -u permet de définir le numéro du device créé (/dev/mdX), l'option -t définit le type de device (ici, un disque dur) et l'option -f le fichier contenant les données du disque dur. FreeBSD va maintenant présenter /dev/md0 comme si c'était un vrai disque dur.
# gpart show md0
34 8388541 md0 GPT (4.0G)
34 128 1 freebsd-boot (64K)
162 7966592 2 freebsd-ufs (3.8G)
7966754 419840 3 freebsd-swap (205M)
8386594 1981 - free - (991K)
La première partition contient le code d'amorçage du système, la seconde est la partition principale et la troisième le swap. Nous nous intéressons ici aux fichiers du système guest, donc à la seconde partition.
# mount /dev/md0p2 /mnt
Si le système de fichiers n'est pas propre, vous devrez exécuter la commande suivante pour le nettoyer :
# fsck -t ufs /dev/md0p2
Une fois les modifications effectuées, ne pas oublier de démonter le système de fichiers :
# umount /mnt
Relançons maintenant notre VM sur son disque dur directement :
# bhyveload -m 1024M -d freebsd_ten0.img freebsd_ten0
Il faudra dorénavant exécuter la commande précédente avant chaque invocation de Bhyve.
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,freebsd_ten0.img -l com1,stdio -W freebsd_ten0
Vous pouvez vous identifier et vérifier que tout fonctionne correctement (interface configurée, comptes utilisateurs créés, etc.). Après avoir joué avec votre VM vierge, redémarrez-la :
# reboot
Et nettoyez la VM avec bhyvectl --destroy.
Jusqu'à présent, nous avons interagi avec notre VM au travers de notre terminal, c'est-à-dire que la sortie standard de Bhyve était branchée à notre terminal. Si vous aviez fermé celui-ci, la VM aurait cessé de fonctionner ; c'est embêtant lorsque vous voulez mettre ça en production...
Pour remédier à ce problème, il est possible de lancer Bhyve en tâche de fond ; néanmoins, le seul accès restant aux VM est celui par le réseau (Telnet, SSH, ...). Fort heureusement, il est possible de brancher la sortie standard de Bhyve sur un terminal virtuel auquel nous pourrons accéder quand bon nous semble (comme une console de secours). Nous utiliserons pour cela le pilote nmdm(4), qui crée un modem entre deux terminaux virtuels de telle sorte qu'ils puissent discuter entre eux. Chargeons le pilote et voyons comment brancher Bhyve :
# kldload nmdm
On lance Bhyve pour qu'il se branche sur le premier terminal (/dev/nmdm0A) :
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,freebsd_ten0.img -l com1,/dev/nmdm0A -W freebsd_ten0 &
Puis, on se connecte à la VM en utilisant le programme cu sur le deuxième terminal (/dev/nmdm0B) :
# cu -l /dev/nmdm0B
On obtient une console identique à celle accessible par écran/clavier. Pour quitter cette console, il vous suffit de composer la séquence de touches ~. (man cu pour la liste complète des commandes). La VM continuera à s'exécuter en tâche de fond jusqu'à ce qu'elle soit détruite (soit par bhyvectl, soit par un reboot de l'host). Pour les têtes en l'air qui oublieraient à quel terminal elles ont branché une VM, voici en bonus une commande pour l'afficher :
# lsof -n | grep freebsd_ten0 | grep bhyve | awk '{print $2}' | xargs -Ixxx lsof -n -p xxx | grep nmdm | awk '{print $9}' /dev/nmdm0A
On en a fini avec FreeBSD en tant que guest ; vous savez maintenant créer, configurer, exécuter, gérer des machines virtuelles et même accéder à une console de secours. Il reste néanmoins un peu de travail à accomplir avant de pouvoir proposer votre cloud maison. En effet, un hyperviseur ne supportant que lui-même en tant qu'invité n'a pas grand intérêt face à ses concurrents ! Fort heureusement, Bhyve supporte deux OS supplémentaires, à savoir OpenBSD et Linux. La section suivante nous guidera donc dans l'installation et la configuration d'une VM faisant tourner chacun d'eux.
3. Une machine virtuelle OpenBSD
Pour d'obscures raisons, certaines personnes (dont certaines ont écrit un article dans ce numéro !) utilisent une variante de NetBSD, très sécurisée, nommée OpenBSD. Il se différencie des autres BSD par l'importance qu'il accorde à la sécurité, la qualité de son code et son intransigeance vis-à-vis des licences des logiciels qu'il utilise (pas de ZFS sous licence CDDL par exemple). Cela les a ainsi poussés à écrire et maintenir les programmes de base du système, comme ps ou encore cat. On peut aussi noter qu'un certain nombre de programmes ont été développés par l'équipe d'OpenBSD : openssh, openSMTPd, ou encore libreSSL (fork d'openSSL).
Bon, je pense que je vous ai assez mis l'eau à la bouche avec cet éloge d'OpenBSD, donc commençons ! Tout d'abord, le loader de FreeBSD ne sait charger que FreeBSD... Il nous faudra donc utiliser un autre loader disponible dans les ports : grub2-bhyve :
# make -C /usr/ports/sysutils/grub2-bhyve install clean
Afin d'avoir une connexion réseau sur notre deuxième VM, nous allons créer une deuxième interface virtuelle :
# ifconfig tap1 create
# ifconfig bridge0 addm tap1
Comme pour notre première machine, on va créer un dossier dédié :
# mkdir /usr/local/vmrc/vm/openbsd_vm1
# cd openbsd_vm1
Pour ne pas avoir à re-compiler OpenBSD avec les bonnes options, téléchargeons une image pré-construite disponible ici :
# fetch http://people.freebsd.org/~grehan/flashimg.amd64-20131014.bz2
# gunzip flashimg.amd64-20131014.bz2
# mv flashimg.amd64-20131014 openbsd_vm1.img
Le fichier obtenu est une image disque comme celle que nous avons créée pour FreeBSD précédemment. Elle contient un système de base prêt à l'emploi.
Le loader grub2-bhyve a besoin d'un fichier de mapping des disques identique à celui utilisé par GRUB. Nous allons donc créer ce fichier en définissant notre disque dur racine hd0 comme étant l'image téléchargée :
# echo '(hd0) ./openbsd_vm1.img' >device.map
Nous pouvons maintenant charger le système à l'aide de la commande grub-bhyve. Celle-ci prend en paramètres la taille de la mémoire vive à allouer, le disque racine à utiliser (ici, nous n'en avons qu'un seul, hd0) et le fichier de mapping :
# grub-bhyve -M 1024M -r hd0 -m device.map openbsd_vm1
Vous allez voir un shell de type GRUB apparaître ; il fonctionne exactement de la même manière qu'un GRUB normal. Pour charger le noyau d'OpenBSD, nous utilisons la commande kopenbsd. Nous lui passons en paramètres un port série et le chemin vers le noyau (sur le disque hd0) :
# kopenbsd -h com0 (hd0,openbsd1)/bsd
Puis, on démarre le noyau :
# boot
En réalité, nous n'avons fait que charger en mémoire le noyau comme nous le faisions avec FreeBSD. Pour réellement démarrer le système, nous devons utiliser la commande bhyve. Ici, nous allons légèrement la modifier pour utiliser l'hostbridge AMD et des interruptions de type MSI(-X) :
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,amd_hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,openbsd_vm1.img -l com1,/dev/nmdm1A -W openbsd_vm1
On peut maintenant se connecter à la VM via cu :
# cu -l /dev/nmdm1B
Une fois le système démarré, vous pouvez vous identifier avec le compte root et le mot de passe test123.
# uname -a
OpenBSD bhyve 5.4 FLASHRD#1 amd64
On peut tester la connectivité réseau :
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: icmp_seq=0 ttl=49 time=44.062 ms
Il est aussi possible d'atteindre la VM FreeBSD précédemment créée (elle a chez moi l'IP 10.1.255.30) :
# ping 10.1.255.30
PING 10.1.255.30 (10.1.255.30): 56 data bytes 64 bytes from 10.1.255.30: icmp_seq=0 ttl=64 time=0.262 ms
L'image étant une image Flash, certaines partitions du système sont montées en lecture seule au démarrage. Si vous voulez faire des modifications sur partitions, il vous faudra les remonter en écriture :
# mount -o rw -u /root
Je vous laisse tout le loisir de jouer avec OpenBSD, installer des serveurs, etc. Nous allons continuer notre tour des OS avec l'installation de Linux.
4. Une machine virtuelle Linux
Je vous passe l'introduction de Linux (ce n'est pas le sujet de ce numéro a priori). Nous allons ici installer une Debian 64 bits. Vous pouvez, si vous le souhaitez, installer n'importe quelle autre distribution 64 bits.
Comme pour les précédentes machines, on configure une interface réseau virtuelle :
# ifconfig tap2 create
# ifconfig bridge0 addm tap2
Puis, un dossier contenant les fichiers :
# mkdir /usr/local/vmrc/vm/linux_vm2; cd linux_vm2
Téléchargez une image d'installation récente :
# fetch http://cdimage.debian.org/cdimage/archive/6.0.9/amd64/iso-cd/debian-6.0.9-amd64-CD-1.iso mv debian-6.0.9-amd64-CD-1.iso linux.iso
Puis, créez comme d'habitude une image disque de 4 Gi :
# truncate -s 4G linux_vm2.img
Pour charger le noyau de Linux, nous utiliserons encore grub2-bhyve. Il faut donc créer le fichier de mapping. Ici, nous avons deux disques, le CD (fichier .iso) et le disque dur virtuel :
# echo '(hd0) ./linux_vm2.img' >device.map echo '(cd0) ./linux.iso' >>device.map
On invoque la commande grub-bhyve en lui disant d'utiliser le CD-ROM comme périphérique racine :
# grub-bhyve -M 1024M -r cd0 -m device.map linux_vm2
Pour charger le noyau de Linux, on utilise la commande linux sur le fichier vmlinuz (adaptez le chemin vers le noyau si vous utilisez une autre distribution). De plus, le noyau Linux utilise un mécanisme de scripts d'initialisation pour démarrer le système ; ces scripts sont contenus dans le fichier initrd.gz.
# linux (cd0)/install.amd64/vmlinuz initrd (cd0)/install.amd64/initrd.gz boot
Et on démarre le système :
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap2 -s 3:0,virtio-blk,linux_vm2.img -s 31:0,ahci-cd,linux.iso -l com1,stdio linux_vm2
Installez le système de la manière la plus simple possible (une partition sur le disque principal). Une fois le système installé, redémarrez.
On va maintenant charger le guest depuis le disque virtuel :
# grub-bhyve -M 1024M -r hd0 -m device.map linux_vm2 set root='(hd0,msdos1)' linux /boot/vmlinuz-2.6.32-5-amd64 root=/dev/vda1 initrd /boot/initrd.img-2.6.32-5-amd64 boot
Puis, on le démarre :
# bhyve -c 2 -m 1024M -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap2 -s 3:0,virtio-blk,linux_vm2.img -l com1,/dev/nmdm2A linux_vm2 cu -l /dev/nmdm2B
Et voilà, votre 3ème VM est prête à être utilisée !
5. Configuration permanente
Nous avons vu tout au long de cet article comment créer, puis lancer des machines virtuelles FreeBSD, OpenBSD et Linux à la main. Il existe cependant des scripts permettant d'automatiser et de rendre les configurations permanentes (pour ne pas avoir à tout reconfigurer à chaque redémarrage de la machine host).
Ces scripts sont encore en fort développement, donc nous récupérerons la dernière version sur GitHub :
# git clone https://github.com/michaeldexter/vmrc; cd vmrc
On installe le tout en exécutant les deux scripts suivants :
# sh install-vmrc.sh ./templates/install-templates.sh
Maintenant, éditez le fichier de configuration /usr/local/etc/vm.conf afin de modifier si besoin est le nom de votre interface réseau, ou bien les chemins vers le dossier des VM (normalement, ils devraient être corrects).
Nous avons déjà provisionné 3 machines virtuelles à la main ; néanmoins, il existe un script permettant de provisionner automatiquement une machine à partir d'un template. Vous pouvez par exemple créer une nouvelle machine virtuelle sur FreeBSD 9.2 en exécutant la commande suivante :
# sh mkvm.sh t_freebsd92 freebsd_nine
Cela créera un dossier dans /usr/local/vmrc/vm nommé freebsd_nine4. Chaque machine doit avoir un numéro différent, car il est utilisé notamment pour affecter un device nmdm.
Afin de pouvoir utiliser le script, il nous faut modifier notre fichier rc.conf situé dans /etc :
# echo 'vm_enable="YES"' >>/etc/rc.conf
Il faut aussi écrire un fichier de configuration de notre machine. Ce fichier vous permettra de configurer l'interface réseau, le serveur DNS, ou encore la console à utiliser (nmdm, stdio ou encore tmux).
# cp /usr/local/vmrc/templates/t_freebsd10 /usr/local/vmrc/vm/freebsd_vm0/freebsd_vm0.conf
Éditez ce fichier à votre convenance, puis arrêtez la machine si elle tourne encore. Nous pouvons désormais la démarrer :
# /usr/local/etc/rc.d/vm start freebsd_vm0
Le script s'occupe de créer le bridge, l'interface tap, d'ajouter l'interface au bridge, de charger les modules noyau nécessaires et enfin, de lancer la machine avec les bons paramètres. Lorsque la machine redémarre, il va aussi nettoyer la machine.
Le script vous permet également d'interagir plus facilement avec vos machines. Par exemple, vous pouvez vous « attacher » à n'importe quelle VM grâce à la commande attach :
# /usr/local/etc/rc.d/vm attach freebsd_vm0
La liste des commandes disponibles se trouve dans le fichier vmrc-instructions.txt.
Si vous souhaitez lancer vos machines au démarrage de l'host, il vous suffit d'appeler le script dans le fichier rc.local (la ligne suivante lance toutes les VM d'un seul coup) :
# echo '/usr/local/etc/rc.d/vm start' >>/etc/rc.local
Conclusion
Avec tout ce que vous avez appris tout au long de cet article, vous êtes maintenant en mesure de construire votre propre plateforme de « Cloud » avec des réseaux virtuels, du stockage réparti et des hautes performances.
Même si Bhyve reste un outil peu convivial, sans interface graphique et sans terminal graphique, le projet libvirt (http://libvirt.org) est aujourd'hui compatible avec Bhyve. Ainsi, vous pouvez intégrer un host faisant tourner Bhyve dans une infrastructure plus globale faisant tourner d'autres technologies (Xen, KVM, VMware...), le tout dans de jolies interfaces de gestion.