Je devais installer une petite application serveur exécutée dans une VM sur l'un des PC de cette société. Les deux ordinateurs exécutent Windows XP (avec les logiciels existants, la mise à niveau n’est donc pas possible), et l’achat d’un ordinateur supplémentaire est limité pour le moment. J'ai donc converti les fenêtres de l'hôte sur l'une d'elles en une VM et installé Lubuntu. Puis importé l'application du serveur et tout fonctionne bien; tout est presque transparent pour l'utilisateur, à l'exception des processus de démarrage et d'arrêt.
Je me demandais comment je pouvais démarrer les deux ordinateurs virtuels au démarrage de l'hôte, puis éteindre l'ordinateur lorsque Windows [VM) _ de Windows XP s'arrête? À l'heure actuelle, les travailleurs le font manuellement, mais j'aimerais automatiser ce processus.
Le système fonctionne sur Lubuntu 14.04 avec VirtualBox 4.3.x.
Vous pouvez configurer un script Init.d/Systemd comme celui-ci:
#! /bin/sh
# /etc/init.d/vbox
#Edit these variables! VMUSER=VMAdmin VMNAME="cdb62186-7c30-4c25-a0b0-e4a32cfb0504" BASEFOLDER=/home/VMAdmin/path/to/backups/
case "$1" in
start)
echo "Starting VirtualBox VM..."
Sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
;;
reset)
echo "Resetting VirtualBox VM..."
Sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
;;
stop)
echo "Saving state of Virtualbox VM..."
Sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
;;
shutdown)
echo "Shutting down Virtualbox VM..."
Sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
;;
status)
Sudo -H -u $VMUSER VBoxManage list vms -l | grep -e ^"$VMNAME": -e ^State | sed s/\ \ //g | cut -d: -f2-
;;
backup)
echo ""
Sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
echo "Waiting for VM "$VMNAME" to poweroff..."
until $(Sudo -H -u $VMUSER VBoxManage showvminfo --machinereadable "$VMNAME" | grep -q ^VMState=.poweroff.)
do
sleep 1
done
FILENAME=$(date +"%Y_%m_%d-%T")
echo "Backing up Virtualbox VM to '$BASEFOLDER$FILENAME'..."
Sudo -H -u $VMUSER VBoxManage clonevm "$VMNAME" --options keepallmacs --name $FILENAME --basefolder $BASEFOLDER
echo "Restarting VirtualBox VM..."
Sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
echo ""
;;
*)
echo "Usage: Sudo service vbox {start|stop|status|shutdown|reset|backup}"
exit 1
;; esac
exit 0
Veuillez noter que j'ai obtenu ce script à partir d'ici: https://superuser.com/questions/789653/init-d-control-script-for-virtualbox-vm
Veuillez vérifier les commandes avant d'installer le script, puis testez chaque fonctionnalité. Vous devrez le placer dans le répertoire /etc/init.d, et y exécuter chmod +x
pour le faire fonctionner. Puis passez en revue et testez la fonctionnalité de celui-ci. Une fois satisfait, lancez:
Sudo update-rc.d vbox defaults 99 01
Cela le configurera pour commencer avec le système. Le post original contient quelques étapes pour les tâches cron, en tant que FYI. Si quelqu'un connaît une méthode plus moderne, n'hésitez pas à modifier ce message ou à poster une autre réponse.
Je voudrais aller avec une combinaison de cron travail et l'utilisation de vboxmanage via des scripts bash.
J'aurais un script bash qui démarrerait les machines virtuelles et lancerait un travail cron pour vérifier l'état des machines.
Le script devrait ressembler à quelque chose comme:
#!/bin/bash
vboxmanage startvm "Server App VM name"
vboxmanage startvm "Windows XP VM name"
crontab ~/check_vms_and_shutdown_job.txt
Disons que nous l'enregistrons sous le nom start_vms_and_cronjob.sh
. N'oubliez pas de chmod +x
_ pour qu'il puisse être exécuté.
Vous pourriez vous interroger sur le fichier check_vms_and_shutdown_job.txt
. C'est un fichier texte contenant des informations sur un travail qui doit être exécuté à certains intervalles. Dans cet exemple, nous l'avons placé dans le dossier de base de l'utilisateur et il devrait se lire:
*/5 * * * * ~/check_vms_and_shutdown.sh
Ce fichier doit avoir une nouvelle ligne à la fin de la ligne (appuyez sur Entrée avant de sauvegarder;)). Ce fichier décrit un travail cron exécuté toutes les 5 minutes et exécutant un script bash.
Maintenant, quel est ce script check_vms_and_shutdown.sh
que vous pourriez demander? Eh bien, voici le point entier. Il devrait dire:
#!/bin/bash
if vboxmanage list runningvms | grep "Windows XP VM name"
then
echo "Windows XP still running."
else
echo "Windows XP shut down. Shutting down the rest."
vboxmanage controlvm "Server App VM name" savestate
crontab -r
shutdown -h now
fi
Maintenant ce qu’il fait, il vérifiera si la machine virtuelle XP est en cours d’exécution. Si ce n'est pas le cas, il ordonnera alors à la machine virtuelle de l'application serveur de sauvegarder son état. Après cela, le travail cron sera supprimé et le système arrêté. Rappelez-vous de chmod +x
et ici nous avons également placé le fichier dans le dossier personnel de l'utilisateur.
Pour plus de commodité et une meilleure utilisation, vous pouvez également exécuter les virtualbox sans tête et les utiliser via l'affichage à distance.
Maintenant, ajoutez le start_vms_and_cronjob.sh
dans vos applications de démarrage et vous devriez être configuré.
Donc, ce que nous avons ici est:
J'espère que cela vous aide à configurer exactement ce dont vous avez besoin.
Ce sont les étapes pour accomplir les tâches décrites. L'invité VM avec l'application serveur s'appellera "ServerApp", la machine Windows "WindowsXP" ci-dessous. Remplacez-les par leurs vrais noms.
La méthode ci-dessous implique la création d'un Xsession personnalisé sur la machine hôte. Cela présente l’avantage de pouvoir supprimer cette session pour ne charger que les applications nécessaires à l’exécution de nos machines virtuelles (nous n’aurons probablement pas besoin d’un bureau complet pour cela). De plus, l'utilisation des méthodes d'attente intégrées à VirtualBox ne nécessite pas l'appel de boucles supplémentaires pour la surveillance des états VM.
Définissez une session Lubuntu personnalisée sur l'hôte:
Créez un fichier dans /usr/share/xsessions
et nommez-le, par exemple. WindowsVM.desktop
avec le contenu suivant:
[Desktop Entry]
Name=WindowsXP # or any other sensible name
Comment=Custom Xsession running a VM
Exec=/etc/X11/Xsession
Rendre ce fichier exécutable. Cette session appellera ~/.xsession
lors de la connexion.
Créez le script de démarrage de session exécutable nommé ~/.xsession
dans le HOME de l'utilisateur ci-dessus:
#! /bin/bash
/usr/bin/lxsession -s Lubuntu LXDE &
VBoxManage startvm "ServerApp" --type headless
VBoxManage startvm "WindowsXP"
VBoxManage guestproperty set RUNNING 1 --flags TRANSIENT
VBoxManage guestproperty wait "WindowsXP" RUNNING
VBoxManage controlvm "SeverApp" savestate
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
Choisissez la session personnalisée dans 4. lors de la connexion.
La difficulté consiste à supprimer la propriété invité RUNNING (ou tout autre nom de notre choix) de la machine virtuelle car elle n’est pas aussi transitoire que le spécifient les spécifications. Malheureusement, il survivra à un arrêt/mise hors tension de la machine virtuelle.
Nous devons donc ajouter la commande suivante utilisant VBoxcontrol.exe (installé avec les ajouts au client) à l'invité Windows à la fin de sa routine d'arrêt (ou à partir d'un script d'arrêt que nous avons mis là):
VBoxControl.exe guestproperty set RUNNING
Ceci mettra alors fin à l'état wait
pour continuer à enregistrer le "ServerAPP" puis mettra l'hôte hors tension.
Une alternative à ceci est en démarrant une application Windows sur l'invité pour attendre la fin de cette application avant d'arrêter les machines et de mettre l'hôte hors tension. Ensuite, nous remplacerions les deux commandes set guestproperty
dans le script par une ligne semblable à celle-ci:
VBoxManage --nologo guestcontrol "WindowsXP" execute --image "C:\\full\\path\\to\\program.exe" --username <windowsuser> --password <password> --wait-exit --wait-stdout
Voir Manuel VirtualBox pour les limitations et pour plus de détails sur la configuration de ce compte pour un compte sans mot de passe sous Windows.
Les commandes de script à l'étape 5. ont expliqué:
/usr/bin/lxsession -s Lubuntu LXDE
démarre une session Lubuntu (remplacez-la par toute autre Xsession personnalisée, le cas échéant)
VBoxManage startvm "ServerApp --type headless"
démarre la machine virtuelle exécutant l'application serveur en mode sans tête (c'est-à-dire sans affichage)
VBoxManage startvm "WindowsXP"
démarre la machine virtuelle exécutant Windows (plein écran ou toute autre résolution définie lors de la dernière exécution)
VBoxManage guestproperty set "WindowsXP" RUNNING 1 --flags TRANSIENT
définit une propriété RUNNING pour la machine Windows pouvant être contrôlée à partir du système d'exploitation invité
VBoxManage guestproperty wait "WindowsXP" RUNNING
attend que la propriété RUNNING soit supprimée de l'invité Windows
VBoxManage controlvm "SeverApp" savestate
termine le serveur App VM dans savestate
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
met fin à l'hôte Lubuntu (mise hors tension) sans interaction de l'utilisateur.