Я использую Windows 7 внутри Virtualbox на Ubuntu 11.10. Все отлично работает Я запускаю его при запуске, но у меня проблема с перезагрузкой.
Когда я печатаю, sudo reboot now
состояние виртуальной Windows 7 не сохраняется. После перезагрузки запускается виртуальная коробка, но вместо работающей Windows я получаю меню аварийной загрузки Windows 7, и окна снова загружаются.
Есть ли возможность, что Ubuntu может послать некоторый сигнал в виртуальный ящик, чтобы безопасно закрыть экземпляр перед перезагрузкой хоста?
источник
reboot
12.10 сообщает: «При вызове с помощью --force или при уровне запуска 0 или 6 этот инструмент вызывает сам системный вызов reboot (2) и напрямую перезагружает систему. В противном случае это просто вызывает инструмент shutdown (8) с соответствующие аргументы. "; и на странице руководстваshutdown
говорится: «По истечении ВРЕМЕНИ shutdown отправляет запрос демону init (8) о переводе системы на соответствующий уровень выполнения».Я бы порекомендовал более сложный подход, включающий в себя выскочившую работу, скрипт запуска и остановки. В качестве примера я использую Windows XP, так как мой домашний каталог позволяет использовать tombert ... который вы должны изменить соответствующим образом. Он обладает тем преимуществом, что вы делаете (перезагрузка, выключение, нажатие кнопки питания), он прекрасно справляется с вашей виртуальной машиной .
Сначала начальную работу поместите в /etc/init/winxpvm.conf:
Задание upstart запускает виртуальную машину на уровне выполнения 2 (который находится в графическом режиме), и в моем случае это увеличивает приоритет на
nice
. Для того, чтобы приятно завершить работу виртуальной машины, мне нужно «отключить» завершение загрузки, используяkill signal SIGCONT
инструкцию. Это оставляет виртуальную машину работающей сначала (избегая значения по умолчаниюSIGTERM
). Через 120 секундSIGKILL
отправка в любом случае. Вместо этого я запускаюwinxpvm-stop.sh
сценарий.Примечание 1: строфы
start on started runlevel [2]
иstop on starting runlevel [!2]
не работают. Нужно особо упомянуть работуrc
.Дополнительное примечание 2. Что сбивает с толку и из руководства по выскочкам: В
kill signal
строфе указывается сигнал, отправляемый через 5 секунд. В этом примере я установил егоSIGTERM
(по умолчанию) на SIGCONT - но тайм-аут на 5 секунд я не смог изменить. Вkill timeout
разделе указывается тайм-аут, после которогоSIGKILL
отправляется сигнал, который нельзя изменить. Поэтому улучшение должно заключаться в определении новых строфterm signal
иterm timeout
.Вот стартовый скрипт winxpvm-start.sh:
Поскольку все настройки и т. Д. Выполняются в пользовательском режиме (так как мой логин - tombert ), даже при запуске от имени root я изменяю учетную запись на tombert . Конечно, пользователь может быть изменен в конфигурации upstart, но это решение дает мне возможность запускать / останавливать виртуальную машину «вручную» с консоли.
Более интересным является скрипт завершения работы в winxpvm-stop.sh:
Сначала я делаю то же самое, что и в стартовом скрипте - меняю пользователя с root на мой аккаунт tombert . Теперь давайте посмотрим на функцию
dostop
. Сначала я проверяю, работает ли виртуальная машина. Затем я пытаюсь «мягко» завершить работу, отправив отключение непосредственно в WinXP с помощьюguestcontrol
. Здесь вы должны предоставить учетные данные для учетной записи WinXP, которая в моем случае является Tombert и пароль. Windowsshutdown
будет корректно закрывать все приложения и выключать операционную систему (обычно). Затем давайте постоянно проверяем состояние виртуальной машиныshowvminfo
. Выполнение этого как минимум 60 раз с 1-секундным таймаутом (делайте все, что вы считаете подходящим здесь) должно дать виртуальной машине достаточно времени для корректного завершения работы. Обратите внимание, что призыв кshowvminfo
также занимает чуть меньше секунды (по крайней мере, на моем компьютере), так что в моем случае это дает ~ 120 секунд. Если все тормозит, мы можем принудительно отключиться, используяpoweroff
инструкцию.Вы также должны увидеть
acpipowerbutton
, но не используется. Это потому, что это не работает надежно. Если вы вошли в Windows или, что еще хуже, с несколькими пользователями, Windows покажет диалоговое окно подтверждения отключения, предотвращающее отключение системы. Это также причина, почемуacpibutton
в/etc/default/virtualbox
не будет работать на 100% надежно. Такжеpoweroff
принудительно отключит виртуальную машину - так же, как и при длительном нажатии кнопки питания. Поэтому лучше установить это значение пустым:Выдержка из / etc / default / virtualbox:
Чтобы сделать его идеальным, вы можете изменить поведение кнопки питания:
Выдержка из /etc/acpi/powerbtn.sh:
Остался один маленький недостаток. Когда виртуальная машина все еще загружается, а служба гостевого управления не запущена (на виртуальной машине), она не получит команду выключения. Редкий случай ... но подумай об этом.
Вот и все, надеюсь, это поможет.
источник
VERR_INVALID_PARAMETER
на стороне хоста, если я вошел в систему через RDC как пользователь, указанный в сценарии, и впоследствии гость продолжает работать.Следуйте этому ответу, чтобы изменить системную политику для перезагрузки
Вы не можете упростить это в
reboot
.init.d
Сценарии AFAIK не будут работать, потому что это занимает слишком много времени, но вы можете выполнить команду следующим образом:где
<vm>
имя виртуальной машиныисточник
Вы можете отправить запрос на выключение виртуальной машины с помощью:
Но если вы сделаете это в сценарии инициализации, сценарий не должен завершиться до завершения работы. Мы можем обнаружить это путем опроса файла диска виртуальной машины (.vdi) с помощью
lsof
илиfuser
в цикле. Или, как дешевый обходной путь,sleep 20
может быть достаточно.Вот что я сейчас использую в блоке закрытия моего скрипта инициализации:
В верхней части файла я определил:
Это может фактически не закрывать само приложение VirtualBox, но оно ожидает завершения работы виртуальной машины. Также это не работает, если виртуальная машина все еще находится в процессе загрузки (многие операционные системы игнорируют кнопку выключения питания на этом этапе), или если вы эмулируете старую систему без поддержки ACPI.
источник