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

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

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

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

40 ответов

@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
ответ дан 6 August 2018 в 04:05

@ 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
ответ дан 7 August 2018 в 22: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
ответ дан 7 August 2018 в 22:05

@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
ответ дан 7 August 2018 в 22:05

@ 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
ответ дан 10 August 2018 в 10:19

У меня была та же проблема: «пауза» 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
ответ дан 10 August 2018 в 10:19

@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
ответ дан 10 August 2018 в 10:19

@ 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
ответ дан 15 August 2018 в 23:27

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

@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
ответ дан 15 August 2018 в 23:27

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

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