Невозможно перейти в спящий режим при работающем virtualbox

У меня проблема с переводом в спящий режим и приостановкой работы моего ноутбука Dell во время работы Virtualbox (XP Guest). Я попробовал метод ядра по умолчанию, uswsusp и tuxonice, и ни один из них не работает. Но если я закрою virtualbox, то гибернация и приостановка работает нормально. Ниже приведены технические характеристики системы. ОС: Ubuntu 10.10 64-битная (полностью обновлено). Оперативная память: 4 ГБ. Замена: 8 ГБ. Корень: 500 ГБ (из которых около 79% бесплатны). Он имеет графический чипсет серии ATI HD 5000, и я использую для него проприетарные драйверы, установленные через жокей.

Благодаря.

3
задан 23 January 2011 в 06:18

4 ответа

@TuKsn

Проблема очень проста быть решенной - переменный ДИСПЛЕЙ должен быть установлен.

VirtualBox использует его при запуске vms в режиме gui. Та же проблема происходит, когда я регистрируюсь через ssh и хочу запустить vm в режиме gui.

Спасибо за Ваш сценарий это работает отлично!

Однако я должен был добавить некоторую модификацию для хранения режима, в котором работают vms (т.е. 'gui' или 'бездисплейный', или 'sdl') должен был правильно перезапустить vms.

Ниже существует сценарий с моим включенным correctnesses:


#!/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

0
ответ дан 23 January 2011 в 06:18

У меня была та же проблема, "приостановитесь", виртуальный гостевой XP (HostKey-P) работал несколько раз, но часто НЕТ. Помещение VM-Guest-XP в "сохраненном состоянии" позволило системе быть в спящем режиме снова без проблем.
Я записал маленький сценарий, вставьте его /etc/pm/sleep.d/05_virtualbox (не забывайте chmod a+x 05_virtualbox) и управление питанием сделает save-machine-state и запустит процедуру по VMs автоматически...

#!/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
3
ответ дан 23 January 2011 в 06:18

Lutz L. First спасибо за сценарий. У меня есть та же проблема на Xubuntu 14.04 с VB 4.3.10 и Xubuntu 12.04, или Гость XP Windwos работает, в спящем режиме.

При первой попытке сценарий, кажется, работает прекрасный. Но в следующий раз VMs автоматически не возобновляют, когда основная система возвращается из быть в спящем режиме состояния.

Это - сообщение, что я нахожу в файле "pm-suspend.log":

Выполнение рычага/etc/pm/sleep.d/05_virtualbox оттепель в спящем режиме: Отправьте резюме VM'sVBoxManage: ошибка: виртуальная машина 'Xubuntu12' неожиданно завершила во время запуска с кодом выхода 1 VBoxManage: ошибка:Подробнее: кодируйте NS_ERROR_FAILURE (0x80004005), Машина компонента, интерфейс IMachine Waiting для VM "Xubuntu12" для включений...

Я могу вручную возобновить Гостей, это работает без проблемы, но это не столь удобно.

P.S.: проблема была известна в течение долгого времени, как Вы видите здесь: https://www.virtualbox.org/ticket/7716

Править: Существует подобный сценарий:

#!/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

(Сохраните этот сценарий как/etc/pm/sleep.d/02-VirtualBox и удостоверьтесь, что это - исполняемый файл),

Источник: http://angryfifer.blogspot.de/2012/02/linux-hibernation-and-virtualbox.html

Печально та же проблема с этим сценарием...

0
ответ дан 23 January 2011 в 06:18

Согласно комментариям к первоначальному вопросу:

я обнаружил, что в virtualbox есть функция, с помощью которой можно сохранить текущее состояние виртуальных машин. Это похоже на гибернацию, за исключением того, что я не сплю с гостевой ОС явно. Более того, процесс очень быстрый, и после этого я могу нормально переводить хост-систему в исходное состояние.

Эта функция известна как Save Machine State.

0
ответ дан 23 January 2011 в 06:18

Другие вопросы по тегам:

Похожие вопросы: