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

Как отметил Себф, вы можете получить физический компакт-диск в магазине Canonical .

Существуют также различные «фрилансеры» , продающие компакт-диски на Amazon.com и других сайтах, но обязательно прочитайте обзоры перед покупкой, поскольку они НЕ являются каноническими, поэтому их качество может быть под вопросом (но что они делают это совершенно законно, поскольку это программное обеспечение с открытым исходным кодом.)

Обратите внимание, что Canonical прекратит поставку физических CD / DVD-дисков для выпусков не LTS , что означает, что после 12.10, следующий физический CD, который вы можете получить от Canonical, скорее всего, будет 14.04.

3
задан 04.11.2019, 23:17

4 ответа

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

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

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

[110]; system("sudo -u '"$VBUSER"' VBoxManage controlvm \"

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

[110]\" savestate && echo \"

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

[110]\">>'"$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 \"

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

[110]\"");' rm -f $VM_LIST_FILE echo . ;; *) echo "Don't know what to do, 1st Arg was:${1}; Must be suspend|hibernate|resume|thaw" ;; esac
0
ответ дан 04.11.2019, 23:18

@TuKsn

Проблема очень проста для решения - необходимо установить переменную DISPLAY.

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

Спасибо за ваш скрипт, он прекрасно работает!

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

Ниже приведен сценарий с моей корректностью:


#!/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 "[110] $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
ответ дан 04.11.2019, 23:18

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

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

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

0
ответ дан 04.11.2019, 23:19
  • 1
    Можно ли определить функцию по имени? Я don' t знают то, чем называют функцию. – juliomalegria 04.11.2019, 23:19
  • 2
    @ptrcao it' s известный как pause (я думаю). Не около моей машины VBox, иначе I' d двойная проверка – AlexKh 04.11.2019, 23:19
  • 3
    Я никогда не слышал об этом " pause" прежде... Я использую " сохраните машину state" опция при закрытии гостевого окна VM - я don' t знают, совпадает ли это с тем, о чем Вы говорите? – Paul Rooney 04.11.2019, 23:20

@ Лутц Л. Сначала спасибо за сценарий. У меня такая же проблема на Xubuntu 14.04 с VB 4.3.10, а Xubuntu 12.04 или Windwos XP Guest работает на hibernate.

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

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

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

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

PS: проблема известна давно, как вы можете видеть здесь: 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 "[110] $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 и убедитесь, что он исполняемый)

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

К сожалению, та же проблема с этим сценарием ...

0
ответ дан 04.11.2019, 23:19

Теги

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