เริ่ม VBoxHeadless VM เมื่อเริ่มต้น


16

ฉันไม่สามารถทำให้ VM ของฉันทำงานเมื่อเริ่มต้นได้

ฉันลอง "แอปพลิเคชั่นเริ่มต้น" และอัปเดต -rc.d โดยไม่มีโชค

sudo update-rc.d startvms defaults 99 10

สิ่งนี้สร้างลิงก์สัญลักษณ์ที่เหมาะสมทั้งหมดสำหรับระดับการรันที่แตกต่างกัน แต่ VM ยังไม่เริ่มทำงาน

นี่คือสคริปต์ startvms ของฉัน:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          startvms
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start my VMs at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO
case "$1" in
  start)
        echo "Starting"
        nohup VBoxHeadless --startvm "UbuntuServer" &
        ;;
  stop)
        echo "Stopping $DESC"
        VBoxManage controlvm "UbuntuServer" poweroff
        ;;

  restart|force-reload)
        echo "Restarting $DESC"
        VBoxManage controlvm "UbuntuServer" poweroff
        nohup VBoxHeadless --startvm "UbuntuServer" &
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac

ผมทำอะไรผิดหรือเปล่า?


คุณอัพเกรด Virtual Box เป็น PUEL เพื่อรวมการรองรับ VRDP (จำเป็นสำหรับโหมด headless) หรือไม่?
Takkat

@ Takkat: ใช่ฉันควรจะกล่าวถึง: โหมดหัวขาดทำงานได้ดีสำหรับฉัน ... ฉันแค่ไม่สามารถให้มันทำงานเมื่อเริ่มต้น
capdragon

1
ถ้าคุณลองVBoxManage startvm --type headless "UbuntuServer"แทนVBoxHeadlessคำสั่งล่ะ
Takkat

คุณอาจต้องรูทเพื่อให้มันทำงานsu -c 'VBoxHeadless --startvm <MACHINE>'ได้
Takkat

@ Takkat: ไม่มีลูกเต๋า แต่อีกครั้งฉันสามารถทำให้ VBoxHeadless ทำงานได้ดีกับคำสั่งที่ฉันใช้ มันไม่ทำงานเมื่อฉันทำในสคริปต์เริ่มต้นเท่านั้น
Capdragon

คำตอบ:


27

นี่ คือสิ่งที่ใช้งานได้ในที่สุด!

1) สร้างไฟล์สคริปต์เริ่มต้น

ใน /etc/init.d sudo nano /etc/init.d/StartVM-

คัดลอกวางต่อไปนี้ในไฟล์และแทนที่ "My VM Name" สำหรับชื่อ vm ของคุณ:

#! /bin/sh
# /etc/init.d/StartVM
#

#Edit these variables!
VMUSER=spode
VMNAME="My VM Name"

case "$1" in
  start)
    echo "Starting VirtualBox VM..."
    sudo -H -b -u $VMUSER /usr/bin/VBoxVRDP -s "$VMNAME"
    ;;
  stop)
    echo "Saving state of Virtualbox VM..."
    sudo -H -u  $VMUSER /usr/bin/VBoxManage controlvm "$VMNAME" savestate
    ;;
  *)
    echo "Usage: /etc/init.d/StartVM {start|stop}"
    exit 1
    ;;
esac

exit 0

2) ให้สิทธิ์ในการเรียกใช้สคริปต์

sudo chmod +x /etc/init.d/StartVMกับ

3) บอกสคริปต์ให้ทำงานเมื่อเริ่มต้น

บอกสคริปต์เป็นคนแรกที่ปิดและสุดท้ายที่จะเริ่มต้น

sudo update-rc.d StartVM defaults 99 01


2
VRDP ไม่เพิ่มค่าใช้จ่ายเพิ่มเติมVBoxManage startvm --type headlessหรือไม่จะดีกว่าไหม
mojzis

3
ในกรณีเฉพาะของฉันฉันต้องการ VM ปิดอย่างสง่างามมากกว่าการบันทึกสถานะ แทนที่ "savestate" ด้วย "acpipowerbutton" ทำงานได้อย่างสมบูรณ์แบบสำหรับสิ่งนี้
muzzamo

2

FYI ใช้งานได้กับ Opensuse โดยไม่ต้องรอ

