Ho molte macchine box virtuali nel mio Ubuntu12.04, ogni volta che spengo o riavvio devo avviarle una per una.
Voglio un aiuto nella scrittura di script per l'avvio automatico delle macchine VBox all'avvio.
Ho molte macchine box virtuali nel mio Ubuntu12.04, ogni volta che spengo o riavvio devo avviarle una per una.
Voglio un aiuto nella scrittura di script per l'avvio automatico delle macchine VBox all'avvio.
Risposte:
È possibile utilizzare il servizio di avvio automatico di VirtualBox. Un buon tutorial che descrive come farlo è pubblicato sul blog "Life of a Geek Admin" .
I seguenti passaggi sono adattati dal post sul blog collegato:
Per prima cosa devi creare il file /etc/default/virtualbox
e aggiungere alcune variabili.
VBOXAUTOSTART_DB che contiene un percorso assoluto per la directory del database di
avvio automatico e VBOXAUTOSTART_CONFIG che contiene il percorso delle impostazioni di configurazione dell'avvio automatico. Il file dovrebbe essere simile al seguente:
# virtualbox defaults file
VBOXAUTOSTART_DB=/etc/vbox
VBOXAUTOSTART_CONFIG=/etc/vbox/vbox.cfg
Ora dobbiamo creare il /etc/vbox/vbox.cfg
file e aggiungere
# Default policy is to deny starting a VM, the other option is "allow".
default_policy = deny
# Create an entry for each user allowed to run autostart
myuserid = {
allow = true
}
Nota: se il nome file vbox.cfg
non funziona sopra, prova a nominarlo autostart.cfg
.
Se sei l'unico utente, puoi semplicemente aggiungere la linea default_policy = allow
al vbox.cfg
file.
Impostare le autorizzazioni sulla directory per il gruppo vboxuser e assicurarsi che gli utenti possano scrivere nella directory e anche nel bit appiccicoso.
sudo chgrp vboxusers /etc/vbox
sudo chmod 1775 /etc/vbox
Aggiungi ciascuno degli utenti al vboxusers
gruppo.
sudo usermod -a -G vboxusers USERNAME
(sostituisci USERNAME
con il nome utente)
NOTA : se sono state modificate le autorizzazioni di gruppo per l'utente corrente, disconnettersi e riconnettersi per aggiornare le autorizzazioni. (credito @ kR105)
Ogni utente che desidera abilitare l'avvio automatico per i singoli computer deve impostare il percorso della directory del database di avvio automatico con
VBoxManage setproperty autostartdbpath /etc/vbox
e abilitare l'avvio automatico per una singola macchina virtuale con
VBoxManage modifyvm <uuid|vmname> --autostart-enabled on
Questo creerà un myuserid.start
file nella /etc/vbox
directory
Ora riavvia il servizio vboxautostart per leggere le modifiche.
sudo service vboxautostart-service restart
Riavvia il sistema e la VM dovrebbe avviarsi
Ho avuto incidenti infelici simili provando questa operazione sull'LTS vaniglia.
~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
In questa versione, il file chiave /etc/init.d/vboxautostart-service non è stato installato.
Per quanto ne so tutti i requisiti e i requisiti di VitualBox sono stati inseriti da apt-get, quindi non posso dire perché il file 'vboxautostart-service' non sia stato fornito. Ma per superare questo, ecco il mio aggiornamento al post di kdmurray.
1) Il file / etc / default / virtualbox esisteva per me. Quindi deve aggiungere var:
VBOXAUTOSTART_DB=/etc/vbox
VBOXAUTOSTART_CONFIG=/etc/vbox/autostart.cfg
2) È necessario creare /etc/vbox/autostart.cfg come indicato da OP.
6b) È necessario ottenere uno script vboxautostart-service e renderlo eseguibile.
cd /etc/init.d/
sudo wget http://www.virtualbox.org/browser/vbox/trunk/src/VBox/Installer/linux/vboxautostart-service.sh?format=raw -O vboxautostart-service
sudo chmod +x vboxautostart-service
6c) Avvisa il controller rc.d, ma ho usato 24 come ora di inizio. Mettendo solo 20 e non si è avviato. Forse ha funzionato anche prima che virtualbox funzionasse.
sudo update-rc.d vboxautostart-service defaults 24 24
Quindi il riavvio ha avviato correttamente la VM.
vboxdrv
in # Required Start
/ # Required Stop
lines con virtualbox
. Sembra che abbiano rinominato il servizio, quindi il sistema operativo non è in grado di rilevare correttamente le priorità di avvio / arresto. Penso che non sia necessario il passaggio 6c se hai sostituito quelle righe.
Puoi usare vboxmanage startvm "my virtual machine" --type=headless|gui|sdl
(uno di quelli). Usa "senza testa" se si tratta di server a cui ti connetti con altri mezzi oltre all'utilizzo della GUI.
Per eseguire effettivamente questi comandi al momento giusto durante l'avvio, ti consigliamo di leggere su Upstart.
Dopo molte ore infelici nel tentativo di far funzionare le procedure da kdmurray sopra, senza successo alla fine ho trovato un metodo che ha funzionato semplicemente.
Innanzitutto il mio host Linux (Mint 17) è stato impostato all'avvio per accedere automaticamente al mio account principale.
In secondo luogo ho usato le funzionalità della GUI di VirtualBox (v4.3.12) per creare un collegamento per ogni macchina virtuale sul desktop. {fai clic con il pulsante destro del mouse sulla VM nella colonna di sinistra e seleziona "Crea collegamento sul desktop"}
Successivo: Avevo già scoperto che aprendo Menu-> Centro di controllo -> Applicazioni di avvio -> Aggiungi e aggiungendo le scorciatoie del desktop ha dato file che non funzionavano, ho notato da un'altra risposta su questa pagina che la posizione degli startup è / home /USERNAME/.config/autostart quindi ho fatto un clic con il tasto destro su ciascuna delle scorciatoie della VM desktop e poi le ho incollate in quella cartella, sovrascrivendo i precedenti file di schifezze. Ora hanno sviluppato le icone "graziose" di VirtualBox.
E abbastanza sicuro al riavvio del computer host, le 3 macchine virtuali si sono avviate automaticamente.
:-)
Bill Williams
PS: purtroppo mi manca ancora qualcosa, perché spesso le macchine virtuali non si avviano all'avvio, invece generano una finestra di dialogo di errore che dice che sono bloccate, anche se ho detto loro di arrestare prima che l'host fosse riavviato.
Oltre alla buona descrizione del servizio vboxautostart sopra, puoi farlo
VBoxManage modifyvm server --autostop-type savestate
per arrestare automaticamente l'ospite allo spegnimento. Per Ubuntu 14.04 ho dovuto aggiungere un sleep 30 alla sezione di arresto del servizio vboxautostart, in modo che attenda che il guest sia stato salvato completamente.
Ho trovato un modo più semplice in Ubuntu 16.04 con VBox 5.1.34.
Mentre sei in VBox, fai clic con il tasto destro del mouse sulla VM in esecuzione o inattiva nell'elenco, seleziona "Crea collegamento sul desktop". Una volta visualizzata l'icona sul desktop, apri con qualsiasi strumento che ti consenta di vedere il comando sottostante creato da VBox (sul mio sistema, faccio clic con il pulsante destro del mouse e seleziono 'Proprietà') Copia questo negli Appunti.
Aprire il programma per aggiornare le "applicazioni di avvio" e creare una nuova applicazione che si avvia all'avvio, incollando il comando copiato dal collegamento desktop creato da VirtualBox.
Per avviare una VM all'accesso alla nostra sessione, potremmo voler definire un file .desktop:
Quando questo file è stato copiato o spostato nella nostra directory di avvio automatico, verrà eseguito dopo l'accesso:
L'esecuzione di Virtual Box nello spazio utente può aiutare a evitare effetti collaterali indesiderati dell'avvio durante l'avvio (ad es. La VM funziona come root, il tempo di avvio aumenta incredibilmente, ...).
Questo può essere fatto utilizzando l'interfaccia di gestione della riga di comando di VirtualBox. Basta eseguire il seguente script all'avvio.
#!/bin/bash
VMUSER="vmuser"
VMNAME="RedHatVM" #also you can put UUID in this variable (VMNAME="4ec6acc1-a232-566d-a040-6bc4aadc19a6")
case "$1" in
start)
echo "===Starting VirtualBox VM==="
sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
;;
stop)
echo "===Saving state of Virtualbox VM==="
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
sleep 20
;;
shutdown)
echo "===Shutting down Virtualbox VM==="
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
sleep 20
;;
reset)
echo "===Resetting VirtualBox VM==="
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
;;
status)
echo -n "VMNAME->";sudo -H -u $VMUSER VBoxManage showvminfo "$VMNAME" --machinereadable |grep "VMState="| cut -d "=" -f2
;;
echo "Usage: /etc/init.d/VMscript {start|stop|shutdown|reset|status}"
exit 1
;;
esac
exit 0
C'è un bel tutorial per maggiori informazioni.
Addon alla risposta @kdmurray.
Se viene visualizzato l'errore:
VBoxManage modifyvm <uuid|vmname> --autostart-enabled on
Per risolvere questo, ho dovuto creare manualmente i file "username" .start e "username" .stop con:
sudo touch "username".start
sudo touch "username".stop
E cambia proprietario con:
sudo chown "username" "username".start
sudo chown "username" "username".stop
rieseguire:
VBoxManage modifyvm <uuid|vmname> --autostart-enabled on
quindi riavviare il servizio:
sudo service vboxautostart-service stop
sudo service vboxautostart-service start
il controllo è tutto ok con:
top
e dovresti vedere il processo "VBox ..." in un elenco, se la macchina virtuale è in esecuzione
Puoi anche far descrivere il gestore della sessione di gnome qui. Gnome Session Manager
Si trova nel centro software o potresti semplicemente andare a un terminale e digitare
sudo apt-get install gnome-session-common
Successivamente è possibile creare un piccolo script da eseguire e utilizzare il gestore sessioni gnome per avviarlo. Ecco un piccolo script di esempio per iniziare ...
#!/bin/sh
#vboxmanage startvm "my virtual machine" --type=headless|gui|sdl (one of those)
# So if your username is user, and virtualbox put your VMs in the default location, and you want headless...
vboxmanage startvm '/home/user/VirtualBox VMs/myvmname' --type=gui
Questo è il modo in cui avvio Centos (nome della mia macchina virtuale) al riavvio della macchina host. Uso crontab per quel lavoro. Ecco la mia voce crontab:
@reboot VBoxHeadless --startvm "Centos" &
Per il server Ubuntu 16.04.1 LTS ho risolto questo facendo:
sudo systemctl enable rc-local.service
/etc/rc.local
su virtual_box_user -c "VBoxHeadless -startvm 'virtual_machine_name' &"
Si noti che virtual_box_user è quello che può vedere la macchina virtuale (che si è disposti ad avviare) eseguendo il comando:
VBoxManage list vms
Esempio:
$ VBoxManage list vms
"virtualbox1" {2eb3ba3b-bcb3-4515-95d9-d33bce214c28}
"virtualbox2" {62365634-f2q4-40c0-b4ed-22f4ab84441a}
Il modificato /etc/rc.local
dovrebbe apparire così
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
su bob -c "VBoxManage startvm 'virtualbox1' --type headless &"
su bob -c "VBoxManage startvm 'virtualbox2' --type headless &"
exit 0
Se non scegli il proprietario corretto di virtualbox, dovresti vedere l'errore digitando il comando:
sudo systemctl status rc-local.service
Spero che questo possa aiutare
1 - Crea un file:
nano /etc/init.d/vm-start
Incolla questo:
#!/bin/bash
/bin/echo "* Starting VMS..."
/bin/sleep 1
/bin/su validuser -c "/usr/bin/vboxmanage startvm MACHINENAME--type headless"
/bin/sleep 1
/bin/su validuser -c "/usr/bin/vboxmanage startvm MACHINENAME2--type headless"
/bin/sleep 1
2 - Rendi eseguibile il file vm-start:
chmod +x /etc/init.d/vm-start
3 - Modifica rc.local
nano /etc/rc.local
Aggiungi questo:
#!/bin/bash
/etc/init.d/vm-start
exit 0
4 - Riavvia.