จะเริ่มและปิดเครื่อง VirtualBox โดยอัตโนมัติได้อย่างไร


52

ฉันจำเป็นต้องเรียกใช้ระบบซอฟต์แวร์ที่ตั้งใจจะติดตั้งเป็นอุปกรณ์ในเครื่องเฉพาะ เพื่อประหยัดพลังงานฉันวางแผนที่จะใช้ระบบบน VirtualBox VM แทน

โฮสต์เป็นกล่อง Linux มาตรฐานที่มีระบบ SysV-Init แขกเป็น Linux ที่ได้รับการดัดแปลงอย่างมากและฉันไม่ต้องการแก้ไขมันเพิ่มเติมอีก VirtualBox ใช้ในเวอร์ชั่น OSE

ฉันได้คิดแล้วว่าจะเริ่มต้น VM ได้อย่างไรเมื่อโฮสต์บู๊ต ( แก้ไข:เสร็จสิ้นตามที่ Nikhil พูดถึงด้านล่างผ่านคำสั่งVBoxManager startvm) แต่ฉันจะปิด VM ได้อย่างไร สคริปต์ใด ๆ ที่ทำงานบนโฮสต์จะต้องรอจนกว่าแขกจะปิดตัวลงอย่างสมบูรณ์

ใครบ้างสามารถแนะนำวิธีการเช่นไฟล์บริการการทำเช่นนี้จะต้องดู?


คุณสามารถให้สคริปต์เริ่มต้นเพื่อเริ่มเครื่องเสมือนในขณะที่เริ่มระบบได้หรือไม่
Beginner

คำตอบ:


34

คุณได้ลองacpipowerbuttonจากชุดคำสั่งนี้หรือยัง?

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

แก้ไขหลังจากอ่านความคิดเห็น:

คุณสามารถใช้acpidหรืออรรถประโยชน์ acpi อื่น ๆ เพื่อให้มันสง่างาม นอกจากนี้คุณสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับการปิดเครื่องในขณะนี้ได้อย่างไร

ธรรมดาshutdownจะไม่รอให้งานที่ยังไม่เสร็จล่าช้าอาจล่าช้าเกินไป

ผมถือว่าคุณไม่ได้ใช้จัดการหน้าต่างจึงพยายามนี้เครื่องมือ

เพิ่งเห็นภูตนี้ คุณอาจพบว่ามันมีประโยชน์.


ขอบคุณสำหรับการตอบกลับของคุณและยินดีต้อนรับสู่ unix.stackexchange.com! อย่างไรก็ตามฉันเกรงว่าคำตอบของคุณจะไม่สามารถแก้ไขปัญหาของฉันได้: acpipowerbutton จำลองการกดปุ่มเปิดปิดบนเครื่องจริง แต่หลังจากออกคำสั่งนี้บนโฮสต์แล้ว VM ก็จะต้องปิดตัวลงอีกครั้ง
jstarek

4
แน่ใจ ดังนั้นคุณต้องเขียนลูปที่ตรวจสอบว่า VM ยังทำงานอยู่หรือไม่ ACPI เป็นวิธีเดียวกับที่ฉันใช้ในสคริปต์สำหรับสิ่งนี้ vboxmanage list runningvmsจนกว่า VM ของคุณจะหายไป
นิลส์

ตกลงในขณะที่ฉันคิดว่าฉันจะจัดการเสื้อคลุมการจัดการในทางปฏิบัติ +50 ให้คุณชี้ไปที่ initscript!
jstarek

16

แทนที่จะเขียนโค้ดเองลองใช้Vagrantซึ่งสร้างขึ้นเพื่ออินสแตนซ์และควบคุมอินสแตนซ์กล่องเสมือน เอกสารเป็นเลิศและฉันขอแนะนำให้คุณตรวจสอบมากกว่าพยายามม้วนของคุณเอง

ความยาวและสั้นของไฟล์คือคุณสร้างไฟล์ควบคุมอย่างง่ายจากนั้นเรียกใช้vagrant upเพื่อเริ่มต้นอินสแตนซ์ VirtualBox มากเท่าที่คุณต้องการ คุณสามารถใช้vagrant sshเพื่อเข้าสู่โฮสต์และvagrant haltปิดโฮสต์ (โดยไม่ต้องยกเลิก) vagrant destroyจะกำจัดอินสแตนซ์

สนับสนุนการจัดสรรด้วยหุ่นกระบอก, Ansible หรือ Chef และช่วยให้คุณควบคุมการตั้งค่า VBox ที่เปิดเผยได้


2
ฉันเป็นแฟนคลับคนจรจัด แต่ในกรณีนี้คุณต้องการอะไรในโลกนี้ OP กำลังเรียกใช้อุปกรณ์ไม่ใช่สร้างระบบของตัวเองดังนั้นการจัดเตรียมจึงพลาดจุดทั้งหมด และทำไมต้องทำ 'box' ที่กำหนดเองออกจากเครื่องเพื่อใช้คนจรจัดเมื่อคุณต้องผ่านกระบวนการสร้างระบบด้วย virtualbox เพื่อทำเช่นนั้น?
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 อย่างสง่างามคุณมีสองตัวเลือกขึ้นอยู่กับแอปพลิเคชันของคุณ:

  • เลียนแบบปุ่ม "ปิดเครื่อง"หรือ "ปุ่มพักเครื่อง" และเตรียม 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- เมื่อคุณต้องการ GUI (แม้จากระยะไกล ) เมื่อคุณทำงานในโหมดหัวขาด:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - เริ่มต้นด้วย GUI สำหรับการดีบักในเครื่อง

