Не в спящий режим с VirtualBox работает

Информация: https://www.redhat.com/promo/fonts/

Загрузить: https://www.redhat.com/promo/fonts/ [ ! d2]

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

40 ответов

В соответствии с комментариями к исходному вопросу:

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

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

2
ответ дан 25 May 2018 в 23:20
  • 1
    Не могли бы вы назвать функцию по имени? Я не знаю, как называется эта функция. – ptrcao 17 October 2011 в 17:06
  • 2
    @ptrcao он известен как pause (я думаю). Не рядом с моей машиной VBox, иначе я бы дважды проверил – jrg♦ 17 October 2011 в 17:25
  • 3
    Я никогда не слышал об этом " паузе " прежде чем ... Я использую «сохранение состояния машины». вариант при закрытии гостевого окна VM - я не знаю, совпадает ли это с тем, о чем вы говорите? – ptrcao 17 October 2011 в 17:46
  • 4
    @ptrcao да, это было бы. Это. Благодарю. – jrg♦ 17 October 2011 в 17:51

В соответствии с комментариями к исходному вопросу:

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

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

2
ответ дан 25 July 2018 в 22:35

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

я нашел, что есть функция в VirtualBox, с которой когда-то сохранить текущее состояние ВМ. Его довольно много, как в спячке, кроме того, что я не в спячке Гость явно ОС. Кроме того этот процесс осуществляется очень быстро и после, что я могу спящего хозяина обычно ОС.

Эта функция известна как [F1].

2
ответ дан 26 July 2018 в 22:45

В соответствии с комментариями к исходному вопросу:

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

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

2
ответ дан 31 July 2018 в 13:22

В соответствии с комментариями к исходному вопросу:

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

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

2
ответ дан 2 August 2018 в 04:01

В соответствии с комментариями к исходному вопросу:

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

Эта функция известна как Сохранить состояние машины .

2
ответ дан 4 August 2018 в 20:04

В соответствии с комментариями к исходному вопросу:

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

Эта функция известна как Сохранить состояние машины .

2
ответ дан 6 August 2018 в 04:05

В соответствии с комментариями к исходному вопросу:

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

Эта функция известна как Сохранить состояние машины .

2
ответ дан 7 August 2018 в 22:05

В соответствии с комментариями к исходному вопросу:

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

Эта функция известна как Сохранить состояние машины .

2
ответ дан 10 August 2018 в 10:19

В соответствии с комментариями к исходному вопросу:

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

Эта функция известна как Сохранить состояние машины .

2
ответ дан 15 August 2018 в 23:27
  • 1
    Не могли бы вы назвать функцию по имени? Я не знаю, как называется эта функция. – ptrcao 17 October 2011 в 17:06
  • 2
    @ptrcao он известен как pause (я думаю). Не рядом с моей машиной VBox, иначе я бы дважды проверил – jrg♦ 17 October 2011 в 17:25
  • 3
    Я никогда не слышал об этом & quot; паузе & quot; прежде чем ... Я использую «сохранение состояния машины». вариант при закрытии гостевого окна VM - я не знаю, совпадает ли это с тем, о чем вы говорите? – ptrcao 17 October 2011 в 17:46
  • 4
    @ptrcao да, это было бы. Это. Благодарю. – jrg♦ 17 October 2011 в 17:51

У меня была такая же проблема, «пауза» виртуального гостя-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 $_; 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
ответ дан 25 May 2018 в 23:20
  • 1
    @TuKsn благодарит за спасибо, скрипт внизу лучше, может обрабатывать несколько пользователей. я не вижу смысла делать тяжелый диск-IO параллельно, я мог бы замедлить работу. Я не могу добавить комментарий к вашему запросу, поэтому я прокомментирую здесь: возможно, вы можете переписать сценарий для отправки 'VBoxManage controlvm & lt; uuid & gt; & Lt; acpipowerbutton | acpisleepbutton & GT;» вместо savestate (+ настроить гостевой режим на спящий режим на диск и отключить питание). Но затем опрос «VBoxManage list runningvms» до вашего скрипта гарантирует, что все усыпляется. – Lutz L. 30 September 2014 в 14:43

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

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

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

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

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

PS: Проблема известна уже давно, как вы можете видеть здесь: https://www.virtualbox.org/ticket/7716

EDIT: Существует аналогичный сценарий:

#!/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 и убедитесь, что он выполним)

