4 votes

Impossible d'hiberner avec la virtualbox en cours d'exécution

J'ai un problème d'hibernation et de suspension de mon ordinateur portable Dell pendant que Virtualbox fonctionne (invité XP). J'ai essayé la méthode par défaut du noyau, uswsusp et tuxonice et aucune d'entre elles ne fonctionne. Mais si je ferme virtualbox, l'hibernation et la suspension fonctionnent bien. Voici les spécifications du système. OS : Ubuntu 10.10 64bit (entièrement mis à jour) RAM : 4GB Swap : 8 GB Root : 500 GB (dont environ 79% sont libres)

Mon modèle d'ordinateur portable est le Dell Inspiron N5010. Il est équipé d'un chipset graphique ATI HD 5000 et j'utilise des pilotes propriétaires pour ce dernier, installés via le jockey.

Gracias.

4voto

Lutz L. Points 141

J'ai eu le même problème, "mettre en pause" l'invité virtuel-XP (HostKey-P) a fonctionné quelques fois mais souvent PAS. Le fait de mettre la VM-Guest-XP en "saved-state" a permis au système d'hiberner à nouveau sans problème.
J'ai écrit un petit script, je l'ai mis en /etc/pm/sleep.d/05_virtualbox (n'oubliez pas chmod a+x 05_virtualbox ) et la gestion de l'énergie fera la sauvegarde de l'état de la machine et la procédure de démarrage sur les VMs automatiquement...

#!/bin/sh

# File: /etc/pm/sleep.d/05_virtualbox  #(at least in ubuntu/fedora)
# 
# This hack saves-state all VirtualBox-VM's off user $VBUSER on hibernate/suspend,
#   saves the list of this VMs in $VM_LIST_FILE, and on thaw/resume it starts all
#   VMs in that list again, and removes $VM_LIST_FILE.
# BUGS: don't use the same NAME for different VMs, or rewrite the script to use UUIDs
#
# a REAL hack, tried to comment as much as possible, but the chosen syntax is obfuscated, 
#   sorry...also sorry for the bad english...
#
# Writer (guilty person): Lutz Langenbach
# Copyleft: do what you want with the Code
# Help: VBoxManage 2>&1 |less or http://www.virtualbox.org/manual/ch08.html

VM_LIST_FILE=/var/tmp/vms-in-saved-state-list
VBUSER=Put_YOUR_username_here

PATH=/sbin:/usr/sbin:/bin:/usr/bin

case "${1}" in
  suspend|hibernate)
    # print list of running VM's output: "vm-name" {vm-uuid}\n
    # extract only the name of VM's and send 
    echo -n "Send savestate to VM's:"
    sudo  -u $VBUSER  VBoxManage list runningvms \
    |perl -ne 'chomp;s/^"([^"]*)".*/\1/; print $_; system("sudo -u '"$VBUSER"' VBoxManage controlvm \"$_\" savestate && echo \"$_\">>'"$VM_LIST_FILE"'");'
    echo ..done
    ;;
  resume|thaw)
    # get each line in $VM_LIST_FILE, use it as VM-Name and send start to it 
    echo -n "Send resume to VM's"
    cat $VM_LIST_FILE | perl -ne 'chomp;s/^"([^"]*)".*/\1/; system("sudo -u '"$VBUSER"' VBoxManage startvm \"$_\"");'
    rm -f $VM_LIST_FILE
    echo .
    ;;
  *)
    echo "Don't know what to do, 1st Arg was:${1}; Must be suspend|hibernate|resume|thaw"
    ;;
esac

3voto

jrg Points 58143

Comme indiqué dans les commentaires de la question initiale :

J'ai découvert qu'il existe une fonction dans Virtualbox qui permet de sauvegarder l'état actuel des VM. l'état actuel des VMs. C'est un peu comme l'hibernation, à l'exception que je ne sauf que je n'hiberne pas explicitement le système d'exploitation invité. De plus, le processus est En outre, le processus est très rapide et après cela, je peux mettre l'OS hôte en hibernation normalement.

Cette caractéristique est connue sous le nom de Save Machine State .

0voto

TuKsn Points 4240

Lutz L. Tout d'abord, merci pour le script. J'ai le même problème sur Xubuntu 14.04 avec VB 4.3.10 et un Xubuntu 12.04 ou un invité Windwos XP qui fonctionne en hibernation.

Au premier essai, le script semble fonctionner parfaitement. Mais la fois suivante, les VMs ne reprennent pas automatiquement lorsque le système principal revient de l'état d'hibernation.

Voici le message que je trouve dans le fichier "pm-suspend.log" :

Exécution du hook /etc/pm/sleep.d/05_virtualbox thaw hibernate : Envoyer la reprise au VM'sVBoxManage : erreur : La machine virtuelle 'Xubuntu12' s'est interrompue s'est terminée de façon inattendue pendant le démarrage avec le code de sortie 1 VBoxManage : error : Détails : code NS_ERROR_FAILURE (0x80004005), composant Machine, interface IMachine En attente de la mise sous tension de la VM "Xubuntu12"...

Je peux reprendre manuellement les Invités, cela fonctionne sans problème, mais ce n'est pas aussi confortable.

P.S. : Le problème est connu depuis longtemps comme vous pouvez le voir ici : https://www.virtualbox.org/ticket/7716

EDITAR: Il existe un script similaire :

#!/bin/bash
# Script to pause/resume running VBox VMs on hibernate/thaw
operation="$1"

# This script is invoked as root, but root cannot use VBoxManage to
# control the VMs of other users. So we obtain the members of the
# 'vboxusers' group and re-execute as each user in turn
if [ $(id -u) -eq 0 ] ; then
    # running as root...
    vboxusers=$(grep ^vboxusers /etc/group | cut -d ':' -f 4- | tr ',' ' ')
    for user in $vboxusers; do
        echo "restarting as $user..."
        su - $user -c "$0 $operation" || exit $?
    done
    exit 0