บทที่คู่มือ VirtualBox ที่เกี่ยวข้อง: บทที่ 7 เครื่องเสมือนระยะไกล - ทีละขั้นตอน: การสร้างเครื่องเสมือนบนเซิร์ฟเวอร์หัวขาด

ป.ล. หากคุณสนใจโซลูชันที่มีการนำมาใช้อย่างเต็มรูปแบบดูเหมือนว่าOpenStackจะเป็นตัวเลือกที่น่าสนใจ


10

ดูเอกสารการจัดการ VM ของ VirtualBox ที่http://www.virtualbox.org/manual/ch08.html

สำหรับการแสดงรายการ VM ให้ใช้คำสั่ง VBoxManage list vms

สำหรับการเริ่มต้น VM ให้ใช้คำสั่ง VBoxManage startvm

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

สำหรับการควบคุม VM ให้ใช้ VBoxManage controlvm

คำcontrolvmสั่งย่อยอนุญาตให้คุณเปลี่ยนสถานะของเครื่องเสมือนที่รันอยู่ในปัจจุบัน สามารถระบุต่อไปนี้:

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(ตัวพิมพ์เล็กทั้งหมด)
Arcege

2
ขอบคุณสำหรับการตอบของคุณ แต่น่าเสียดายที่นี้ไม่ได้แก้ไขปัญหาของฉัน: ฉันต้องได้อย่างสง่างามปิดตัวลงของผู้เข้าพักคือออก "ปิด -h ตอนนี้" ภายในของผู้เข้าพักและมีเจ้าภาพรอจนกว่าผู้เข้าพักได้ปิดตัวลงอย่างสมบูรณ์ ไม่มีคำVBoxManage controlvmสั่งย่อยทำ
jstarek

คุณสามารถตรวจสอบให้แน่ใจว่าโดยการตรวจสอบ vms ทั้งหมดที่อยู่ในโฮสต์ก่อนที่โฮสต์จะลง หากคุณต้องการควบคุมโฮสต์จากภายในแขกดังนั้นvirtualbox.org/manual/ch08.html#vboxmanage-guestcontrolแต่สิ่งนี้อาจไม่ให้สิ่งที่คุณต้องการ คุณควรเขียนสคริปต์เริ่มต้นเช่น/etc/init.d/vboxvms-serviceสคริปต์บนระบบโฮสต์ซึ่งเมื่อเริ่มต้นจะทำให้ vms ทั้งหมดบนและหยุดเมื่อจะทำให้ vms ทั้งหมดลงไป
Nikhil Mulley

VBoxManage controlvm savestateเป็นไปได้อีกอย่างหนึ่ง (อย่างน้อย google บอกฉัน) มันบันทึกสถานะของเครื่องและปิดมันลงอย่างหมดจด แต่ก็ยังไม่มีวิธีที่จะบังคับให้โฮสต์รอ
Baarn

5

สำหรับระบบที่ใช้ systemd คุณสามารถลองสิ่งนี้ได้

ขั้นตอนที่ # 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
เป็นที่ต้องการที่จะรวมคำตอบที่นี่และเลือกที่จะเชื่อมโยงไปยังข้อมูลรายละเอียดเพิ่มเติม ลิงก์เป้าหมายหายไปโดยไม่แจ้งล่วงหน้าทำให้คำตอบของคุณไร้ค่า
Anthon

ปัญหาคือฉันไม่สามารถคัดลอกไฟล์ systemd ทั้งหมดในลิงค์ 1 ที่นี่หรือฉันควรทำเช่นนี้?
ม.ค. Rüegg

โชคไม่ดีที่ "link rot" เป็นปัญหาใหญ่ในกรณีเหล่านั้น ... ฉันคิดว่าสำหรับลูกหลานสองบรรทัดต่อไปนี้จะจับความคิดพื้นฐานที่อยู่เบื้องหลังลิงก์ของคุณ: มันกำลังสร้างบริการที่ใช้VBoxHeadless -s %iในการเริ่มและVBoxManage controlvm %i savestateหยุด VM
jstarek

พยายามทำสิ่งนี้ใน Debian Jessie แต่มันไม่ได้ผล สร้างผู้ใช้และกลุ่มตั้งค่าความเป็นเจ้าของไฟล์ทั้งหมด (รวมถึง / dev / vbox *) แต่เมื่อบริการเริ่มต้นจะไม่สามารถค้นหา VM ได้แม้ว่าชื่อนั้นจะถูกต้องก็ตาม จะใช้สคริปต์เริ่มต้นปกติหลังจากทั้งหมด
mivk

