Używam Windows 7 w Virtualbox na Ubuntu 11.10. Wszystko dziala. Używam go podczas uruchamiania, ale mam problem z ponownym uruchomieniem.
Kiedy piszę, sudo reboot now
stan wirtualnego systemu Windows 7 nie jest zapisywany. Po ponownym uruchomieniu Virtualbox uruchamia się, ale zamiast działającego systemu Windows pojawia się menu rozruchu awaryjnego systemu Windows 7, a system Windows uruchamia się ponownie.
Czy istnieje opcja, że Ubuntu może wysłać sygnał do wirtualnego urządzenia, aby bezpiecznie zamknąć instancję przed ponownym uruchomieniem hosta?
źródło
reboot
podręcznika dla 12.10 mówi: „Gdy zostanie wywołana z --force lub w trybie 0 lub 6, to narzędzie wywołuje samo wywołanie systemowe reboot (2) i bezpośrednio ponownie uruchamia system. W przeciwnym razie po prostu wywołuje narzędzie shutdown (8) z odpowiednie argumenty. ”; a strona podręcznika manshutdown
mówi: „Po upływie CZASU zamknięcie wysyła żądanie do demona init (8), aby doprowadzić system do odpowiedniego poziomu uruchamiania”.Poleciłbym bardziej wyrafinowane podejście, w tym pracę upstart, skrypt start i stop. Jako przykład używam systemu Windows XP, ponieważ mój katalog domowy pozwala na użycie tomberta ... który należy odpowiednio zmienić. Ma tę zaletę, że wszystko, co robisz (restart, zamknięcie, naciśnięcie przycisku zasilania), dobrze radzi sobie z maszyną wirtualną .
Najpierw zadanie upstart, umieść w /etc/init/winxpvm.conf:
Zadanie upstart uruchamia maszynę wirtualną na poziomie 2 (który jest w trybie graficznym), aw moim przypadku zwiększa priorytet o
nice
. Aby ładnie zamknąć maszynę wirtualną, muszę „wyłączyć” zakończenie upstart za pomocąkill signal SIGCONT
instrukcji. To powoduje, że maszyna wirtualna najpierw działa (unikając domyślnejSIGTERM
). Po 120 sekundach i takSIGKILL
zostanie wysłany. Zamiast tego uruchamiamwinxpvm-stop.sh
skrypt.Uwaga dodatkowa 1: Sekcje
start on started runlevel [2]
istop on starting runlevel [!2]
nie działają. Należy szczególnie wspomnieć o pracyrc
.Uwaga dodatkowa 2: Co jest mylące również z podręcznika dla początkujących: Sekcja
kill signal
określa sygnał wysłany po 5 sekundach. W tym przykładzie ustawiłem go zSIGTERM
(domyślnie) na SIGCONT - ale nie mogłem zmienić limitu 5 sekund. Sekcjakill timeout
określa limit czasu, po którymSIGKILL
jest wysyłany - którego sygnału nie można zmienić. Ulepszeniem byłoby zatem zdefiniowanie nowych zwrotekterm signal
iterm timeout
.Oto skrypt startowy winxpvm-start.sh:
Ponieważ wszystkie ustawienia itp. Są wykonywane w trybie użytkownika (ponieważ mój login to tombert ), nawet po uruchomieniu jako root zmieniam konto na tombert . Użytkownik może oczywiście zostać zmieniony w konfiguracji upstart, ale to rozwiązanie pozostawia mi opcję uruchamiania / zatrzymywania maszyny wirtualnej „ręcznie” z konsoli.
Bardziej interesujący jest skrypt zamykający w winxpvm-stop.sh:
Najpierw robię to samo, co w skrypcie startowym - zmieniam użytkownika z root na moje konto tombert . Teraz spójrzmy na funkcję
dostop
. Najpierw sprawdzam, czy maszyna wirtualna w ogóle działa. Następnie próbuję „miękko” zamknąć system, wysyłając go bezpośrednio do WinXP przy użyciuguestcontrol
. Tutaj musisz podać poświadczenia konta WinXP, które w moim przypadku to tombert i hasło. Windowsshutdown
z wdziękiem zamknie wszystkie aplikacje i wyłączy system operacyjny (normalnie). Następnie pozwala stale sprawdzać stan maszyny wirtualnej za pomocąshowvminfo
. Wykonanie tego co najmniej 60 razy z 1-sekundowym limitem czasu (rób wszystko, co uważasz, że jest to właściwe) powinno pozostawić maszynie wirtualnej wystarczająco dużo czasu, aby mogła się bezpiecznie zamknąć. Pamiętaj, że połączenie zshowvminfo
zajmuje również trochę mniej niż sekundę (przynajmniej na moim komputerze), więc w moim przypadku daje to ~ 120 sekund. Jeśli wszystko zahamuje, możemy wymusić wyłączenie przy użyciupoweroff
oświadczenia.Powinieneś także zobaczyć
acpipowerbutton
, ale nieużywany. Jest tak, ponieważ nie działa niezawodnie. Jeśli jesteś zalogowany do systemu Windows lub nawet gorzej wielu użytkowników, system Windows wyświetli okno dialogowe potwierdzenia zamknięcia, uniemożliwiające zamknięcie systemu. Jest to również powód, dla któregoacpibutton
w/etc/default/virtualbox
nie będzie działać w 100% niezawodny. Równieżpoweroff
silnie wyłączy maszynę wirtualną - tak samo jak długo naciśnij przycisk zasilania. Dlatego najlepiej ustawić to na puste:Fragment z / etc / default / virtualbox:
Aby było idealnie, możesz zmienić zachowanie przycisku zasilania:
Fragment /etc/acpi/powerbtn.sh:
Pozostaje jedna mała wada. Gdy maszyna wirtualna nadal się uruchamia, a usługa kontroli gościa nie jest uruchomiona (na maszynie wirtualnej), nie otrzyma polecenia zamknięcia. Rzadki przypadek ... ale pomyśl o tym.
To wszystko, mam nadzieję, że to pomoże.
źródło
VERR_INVALID_PARAMETER
po stronie hosta, jeśli jestem zalogowany za pośrednictwem RDC jako użytkownik podany w skrypcie, a następnie gość nadal działa.Postępuj zgodnie z tą odpowiedzią, aby zmienić zasady systemowe dotyczące ponownego uruchamiania
Nie możesz tego usprawnić
reboot
.init.d
Skrypty AFAIK nie będą działać, ponieważ zajmuje to zbyt dużo czasu, ale możesz uruchomić następującą komendę:gdzie
<vm>
jest nazwa maszyny wirtualnejźródło
Możesz wysłać żądanie zamknięcia do maszyny wirtualnej za pomocą:
Ale jeśli zrobisz to w skrypcie inicjującym, skrypt nie powinien wyjść, dopóki zamknięcie nie zostanie zakończone. Możemy to wykryć, odpytując plik dysku maszyny wirtualnej (.vdi) za pomocą
lsof
lubfuser
w pętli. Lub jako tanie obejście,sleep 20
może wystarczyć.Oto, czego obecnie używam w zamkniętym bloku skryptu inicjującego:
W górnej części pliku zdefiniowałem:
To może nie zamknąć aplikacji VirtualBox, ale czeka na zakończenie maszyny wirtualnej. Nie działa również, jeśli maszyna wirtualna jest w trakcie uruchamiania (wiele systemów operacyjnych ignoruje przycisk wyłączania podczas tej fazy) lub jeśli emulujesz stary system bez obsługi ACPI.
źródło