fi

hibernated_vm_list=$HOME/.vbox-hibernated-vms

# get a list of all running VMs, save their state to disk and
# remember that we have done this
hibernate_vms()
{
    rm -f $hibernated_vm_list

    # each line in list is: "vmname" {vm-uuid}
    local vm_list="$(VBoxManage list runningvms)"
    if [ -z "$vm_list" ] ; then # nothing to do
        return 0
    fi

    local tempfile="/tmp/VBoxPauseResume.tmp"
    echo "$vm_list" > $tempfile
    local pids=""
    while read line ;
    do
        vm_name=$(echo "$line" | sed 's/\(".*"\).*/\1/')
        vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)/\1/')
        echo "saving state of vm $vm_name for user $user"
        (VBoxManage controlvm $vm_uuid savestate && \
            echo "$vm_name $vm_uuid" >> $hibernated_vm_list && \
            echo "saved state of vm $vm_name for user $user") &
        pids="$pids $!"
    done < $tempfile
    wait $pids
    rm -f $tempfile
}

# resumes any VMs that were saved by hibernate_vms(). Uses parallel
# child processes to thaw several VMs faster
thaw_vms()
{
    if [ -e $hibernated_vm_list ] ; then
        local pids=""
        while read line ;
        do
            vm_name=$(echo "$line" | sed 's/\(".*"\).*/\1/')
            vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)/\1/')
            echo "resuming vm $vm_name for user $user"
            VBoxManage startvm $vm_uuid &
            pids="$pids $!"
        done < $hibernated_vm_list
        wait $pids
        rm -f $hibernated_vm_list
    fi
}

case $operation in
    hibernate) hibernate_vms ;;
    suspend) ;;
    thaw) thaw_vms ;;
    resume) ;;
esac

(Sauvegarder ce script comme /etc/pm/sleep.d/02-VirtualBox, et s'assurer qu'il est exécutable)

Source : http://angryfifer.blogspot.de/2012/02/linux-hibernation-and-virtualbox.html

Malheureusement, le même problème avec ce script...

0voto

dervih Points 1

@TuKsn

Le problème est très simple à résoudre - la variable DISPLAY doit être définie.

VirtualBox l'utilise lors du démarrage des vms dans le mode gui. Le même problème se produit lorsque je me connecte via ssh et que je veux démarrer un vm en mode gui.

Merci pour votre script, il fonctionne très bien !

Cependant, j'ai dû ajouter quelques modifications afin de stocker le mode dans lequel les vms fonctionnent (i.e. 'gui' ou 'headless' ou 'sdl') nécessaire pour redémarrer correctement les vms.

Ci-dessous il y a le script avec mes corrections incluses :

#!/bin/bash
# Script to pause/resume running VBox VMs on hibernate/thaw

# Set your display here
display=":0.0"

operation="$1"

# This script is invoked as root, but root cannot use VBoxManage to
# control the VMs of other users. So we obtain the members of the
# 'vboxusers' group and re-execute as each user in turn
if [ $(id -u) -eq 0 ] ; then
    # running as root...
    vboxusers=$(grep ^vboxusers /etc/group | cut -d ':' -f 4- | tr ',' ' ')
    for user in $vboxusers; do
        echo "restarting as $user..."
        su - $user -c "$0 $operation" || exit $?
    done
    exit 0
fi

hibernated_vm_list=$HOME/.vbox-hibernated-vms

# get a list of all running VMs, save their state to disk and
# remember that we have done this
hibernate_vms()
{
    rm -f $hibernated_vm_list

    # each line in list is: "vmname" {vm-uuid}
    local vm_list="$(VBoxManage list runningvms)"
    if [ -z "$vm_list" ] ; then # nothing to do
        return 0
    fi

    local tempfile="/tmp/VBoxPauseResume.tmp"
    echo "$vm_list" > $tempfile
    local pids=""
    while read line ;
    do
        vm_name=$(echo "$line" | sed 's/\(".*"\).*/\1/')
        vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)/\1/')
        vm_type=$(VBoxManage showvminfo $vm_uuid | grep "Session type:" | awk '{print $NF}')
        case $vm_type in
            "headless") ;;
            "sdl") ;;
            "GUI/Qt") vm_type="gui" ;;
            *) vm_type="gui" ;;
        esac
        echo "saving state of vm $vm_name for user $user from mode $vm_type"
        (VBoxManage controlvm $vm_uuid savestate && \
            echo "$vm_name $vm_uuid $vm_type" >> $hibernated_vm_list && \
            echo "saved state of vm $vm_name for user $user") &
        pids="$pids $!"
    done < $tempfile
    wait $pids
    rm -f $tempfile
}

# resumes any VMs that were saved by hibernate_vms(). Uses parallel
# child processes to thaw several VMs faster
thaw_vms()
{
    if [ -e $hibernated_vm_list ] ; then
        local pids=""
        while read line ;
        do
            vm_name=$(echo "$line" | sed 's/\(".*"\).*/\1/')
            vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)/\1/' | awk '{print $1}')
            vm_type=$(echo "$line" | sed 's/.*\({.*}\)/\1/' | awk '{print $2}')
            echo "resuming vm $vm_name for user $user in mode $vm_type"
            DISPLAY=$display VBoxManage startvm $vm_uuid --type $vm_type &
            pids="$pids $!"
        done < $hibernated_vm_list
        wait $pids
        rm -f $hibernated_vm_list
    fi
}

case $operation in
    hibernate) hibernate_vms ;;
    suspend) ;;
    thaw) thaw_vms ;;
    resume) ;;
esac

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X