Como adoptar un pingüino

BLOG de AZULcasiNEGRO, donde se cuentan básicamente las peripecias durante la migración a Kubuntu/Linux

Aviso Cookies

Categories

Contador

Eres el visitante

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

5 comentarios

  1. Ariel Tanner  

    Lo que planteas en este post es un caso muy particular de implementación pero es justo lo que estoy buscando.

    Aun no lo pruebo, pero supongo que funcionará, si funciona lo implementaré en uno de los laboratorios de computo de mi facultad.

    Desde ya estoy muy agradecido de esta publicación.

    Apenas pruebe te cuento como me fue

  2. AZULcasiNEGRO  

    Ariel, comenta que tal te va esta porque si tienes problemas la mejoraremos o la haremos de otra manera.

  3. Marlon  

    Hola a todos...
    Yo tengo un servidor Ubuntu server 10.04
    con la idea de virtualizar varias maquinas virtuales a medida que sea decesario. Utilizo VirtualBox porque el cpu no tiene modulo de virtualizacion y no me funciona bien el kvm a demas de que me gusta mucho lo confieso.
    El problema esta en que las maquinas vistuales se deben de levantar junto con el sistema pero este escript no me funciono.
    Buscando en internet me encontre con esta solucion y me soluciono el problema, a lo mejor a ustede tambien les sirve y aqui se los dejo.

    Crea un script bash donde decees:
    # sudo nano /etc/init.d/script.sh

    En el pones el comando de virtualbox que ejecutas normalmente en el cmd para levantar la maquina virtual que quiere.
    #!/bin/bash
    vboxmanage startvm --type headless VMRedhat

    Y lo guardas.

    Ahora editas el archivo /etc/rc.local
    # sudo nano /etc/rc.local

    Y le agregas esta linea:
    sh /etc/init.d/script.sh

    Y ya esta al lebantar el sistema te debe de ejecutar la maquina virtual tambien.

  4. triviman  

    ahora mismo te pongo en un pedestal,es justo lo que buscaba y va genial en ubuntu server 10.04.1 con otro ubuntu server 10.04.1 dentro de la maquina virtual justo lo que necesitaba para un proyecto que estoy realizando!!

  5. luis puentes (arg)  

    Se agradece el trabajo. Funciona a la perfeccion y es util tanto para su objetivo de maquinas virtuales, como para otros. Me fue muy pero muy util.

Publicar un comentario

Cuenta atrás

Nuestros derechos

Recent Posts

Recent Comments