[Virtualbox 4.0] Comment démarrer des VM au boot ?

Bonjour à tous,

Je suis passé à Virtualbox pour gérer mes deux serveurs de développement.
Je suis maintenant en train d’installer une debian squeeze sur une machine virtuelle pour en faire le serveur d’intégration principal, que je vais cloner pour en faire le serveur de test.

J’aimerais que les deux machines virtuelles démarrent au boot de la machine. Est-ce possible ?
Je n’ai pas vu cela dans les docs…

Merci d’avance.

Salut,
Je fais ça avec ce script:

[code]$ cat /etc/init.d/hotspot
#! /bin/sh

BEGIN INIT INFO

Provides: MyVM

Required-Start: $local_fs $remote_fs

Required-Stop: $local_fs $remote_fs

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: virtual machine

Description: virtual machine hosted by VirtualBox

END INIT INFO

Based on /etc/init.d/skeleton from Ubuntu 8.04. Updated for Ubuntu 9.10.

If you are using Ubuntu <9.10, you might need to change “Default-Stop”

above to “S 0 1 6”.

Do NOT “set -e”

PATH should only include /usr/* if it runs after the mountnfs.sh script

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="VM Hotspot virtual machine"
NAME=hotspot
SCRIPTNAME=/etc/init.d/$NAME

#MANAGE_CMD=VBoxManage
MANAGE_CMD=VBoxManage
VM_OWNER=laurent
VM_NAME=“hotspot” #This has to be the name exactly as it appears in your VirtualBox GUI control panel.

Read configuration variable file if it is present

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Load the VERBOSE setting and other rcS variables

[ -f /etc/default/rcS ] && . /etc/default/rcS

Define LSB log_* functions.

Depend on lsb-base (>= 3.0-6) to ensure that this file is present.

. /lib/lsb/init-functions

Function that starts the daemon/service

do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started

    sudo -H -u $VM_OWNER VBoxManage showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null && {
        echo "$VM_NAME" is already running.
        return 1
    }

sudo -H -u $VM_OWNER $MANAGE_CMD startvm “$VM_NAME” -type vrdp >/dev/null || {

sudo -H -u $VM_OWNER $MANAGE_CMD startvm “$VM_NAME” >/dev/null || {

    sudo -H -u $VM_OWNER $MANAGE_CMD startvm "$VM_NAME" --type headless >/dev/null || {
        echo Failed to start "$VM_NAME".
        return 2
    }

    echo "$VM_NAME" started or resumed.
    return 0

}

Function that stops the daemon/service

do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred

    sudo -H -u $VM_OWNER VBoxManage showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null || {
        echo "$VM_NAME" is already stopped.
        return 1
    }

    sudo -H -u $VM_OWNER VBoxManage controlvm "$VM_NAME" savestate || {
        echo Failed to stop "$VM_NAME".
        return 2
    }

    echo "$VM_NAME" suspended.
    return 0

}

Display “State” field from showinfo action

do_status()
{
sudo -H -u $VM_OWNER VBoxManage showvminfo “$VM_NAME”|grep “^State:\s*.*$”
}

case “$1” in
start)
[ “$VERBOSE” != no ] && log_daemon_msg “Starting $DESC” "$NAME"
do_start
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ “$VERBOSE” != no ] && log_daemon_msg “Stopping $DESC” "$NAME"
do_stop
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the “reload” option is implemented then remove the
# ‘force-reload’ alias
#
log_daemon_msg “Restarting $DESC” "$NAME"
do_stop
case “$?” in
0|1)
do_start
case “$?” in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
status)
do_status
;;
*)
#echo “Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}” >&2
echo “Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}” >&2
exit 3
;;
esac[/code]

[code]root@passerelle:~# service hotspot start
hotspot started or resumed.

root@passerelle:~# service hotspot status
State: running (since 2011-05-20T18:07:57.842000000)

root@passerelle:~# service hotspot stop
0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%
hotspot suspended.[/code]

Excellent, je vais voir pour l’adapter pour mon cas.
Je te tiens au courant.

Merci ! :023

Alors ?

EDIT : OK ; bêtement, je n’avais pas rendu exécutable le fichier…

Alors il me dit : “hotspot: unrecognized service”, quelle que soit l’option de la ligne de commande.

VBoxManage est bien installé et tout…

[code]$ cat /etc/init.d/hotspot
#! /bin/sh

BEGIN INIT INFO

Provides: MyVM

Required-Start: $local_fs $remote_fs

Required-Stop: $local_fs $remote_fs

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: virtual machine

Description: virtual machine hosted by VirtualBox

END INIT INFO

Based on /etc/init.d/skeleton from Ubuntu 8.04. Updated for Ubuntu 9.10.

If you are using Ubuntu <9.10, you might need to change “Default-Stop”

above to “S 0 1 6”.

Do NOT “set -e”

PATH should only include /usr/* if it runs after the mountnfs.sh script

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="VM Hotspot virtual machine"
NAME=hotspot
SCRIPTNAME=/etc/init.d/$NAME

#MANAGE_CMD=VBoxManage
MANAGE_CMD=VBoxManage
VM_OWNER=adrien
VM_NAME=“dev.creasixtine.com#This has to be the name exactly as it appears in your VirtualBox GUI control panel.

Read configuration variable file if it is present

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Load the VERBOSE setting and other rcS variables

[ -f /etc/default/rcS ] && . /etc/default/rcS

Define LSB log_* functions.

Depend on lsb-base (>= 3.0-6) to ensure that this file is present.

. /lib/lsb/init-functions

Function that starts the daemon/service

do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started

    sudo -H -u $VM_OWNER VBoxManage showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null && {
        echo "$VM_NAME" is already running.
        return 1
    }

sudo -H -u $VM_OWNER $MANAGE_CMD startvm “$VM_NAME” -type vrdp >/dev/null || {

sudo -H -u $VM_OWNER $MANAGE_CMD startvm “$VM_NAME” >/dev/null || {

    sudo -H -u $VM_OWNER $MANAGE_CMD startvm "$VM_NAME" --type headless >/dev/null || {
        echo Failed to start "$VM_NAME".
        return 2
    }

    echo "$VM_NAME" started or resumed.
    return 0

}

Function that stops the daemon/service

do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred

    sudo -H -u $VM_OWNER VBoxManage showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null || {
        echo "$VM_NAME" is already stopped.
        return 1
    }

    sudo -H -u $VM_OWNER VBoxManage controlvm "$VM_NAME" savestate || {
        echo Failed to stop "$VM_NAME".
        return 2
    }

    echo "$VM_NAME" suspended.
    return 0

}

Display “State” field from showinfo action

do_status()
{
sudo -H -u $VM_OWNER VBoxManage showvminfo “$VM_NAME”|grep “^State:\s*.*$”
}

case “$1” in
start)
[ “$VERBOSE” != no ] && log_daemon_msg “Starting $DESC” "$NAME"
do_start
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ “$VERBOSE” != no ] && log_daemon_msg “Stopping $DESC” "$NAME"
do_stop
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the “reload” option is implemented then remove the
# ‘force-reload’ alias
#
log_daemon_msg “Restarting $DESC” "$NAME"
do_stop
case “$?” in
0|1)
do_start
case “$?” in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
status)
do_status
;;
*)
#echo “Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}” >&2
echo “Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}” >&2
exit 3
;;
esac

[/code]

Salut,

As-tu pensé à faire un chmod +x sur le script pour le rendre exécutable ?
Tu n’as pas mis ça ($ cat /etc/init.d/hotspot) dans le script j’espère ?
Tu l’as bien créé dans /etc/init.d ?

Oui c’est bien ça, j’avais vu la chose après avoir posté.

Ça marche !

En plus, c’est vraiment bien parce que ça suspend les machines virtuelles au lieu de leur envoyer un HALT acpi, du coup c’est bien plus rapide… Bravo :wink:

Juste une chose, penses-tu qu’on peut facilement tuner le script pour démarrer à la volée une liste de machines virtuelles ? (données en argument, ou bien listées dans le fichier)

C’est super :wink:

Oui c’est pratique ce script.
Je n’ai pas essayé d’aller plus loin car je n’en avais pas besoin.

Pourquoi pas un script qui lance lui même plusieurs script avec une VM pas script ?
Ou bien à la fin de chaque script un lien qui lance un autre script.
Ou encore un script avec plusieurs VM, tout est faisable, il faut juste l’écrire.
Ou un script qui lance des VM listées dans un fichier…

Pense à nous donner un retour ça peut servir à quelqu’un!

Oui, si je prends une solution automatisée (plutôt que de dupliquer le script initial /etc/init.d/hotspot), je montrerai ça.

Mais bon, pour l’instant je ne suis pas un hardcore de la virtualisation, et de toute façon, avec 3 Go de ram sur cette machine, on n’ira pas bien loin !