Источник: https: // www .virtualbox.org / ticket / 7716

К сожалению, та же проблема с этим sc НИИИТ ...

0
ответ дан 25 May 2018 в 23:20

@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 "$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
ответ дан 25 May 2018 в 23:20

@TuKsn

проблема очень просто решается - переменная дисплея должен быть установлен.

в VirtualBox использует его при запуске виртуальных машин в графическом режиме. Та же проблема возникает при входе через SSH и хочу запустить виртуальную машину, в графическом режиме.

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

однако мне пришлось добавить некоторые модификации для того, чтобы сохранить режим, в котором работают виртуальные машины (т. е. 'гуй' или 'безголовый' или 'СДЛ') необходимо, чтобы правильно перезагрузить ВМ.

ниже есть скрипт с моего 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
ответ дан 25 July 2018 в 22:35

У меня была такая же проблема, «пауза» виртуального гостя-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 $_; 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
ответ дан 25 July 2018 в 22:35
  • 1
    @TuKsn благодарит за спасибо, скрипт внизу лучше, может обрабатывать несколько пользователей. я не вижу смысла делать тяжелый диск-IO параллельно, я мог бы замедлить работу. Я не могу добавить комментарий к вашему запросу, поэтому я прокомментирую здесь: возможно, вы можете переписать сценарий для отправки 'VBoxManage controlvm & lt; uuid & gt; & Lt; acpipowerbutton | acpisleepbutton & GT;» вместо savestate (+ настроить гостевой режим на спящий режим на диск и отключить питание). Но затем опрос «VBoxManage list runningvms» до вашего скрипта гарантирует, что все усыпляется. – Lutz L. 30 September 2014 в 14:43

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

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

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

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

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

PS: Проблема известна уже давно, как вы можете видеть здесь: https://www.virtualbox.org/ticket/7716

EDIT: Существует аналогичный сценарий:

#!/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 и убедитесь, что он выполним)

Источник: https: // www .virtualbox.org / ticket / 7716

К сожалению, та же проблема с этим sc НИИИТ ...

0
ответ дан 25 July 2018 в 22:35

@TuKsn

проблема очень просто решается - переменная дисплея должен быть установлен.

в VirtualBox использует его при запуске виртуальных машин в графическом режиме. Та же проблема возникает при входе через SSH и хочу запустить виртуальную машину, в графическом режиме.

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

однако мне пришлось добавить некоторые модификации для того, чтобы сохранить режим, в котором работают виртуальные машины (т. е. 'гуй' или 'безголовый' или 'СДЛ') необходимо, чтобы правильно перезагрузить ВМ.

ниже есть скрипт с моего 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
ответ дан 26 July 2018 в 22:45

у меня была такая же проблема, "пауза" виртуальный-Гость-ХР (ключ хоста-П) сработало несколько раз, но чаще нет. Положить ВМ-Гость-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 $_; 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
ответ дан 26 July 2018 в 22:45
  • 1
    @TuKsn спасибо за спасибо, скрипт внизу лучше, может обрабатывать несколько пользователей. я не вижу смысла делать тяжелые дискового ввода-вывода параллельно, я могу сбавить темп. я не могу добавить комментарий к своему ответили на все воп так что мне тут комментировать: может быть, можно переписать скрипт, чтобы отправить 'VBoxManage controlvm <идентификатор> <acpipowerbutton|acpisleepbutton> вместо сэйва (+настроить гостя в спящий режим для диска и отключение питания). Но затем список опроса 'VBoxManage runningvms до Вашего скрипта гарантирует, что все погружается в сон. – Lutz L. 30 September 2014 в 14:43

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

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

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

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

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

PS: Проблема известна уже давно, как вы можете видеть здесь: https://www.virtualbox.org/ticket/7716

EDIT: Существует аналогичный сценарий:

#!/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 и убедитесь, что он выполним)

Источник: https: // www .virtualbox.org / ticket / 7716

К сожалению, та же проблема с этим sc НИИИТ ...

0
ответ дан 26 July 2018 в 22:45

@TuKsn

проблема очень просто решается - переменная дисплея должен быть установлен.

в VirtualBox использует его при запуске виртуальных машин в графическом режиме. Та же проблема возникает при входе через SSH и хочу запустить виртуальную машину, в графическом режиме.

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