VBoxHeadless -s "OpenSuSE 11.4 64bit" &

ดังนั้นฉันใช้สคริปต์เดียวกันฉันมียกเว้นออก nohup หรือไม่
capdragon

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

2

สิ่งนี้ใช้ได้กับเซิร์ฟเวอร์ Ubuntu 12.04 และ VirtualBox 4.2.20

#! /bin/sh
# /etc/init.d/StartVM
#
#Edit these variables!
VMUSER=username
case "$1" in
  start)
    echo "Starting VirtualBox VM SMARTHOST ..."
    sudo -u $VMUSER VBoxManage startvm SMARTHOST --type headless
    echo "Starting VirtualBox VM wxp-acceso ..."
    sudo -u $VMUSER VBoxManage startvm wxp-acceso --type headless
    echo "Starting VirtualBox VM wmmaq_edi ..."
    sudo -u $VMUSER VBoxManage startvm vmmaq_edi --type headless
    ;;
  stop)
    echo "Saving state of Virtualbox VM SMARTHOST ..."
    sudo -u $VMUSER VBoxManage controlvm SMARTHOST savestate
    echo "Saving state of Virtualbox VM wxp-acceso ..."
    sudo -u $VMUSER VBoxManage controlvm wxp-acceso savestate
    echo "Saving state of Virtualbox VM vmmaq_edi ..."
    sudo -u $VMUSER VBoxManage controlvm vmmaq_edi savestate
    ;;
  *)
    echo "Usage: /etc/init.d/StartVM {start|stop}"
    exit 1
    ;;
esac

exit 0

และ

sudo chmod +x /etc/init.d/StartVM

และ

sudo update-rc.d StartVM defaults 99 01

ตามที่ระบุไว้ในคำตอบก่อนหน้า


มันใช้งานได้ดีสำหรับฉัน! ยกเว้นกับ Vbox 5.0 มัน sudo -u $ VMUSER VBoxHeadless - เริ่มต้น vv $ VMNAME & ดังนั้น startvm มี 2 "-" และคุณเพิ่งฟ้อง VBoxHeadless แทนที่จะเป็น - หัวขาดชนิด นอกจากนี้ยังมีข้อสังเกตว่าในขณะที่ฉันแน่ใจว่าเราอยู่บนเซิร์ฟเวอร์โดยไม่มี "&" ที่ท้ายเซิร์ฟเวอร์ไม่บูตเพื่อเข้าสู่ระบบพรอมต์ แต่บริการทั้งหมดทำงานเช่น SSH, RDP ฯลฯ ฯลฯ เพียงสิ่งที่ฉันสังเกตเห็น มันทำให้เซิร์ฟเวอร์ติดอยู่ที่ข้อมูล verbose เข้าสู่ระบบการบูต!
FreeSoftwareServers

1

เนื่องจากคุณพูดถึงว่าVBoxHeadlessทำงานได้ดีถ้าคุณพิมพ์จากบรรทัดคำสั่งของเทอร์มินัล แต่ไม่เริ่ม VM ใด ๆ เมื่อเปิดตัวจากสคริปต์เริ่มต้นฉันเดาว่ามันกำลังมองหาตัวแปรสภาพแวดล้อมบางอย่างที่กำหนดไว้เมื่อคุณใช้เชลล์ ในเทอร์มินัลของคุณ แต่ไม่ได้กำหนดในสภาพแวดล้อมสคริปต์เริ่มต้น (ซึ่งโดยทั่วไปจะว่างเปล่ายกเว้นพารามิเตอร์ที่กำหนดในบรรทัดคำสั่งเคอร์เนล)

คุณสามารถลองแทนที่ VBoxHeadless invocations ในสคริปต์ด้วยสิ่งนี้ได้หรือไม่?

env USER=username HOME=/path/to/user/homedir VBoxHeadless ...same options as before...

ที่นี่ "ชื่อผู้ใช้" และพา ธ โฮมไดเร็กทอรีควรเปลี่ยนให้ตรงกับชื่อผู้ใช้ที่คุณใช้เพื่อเริ่มต้น VM

หากใช้งานได้คุณอาจต้องการใช้su -lเพื่อรัน VBoxHeadless แทนการแฮ็คenvนี้


+1 สำหรับsu -l- นั่นเป็นจุดที่ดี!
Takkat

