web-dev-qa-db-fra.com

Comment démarrer un VM au démarrage et un arrêt sur VM stop?

Longue histoire courte...

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.

Le problème

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.

Exigences

  1. Lubuntu devrait avoir un utilisateur configuré pour se connecter au démarrage -> done!
  2. L'application serveur VM doit démarrer à l'ouverture de session -> incertain
  3. Windows XP VM doit démarrer à l'ouverture de session -> incertain
  4. L'application serveur VM doit enregistrer l'état et être fermée automatiquement lorsque la machine Windows XP est arrêtée -> ne sait pas
  5. Lubuntu devrait s'arrêter lorsque tous les VM sont mis en pause/fermés. -> ne sait pas

Le système fonctionne sur Lubuntu 14.04 avec VirtualBox 4.3.x.

4
Yanick Rochon

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.

3
Geary Shull

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:

  • Lorsque le système démarre, les machines virtuelles sont démarrées par un script Shell et un nouveau travail cron (exécutant un script Shell) est créé à partir d'un fichier txt de règle de travail cron.
  • Toutes les 5 minutes, le travail cron exécute le script qui vérifie si la machine virtuelle XP est toujours en cours d'exécution. Dans le cas contraire, il enregistre l'autre machine virtuelle, supprime le travail cron et arrête le système.

J'espère que cela vous aide à configurer exactement ce dont vous avez besoin.

3
Ahti Komu

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.

  1. Créez un utilisateur pour exécuter la machine virtuelle.
  2. Installez le ajouts invité à l'invité
  3. Passer en plein écran avec Host + F lors de l'exécution de la machine virtuelle.
  4. 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.

  5. 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
    
  6. 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.

3
Takkat