Primero vamos a ver para que nos puede servir.
Supongamos que tenemos una maquina virtual que contiene un determinado servicio o programa que queremos que se arranque y pare cuando se arraque y pare nuestro ubuntu/kubuntu. También sería interesante para una mv que tubiera algún programa que accedemos remotamente.
Un caso típico sería un Windows con alguna vieja y/o pegajosa aplicación de gestión, la cual es necesaria pero no se quiere o puede migrar a linux.
Pues para eso os propongo el siquiente script:
#!/bin/sh
### BEGIN INIT INFO
# Provides: VB - ServidorXP
# Required-Start: $local_fs $remote_fs vboxdrv vboxnet
# Required-Stop: $local_fs $remote_fs vboxdrv vboxnet
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Handles the ServidorXP virtual machine
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
# AZULcasiNEGRO - x22bcn@gmail.com
#
# CHANGE THESE AS NEEDED
#
# Name given to the virtual machine
VM_NAME="ServidorXP"
# Name of this file, excluding /etc/init.d/
THIS_FILE=vb-servidorxp
# Username to run as
RUNAS_USERNAME=usuario
#
# END CHANGE THESE AS NEEDED
#
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="VirtualBox - ${VM_NAME}"
#DAEMON=/usr/bin/VBoxHeadless
DAEMON=/usr/bin/VBoxManage
DAEMON_ARGS="-startvm \"${VM_NAME}\""
PIDFILE=/var/run/$THIS_FILE.pid
SCRIPTNAME=/etc/init.d/$THIS_FILE
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
is_running()
{
ISRUNNING=`su $RUNAS_USERNAME -c "$DAEMON showvminfo $VM_NAME | grep running"`
# echo ">"$ISRUNNING"<"
if [ -n "$ISRUNNING" ]; then
return 1
else
return 0
fi
}
#
# 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
is_running
if [ $? -eq 1 ]; then return 1; fi
su $RUNAS_USERNAME -c "$DAEMON startvm ${VM_NAME} -type vrdp " &
sleep 5
is_running
if [ $? -eq 0 ]; then return 2; fi
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
is_running
if [ $? -eq 0 ]; then return 1; fi
su $RUNAS_USERNAME -c "$DAEMON controlvm ${VM_NAME} savestate "
is_running
if [ $? -eq 1 ]; then return 2; fi
return 0
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$THIS_FILE"
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1; log_failure_msg "$DESC in running." ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$THIS_FILE"
do_stop
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1; log_failure_msg "$DESC in stoped." ;;
2) log_end_msg 1 ;;
esac
;;
status)
is_running
case "$?" in
0) log_success_msg "$DESC is stoped." ;;
1) log_success_msg "$DESC is running." ;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status}" >&2
exit 3
;;
esac
:
¿ Como lo usamos ?
Creamos un archivo con el contenido de este script en /etc/init.d
Le ponemos un nombre archivo, en este caso vb-servidorxp. Nos acordamos de él ;)
Configuramos esta parte del script
#
# CHANGE THESE AS NEEDED
#
# Name given to the virtual machine
VM_NAME="ServidorXP"
# Name of this file, excluding /etc/init.d/
THIS_FILE=vb-servidorxp
# Username to run as
RUNAS_USERNAME=usuario
#
# END CHANGE THESE AS NEEDED
#
Donde VM_NAME es el nombre de la máquina virtual. THIS_FILE el nombre del script, y RUNAS_USERNAME el usuario con el que se debe ejecutar la máquina virtual.
Le cambiamos el usuario y grupo
# chown root:root /etc/init.d/vb-serverxp
Ahora le damos permisos de ejecución al script
# chmod ug+x /etc/init.d/vb-serverxp
Sólo nos queda que se inicie y cierre con el ordenador. Aquí debemos tener una cosa en cuenta. Como dependemos de los servicios de VirtualBox (vboxdrv y vboxnet) para que funcione, debemos configurarlo para que se encienda despues y se apague antes. Si no lo hacemos, o no arrancará o puede dejar colgado el sistema al cerrar. En principio, esto ya lo conseguimos con los parámetros Required-Start y Required-Stop. El sistema ya se encargará de vigilar que se encienda despues y se apague antes que estos servicios. Entonces asignaremos a nuestro script para que se ejecute automáticamente de la siguiente manera:
# update-rc.d vb-serverxp defaults
Pues ya tenemos nuestro pc complementario dentro de nuestro pc con linux, que arranca y apaga automáticamente.
Actualización: He añadido la restricción de servicios en Required-Start y Required-Stop porque es mucho más efectivo que la numeración de arranque.
Para eliminar el arranque automático actual haremos:
# update-rc.d -f vb-serverxp remove
Y luego volveremos a asignarlo con defaults.
Actualización (II): Este primer apaño no acaba de funcionar del todo. Al apagar si que funciona, pero al arrancar la vm no se inicia porque aún no están cargados los modulos de VirtualBox en el kernel. Creo que el error es debido a lo hace de forma asíncrona. Total, como lo queremos es que funcione, le cambiamos la configuración al script y listo.
Para eliminar el arranque automático actual haremos:
# update-rc.d -f vb-serverxp remove
Y luego volveremos a asignarlo con defaults, y 99 al arrancar (al final de todo) y 20 al apagar (tal y como estaba).
# update-rc.d vb-serverxp defaults 99 20