वर्चुअलबॉक्स विंडोज मेजबान शटडाउन पर मेहमानों के सुंदर शटडाउन


17

जब कोई होस्ट कंप्यूटर बंद हो जाता है या फिर से चालू होता है, तो मैं VirtualBox विंडोज के तहत चल रहे किसी भी अतिथि VMs को शालीनता से बंद करने का समाधान खोजने की कोशिश कर रहा हूं।

ऐसा लगता है कि सबसे सुरक्षित विकल्प "सेव स्टेट" कमांड को ट्रिगर करना होगा जब होस्ट बंद होना शुरू हो जाता है, लेकिन यह स्पष्ट नहीं है कि मेजबान वीएम के लिए राज्य और पावर ऑफ को खत्म करने के लिए लंबे समय तक इंतजार करेगा।

किसी को भी इस (प्रतीत होता है) मूल मुद्दे के लिए एक मजबूत समाधान है?


अतिथि परिवर्धन स्थापित करें? क्या यह आवश्यक कार्यक्षमता प्रदान नहीं करता है?
Canadian Luke

@CanadianLuke यह नहीं करता है। :)
Matt Jenkins

जवाबों:


6

मुझे एक समान समस्या थी और एक सेवा के रूप में वर्चुअलबॉक्स चलाकर इसे हल किया:

http://vboxvmservice.sourceforge.net/

VBoxVMService के साथ आप चुन सकते हैं कि आप मशीन को कैसे बंद करना चाहते हैं (राज्य को बचाएं, पावर बंद करें) और स्टार्टअप। चूंकि यह एक सेवा के रूप में चल रहा है, सिस्टम शटडाउन प्रक्रिया के दौरान विंडोज स्वचालित रूप से इसके बंद होने का इंतजार करेगा।


विंडोज 10 पर सेटिंग की प्रक्रिया इतनी स्वचालित नहीं है। मुझे यह देखने के लिए कि शूटिंग में क्या परेशानी है, इसका उल्लेख करना होगा। हालाँकि, सही तरीके से कॉन्फ़िगर किए जाने के बाद, यह सॉफ़्टवेयर ठीक वही करता है जिसकी मुझे आवश्यकता है। आपके महान कार्य के लिए धन्यवाद।
iuradz

3

दुर्भाग्य से यह VMBox VirtualBox GUI के माध्यम से शुरू होने के लिए संभव नहीं लगता है। भले ही GUI होस्ट शटडाउन इवेंट को पकड़ सकता है और प्रतिक्रिया दे सकता है, वर्चुअलबॉक्स सेवा समाप्त हो जाती है: https://forums.virtualbox.org/viewtopic.php?p=278668#p278668

यदि आपको ग्राफ़िकल कंसोल की आवश्यकता नहीं है, तो VBoxHeadlessTray या VBoxVMService जाने का रास्ता हो सकता है। दोनों Windows होस्ट शटडाउन और पुनरारंभ पर स्वत: सहेजने और फिर से शुरू करने का समर्थन करते हैं।

VirtualBox 5.0 एक परिचय "वियोज्य यूआई" स्टार्ट मोड। यह मोड एक अलग यूआई प्रक्रिया के साथ एक हेडलेस वीएम शुरू करता है। चित्रमय प्रदर्शन हालांकि ग्रस्त है और 3 डी त्वरण अभी तक समर्थित नहीं है। लेकिन शायद इसे भविष्य में VBoxHeadlessTray के साथ जोड़ा जा सकता है (VBoxHeadlessTray 5.0 अभी तक समर्थन नहीं करता है।)। VBoxHeadlessTray GitHub रिपॉजिटरी और इसी के लिए VirtualBox 5 समर्थन जोड़ने के लिए GitHub पुल अनुरोध

संपादित करें: VBoxVmService भी समर्थन नहीं करता है संस्करण 5.0 के रूप में नया वियोज्य मोड। केवल नेतृत्वहीन अब तक। मैंने एक जोड़ दिया महत्वपूर्ण लेख मांगना उसके लिए।


जैसा कि मुझे प्रति पोस्ट दो से अधिक लिंक पोर्ट करने की अनुमति नहीं है, यहां लिंक दिए गए हैं VBoxHeadlessTray और इसी के लिए गिटहब पुल अनुरोध VirtualBox 5 समर्थन जोड़ने के लिए।
Leo B

मुझे थ्रेड में उल्लिखित मुद्दों का अनुभव नहीं है। इस विषय पर मेरा जवाब देखें। मैं विंडोज होस्ट शटडाउन चला सकता हूं और चल सकता हूं। शटडाउन ब्लॉक जब तक कि मेरे सभी वीएम बंद नहीं हो जाते हैं, और मैंने एक साफ शटडाउन या एक बचत राज्य करने के लिए डिफ़ॉल्ट कार्रवाई को बदल दिया है।
Kris Bahnsen

2

