VirtualBox मशीनों को स्वचालित रूप से कैसे शुरू करें और बंद करें?


52

मुझे एक सॉफ्टवेयर सिस्टम चलाने की आवश्यकता है जिसे एक समर्पित मशीन पर एक उपकरण के रूप में स्थापित करने का इरादा है। ऊर्जा बचाने के लिए, मैं इसके बजाय वर्चुअलबॉक्स वीएम पर सिस्टम को चलाने की योजना बना रहा हूं।

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

मैंने पहले ही पता लगा लिया है कि मेजबान बूट होने पर वीएम कैसे शुरू करें ( संपादित करें: यह किया जाता है, जैसा कि निखिल ने नीचे उल्लेख किया है, कमांड के माध्यम से VBoxManager startvm), लेकिन मैं वीएम को कैसे शान से बंद कर सकता हूं? मेजबान पर चल रही किसी भी स्क्रिप्ट को तब तक इंतजार करना होगा जब तक कि मेहमान पूरी तरह से बंद न हो जाए।

क्या कोई सुझाव दे सकता है कि, उदाहरण के लिए, ऐसा करने वाली सेवा फ़ाइल को देखना होगा?


क्या आप स्टार्टअप मशीन को बूटिंग करते हुए वर्चुअल मशीन शुरू करने के लिए दे सकते हैं
शुरुआती

जवाबों:


34

क्या आपने acpipowerbuttonइस कमांड सेट से कोशिश की है?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

टिप्पणियों को पढ़ने के बाद संपादित करें:

आप acpidइसे इनायत करने के लिए उपयोग कर सकते हैं या अन्य एसीपी उपयोगिताओं। इसके अलावा, क्या आप इस बारे में अधिक जानकारी प्रदान कर सकते हैं कि आप इस समय मशीन को कैसे बंद करते हैं?

सादा shutdownअधूरा काम करने के लिए इंतजार नहीं करेगा, एक समय की देरी बहुत लंबी हो सकती है।

मुझे लगता है कि आप एक खिड़की प्रबंधक का उपयोग नहीं कर रहे हैं तो इस उपकरण का प्रयास करें

बस इस डेमॉन को देखा । आपको यह उपयोगी लग सकता है।


आपके उत्तर के लिए धन्यवाद और unix.stackexchange.com पर आपका स्वागत है! हालाँकि, मुझे डर है कि आपका जवाब भी मेरे मुद्दे को संबोधित नहीं करता है: acpipowerbutton एक वास्तविक मशीन पर पावर बटन दबाने का अनुकरण करता है, लेकिन होस्ट पर यह आदेश जारी करने के बाद, VM फिर से, बंद करने के लिए कुछ समय लेगा।
jstarek

4
ज़रूर। तो आपको एक लूप लिखना होगा जो यह जांचता है कि क्या वीएम अभी भी चल रहा है। ACPI ठीक उसी विधि है जिसका उपयोग मैं अपनी स्क्रिप्ट में इसके लिए करता हूं। vboxmanage list runningvmsजब तक आपका वीएम चला नहीं जाता।
निल्स

ठीक है, जबकि मुझे लगता है कि मैं प्रैक्टिस में एक प्रबंधन आवरण के लिए समझौता करूंगा, +50 आप को इंस्क्रिप्ट में इंगित करने के लिए!
jstarek

16

इसे स्वयं कोड करने के बजाय, वैग्रांट का उपयोग करने पर विचार करें , जो कि वर्चुअलबॉक्स उदाहरणों को तुरंत और नियंत्रित करने के लिए बनाया गया है। दस्तावेज़ीकरण उत्कृष्ट है और मेरा सुझाव है कि आप इसे स्वयं रोल करने के प्रयास के बजाय इसे देखें।