однако мне пришлось добавить некоторые модификации для того, чтобы сохранить режим, в котором работают виртуальные машины (т. е. 'гуй' или 'безголовый' или 'СДЛ') необходимо, чтобы правильно перезагрузить ВМ.

ниже есть скрипт с моего 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
ответ дан 31 July 2018 в 13:22

у меня была такая же проблема, "пауза" виртуальный-Гость-ХР (ключ хоста-П) сработало несколько раз, но чаще нет. Положить ВМ-Гость-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 $_; 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
ответ дан 31 July 2018 в 13:22
  • 1
    @TuKsn спасибо за спасибо, скрипт внизу лучше, может обрабатывать несколько пользователей. я не вижу смысла делать тяжелые дискового ввода-вывода параллельно, я могу сбавить темп. я не могу добавить комментарий к своему ответили на все воп так что мне тут комментировать: может быть, можно переписать скрипт, чтобы отправить 'VBoxManage controlvm <идентификатор> <acpipowerbutton|acpisleepbutton> вместо сэйва (+настроить гостя в спящий режим для диска и отключение питания). Но затем список опроса 'VBoxManage runningvms до Вашего скрипта гарантирует, что все погружается в сон. – Lutz L. 30 September 2014 в 14:43

@ Лутц л. во-первых спасибо за сценарий. У меня такая же проблема на 14.04 xubuntu в с VB 4.3.10 и xubuntu в 12.04 или Windwos XP с гостя работает на hibernate.

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

это послание, которое я нашел в "ПМ-приостановить.лог-файл":

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

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

С. П.: проблема известна уже давно, как вы можете видеть здесь: 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/ПМ/сна.д/02-VirtualBox, и убедитесь, что он исполняемый)

Источник: https://www.virtualbox.org/ticket/7716

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

0
ответ дан 31 July 2018 в 13:22

@TuKsn

проблема очень просто решается - переменная дисплея должен быть установлен.

в VirtualBox использует его при запуске виртуальных машин в графическом режиме. Та же проблема возникает при входе через SSH и хочу запустить виртуальную машину, в графическом режиме.

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

однако мне пришлось добавить некоторые модификации для того, чтобы сохранить режим, в котором работают виртуальные машины (т. е. 'гуй' или 'безголовый' или 'СДЛ') необходимо, чтобы правильно перезагрузить ВМ.

ниже есть скрипт с моего 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
ответ дан 2 August 2018 в 04:01

У меня была такая же проблема, «пауза» виртуального гостя-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 $_; 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
ответ дан 2 August 2018 в 04:01
  • 1
    @TuKsn благодарит за спасибо, скрипт внизу лучше, может обрабатывать несколько пользователей. я не вижу смысла делать тяжелый диск-IO параллельно, я мог бы замедлить работу. Я не могу добавить комментарий к вашему запросу, поэтому я прокомментирую здесь: возможно, вы можете переписать сценарий для отправки 'VBoxManage controlvm & lt; uuid & gt; & Lt; acpipowerbutton | acpisleepbutton & GT;» вместо savestate (+ настроить гостевой режим на спящий режим на диск и отключить питание). Но затем опрос «VBoxManage list runningvms» до вашего скрипта гарантирует, что все усыпляется. – Lutz L. 30 September 2014 в 14:43

@ Лутц л. во-первых спасибо за сценарий. У меня такая же проблема на 14.04 xubuntu в с VB 4.3.10 и xubuntu в 12.04 или Windwos XP с гостя работает на hibernate.

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

это послание, которое я нашел в "ПМ-приостановить.лог-файл":

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

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

С. П.: проблема известна уже давно, как вы можете видеть здесь: 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/ПМ/сна.д/02-VirtualBox, и убедитесь, что он исполняемый)

Источник: https://www.virtualbox.org/ticket/7716

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

0
ответ дан 2 August 2018 в 04:01

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

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

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

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

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

PS: Проблема известна уже давно, как вы можете видеть здесь: https://www.virtualbox.org/ticket/7716