क्षमा करें मुझे पार्टी के लिए देर हो रही है। इसका सटीक उत्तर है, हालांकि इसके लिए कुछ कमांडलाइन-फू की आवश्यकता होती है। अधिक जानकारी के लिए यह थ्रेड पोस्ट देखें: https://forums.virtualbox.org/viewtopic.php?f=6&t=53684#p285540

आप जिस आदेश को देख रहे हैं, वह है:

"C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" setextradata "VM NAME" GUI / DefaultCloseAction शटडाउन

यह वह है जो मैं कई वीएम पर उपयोग करता हूं, विंडो बंद करता हूं और यह स्वचालित रूप से एक सुरक्षित शटडाउन शुरू करता है। शटडाउन विंडोज, और सब कुछ बंद करने के अपने प्रयास में, यह इन प्रक्रियाओं के पूरा होने का इंतजार करेगा।


1

मेरे पास 3 बैच स्क्रिप्ट हैं जो कि मैं शुरू करने वाले पावर बटन के बजाय उपयोग करता हूं।

do_shutdown.bat (10 सेकंड की प्रतीक्षा अवधि के साथ शटडाउन पीसी, वीवीएस के 10 सेकंड का समय बचाने के लिए नहीं, बल्कि मुझे 10 सेकंड के भीतर शटडाउन को रद्द करने की अनुमति देने के लिए। उलटी गिनती vm के बंद होने के बाद शुरू होती है)

"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /s /t 10

do_reboot.bat (Vm के शट डाउन होने के तुरंत बाद रिबूट)

"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /r /t 0

do_cancel.bat (मुझे 10 सेकंड की प्रतीक्षा अवधि के भीतर पीसी-शटडाउन को रद्द करने की अनुमति देता है। यह तब वीएम के फिर से पुनरारंभ करता है, क्योंकि वे do_shutdown.bat के साथ बंद हो गए)

shutdown /a
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Minimal" --type headless
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Server" --type headless

के बजाय savestate आप निम्न में से किसी एक का भी उपयोग कर सकते हैं

poweroff        - pulls the plug
                  (probably not a good idea...)

acpipowerbutton - presses the power off button for a clean shutdown
                  ("The system is going down for power off NOW!" to all consoles)

acpisleepbutton - tells the os to go to sleep
                  (probably just as bad as poweroff)

1
धन्यवाद, यह दिलचस्प है। दुर्भाग्य से, अन्य गैर-मैनुअल शटडाउन / रिबूट परिदृश्य हैं जिन्हें मुझे भी संभालने की आवश्यकता है। उदाहरण के लिए, विंडोज अपडेट या कम बैटरी पावर ऑफ / शटडाउन इवेंट्स द्वारा शेड्यूल किया गया पुनरारंभ।
Matt Jenkins

1
ओह ठीक। वहाँ भी है समूह नीति संपादक उसके साथ "लिपियों (स्टार्टअप / शटडाउन)" अनुभाग lifehacker.com/... मैं शटडाउन (एक कर्ल कॉल) पर एक बहुत ही छोटी कमांड के लिए उपयोग कर रहा हूं, इसलिए मुझे नहीं पता कि यह उन स्क्रिप्ट पर कैसे व्यवहार करता है जो पूरा होने में थोड़ी देर लगते हैं।
Daniel F

1

मेरे पास एक समान प्रश्न था और यह पृष्ठ मिला। मैं VirtualBox को एक सेवा के रूप में नहीं चलाना चाहता, क्योंकि मेरे पास परीक्षण के लिए बहुत सारे VMs हैं, और आमतौर पर VirtualBox UI में चलाने के लिए विभिन्न लोगों को चुनते हैं। जब मैं अपना कंप्यूटर बंद करता हूं, तो प्रत्येक वीएम की स्थिति को मैन्युअल रूप से सहेजना कष्टप्रद होता है। सभी रनिंग वीएम को बचाने के लिए स्क्रिप्ट का उपयोग करना इस मामले में एक व्यावहारिक समाधान लगता है। डैनियल एफ के उत्तर को और अधिक सामान्य बनाने के लिए, मैंने इन लिपियों को लिखा है जो स्पष्ट रूप से नामकरण के बिना सभी चल रहे वीएम की स्थिति को स्वचालित रूप से बचाते हैं।

saveRunningVMs.bat विंडोज के लिए:

set VBoxManageEXE="%ProgramFiles%\Oracle\VirtualBox\VBoxManage.exe"
set ListRunningVMS=%VboxManageEXE% list runningvms
for /f tokens^=2^,4^ delims^=^" %%p in ('%ListRunningVMS%') do %VBoxManageEXE% controlvm %%p savestate

echo all vms saved, you can shutdown now.

rem shutdown /s /t 10

saveRunningVMs.sh लिनक्स के लिए:

#!/bin/bash
vboxmanage list runningvms | while read line; do
  #echo "VBoxManage controlvm $uuid savestate;"
  echo $line
  if [[ $line =~ \{(.*)\} ]]
  then
    vboxmanage controlvm ${BASH_REMATCH[1]} savestate
  fi
done

0

