VirtualBox 4 (headless) sur FreeBSD

VirtualBox est devenu pour moi le meilleur moyen pour installer – tester (et casser) des machines de test. J’ai donc utilisé mon NAS comme hôte pour mes VM.

Installation de VirtualBox

J’ai commencé par l’installation de VirtualBox via portmaster :

# portmaster --with-configure /usr/ports/emulators/virtualbox-ose

Attention, il est nécessaire d’avoir installé FreeBSD avec lib32 (y compris sur un système 64bits) ainsi que les sources du kernel et des librairies pour pouvoir compiler VirtualBox. Si ces dépendances sont absentes, il est possible de les installer avec sysinstall.

Lors du choix des options de compilation pour Virtualbox, sélectionner le support de VNC, seul moyen d’accéder aux interfaces des machines virtuelles, la machine hôte fonctionnant sans interface graphique.

Une fois VirtualBox installé, on peut charger les modules kernel avec la commande kldload vboxdrv et kldload vboxnetadp ou les charger au démarrage en ajoutant au fichier /etc/rc.conf :

vboxdrv_load="YES"
vboxnet_enable="YES"

Enfin, comme l’utilisation du compte root, c’est mal, on ajoute le groupe vboxusers au compte d’admin :

# pw groupmod vboxusers -m your_username

Création de machines virtuelles

On peut commencer la création de la première machine virtuelle :

$ VBoxManage createvm --name "Guest_name" --register --ostype OS_type --basefolder /path/to/VM

Avec :

  • Guest_name : Nom de la machine virtuelle.
  • OS_type : type de système. Ce paramètre est utilisé par VirtualBox pour la configuration de la machine virtuelle, il n’est pas obligatoire mais peut améliorer le support des différents OS. Ce paramètre est de la forme : CentOS, CentOS_64, OpenSolaris, FreeBSD_64… Une liste détaillée peut être obtenue via la commande : VBoxManage list ostypes.
  • /path/to/VM : le répertoire racine utilisé pour cette machine virtuelle. Contient le fichier de configuration de la machine, le disque virtuel, ainsi que les différents snapshots. Se situe par défaut dans ~/.Virtualbox, mais dans mon cas, autant utiliser le pool ZFS et un point de montage dédiés au machines virtuelles.

Puis on passe à la configuration proprement dite, avec la mémoire et le réseau :

$ VBoxManage modifyvm "Guest_name" --memory 1024 --nic1 nat
  • --memory 1024 : RAM dédié à la machine virtuelle, en Mo.
  • --nic1 nat : Pour la première interface, accès en NAT, pour que la machine ait un accès à Internet.

Puis la création des contrôleurs IDE et SATA pour la machine virtuelle :

$ VBoxManage storagectl "Guest_name" --name "IDE Controller"  --add ide
$ VBoxManage storagectl "Guest_name" --name "SATA Controller" --add sata

Et du disque dur virtuel :

$ VBoxManage createhd --filename /path/to/VM/disk.vdi --size 20480
  • --filename /path/to/VM/disk.vdi : chemin pour le disque à créer.
  • --size 20480 : Volume de 20 Go, par défaut de taille variable.

On attache le disque /path/to/VM/disk.vdi au premier port du contrôleur SATA :

$ VBoxManageVBM storageattach "Guest_name" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /path/to/VM/disk.vdi

Puis, si nécessaire, on attache un ISO situé dans /path/to/image.iso au premier port du contrôleur IDE :

$ VBoxManage storageattach "Guest_name" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium /path/to/image.iso

Une deuxième interface peut être attachée pour communiquer avec le réseau de la machine hôte :

$ VBoxManage modifyvm "Guest_name" --nic2 hostonly --hostonlyadapter2 alc0

Le paramètre --hostonlyadapter2 alc0 est nécessaire pour indiquer à VirtualBox l’interface à lier avec la machine virtuelle.
La machine virtuelle pourra être configurée avec une IP appartenant au réseau de la machine hôte, et sera joinable directement par les machines présentes sur ce réseau.

Contrôle des machines virtuelles

Pour lancer une machine virtuelle, utiliser la commande :

$ VBoxHeadless -n -m 5900 -s "Guest_name"

Les options sont :

  • -n : démarrer avec le support de VNC.
  • -m 5900 : Choix du port à utiliser pour VNC (ici le port par défaut).

La machine est ensuite joignable via VNC en se connectant à IP_machine_hôte:5900.
On peut peut aussi la démarrer via la commande VBoxManage startvm "Guest_name" --type headless, à condition d’avoir déjà configuré ses interfaces et l’accès SSH pour pouvoir y accéder (le support de VNC n’est pas implémenté dans la commande VBoxManage).

Suppression d’une machine virtuelle

Pour supprimer une machine virtuelle, démonter le disque virtuel :

$ VBoxManage closemedium disk path/to/disk.vdi --delete

L’option --delete supprime également le fichier .vdi présent sur le disque.
Puis :

$ VBoxManage unregistervm "Guest_name" --delete

Cette commande supprime la machine de la liste des VM connues, et supprime également le répertoire de base de cette machine avec l’option --delete.

Installation de l’OS invité

Lors de l’installation de l’OS invité, il est impératif de spécifier un clavier US, VNC se charge de réaliser la conversion du keymap de la machine cliente vers la disposition US pour la machine virtuelle.

Dès que l’OS hôte est installé, on peut installer et configurer les extensions invité.

Gestion des snapshots

Une fois que la machine hôte est installée, configurée, mise a jour et les additions invités installés, j’ai pris l’habitude de prendre un snapshot. Ainsi, il est possible de réinitialiser cette machine à son état d’installation à tout moment.

Pour prendre un snapshot :

$ VBoxManage snapshot "Guest_name" take "Snapshot_name"

Pour le restaurer, et donc supprimer toutes les modifications effectuées sur la machine depuis la prise du snapshot :

$ VBoxManage snapshot "Guest_name" restore "Snapshot_name"

Pour le supprimer, et donc perdre la possibilité de revenir en arrière :

$ VBoxManage snapshot "Guest_name" delete "Snapshot_name"

Attention, une fois qu’un snapshot est crée, l’ensemble de modifications effectuées sur le disque de la machine sont aussi enregistrées dans le fichier de snapshot, ce qui peut entraîner une occupation d’espace disque conséquente.

Script de gestion des VM

Comme les différentes opérations de création, suppression et gestion sont un peu moins pratiques à réaliser avec VBoxManage et VBoxHeadless que sur la version graphique de VirtualBox, j’ai écrit un script permettant de réaliser ces opérations aussi rapidement qu’avec la version GUI. Il est disponible sur cette page.

Le déploiement de plusieurs machines de façon automatisée via des fichiers de configuration est aussi possible avec VBoxTool (sans le support VNC).