EDIT: есть аналогичный скрипт:

  #! / bin / bash # Сценарий для приостановки / возобновления запуска виртуальных машин VBox при работе спящего / оттаивания = "$ 1" # Этот скрипт  вызывается как root, но root не может использовать VBoxManage для # control t  он VM других пользователей.  Таким образом, мы получаем членов группы # vboxusers и повторно выполняем, как каждый пользователь, в свою очередь, если [$ (id -u) -eq 0];  затем # работает как root ... vboxusers = $ (grep ^ vboxusers / etc / group | cut -d ':' -f 4- | tr ',' '') для пользователя в $ vboxusers;  do echo "restarting as $ user ..." su - $ user -c "$ 0 $ operation" ||  exit $?  done exit 0 fi hibernated_vm_list = $ HOME / .vbox-hibernated-vms # получить список всех запущенных виртуальных машин, сохранить их состояние на диск и # вспомнить, что мы сделали эту hibernate_vms () {rm -f $ hibernated_vm_list # каждую строку в  list: "vmname" {vm-uuid} local vm_list = "$ (VBoxManage list runningvms)", если [-z "$ vm_list"];  то # ничего не делать return 0 fi local tempfile = "/ tmp / VBoxPauseResume.tmp" echo "$ vm_list" & gt;  $ tempfile local pids = "" при чтении строки;  do vm_name = $ (echo "$ line" | sed 's / \ (". *" \). * / \ 1 /') vm_uuid = $ (echo "$ line" | sed 's /.* \ ({  . *} \) / \ 1 / ') echo "сохранение состояния vm $ vm_name для пользователя $ user" (VBoxManage controlvm $ vm_uuid savestate & amp; \ echo "$ vm_name $ vm_uuid" & gt; & gt; $ hibernated_vm_list & amp;  & amp; \ echo "сохраненное состояние vm $ vm_name для пользователя $ user") & amp;  pids = "$ pids $!"  done & lt;  $ tempfile wait $ pids rm -f $ tempfile} # возобновляет любые виртуальные машины, которые были сохранены hibernate_vms ().  Использует параллельные # дочерние процессы для оттаивания нескольких VM быстрее thaw_vms () {if [-e $ hibernated_vm_list];  затем локальные pids = "" при чтении строки;  do vm_name = $ (echo "$ line" | sed 's / \ (". *" \). * / \ 1 /') vm_uuid = $ (echo "$ line" | sed 's /.* \ ({  . *} \) / \ 1 / ') echo "возобновление vm $ vm_name для пользователя $ user" VBoxManage startvm $ vm_uuid & amp;  pids = "$ pids $!"  done & lt;  $ hibernated_vm_list wait $ pids rm -f $ hibernated_vm_list fi} case $ операция в спящем режиме) hibernate_vms ;;  приостановить) ;;  оттаивание) thaw_vms ;;  продолжить) ;;  esac  

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

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

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

0
ответ дан 4 August 2018 в 20:04

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

  #! / bin / sh # Файл: /etc/pm/sleep.d/05_virtualbox # (по крайней мере, в ubuntu  / fedora) # # Этот хак сохраняет состояние всех пользователей VirtualBox-VM $ VBUSER в режиме hibernate / suspend, # сохраняет список этих виртуальных машин в $ VM_LIST_FILE, а при оттаивании / возобновлении он снова запускает все # VM в этом списке и  удаляет $ VM_LIST_FILE.  # ОШИБКИ: не используйте одно и то же имя для разных виртуальных машин или перезаписывайте скрипт, чтобы использовать UUID # # REAL hack, пытались как можно больше комментариев, но выбранный синтаксис был запутан, # извините ... также жаль  плохой английский ... # # Writer (виновный): Lutz Langenbach # Copyleft: сделайте то, что вы хотите, с помощью Code # Help: VBoxManage 2 & amp; 1 | less или 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}" в suspend | hibernate  ) # распечатать список результатов работы виртуальной машины: «vm-name» {vm-uuid} \n # извлечь только имя виртуальной машины и отправить echo -n «Отправить savestate для VM:» sudo -u $ VBUSER VBoxManage list runningvms \ |  perl -ne 'chomp; s / ^ "([^"] *) ". * / \ 1 /; print $ _; system (" sudo -u' "$ VBUSER" 'VBoxManage controlvm \ "$ _ \" savestate  & amp; & echo \ "$ _ \" & gt; & gt; '"$ VM_LIST_FILE"' ");  echo ..done ;; resume | thaw) # получить каждую строку в $ VM_LIST_FILE, использовать ее как имя VM и отправить ей начало echo -n «Отправить резюме в VM» cat $ VM_LIST_FILE | perl -ne 'chomp; s /  ^ "([^"] *)»* / \ 1 /.  system ("sudo -u '" $ VBUSER "' VBoxManage startvm \" $ _ \ ""); '  rm -f $ VM_LIST_FILE эхо.  ;;  *) echo «Не знаю, что делать, 1-й Arg был: $ {1}; Должен быть приостановлен | спящий | резюме | оттепель ;;;  esac  