3

จะส่งคำสั่งผ่าน ssh จากโฮสต์ไปยังแขกได้อย่างไร

ฉันไม่แน่ใจว่ามันใช้งานได้หรือไม่และคุณสามารถตรวจสอบสถานะของเครื่องได้ในภายหลังหรือรับบางสิ่งบางอย่างเช่นสถานะทางออก แต่ควรทำความสะอาดอย่างน้อย


เป็นความคิดที่ดี แต่สิ่งนี้จะรับประกันได้ว่าแขก VM สามารถเข้าถึงได้ผ่านเครือข่ายจากโฮสต์อย่างน้อยพอร์ต ssh (22)
Nikhil Mulley

โดยพื้นฐานแล้วจะสามารถใช้งานได้เครื่องสามารถเข้าถึงได้ใน LAN ทั้งหมดผ่านรายการ DNS อย่างไรก็ตามสมมติว่าฉันเขียนสคริปต์ที่ ssh'd ลงในอุปกรณ์เมื่อใดก็ตามที่โฮสต์ล้มเหลว - มันจะยังคงต้องบล็อก (หยุดชั่วคราว) จนกว่าแขกจะปิดตัวลงอย่างสมบูรณ์ นี่คือประเด็นคำถามของฉันอย่างแม่นยำ: สคริปต์จะทราบได้อย่างไรว่าแขกไม่ทำงานเพื่อให้สามารถควบคุมการไหลกลับไปที่ SysV-Init และโฮสต์สามารถปิดการทำงานต่อไปได้
jstarek

1
ความคิดเห็นของคุณถือว่าทุกอย่างจะทำงานได้อย่างราบรื่นบนระบบโฮสต์และไม่ใช่ในระบบของแขก จะเป็นอย่างไรถ้าต่อสายไฟเข้ากับระบบโฮสต์ มันเป็นการสนทนาที่แตกต่าง SysV-init ของคุณบนระบบโฮสต์จะรอสคริปต์บริการเพื่อหยุด VMs ตราบใดที่สคริปต์บริการเข้าใจตรรกะเพื่อปิด VM ของแขกอย่างถูกวิธี จากนั้นให้ผลตอบแทนสถานะความสำเร็จหรือความล้มเหลวกลับไปที่คอนโซลหรือ init
Nikhil Mulley

1
เกี่ยวกับ: สคริปต์รู้ได้อย่างไรเมื่อแขกหยุดทำงานลองตรวจสอบง่ายๆว่า vm เปิดหรือปิดจากอินเทอร์เฟซ VboxManager และหากแขกเป็น ssh'able นอกจากนี้ให้ทำการตรวจสอบบางอย่างบนระบบโฮสต์ซึ่งจะดำเนินการว่า VM พร้อมใช้งานจาก Vboxmanager และ ssh'able ทันเวลาหรือไม่
Nikhil Mulley

1

วิธีการแก้ปัญหาของฉัน: ใน shellscript นี้ 'root' เป็นผู้เรียกใช้และ 'theuser' เป็นเจ้าของ 'thevm'

ฉันรู้ว่า 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
}
...


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 ที่เรียกอีกอันหนึ่งจากโฮสต์การโทรจะบล็อกจนกว่าจะพร้อม กระบวนการนี้ (ตามที่อธิบาย) เพิ่มการพึ่งพา linux ที่แขก แต่ลบการพึ่งพา VBox ที่โฮสต์

การตัดการไล่ล่า: คุณไม่จำเป็นต้องเข้าถึง VBox เพื่อปิดเครื่องหากคุณมีวิธีการเข้าถึง (เช่น ssh) ระบบปฏิบัติการจะมีวิธีการบางอย่างอยู่เสมอ (การเปิดเครื่องนั้นแตกต่างกันแน่นอน)


สองเหตุผล: ประการแรกตามที่ระบุไว้ในคำถามเดิมฉันไม่ต้องการเปลี่ยนแปลงระบบปฏิบัติการของผู้เยี่ยมชมหากมีความจำเป็นจริงๆ ประการที่สองและที่สำคัญกว่านี้คือมีจุดประสงค์เพื่อมอบวิธีที่สะอาดในการปิด VM ที่ทำงานอยู่ทั้งหมดโดยอัตโนมัติหากโฮสต์ถูกปิด
jstarek

@jstarek แต่คุณไม่จำเป็นต้องปรับเปลี่ยนระบบปฏิบัติการเกสต์หากคุณไม่ต้องการ (99.99% ของเวลาที่คุณมีวิธีการเข้าสู่ระบบหรือข้อยกเว้นนี้) และนั่นคือความคิดถ้าโฮสต์ล่มสคริปต์ที่ถูกต้องจะถูกเรียกเมื่อเปลี่ยนรันไทม์และนี่เป็นเพียงการบันทึกไปยังแขกและปิดมันจาก "ข้างใน" ซึ่งเป็นสิ่งที่คนจรจัดทำต่อไป ... ก่อนที่จะไปเดรัจฉาน บังคับ "นั่นคือ ...
estani
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.