Je dois exécuter un système logiciel destiné à être installé en tant qu'appliance sur une machine dédiée. Afin d'économiser de l'énergie, j'ai l'intention d'exécuter le système sur une machine virtuelle VirtualBox.
L'hôte est une machine Linux standard avec un système SysV-Init, l'invité est un Linux fortement modifié et je préférerais ne pas avoir à le modifier davantage. VirtualBox est utilisé dans la version OSE.
J'ai déjà compris comment démarrer la machine virtuelle lorsque l'hôte démarre ( Edit: ceci est fait, comme indiqué par Nikhil ci-dessous, via la commande VBoxManager startvm
), mais comment puis-je arrêter la machine virtuelle en douceur? Tout script exécuté sur l'hôte doit attendre que l'invité soit complètement arrêté.
Quelqu'un peut-il suggérer à quoi, par exemple, un fichier de service faisant cela devrait ressembler?
la source
Réponses:
Avez-vous essayé
acpipowerbutton
de cet ensemble de commandes?Modifier après avoir lu les commentaires:
Vous pouvez utiliser
acpid
ou d'autres utilitaires acpi pour le rendre gracieux. Aussi, pouvez-vous fournir plus d'informations sur la façon dont vous arrêtez la machine en ce moment?Plaine
shutdown
n'attendrait pas les travaux non terminés, un délai peut être trop long.Je suppose que vous n'utilisez pas de gestionnaire de fenêtres, alors essayez cet outil.
Je viens de voir ce démon . Vous pourriez le trouver utile.
la source
vboxmanage list runningvms
jusqu'à ce que votre VM est parti.Plutôt que de coder cela vous-même, pensez à utiliser Vagrant , qui est conçu pour instancier et contrôler les instances de virtualbox. La documentation est excellente et je suggère que vous vérifiiez plutôt que d'essayer de rouler vous-même.
En résumé, vous créez un fichier de contrôle simple, puis exécutez-le
vagrant up
pour démarrer autant d'instances de VirtualBox que vous le souhaitez. Vous pouvez utiliservagrant ssh
pour vous connecter aux hôtes etvagrant halt
pour éteindre l’hôte (sans terminer).vagrant destroy
se débarrasser des instances.Il prend en charge l’approvisionnement avec puppet, Ansible ou Chef et vous permet de contrôler la plupart des paramètres de configuration de la VBox exposés.
la source
J'ai une application similaire à la vôtre, à une différence près: je dois redémarrer le système et récupérer les instantanés.
Ce qui vous intéresse, c'est le mode sans tête .
J'ai quelques-uns de ces services alors j'utilise le script suivant:
VBox_StopRestoreStart.sh
SI vous souhaitez éteindre la machine virtuelle avec élégance, vous avez deux options, selon votre application:
VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
VBoxManage controlvm <uuid>|<VMname> savestate
CONSEILS: Vous pourriez trouver utile:
VBoxManage list vms
- liste des vms disponiblesrdesktop IP-ADDR:3389
ourdesktop-vrdp IP-ADDR:3389
- lorsque vous souhaitez une interface graphique (même à distance ) lorsque vous utilisez le mode sans tête:VBoxHeadless -s <uuid>|<VMname>
VBoxManage startvm
- commencez par l'interface graphique pour le débogage localChapitre du manuel de VirtualBox lié: Chapitre 7. Machines virtuelles distantes - Étape par étape: créer une machine virtuelle sur un serveur sans tête
PS Si vous êtes intéressé par les solutions complètes déjà mises en œuvre, OpenStack semble un choix intéressant.
la source
Consultation de la documentation de gestion de VM VirtualBox à l' adresse http://www.virtualbox.org/manual/ch08.html
Pour lister les VM, utilisez la commande
VBoxManage list vms
Pour démarrer la VM, utilisez la commande
VBoxManage startvm
http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm
Pour contrôler la VM, utilisez
VBoxManage controlvm
La
controlvm
sous-commande vous permet de modifier l'état d'une machine virtuelle en cours d'exécution. Les éléments suivants peuvent être spécifiés:VBoxManage controlvm <vm> pause
met temporairement une machine virtuelle en attente, sans changer définitivement son état. La fenêtre de la machine virtuelle sera peinte en gris pour indiquer que la machine virtuelle est actuellement en pause. (Cela équivaut à sélectionner l'élément "Pause" dans le menu "Machine" de l'interface graphique.)Utilisez
VBoxManage controlvm <vm> resume
pour annuler une commande de pause précédente. (Cela revient à sélectionner l’option "Reprendre" dans le menu "Machine" de l’interface graphique.)VBoxManage controlvm <vm> reset
a le même effet sur une machine virtuelle que d'appuyer sur le bouton "Réinitialiser" d'un ordinateur réel: un redémarrage à froid de la machine virtuelle, qui redémarre et redémarre immédiatement le système d'exploitation invité. L'état de la machine virtuelle n'est pas enregistré au préalable et des données peuvent être perdues. (Cela équivaut à sélectionner l'élément "Réinitialiser" dans le menu "Machine" de l'interface graphique.)VBoxManage controlvm <vm> poweroff
a le même effet sur une machine virtuelle que de tirer le câble d’alimentation sur un ordinateur réel. Là encore, l'état de la machine virtuelle n'est pas enregistré au préalable et des données peuvent être perdues. (Cela équivaut à sélectionner l'élément "Fermer" dans le menu "Machine" de l'interface graphique ou à appuyer sur le bouton de fermeture de la fenêtre, puis à sélectionner "Eteindre la machine" dans la boîte de dialogue.)Après cela, l'état de la VM sera "Eteint".
la source
vboxmanage
cas (tous en minuscules).VBoxManage controlvm
sous-commandes ne le fait./etc/init.d/vboxvms-service
script sur le système hôte, qui au démarrage rendra tous les vms actifs et à l’arrêt, les arrêtera tous.VBoxManage controlvm savestate
est une autre possibilité (du moins google me dit), il enregistre le statut des machines et l’arrête proprement, mais toujours aucun moyen de forcer l’hôte à attendre.Pour un système basé sur systemd, vous pouvez essayer ceci.
Étape 1: créer un fichier de service
Étape 2: Activer le fichier de service
Références
la source
VBoxHeadless -s %i
de démarrer etVBoxManage controlvm %i savestate
d'arrêter la machine virtuelle.Que diriez-vous d'envoyer la commande via ssh de l'hôte à l'invité?
Je ne suis pas sûr si cela fonctionne et si vous pouvez vérifier l'état de la machine par la suite ou obtenir quelque chose comme un état de sortie, mais il devrait au moins être nettoyé.
la source
Ma solution: dans cet interpréteur de scripts, 'root' est l'invocateur et 'l'utilisateur' est le propriétaire de 'thevm'
Je sais que les vms ont pris fin lorsque la sortie de la commande
VBoxManage list runningvms
renvoie une chaîne vide.la source
Pour démarrer vm:
Pour arrêter vm:
Répertoriez tous les vm en cours d'exécution:
la source
Peut-être que cela aidera dans le cadre de la solution.
la source
Pourquoi ne vous connectez-vous pas à votre invité et arrêtez-vous à partir de là?
À moins que vous n'ayez une bonne raison de ne pas installer sshd et d'accéder à la machine virtuelle via la VBox, j'opterais pour un script qui ne fait que générer un script
ssh shutdown -h now
. Pour être honnête, je créerais un script pour chaque machine qui l'arrêterait correctement et effectuerait quelques vérifications.Emballez simplement un script /etc/init.d/shutdown_vm qui appelle l’autre depuis l’hôte, l’appel sera bloqué jusqu’à ce qu’il soit prêt. Ce processus (tel que décrit) ajoute une dépendance linux sur l'invité mais supprime la dépendance VBox sur l'hôte.
Pour aller droit au but: vous n'avez pas besoin d'accéder à la VBox pour éteindre une machine, si vous avez un moyen d'y accéder (c.-à-d. Ssh), le système d'exploitation aura toujours un moyen de le faire (l'allumer, c'est différent, bien sûr).
la source