इसकी लंबी और छोटी बात यह है कि आप एक साधारण नियंत्रण फ़ाइल बनाते हैं और फिर vagrant upजितने चाहें उतने वर्चुअलबॉक्स इंस्टेंस शुरू करने के लिए दौड़ते हैं। आप vagrant sshमेजबानों में प्रवेश करने और मेजबान vagrant haltको बंद करने के लिए (समाप्त किए बिना) का उपयोग कर सकते हैं । vagrant destroyउदाहरणों से छुटकारा मिलेगा।

यह कठपुतली, Ansible या शेफ के साथ प्रावधान का समर्थन करता है और आपको अधिकांश उजागर VBox कॉन्फ़िगरेशन सेटिंग्स को नियंत्रित करने की अनुमति देता है।


2
मैं योनि का प्रशंसक हूं, लेकिन इस मामले में, पृथ्वी पर आप इसके लिए क्या चाहते हैं? ओपी एक उपकरण चला रहा है, अपनी प्रणाली का निर्माण नहीं कर रहा है, इसलिए प्रावधान पूरी तरह से चूक जाता है। और क्यों, उपकरण से बाहर एक कस्टम 'बॉक्स' बनाएं, सिर्फ योनि का उपयोग करने के लिए, जब आप मूल रूप से ऐसा करने के लिए वर्चुअलबॉक्स के साथ सिस्टम के निर्माण की प्रक्रिया से गुजर रहे होंगे?
mc0e

10

मेरे पास आपके समान आवेदन है, एक अंतर के साथ: मुझे सिस्टम को पुनरारंभ करने और स्नैपशॉट से पुनर्प्राप्त करने की आवश्यकता है।

आप जो रुचि रखते हैं वह हेडलेस-मोड है

मेरे पास कुछ ऐसी सेवाएं हैं, इसलिए मैं निम्नलिखित स्क्रिप्ट का उपयोग करता हूं:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

मैं वीएम को कैसे शान से बंद कर सकता हूं?

यदि आप VM को शालीनतापूर्वक बंद करना चाहते हैं, तो आपके पास आपके आवेदन के आधार पर दो विकल्प हैं:

  • "शट-डाउन बटन" या "स्लीप बटन" का अनुकरण करें और उस पर प्रतिक्रिया करने के लिए VM को तैयार करें (कृपापूर्वक बंद करने के लिए)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • बाद में पुनर्स्थापित करने के लिए VM राज्य को सहेजें
    • VBoxManage controlvm <uuid>|<VMname> savestate

सुझाव: आप उपयोगी पा सकते हैं:

  • VBoxManage list vms - उपलब्ध vms की सूची
  • rdesktop IP-ADDR:3389या rdesktop-vrdp IP-ADDR:3389- जब आप एक जीयूआई (यहां तक ​​कि दूरस्थ रूप से ) चाहेंगे जब आप हेडलेस मोड में दौड़ेंगे:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - स्थानीय डिबगिंग के लिए GUI से शुरू करें

संबंधित वर्चुअलबॉक्स मैनुअल का अध्याय: अध्याय 7. दूरस्थ आभासी मशीनें - चरण दर चरण: एक हेडलेस सर्वर पर एक वर्चुअल मशीन बनाना

पुनश्च यदि आप पूरी तरह से पहले से लागू किए गए समाधानों में रुचि रखते हैं, तो ओपनस्टैक दिलचस्प विकल्प लगता है।


10

वर्चुअलबॉक्स वीएम प्रबंधन दस्तावेज को http://www.virtualbox.org/manual/ch08.html पर देख रहे हैं

VMs को सूचीबद्ध करने के लिए, कमांड का उपयोग करें VBoxManage list vms

वीएम शुरू करने के लिए, कमांड का उपयोग करें VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

VM को नियंत्रित करने के लिए, का उपयोग करें VBoxManage controlvm

controlvmSubcommand आप एक आभासी मशीन वर्तमान में चल रहे की स्थिति बदलने देता है। निम्नलिखित निर्दिष्ट किया जा सकता है:

