script di controllo init.d per virtualbox VM


2

Ho un server Ubuntu su cui una macchina virtuale Virtualbox deve essere sempre in esecuzione. Le macchine virtuali sono amministrate da un utente specifico VMAdminche non ha privilegi di amministratore. Devo creare uno script init.d per gestire le macchine virtuali Virtualbox.
Dovrebbe:

  • avviare la macchina virtuale all'avvio del sistema host;
  • salva lo stato del sistema guest ogni volta che l'host viene spento;
  • fornire comandi per l'avvio, l'arresto, il ripristino e il backup della VM.

Risposte:


8

Il seguente script si occupa di tutto quanto sopra:

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

#Edit these variables!
VMUSER=VMAdmin
VMNAME="cdb62186-7c30-4c25-a0b0-e4a32cfb0504"
BASEFOLDER=/home/VMAdmin/path/to/backups/

case "$1" in
    start)
        echo "Starting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        ;;
    reset)
        echo "Resetting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
        ;;
    stop)
        echo "Saving state of Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
        ;;
    shutdown)
        echo "Shutting down Virtualbox VM..."
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
        ;;
    status)
        sudo -H -u $VMUSER VBoxManage list vms -l | grep -e ^"$VMNAME": -e ^State | sed s/\ \ //g | cut -d: -f2-
        ;;
    backup)
        echo ""
        sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton

        echo "Waiting for VM "$VMNAME" to poweroff..."
        until $(sudo -H -u $VMUSER VBoxManage showvminfo --machinereadable "$VMNAME" | grep -q ^VMState=.poweroff.)
        do
          sleep 1
        done

        FILENAME=$(date +"%Y_%m_%d-%T")
        echo "Backing up Virtualbox VM to '$BASEFOLDER$FILENAME'..."
        sudo -H -u $VMUSER VBoxManage clonevm "$VMNAME" --options keepallmacs --name $FILENAME --basefolder $BASEFOLDER

        echo "Restarting VirtualBox VM..."
        sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
        echo ""
        ;;
    *)
        echo "Usage: sudo service vbox {start|stop|status|shutdown|reset|backup}"
        exit 1
        ;;
esac

exit 0

Di 'allo script di essere il primo a chiudere e l'ultimo ad avviare:

sudo update-rc.d vbox defaults 99 01

Per aggiungere attività di backup a crontab, eseguire:

sudo crontab -e

E aggiungi una riga come:

* 3 * * 5 service vbox backup

Che eseguirà un backup settimanale il venerdì alle 3 del mattino. Per maggiori informazioni sulla creazione di un'attività crontab, consultare: http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

Domanda correlata: script Bash in attesa dell'arresto di Virtualbox VM?


Lo adoro! Ma non sembra uno script upstart ;-)
Andrew

Grazie per questo script. puoi adattarlo per prendere il nome della virtualbox come parametro?
skonsoft,

1
@skonsoft: probabilmente potresti sostituirlo $VMNAMEcon $2e l'uso avvia il servizio sudo service vbox start VMNAME. Non sono sicuro se questo utilizzo sia consigliato o addirittura consentito.
Emanuel Ey,

Sì, l'ho fatto e funziona. Comando come questo: sudo service vbox VMNAME start. Ti ho chiesto di farlo perché voglio condividere con te un altro script che utilizza il tuo script per avviare tutte le VM configurate (solo chiamando il tuo script) e funziona molto bene
skonsoft,

1
@skonsoft Mi piacerebbe vedere quella sceneggiatura. Aggiungilo come un'altra risposta a questa domanda o pubblicalo come domanda autonoma con risposta e condividi il link. Inoltre, ricordati di votare questa domanda che ti è stata utile;)
Emanuel Ey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.