Création de VMs en CLI dans Virtualbox
Introduction
Dans cet atelier, tu vas approfondir ta connaissance de VirtualBox, un outil que tu as déjà utilisé pour monter des VM. Au lieu d’utiliser l’interface graphique, tu vas voir comment créer et démarrer des VM à l’aide de lignes de code.
Cette manière de procéder te permet de gagner en efficacité et de mieux comprendre les fonctionnalités sous-jacentes de VirtualBox. Les lignes de code offrent un niveau de précision et de contrôle supérieur à celui de l’interface graphique, et te permettent de personnaliser tes VM avec une plus grande finesse. Par ailleurs, l’utilisation de scripts d’automatisation en remplacement d’opération réalisées à la main permet un gain de vitesse et une bien meilleure fiabilité dans le cas d’opérations répétitives.

🤓 Objectifs :
✅ Utiliser la commande VBoxManage
✅ Apprendre à créer et démarrer des VM avec des commandes
✅ Synthétiser tout ça sous forme de script
Sommaire
📌 La virtualisation (rappel)
La virtualisation est une technique qui permet de simuler plusieurs environnements informatiques sur une même machine physique, chacun fonctionnant comme une machine autonome. Cela permet une meilleure utilisation des ressources, une isolation des environnements et une flexibilité dans la gestion des ressources informatiques.
👉 Mise en œuvre
🔧 Prérequis
Pour cet atelier, il te faut :
- Une machine sur laquelle le logiciel Virtualbox est installé
- Un ou plusieurs fichiers ISO d’image d’installation d’OS pour pouvoir créer une VM de zéro
- Au moins une VM déjà existante qui sert de modèle
Cette quête a été faite avec une machine sous Ubuntu 22.04 LTS. La version installée de Virtualbox est la 7.
Il est possible que des différences d’affichages ou de résultats apparaissent dans le cas d’une configuration différente.
Si tu es sous Windows, tu devras adapter les lignes de commandes
👉 VBoxManage
VBoxManage est l’outil de gestion en ligne de commande de VirtualBox. Avec cet outil, tu peux créer et gérer les VM, ainsi que leur configuration.
Voici quelques exemples qui te permettent d’avoir des informations sur les VM :
- Avoir la liste des VM avec la commande
vboxmanage list vms:
wilder@Ubuntu:~$ vboxmanage list vms
"ClientWindows1" {a192051d-8e02-4b17-b314-95bfa7cb912c}
"WinServer1" {f13a598e-eca6-4012-bf77-162e4056d9e6}
"FreePBX" {55178726-eb94-45f2-9b3f-3253f2575274}
"Windows1" {e6c1ecaf-7467-4d90-b661-6ada020fd05e}
"Windows2" {faf23580-6ace-4a32-9799-875be62f935c}
"FTP server" {16d7eb2e-e4ac-4541-9e72-19a5ddf89f2e}
Cette commande renvois la liste des VM présente dans la configuration de virtualbox dans
~/.config/VirtualBox/VirtualBox.xml.
Le numéro présent à la suite du nom est l’ID de la VM.
Voilà le contenu du fichier :
wilder@Ubuntu:~/.config/VirtualBox$ cat VirtualBox.xml
[...]
<MachineRegistry>
<MachineEntry uuid="{a192051d-8e02-4b17-b314-95bfa7cb912c}" src="/home/wilder/VirtualBox VMs/ClientWindows1/ClientWindows1.vbox"/>
<MachineEntry uuid="{f13a598e-eca6-4012-bf77-162e4056d9e6}" src="/home/wilder/VirtualBox VMs/WinServer1/WinServer1.vbox"/>
<MachineEntry uuid="{55178726-eb94-45f2-9b3f-3253f2575274}" src="/home/wilder/VirtualBox VMs/FreePBX/FreePBX.vbox"/>
<MachineEntry uuid="{e6c1ecaf-7467-4d90-b661-6ada020fd05e}" src="/home/wilder/VirtualBox VMs/Windows1/Windows1.vbox"/>
<MachineEntry uuid="{faf23580-6ace-4a32-9799-875be62f935c}" src="/home/wilder/VirtualBox VMs/Windows2/Windows2.vbox"/>
<MachineEntry uuid="{16d7eb2e-e4ac-4541-9e72-19a5ddf89f2e}" src="/home/wilder/VirtualBox VMs/FTP server/FTP server.vbox"/>
</MachineRegistry>
[...]
- Obtenir des informations sur une VM avec la commande
vboxmanage showvminfo %VM%(%VM% est le nom ou l’ID de la VM) :
wilder@Ubuntu:~$ vboxmanage showvminfo ClientWindows1
Name: ClientWindows1
Encryption: disabled
Groups: /Infra_TSSR
Guest OS: Windows 10 (64-bit)
[...]
Ou
wilder@Ubuntu:~$ vboxmanage showvminfo {a192051d-8e02-4b17-b314-95bfa7cb912c}
Name: ClientWindows1
Encryption: disabled
Groups: /Infra_TSSR
Guest OS: Windows 10 (64-bit)
[...]
- Obtenir des informations sur les VM démarées avec la commande
vboxmanage list runningvms:
wilder@Ubuntu:~$ vboxmanage list runningvms
wilder@Ubuntu:~$
Ici il n’y a pas de résultat car aucune VM n’est démarrée.
Démarres en une avec la commande startvm comme ceci :
wilder@Ubuntu:~$ vboxmanage startvm WinServer1
Waiting for VM "WinServer1" to power on...
VM "WinServer1" has been successfully started.
Si tu relance la commande vboxmanage list runningvms tu vois que la liste n’est plus vide :
wilder@Ubuntu:~$ vboxmanage list runningvms
"WinServer1" {f13a598e-eca6-4012-bf77-162e4056d9e6}
- Avoir la liste et l’arborescence des snapshots d’une VM avec la commande
vboxmanage snapshot <NomDeVM> list:
wilder@Ubuntu:~$ vboxmanage snapshot glpi list
Name: Instantané 1 (UUID: f555081a-33c2-475b-8aa8-09a21d806551)
Description: après fixe adresse IP statique
Name: Instantané 2 (UUID: 0a157e77-7bf6-456a-baf0-1ce8545c7cc2)
Description: après install openssh-server
Name: Instantané 3 - avant install mariaDB et php (UUID: 3d230fb4-7881-423e-a2a5-6ec76544678b)
Name: Instantané 4 - avant installation glpi 10 (UUID: c16c4026-5b48-481b-af75-9b70fbb2925c)
Name: Instantané 5 - avant création de la BDD (UUID: ca3215a5-c2aa-4f03-8cfb-f808ae9c1d65) *
Description: avec compte, prvilège, etc
Name: Instantané 6 - début d'installation (warnings) (UUID: 54ed094b-8122-4328-aa8b-452dd95ab89a)
Description: Il y a des warnings au check : version php ancienne, etc.
[...]
[La doc officielle sur VBoxManage
La partie de la doc officielle qui concerne VBoxManage.
https://www.virtualbox.org/manual/ch08.html](https://www.virtualbox.org/manual/ch08.html)
🔬 Créer une VM de zéro
On va utiliser la commande vboxmanage createvm.
Ta VM a les caractéristiques suivantes :
- Nom :
Ubuntu10 - Taille de disque dur :
30 Go - Type du disque dur :
vmdk
Ici la VM aura un disque dur de type vmdk qui est un format generique pour les VM, mais tu peux utiliser le format vdi également.
- Lecteur CD branché :
oui, avec le fichier image iso d’Ubuntu d’inséré - Taille de RAM :
2048 Go - Carte réseau :
oui, en NAT - Contrôleur graphique :
VMSVGA - Taille de la mémoire vidéo :
16 Mo
Voici les lignes de commande à exécuter :
# Création de la VM
vboxmanage createvm --name Ubuntu10 --ostype "Ubuntu_64" --register
# Configuration de la mémoire RAM, de la mémoire vidéo, et du contrôleur graphique
vboxmanage modifyvm Ubuntu10 --memory 2048 --graphicscontroller VMSVGA --vram 16
# Création du contrôleur SATA
vboxmanage storagectl Ubuntu10 --name "SATA Controller" --add sata --controller IntelAhci
# Création du disque dur
vboxmanage createmedium disk --filename ~/VirtualBox\ VMs/Ubuntu10/Ubuntu10.vmdk --size 30000 --format VMDK
# Attachement du disque dur crée à la VM
vboxmanage storageattach Ubuntu10 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium ~/VirtualBox\ VMs/Ubuntu10/Ubuntu10.vmdk
# Ajout d'un lecteur CDrom
vboxmanage storagectl Ubuntu10 --name "IDE Controller" --add ide
# Insertion de l'image d'installation dans le lecteur CDrom
vboxmanage storageattach Ubuntu10 --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /home/wilder/Documents/ubuntu-22.04.2-desktop-amd64.iso
# Configuration de la carte réseau en NAT
vboxmanage modifyvm Ubuntu10 --nic1 nat
# Démarrage de la VM
vboxmanage startvm Ubuntu10 --type gui
Ces lignes de codes vont créer la VM et la démarrer pour commencer l’installation.
🔬 Créer une VM de zéro avec un script
Si on reprend les lignes de commandes ci-dessus, et que l’on passe en argument le nom de la VM, la taille de la RAM, ainsi que l’emplacement d’un fichier ISO d’installation, on peut avoir un script très pratique.
Voilà un exemple de ce qui est possible avec le script createVmWithIso.sh :
#!/bin/bash
# Création et configuration d'une VM dans VirtualBox à partir d'une ISO
# Arguments :
# - nom de la VM
# - taille de la RAM
# - Emplacement fichier ISO
# Check arguments
if [ $# -ne 3 ]
then
echo "Il manque les données suivantes à mettre en arguments de ce script :"
echo "- Nom de la VM"
echo "- Taille de la RAM (en Mo)"
echo "- Emplacement du fichier ISO d'installation"
exit 1
fi
# Création des variables
vm_name=$1
vm_ram=$2
iso_path=$3
# Création de la VM vide
vboxmanage createvm --name $vm_name --ostype "Ubuntu_64" --register
# Configuration de la mémoire RAM, de la mémoire vidéo, et du contrôleur graphique
vboxmanage modifyvm $vm_name --memory $vm_ram --vram 16 --graphicscontroller VMSVGA
# Création du contrôleur SATA
vboxmanage storagectl $vm_name --name "SATA Controller" --add sata --controller IntelAhci
# Création du disque dur
vboxmanage createmedium disk --filename ~/VirtualBox\ VMs/$vm_name/$vm_name.vmdk --size 30000 --format VMDK
# Attachement du disque dur crée à la VM
vboxmanage storageattach $vm_name --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium ~/VirtualBox\ VMs/$vm_name/$vm_name.vmdk
# Ajout d'un lecteur CDrom
vboxmanage storagectl $vm_name --name "IDE Controller" --add ide
# Insertion de l'image d'installation dans le lecteur CDrom
vboxmanage storageattach $vm_name --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium $iso_path
# # Configuration de la carte réseau en NAT
vboxmanage modifyvm $vm_name --nic1 nat
# Démarrage de la VM
vboxmanage startvm "$vm_name" --type gui
Créer ce script et exécute-le comme ceci pour le tester :
wilder@Ubuntu:~$ ./createVmWithIso.sh Ubuntu10 2048 /home/wilder/Documents/ubuntu-22.04.2-desktop-amd64.iso
Tu as désormais un script qui créer une VM avec différents arguments.
🔬 Créer des VMs à partir d’une autre VM avec un script
On peut également créer des VMs à partir d’une autre VM.
Tu vas utiliser le disque dur de ta VM template pour créer directement des VM fonctionnelles.
Tu vas d’abord cloner le disque dur virtuel de la VM template avec la commande vboxmanage clonemedium.
Créer un fichier de script createVmFromTemplate.sh et copie les lignes de commandes ci-dessous :
On repart du script précédent, modifié. Entre-autre, on y a ajouté une boucle pour pouvoir créer plusieurs VMs.
#!/bin/bash
# Création d'une ou plusieurs VM Ubuntu VirtualBox à partir d'un template de disque dur
# Arguments :
# - nom de la VM
# - taille de la RAM
# - nombre de VMs à créer (optionnel)
# Vérification des arguments
if [ $# -lt 2 ]
then
echo "Arguments requis pour ce script :"
echo "- Nom de la VM"
echo "- Taille de la RAM (en Mo)"
echo "Optionnel :"
echo "- Nombre de VMs à créer (par défaut 1)"
exit 1
fi
# Variables depuis les arguments
vm_name=$1
vm_ram=$2
num_vms=${3:-1}
# Emplacement du disque dur template
template_disk_path="/home/wilder/VirtualBox VMs/Template/TemplateUbuntu-22.04LTS/TemplateUbuntu-22.04LTS_1.vmdk"
for i in $(seq -w 1 $num_vms)
do
if [ $num_vms -eq 1 ]
then
final_vm_name=$vm_name
else
final_vm_name="${vm_name}_${i}"
fi
# Emplacement du nouveau disque dur cloné
new_disk_path="/home/wilder/VirtualBox VMs/${final_vm_name}/${final_vm_name}_1.vmdk"
# Création du dossier pour la nouvelle VM
mkdir -p "/home/wilder/VirtualBox VMs/${final_vm_name}"
# Création de la VM vide
vboxmanage createvm --name $final_vm_name --ostype "Ubuntu_64" --register
# Configuration de la mémoire RAM et du contrôleur graphique
vboxmanage modifyvm $final_vm_name --memory $vm_ram --graphicscontroller VMSVGA --vram 16
# Création du contrôleur SATA
vboxmanage storagectl $final_vm_name --name "SATA Controller" --add sata --controller IntelAhci
# Création du contrôleur IDE
vboxmanage storagectl $final_vm_name --name "IDE Controller" --add ide
# Attachement du lecteur CD-ROM au contrôleur IDE
vboxmanage storageattach $final_vm_name --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive
# Clonage du disque dur template
vboxmanage clonemedium disk "$template_disk_path" "$new_disk_path" --format VMDK
# Attachement du disque dur cloné à la VM
vboxmanage storageattach $final_vm_name --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "$new_disk_path"
# Configuration de la carte réseau en NAT
vboxmanage modifyvm $final_vm_name --nic1 nat
done
Voilà comment exécuter ce script :
wilder@Ubuntu:~$ ./createVmFromTemplate.sh Ubuntu10_ 2048 2
Avec ce script tu a plusieurs VM directement fonctionnelles !
☝️ Résumé
On peut utiliser Virtualbox graphiquement, mais l’utilisation de lignes de commandes ou de script augmente considérablement la puissance de ce logiciel.
La commande de gestion des VM est vboxmanage.
On peut récupérer des informations et on peut gérer la création et l’utilisation des VM avec cette commande.
Une VM peut être créer à partir d’une image d’installation, ou bien à partir d’une autre VM en clonant son disque dur virtuel.
📝 Quiz
1. Avec quelle commande peut-on définir la taille de la mémoire RAM ?
- vboxmanage createvm
- VBoxManage clonemedium
- vboxmanage modifyvm
- vboxmanage createmedium disk
2. Avec quelle commande peut-on créer une VM ?
- vboxmanage createvm
- vboxmanage createmedium disk
- vboxmanage modifyvm
- VBoxManage clonemedium
3. Lorsque l’on utilise la méthode du clonage de VM à partir d’une VM template, que fait-on pour le disque dur ? (plusieurs réponses)
- On est obligé de créer un contrôleur de disque
- On n’a pas besoin de créer un contrôleur de disque
- On doit obligatoirement créer un emplacement pour le disque dur de la VM clonée
- On doit obligatoirement créer un disque dur vide
4. Seul le format de disque vmdk est supporté par la commande vboxmanage.
- Faux
- Vrai
5. À quoi sert la commande vboxmanage ? (plusieurs réponses)
- Aucune des réponses précédentes
- Gérer des VM
- Créer des VM
- Démarrer des VM
💪Challenge
- Test les différentes méthodes de création de VM évoquées dans cet atelier dans Virtualbox avec l’outil vboxmanage.
- Pour aller plus loin, tu peux créer un script qui démarre les VM de ton environnement de test, par exemple un serveur Debian et un client Ubuntu
- Tu peux également créer un second script qui éteint toutes les VM en cours d’exécution.