VBoxManage controlvm <vm> pauseअस्थायी रूप से अच्छे के लिए अपनी स्थिति को बदलने के बिना, एक आभासी मशीन को होल्ड पर रखता है। VM को वर्तमान में रोका गया है यह इंगित करने के लिए VM विंडो को ग्रे में चित्रित किया जाएगा। (यह GUI के "मशीन" मेनू में "पॉज़" आइटम को चुनने के बराबर है।)

VBoxManage controlvm <vm> resumeपिछले विराम आदेश को पूर्ववत करने के लिए उपयोग करें । (यह GUI के "मशीन" मेनू में "पुनरारंभ" आइटम का चयन करने के बराबर है।)

VBoxManage controlvm <vm> resetवर्चुअल मशीन पर एक वास्तविक कंप्यूटर पर "रीसेट" बटन दबाने का समान प्रभाव पड़ता है: वर्चुअल मशीन का एक ठंडा रिबूट, जो फिर से अतिथि ऑपरेटिंग सिस्टम को फिर से बूट और बूट करेगा। VM की स्थिति पहले से सहेजी नहीं गई है, और डेटा खो सकता है। (यह GUI के "मशीन" मेनू में "रीसेट" आइटम को चुनने के बराबर है।)

VBoxManage controlvm <vm> poweroffवर्चुअल मशीन पर एक वास्तविक कंप्यूटर पर पावर केबल खींचने के समान प्रभाव पड़ता है। फिर से, VM की स्थिति पहले से सहेजी नहीं गई है, और डेटा खो सकता है। (यह GUI के "मशीन" मेनू में "बंद" आइटम का चयन करने या खिड़की के करीब बटन को दबाने के बराबर है, और फिर संवाद में "पावर ऑफ मशीन" का चयन करने के बराबर है। "

इसके बाद, VM की स्थिति "संचालित बंद" होगी।


ध्यान दें कि कुछ प्रणालियों पर, यह vboxmanage(सभी निचले मामले) है।
Arsege

2
आपके उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्य से, यह मेरे मुद्दे को संबोधित नहीं करता है: मुझे अतिथि के अंदर शान से अतिथि को बंद करने की आवश्यकता है , अर्थात अतिथि के अंदर एक "शटडाउन -एच" जारी करें और जब तक अतिथि पूरी तरह से बंद न हो जाए, तब तक मेजबान प्रतीक्षा करें । कोई भी VBoxManage controlvmउप-क्षेत्र ऐसा नहीं करता है।
jstarek

आप यह सुनिश्चित कर सकते हैं कि होस्ट से नीचे जाने से पहले सभी vms होस्ट में नीचे हैं। यदि आपको अतिथि के अंदर से होस्ट को नियंत्रित करने की आवश्यकता है, तो virtualbox.org/manual/ch08.html#vboxmanage-guestcontrol लेकिन यह आपको वह नहीं दे सकता है जिसकी आपको तलाश है। आपको /etc/init.d/vboxvms-serviceहोस्ट सिस्टम पर स्क्रिप्ट की तरह एक स्टार्टअप स्क्रिप्ट लिखना चाहिए , जो शुरू में सभी vms को ऑन और ऑन स्टॉप बना देगा, सभी vms को डाउन कर देगा।
निखिल मुल्ले

VBoxManage controlvm savestateएक अन्य कब्ज़ है (कम से कम Google मुझे बताता है), यह मशीनों की स्थिति को बचाता है और इसे सफाई से बंद कर देता है, लेकिन फिर भी मेजबान को प्रतीक्षा करने के लिए मजबूर करने का कोई तरीका नहीं है।
बरन

5

सिस्टम आधारित प्रणाली के लिए, आप यह कोशिश कर सकते हैं।

चरण # 1: एक सेवा फ़ाइल बनाएँ

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

चरण # 2: सेवा फ़ाइल सक्षम करें

$ sudo systemctl enable vboxvmservice@vm_name.service

संदर्भ


1
यहां एक उत्तर शामिल करना और अधिक विस्तृत जानकारी के लिए वैकल्पिक रूप से लिंक प्रदान करना पसंद किया जाता है । लिंक लक्ष्य नोटिस के बिना गायब हो जाते हैं, जिससे आपका उत्तर बेकार हो जाता है।
एंथन

खैर, समस्या यह है कि मैं वास्तव में लिंक 1 में पूरे सिस्टमड फ़ाइल को यहां कॉपी नहीं कर सकता, या मुझे यह करना चाहिए?
जन रुएग

खैर, दुर्भाग्यवश "लिंक रोट" उन मामलों में एक बड़ी समस्या है ... मुझे लगता है, पोस्टरिटी के लिए, निम्नलिखित दो लाइनें आपके लिंक के पीछे मूल विचार को पकड़ती हैं: यह एक ऐसी सेवा बना रही है जो वीएम VBoxHeadless -s %iको शुरू करने और VBoxManage controlvm %i savestateबंद करने के लिए उपयोग करती है ।
jstarek

डेबियन जेसी में यह कोशिश की, लेकिन यह काम नहीं किया। बनाया गया उपयोगकर्ता और समूह, सभी फ़ाइलों का स्वामित्व (/ dev / vbox * सहित)। लेकिन जब सेवा शुरू होती है, तो यह वीएम को नहीं मिल सकता है, भले ही नाम सही हो। सब के बाद सामान्य init स्क्रिप्ट का उपयोग करेगा।
मिवक

3

मेजबान से अतिथि को ssh के माध्यम से कमांड भेजने के बारे में कैसे?

मुझे यकीन नहीं है कि यह काम करता है और यदि आप मशीन की स्थिति की जांच बाद में कर सकते हैं या बाहर निकलने की स्थिति जैसा कुछ प्राप्त कर सकते हैं, लेकिन यह कम से कम स्वच्छ होना चाहिए।


अच्छा विचार है, लेकिन यह इस बात पर वार करेगा कि अतिथि वीएम होस्ट से नेटवर्क के माध्यम से पहुंच योग्य है, ssh पोर्ट को कम से कम (22)।
निखिल मुल्ले

मूल रूप से, यह काम करेगा, उपकरण पूरे डीएनएस में अपनी डीएनएस प्रविष्टि के माध्यम से पहुंचा जा सकता है। हालाँकि, मान लीजिए कि मैंने एक स्क्रिप्ट लिखी थी, जब भी मेजबान नीचे जाता है, तो वह उपकरण में ssh'd होता है - तब तक इसे तब तक ब्लॉक (रोकना) होगा जब तक कि मेहमान पूरी तरह से बंद न हो जाए। यह मेरे प्रश्न का ठीक-ठीक बिंदु है: अतिथि के डाउन होने पर स्क्रिप्ट को कैसे पता चल सकता है, ताकि वह SysV-Init पर नियंत्रण प्रवाह वापस प्राप्त कर सके और होस्ट बंद हो सके?
जसरेक j

1
आपकी टिप्पणी मानती है कि सब कुछ मेजबान प्रणाली पर सुचारू रूप से काम करेगा और अतिथि प्रणाली पर नहीं। क्या होगा अगर पावर केबल को होस्ट सिस्टम पर प्लग किया गया हो? इसकी एक अलग चर्चा। होस्ट सिस्टम पर आपका SysV-init सेवा स्क्रिप्ट के लिए प्रतीक्षा करेगा जब तक कि VM स्क्रिप्ट सेवा स्क्रिप्ट को सही तरीके से बंद करने के लिए तर्क को समझता है (दूरस्थ होस्ट पर शटडाउन निष्पादित करें या बस vbox इंटरफ़ेस के माध्यम से बंद करें) फिर उपज सफलता या विफलता की स्थिति को वापस सांत्वना या init पर लौटाती है।
निखिल मुल्ले

1
इस बारे में: अतिथि के डाउन होने पर स्क्रिप्ट को कैसे पता चलता है कि VmManager इंटरफ़ेस से vm चालू या बंद है या नहीं और अतिथि ssh'able है तो एक साधारण जाँच करें। इसके अलावा, होस्ट सिस्टम पर कुछ निगरानी रखें जो प्रदर्शन करेगा कि क्या वीएम वोमेनमैगर से उपलब्ध है और समय पर आधार पर इसकी ssh'able है।
निखिल मुल्ले

1

मेरा समाधान: इस शेल्स्क्रिप्ट में 'रूट' इनवॉकर है, और 'theuser' 'thev' का मालिक है

मुझे पता है कि vms समाप्त हो गया है जब कमांड का आउटपुट VBoxManage list runningvmsएक खाली स्ट्रिंग देता है।

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash theuser`" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...

1

Vm शुरू करने के लिए:

VBoxManage startvm VMNAME --type headless

Vm को रोकने के लिए:

VBoxManage controlvm VMNAME savestate

सभी चल रहे vm की सूची दें:

VBoxManage list runningvms

0

शायद यह समाधान के भाग के रूप में मदद करेगा।

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done

0

आप अपने अतिथि के लिए लॉगिन क्यों नहीं करते और वहां से शटडाउन करते हैं?

जब तक आपके पास sshd स्थापित नहीं करने और VM को VBox के माध्यम से वास्तव में एक्सेस नहीं करने का एक अच्छा कारण है, मैं एक स्क्रिप्ट के लिए जाऊंगा जो अभी एक समस्या है ssh shutdown -h now। ईमानदार होने के लिए, मैं हर मशीन के लिए एक स्क्रिप्ट बनाऊंगा जो इसे ठीक से बंद कर दे और इसे देखते समय कुछ चेकअप करें।

बस एक /etc/init.d/shutdown_vm स्क्रिप्ट पैक करें जो होस्ट से दूसरे को कॉल करती है, कॉल तैयार होने तक ब्लॉक रहेगी। यह प्रक्रिया (जैसा कि वर्णित है) अतिथि में एक लिनक्स निर्भरता को जोड़ती है लेकिन मेजबान पर VBox निर्भरता को हटा देती है।

पीछा करने के लिए काटना: आपको किसी मशीन को बंद करने के लिए VBox तक पहुंचने की आवश्यकता नहीं है, यदि आपके पास इसे एक्सेस करने के कुछ साधन हैं (यानी ssh) तो OS के पास हमेशा इसके लिए कुछ साधन होंगे (इसे चालू करना, बिल्कुल अलग है)


दो कारण: पहला, जैसा कि मूल प्रश्न में कहा गया है, मैं भारी संशोधित अतिथि ओएस को बदलना नहीं चाहता था यदि यह वास्तव में आवश्यक नहीं था। दूसरी बात, और इससे भी महत्वपूर्ण बात यह थी कि अगर मेजबान बंद हो जाता तो सभी चालू VMs को स्वचालित रूप से बंद करने के लिए एक स्वच्छ रास्ता प्रदान करना था।
jstarek

@jstarek लेकिन यदि आप नहीं चाहते हैं कि आप अपने अतिथि OS को संशोधित करें, (99.99% समय आपके पास लॉग इन करने के लिए कुछ साधन है, या यह एक अपवाद है)। और वास्तव में यह विचार है, यदि मेजबान नीचे जाता है, तो रनटाइम बदलते समय उचित स्क्रिप्ट को कॉल किया जाएगा और यह सिर्फ अतिथि को लॉग इन करता है और इसे "अंदर" से बंद कर देता है, जो कि वैसे भी योनि करता है ... "जानवर" जाने से पहले बल "वह है ...
एस्टानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.