Não é possível hibernar com o VirtualBox em execução

3

Estou tendo problemas para hibernar e suspender meu laptop Dell enquanto o VirtualBox está em execução (XP Guest). Eu tentei o método de kernel padrão, uswsusp e tuxonice e nenhum deles funciona. Mas se eu fechar o virtualbox, então o hibernation e o suspend funcionam bem. A seguir estão as especificações do sistema. SO: Ubuntu 10.10 64 bits (completado atualizado) Ram: 4GB Troca: 8 GB Raiz: 500 GB (dos quais cerca de 79% são gratuitos)

Meu modelo de laptop é o Dell Inspiron N5010. Tem chipset gráfico série ATI HD 5000 e eu uso drivers proprietários para ele, instalados via jockey.

Obrigado.

    
por hsinxh 23.01.2011 / 04:18

4 respostas

2

De acordo com os comentários à pergunta original:

I found that there is a feature in virtualbox with which once save the current state of VMs. Its pretty much like hibernating, except that I am not hibernating the Guest OS explicitly. Morever the process is very fast and after that I can hibernate the Host OS normally.

Esse recurso é conhecido como Save Machine State .

    
por jrg 17.10.2011 / 15:09
3

Eu tive o mesmo problema, "pausar" o virtual-guest-XP (HostKey-P) funcionou algumas vezes, mas muitas vezes NÃO. Colocar o VM-Guest-XP em "estado-salvo" deixa o sistema hibernar novamente sem problemas.
Escrevi um script pequeno, coloquei em /etc/pm/sleep.d/05_virtualbox (não se esqueça de chmod a+x 05_virtualbox ) e o gerenciamento de energia executará o estado de salvar a máquina e iniciará o procedimento nas VMs automaticamente ...

#!/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/^"([^"]*)".*//; 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/^"([^"]*)".*//; 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
    
por Lutz L. 29.01.2014 / 18:31
0

@ Lutz L. Primeiro obrigado pelo roteiro. Eu tenho o mesmo problema no Xubuntu 14.04 com VB 4.3.10 e um Xubuntu 12.04 ou um Windwos XP Guest está em execução no modo de hibernação.

Na primeira tentativa, o script parece funcionar perfeitamente. Mas na próxima vez que as VMs não forem retomadas automaticamente quando o sistema principal retornar do estado de hibernação.

Esta é a mensagem que encontro no arquivo "pm-suspend.log":

Running hook /etc/pm/sleep.d/05_virtualbox thaw hibernate: Send resume to VM'sVBoxManage: error: The virtual machine 'Xubuntu12' has terminated unexpectedly during startup with exit code 1 VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component Machine, interface IMachine Waiting for VM "Xubuntu12" to power on...

Eu posso retomar manualmente os convidados, isso funciona sem problemas, mas isso não é tão confortável.

P.S .: O problema é conhecido há muito tempo, como você pode ver aqui: link

EDITAR: Existe um script semelhante:

#!/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/\(".*"\).*//')
        vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)//')
        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/\(".*"\).*//')
            vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)//')
            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

(Salve este script como /etc/pm/sleep.d/02-VirtualBox e verifique se ele é executável)

Fonte: link

Infelizmente, o mesmo problema com este script ...

    
por TuKsn 28.04.2014 / 01:22
0

@TuKsn

O problema é muito simples de ser resolvido - DISPLAY variável deve ser definido.

VirtualBox usa enquanto inicia vms no modo gui. O mesmo problema ocorre quando eu faço log via ssh e quero iniciar um vm no modo gui.

Obrigado pelo seu script, ele funciona muito bem!

No entanto, tive que adicionar algumas modificações, a fim de armazenar o modo em que o trabalho vms (ou seja, 'gui' ou 'headless' ou 'sdl') necessário para reiniciar corretamente o vms.

Abaixo, há o script com minhas correções incluídas:


#!/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/\(".*"\).*//')
        vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)//')
        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/\(".*"\).*//')
            vm_uuid=$(echo "$line" | sed 's/.*\({.*}\)//' | awk '{print $1}')
            vm_type=$(echo "$line" | sed 's/.*\({.*}\)//' | 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

    
por dervih 01.01.2015 / 23:48