Aller au contenu

VirtualBox : automatisation et dépannage

Modèle de service (/etc/systemd/system/vbox@.service) : une instance par machine, exécutée par l’utilisateur propriétaire des machines (ici vbox).

[Unit]
Description=Machine virtuelle VirtualBox %i
After=network-online.target vboxdrv.service
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
User=vbox
Group=vbox
ExecStart=/usr/bin/VBoxManage startvm %i --type headless
ExecStop=/usr/bin/VBoxManage controlvm %i acpipowerbutton
ExecStop=/bin/bash -c 'for i in $(seq 1 60); do /usr/bin/VBoxManage list runningvms | grep -q "\"%i\"" || exit 0; sleep 2; done; /usr/bin/VBoxManage controlvm %i poweroff'
TimeoutStopSec=150
[Install]
WantedBy=multi-user.target
Fenêtre de terminal
sudo adduser --system --group --home /srv/vms vbox
sudo usermod -aG vboxusers vbox
sudo systemctl daemon-reload
sudo systemctl enable --now vbox@srv1
systemctl status vbox@srv1

À l’arrêt de l’hôte, systemd envoie la demande d’arrêt ACPI, attend jusqu’à 120 secondes que la machine ait disparu de la liste des machines en cours, puis coupe brutalement en dernier recours. Les machines doivent avoir été créées par l’utilisateur vbox (même registre). Voir systemd : écrire un service.

Un minuteur (voir systemd : minuteurs) qui lance un script de sauvegarde :

#!/bin/bash
set -euo pipefail
vm=srv1
dest=/srv/sauvegardes
stamp=$(date +%F)
VBoxManage snapshot "$vm" take "sauv-$stamp" --live
VBoxManage export "$vm" -o "$dest/$vm-$stamp.ova" --ovf20 || true
VBoxManage snapshot "$vm" delete "sauv-$stamp"
find "$dest" -name "$vm-*.ova" -mtime +7 -delete

Selon la version de VirtualBox, l’export d’une machine en cours d’exécution n’est pas possible : dans ce cas, arrêter la machine avant l’export ou copier le disque du snapshot (voir Snapshots, clones et sauvegarde).

#!/bin/bash
# vm.sh : démarrer, arrêter, état
set -euo pipefail
vm=${2:?machine manquante}
case ${1:?commande manquante} in
start) VBoxManage startvm "$vm" --type headless ;;
stop) VBoxManage controlvm "$vm" acpipowerbutton ;;
status) VBoxManage showvminfo "$vm" --machinereadable | grep '^VMState=' ;;
*) echo "usage : $0 start|stop|status machine" >&2; exit 2 ;;
esac
Fenêtre de terminal
tail -n 100 /srv/vms/srv1/Logs/VBox.log
grep -iE "error|fail|VERR" /srv/vms/srv1/Logs/VBox.log | head
sudo journalctl -u vbox@srv1 -n 50 --no-pager
sudo dmesg | grep -i vbox
Message Cause et solution
Kernel driver not installed (rc=-1908) Modules non chargés : sudo modprobe vboxdrv, sudo dkms status, redémarrer après une mise à jour du noyau
Key was rejected by service Secure Boot : inscrire la clé des modules (MOK) ou le désactiver
VERR_VMX_NO_VMX Virtualisation matérielle désactivée (micrologiciel) ou absente
VERR_VMX_IN_VMX_ROOT_MODE KVM ou un autre hyperviseur utilise le processeur : sudo modprobe -r kvm_intel kvm
NS_ERROR_FAILURE / Callee RC: E_FAIL Détail dans VBox.log
VBoxManage: error: The machine 'srv1' is already locked by a session Une session existe déjà (machine démarrée, ou processus bloqué) : VBoxManage list runningvms, ps aux | grep VBox
Could not find a registered machine Mauvais utilisateur (chaque utilisateur a son registre)
VERR_FILE_NOT_FOUND sur un disque Fichier déplacé ou supprimé : corriger le chemin avec storageattach
Version mismatch Extension Pack Réinstaller l’Extension Pack de la même version que VirtualBox
Machine « aborted » Coupure de l’hôte ou arrêt brutal : redémarrer, vérifier les systèmes de fichiers de l’invité
Lenteurs Trop de processeurs ou de mémoire attribués, KVM chargé en parallèle, disque de l’hôte saturé
Fenêtre de terminal
VBoxManage list runningvms
ps aux | grep -E '[V]BoxHeadless|[V]irtualBoxVM'
kill <PID> # arrêt du processus de la machine
VBoxManage startvm srv1 --type headless
Fenêtre de terminal
sudo dkms status
sudo apt install --reinstall virtualbox-dkms
sudo modprobe vboxdrv
VBoxManage --version
VBoxManage list extpacks

Mettre à jour aussi l’Extension Pack et les Guest Additions de l’invité (sudo apt install --only-upgrade virtualbox-guest-utils).

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

La procédure est la même. La version de VirtualBox, et donc la compatibilité avec le noyau, dépend de la version d’Ubuntu : après une montée de version, vérifier dkms status et les noms d’options des scripts (--audio-driver, --vrde-port depuis la 7.0). Le service d’exemple suppose que VBoxManage est dans /usr/bin.