मैंने एक पाइथन स्क्रिप्ट बनाई जो सभी रनिंग वर्चुअलबॉक्स वीएम को सस्पेंड कर देगी, और फिर एक निर्धारित कार्य के रूप में लॉगआउट पर स्क्रिप्ट को चलाने के लिए सिस्टम सेट करें।

मुझे नहीं पता कि यह तरीका कितना विश्वसनीय है। जैसा कि दूसरों ने नोट किया है Winlogon 7002 कार्य को पूरा करने के लिए सिस्टम कितनी देर तक इंतजार करेगा, इसकी सीमाएं हैं। लेकिन मुझे व्यक्तिगत रूप से इसके साथ कोई समस्या नहीं है, क्योंकि यह कई राज्यों में समग्र वीएम रैम के 4+ जीबी के साथ कई बेकार VM को दे रहा है।

इसे स्थापित करने के चरण यहां दिए गए हैं:

  1. Python.org से Python 2.7.x को डाउनलोड और इंस्टॉल करें
  2. नोटपैड या किसी अन्य सादे पाठ संपादक का उपयोग करके अपने सिस्टम पर कहीं पायथन स्क्रिप्ट फ़ाइल बनाएं (नीचे देखें)
  3. टास्क शेड्यूलर खोलें
  4. कार्रवाई चुनें - & gt; एक बेसिक टास्क बनाएं ... और निम्नलिखित सेटिंग्स के साथ एक कार्य बनाने के लिए विज़ार्ड का उपयोग करें
    • अपनी पसंद का एक नाम
    • जब कोई विशिष्ट ईवेंट लॉग हो जाए तो कार्य प्रारंभ करें
    • लॉग: सिस्टम
    • स्रोत: विनलॉगन
    • इवेंट आईडी: 7002
    • एक कार्यक्रम शुरू करें
    • के पास कार्यक्रम / स्क्रिप्ट , अपने पूरे रास्ते में प्रवेश करें python.exe, उदाहरण के लिए c:\Python27\python.exe
    • के पास तर्क जोड़ें , पूर्ण पथ दर्ज करें, जहाँ आप अजगर स्क्रिप्ट फ़ाइल डालते हैं, उदाहरण के लिए, मैं अपने दस्तावेज़ फ़ोल्डर के सबफ़ोल्डर में रखता हूं, इसलिए यह है C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
    • समाप्त चुनें।

अब VirtualBox VMs को लॉगआउट / रिस्टार्ट / शटडाउन पर निलंबित किया जाना चाहिए।

अजगर स्क्रिप्ट शटडाउन करने के लिए नीचे है:

# A script to suspend all running VirtualBox VMs

import os

import subprocess

import sys


class VM(object):
    def __init__(self, name, uuid):
        self.name = name
        self.uuid = uuid

    def __repr__(self):
        return "VM(%r,%r)" % (self.name, self.uuid)


class VBoxRunner(object):
    def __init__(self):
        program_files = os.environ["ProgramW6432"]
        vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
        self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")

    def vbox_run(self, *args):
        subprocess.check_call([self.vboxmanage_filename] + list(args))

    def vbox_run_output(self, *args):
        return subprocess.check_output([self.vboxmanage_filename] + list(args))

    def list(self, running=True):
        if running:
            list_cmd = "runningvms"
        else:
            list_cmd = "vms"

        return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]

    def suspend_all(self):
        success = True
        stopped_some_vms = False
        vms = self.list(running=True)
        for vm in vms:
            if vm is None:
                continue
            # noinspection PyBroadException
            try:
                self.suspend_vm(vm)
            except:
                success = False
            else:
                stopped_some_vms = True
        if not stopped_some_vms:
            self.message("No running vms")
        return success

    @staticmethod
    def parse_vm_list_entry(x):
        """:type x: str"""
        if not x.startswith('"'):
            return None
        end_pos = x.find('"', 1)
        if end_pos == -1:
            return None
        name = x[1:end_pos]
        assert x[end_pos + 1: end_pos + 3] == " {"
        assert x.endswith("}")
        uuid = x[end_pos + 2:]

        return VM(name, uuid)

    @staticmethod
    def message(msg):
        print >>sys.stderr, msg

    def suspend_vm(self, vm):
        assert isinstance(vm, VM)
        self.vbox_run("controlvm", vm.uuid, "savestate")


def main():
    vr = VBoxRunner()
    success = vr.suspend_all()
    if not success:
        sys.exit(1)


if __name__ == "__main__":
    main()

बैच स्क्रिप्ट का उपयोग करने के लिए दूसरों के सुझाव जो आप मैन्युअल रूप से चला सकते हैं, जो तब बचत करता है और यदि आपके उपयोग के मामले में फिट बैठता है तो शट डाउन महान है। लेकिन मैं वास्तव में इसके लिए क्या चाहता हूं विंडोज अपडेट स्वचालित रीबूट है, एक वीएम के साथ काम करने के बाद मैं पिछले दो दिनों से लगातार विंडोज अपडेट रीस्टार्ट द्वारा रात भर कड़ी मेहनत कर रहा हूं ...
rakslice
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.