3
ответ дан 4 August 2018 в 20:04

@TuKsn

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

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

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

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

Ниже приведен скрипт с моими правильными значениями:

  #! / bin  / bash # Сценарий для приостановки / возобновления работы виртуальных машин VBox при спящем / оттаивании # Установите ваш дисплей здесь display = ": 0.0" operation = "$ 1" # Этот скрипт вызывается как root, но root не может использовать VBoxManage для # управления виртуальными машинами  других пользователей.  Таким образом, мы получаем членов группы # vboxusers и повторно выполняем, как каждый пользователь, в свою очередь, если [$ (id -u) -eq 0];  затем # работает как root ... vboxusers = $ (grep ^ vboxusers / etc / group | cut -d ':' -f 4- | tr ',' '') для пользователя в $ vboxusers;  do echo "restarting as $ user ..." su - $ user -c "$ 0 $ operation" ||  exit $?  done exit 0 fi hibernated_vm_list = $ HOME / .vbox-hibernated-vms # получить список всех запущенных виртуальных машин, сохранить их состояние на диск и # вспомнить, что мы сделали эту hibernate_vms () {rm -f $ hibernated_vm_list # каждую строку в  list: "vmname" {vm-uuid} local vm_list = "$ (VBoxManage list runningvms)", если [-z "$ vm_list"];  то # ничего не делать return 0 fi local tempfile = "/ tmp / VBoxPauseResume.tmp" echo "$ vm_list"> $ tempfile local pids = "" при чтении строки;  do vm_name = $ (echo "$ line" | sed 's / \ (". *" \). * / \ 1 /') vm_uuid = $ (echo "$ line" | sed 's /.* \ ({  . *} \) / \ 1 / ') vm_type = $ (VBoxManage showvminfo $ vm_uuid | grep "Тип сеанса:" | awk' {print $ NF} ') case $ vm_type в "headless") ;;  "sdl") ;;  «GUI / Qt») vm_type = "gui" ;;  *) vm_type = "gui" ;;  esac echo "сохранение состояния vm $ vm_name для пользователя $ user из режима $ vm_type" (VBoxManage controlvm $ vm_uuid savestate && \ echo "$ vm_name $ vm_uuid $ vm_type" >> $ hibernated_vm_list && \ echo "сохраненное состояние vm $ vm_name для  user $ user ") & pids =" $ pids $! "  done & lt;  $ tempfile wait $ pids rm -f $ tempfile} # возобновляет любые виртуальные машины, которые были сохранены hibernate_vms ().  Использует параллельные # дочерние процессы для оттаивания нескольких VM быстрее thaw_vms () {if [-e $ hibernated_vm_list];  затем локальные pids = "" при чтении строки;  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 для пользователя $ user в режиме $ vm_type" DISPLAY = $ display VBoxManage startvm $ vm_uuid --type $ vm_type & pids = "$ pids $!"  done & lt;  $ hibernated_vm_list wait $ pids rm -f $ hibernated_vm_list fi} case $ операция в спящем режиме) hibernate_vms ;;  приостановить) ;;  оттаивание) thaw_vms ;;  продолжить) ;;  esac  
0
ответ дан 4 August 2018 в 20:04

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

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

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

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

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

PS: Проблема известна уже давно, как вы можете видеть здесь: https://www.virtualbox.org/ticket/7716