ไม่ ... ยังไม่ทำงาน ฉันตัดสินใจที่จะใช้งาน cron
capdragon

1

ใน Virtualbox เวอร์ชันล่าสุด (4.2.0 เป็นต้นไป) คุณไม่จำเป็นต้องม้วนสคริปต์ของคุณเองเพื่อเริ่มต้นทำงานกับ VM โดยอัตโนมัติ แต่ใช้การกำหนดค่าบางอย่าง ดูหัวข้อ 9.24 ของคู่มือ Virtualbox "การเริ่มต้นเครื่องเสมือนในระหว่างการบูตระบบ "

น่าเสียดายที่คู่มือให้คำแนะนำการร่างเท่านั้นและยังไม่ได้รับการอัปเดตในยุคสมัย ฉันพบโพสต์นี้ในฟอรัม Virtualboxพร้อมรายละเอียดเพิ่มเติม

คุณสามารถใส่บรรทัดใน rc.local เพื่อเริ่มต้นเซิร์ฟเวอร์ของคุณ แต่ถ้าคุณต้องการที่จะอ่านอย่างเป็นทางการ "อย่างเป็นทางการ"

เพิ่มบรรทัดเหล่านี้ใน / etc / default / virtualbox:

VBOXAUTOSTART_DB=/etc/vbox
VBOXAUTOSTART_CONFIG=/etc/vbox/vboxautostart.cfg

แก้ไข /etc/vbox/vboxautostart.cfg (ตัวอย่างนี้ปฏิเสธการอนุญาตโดยอัตโนมัติสำหรับผู้ใช้ทั้งหมดยกเว้นผู้ใช้ "Bob":

# Default policy is to deny starting a VM, the other option is "allow".
default_policy = deny

# Bob is allowed to start virtual machines but starting them
# will be delayed for 10 seconds
bob = {
    allow = true
    startup_delay = 10
}

# Alice is not allowed to start virtual machines, useful to exclude certain users
# if the default policy is set to allow.
alice = {
    allow = false
}

เพิ่มกลุ่ม vboxusers ไปยัง / etc / vbox และ sticky bit:

# chgrp vboxusers /etc/vbox
# chmod 1775 /etc/vbox

เพิ่มผู้ใช้ทั้งหมดที่จะใช้ virtualbox ไปยังกลุ่ม "vboxusers" เช่น:

# adduser Bob vboxusers

ผู้ใช้ทุกคนที่ต้องการเปิดใช้งาน autostart สำหรับเครื่องแต่ละเครื่องต้องตั้งค่าพา ธ ไปยังไดเรกทอรีฐานข้อมูล autostart ด้วย:

$ VBoxManage setproperty autostartdbpath /etc/vbox

จากนั้นผู้ใช้สามารถตั้งค่า VMs ให้เริ่มทำงานอัตโนมัติและกำหนดค่าวิธีหยุด (เช่น savestate, acpishutdown) ด้วย:

$ VBoxManage modifyvm <vmname> --autostart-enabled on
$ VBoxManage modifyvm <vmname> --autostop-type acpishutdown

ข้างต้นทำงานให้ฉันด้วย Virtualbox 5 ติดตั้งจากพื้นที่เก็บข้อมูล virtualbox.org


ประณามเพิ่งเสร็จสิ้นการบิดนี้เพื่อหาคำตอบที่นี่แล้วตามโพสต์บล็อกนี้
Jules

0

หนึ่งอาจต้องการตั้งค่าพอร์ตโดยตรงเมื่อใช้ vrdp .. ความคิดเห็นที่คำตอบด้านบนซึ่ง compartmentalizes ดีที่จะใช้สคริปต์ที่แตกต่างกันสำหรับ vms ที่แตกต่างกัน

VBoxVRDP -startvm "myVM" -vrdpport 3391 &

0

ว้าว .. ฉันเห็นโซลูชันเหล่านี้ทั้งหมดซึ่งดูเหมือนจะซับซ้อนเล็กน้อย แต่นี่เป็นแล็ปท็อปตัวที่สามที่ฉันเขียนแค่:

VBoxHeadless -s "Ubuntu Server"

ในไฟล์ rc.local ของฉันในไดเรกทอรี / etc / และใช้งานได้ดี รันเครื่องเสมือนโดยอัตโนมัติเมื่อรีบูต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.