EDIT: есть аналогичный скрипт:

  #! / bin / bash # Сценарий для приостановки / возобновления запуска виртуальных машин VBox при работе спящего / оттаивания = "$ 1" # Этот скрипт  вызывается как root, но root не может использовать VBoxManage для # control t  он VM других пользователей.  Таким образом, мы получаем членов группы # vboxusers и повторно выполняем, как каждый пользователь, в свою очередь, если [$ (id -u) -eq 0];  затем # работает как root ... vboxusers = $ (grep ^ vboxusers / etc / group | cut -d ':' -f 4- | tr ',' '') для пользователя в $ vboxusers;  do echo "restarting as $ user ..." su - $ user -c "$ 0 $ operation" ||  exit $?  done exit 0 fi hibernated_vm_list = $ HOME / .vbox-hibernated-vms # получить список всех запущенных виртуальных машин, сохранить их состояние на диск и # вспомнить, что мы сделали эту hibernate_vms () {rm -f $ hibernated_vm_list # каждую строку в  list: "vmname" {vm-uuid} local vm_list = "$ (VBoxManage list runningvms)", если [-z "$ vm_list"];  то # ничего не делать return 0 fi local tempfile = "/ tmp / VBoxPauseResume.tmp" echo "$ vm_list" & gt;  $ tempfile local pids = "" при чтении строки;  do vm_name = $ (echo "$ line" | sed 's / \ (". *" \). * / \ 1 /') vm_uuid = $ (echo "$ line" | sed 's /.* \ ({  . *} \) / \ 1 / ') echo "сохранение состояния vm $ vm_name для пользователя $ user" (VBoxManage controlvm $ vm_uuid savestate & amp; \ echo "$ vm_name $ vm_uuid" & gt; & gt; $ hibernated_vm_list & amp;  & amp; \ echo "сохраненное состояние vm $ vm_name для пользователя $ user") & amp;  pids = "$ pids $!"  done & lt;  $ tempfile wait $ pids rm -f $ tempfile} # возобновляет любые виртуальные машины, которые были сохранены hibernate_vms ().  Использует параллельные # дочерние процессы для оттаивания нескольких VM быстрее thaw_vms () {if [-e $ hibernated_vm_list];  затем локальные pids = "" при чтении строки;  do vm_name = $ (echo "$ line" | sed 's / \ (". *" \). * / \ 1 /') vm_uuid = $ (echo "$ line" | sed 's /.* \ ({  . *} \) / \ 1 / ') echo "возобновление vm $ vm_name для пользователя $ user" VBoxManage startvm $ vm_uuid & amp;  pids = "$ pids $!"  done & lt;  $ hibernated_vm_list wait $ pids rm -f $ hibernated_vm_list fi} case $ операция в спящем режиме) hibernate_vms ;;  приостановить) ;;  оттаивание) thaw_vms ;;  продолжить) ;;  esac  

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

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

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

0
ответ дан 6 August 2018 в 04:05

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

  #! / bin / sh # Файл: /etc/pm/sleep.d/05_virtualbox # (по крайней мере, в ubuntu  / fedora) # # Этот хак сохраняет состояние всех пользователей VirtualBox-VM $ VBUSER в режиме hibernate / suspend, # сохраняет список этих виртуальных машин в $ VM_LIST_FILE, а при оттаивании / возобновлении он снова запускает все # VM в этом списке и  удаляет $ VM_LIST_FILE.  # ОШИБКИ: не используйте одно и то же имя для разных виртуальных машин или перезаписывайте скрипт, чтобы использовать UUID # # REAL hack, пытались как можно больше комментариев, но выбранный синтаксис был запутан, # извините ... также жаль  плохой английский ... # # Writer (виновный): Lutz Langenbach # Copyleft: сделайте то, что вы хотите, с помощью Code # Help: VBoxManage 2 & amp; 1 | less или 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}" в suspend | hibernate  ) # распечатать список результатов работы виртуальной машины: «vm-name» {vm-uuid} \n # извлечь только имя виртуальной машины и отправить echo -n «Отправить savestate для VM:» sudo -u $ VBUSER VBoxManage list runningvms \ |  perl -ne 'chomp; s / ^ "([^"] *) ". * / \ 1 /; print $ _; system (" sudo -u' "$ VBUSER" 'VBoxManage controlvm \ "$ _ \" savestate  & amp; & echo \ "$ _ \" & gt; & gt; '"$ VM_LIST_FILE"' ");  echo ..done ;; resume | thaw) # получить каждую строку в $ VM_LIST_FILE, использовать ее как имя VM и отправить ей начало echo -n «Отправить резюме в VM» cat $ VM_LIST_FILE | perl -ne 'chomp; s /  ^ "([^"] *)»* / \ 1 /.  system ("sudo -u '" $ VBUSER "' VBoxManage startvm \" $ _ \ ""); '  rm -f $ VM_LIST_FILE эхо.  ;;  *) echo «Не знаю, что делать, 1-й Arg был: $ {1}; Должен быть приостановлен | спящий | резюме | оттепель ;;;  esac  
3
ответ дан 6 August 2018 в 04:05

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

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