Archive for 9 enero 2009

h1

Monitorizar máquinas virtuales VirtualBox con Monit

09/01/2009

Utilizando Monit se puede controlar el estado de procesos de una máquina, y actuar en consecuencia automaticamente en función del estado de los mismos. Es necesario distinguir los dos proyectos del mismo equipo de desarrollo: Monit (opensource) y M/Monit, comercial.

En el caso de que se estén ejecutando máquinas virtuales con VirtualBox, éstas se pueden levantar en caso de caída, cumpliendo siempre los siguientes requisitos:

Instalar VirtualBox como un demonio (servicio), tantas veces como máquinas virtuales se tengan.
– Cada máquina virtual debe tener activado el servicio “RemoteDisplay” (vdrp) con un puerto distinto logicamente.

Configurado esto, sería necesario añadir en /etc/monit/monitrc el siguiente código adaptándolo a la situación particular:

check host VirtualBox-Monowall with address 127.0.0.1
start program = "/etc/init.d/virtualbox-Monowall start"
stop program = "/etc/init.d/virtualbox-Monowall stop"
if failed port 3389 then restart

Donde habría que cambiar el nombre, la ruta del demonio y el puerto.
Hecho esto, reiniciar el servicio y hacer una prueba matando el proceso:

$ sudo /etc/init.d/monit restart
Stopping daemon monitor: monit.
Starting daemon monitor: monit.

$ ps axu | grep VB
carlos 14786 5.9 10.2 191844 91860 ? Sl 22:05 2:12 /usr/lib/virtualbox/VBoxHeadless -comment Monowall -startvm 8ea024df-49f2-4d1f-bd5c-f3ba15aacb37

$ kill -9 14786

Tras esperar el tiempo definido en Monit para chequear el sistema, se puede ver en el log de Monit como arranca la máquina:

$ tail -10f /var/log/monit.log
[CET Jan 8 22:05:33] error : 'VirtualBox-Monowall' failed, cannot open a connection to INET[127.0.0.1:3389] via TCP
[CET Jan 8 22:05:36] info : 'VirtualBox-Monowall' trying to restart
[CET Jan 8 22:05:36] info : 'VirtualBox-Monowall' stop: /etc/init.d/virtualbox-Monowall
[CET Jan 8 22:05:36] info : 'VirtualBox-Monowall' start: /etc/init.d/virtualbox-Monowall

$ ps axu | grep VB
carlos@shirley:~/.VirtualBox/Machines/Monowall$ ps aux | grep VB
carlos 16204 27.6 10.2 191516 91800 ? Sl 22:48 0:27 /usr/lib/virtualbox/VBoxHeadless -comment Monowall -startvm 8ea024df-49f2-4d1f-bd5c-f3ba15aacb
37
carlos 16341 0.0 0.1 7468 896 pts/4 S+ 22:50 0:00 grep VB
carlos 30314 0.0 0.2 24356 2060 ? S 14:29 0:00 /usr/lib/virtualbox/VBoxXPCOMIPCD
carlos 30321 0.0 0.6 43752 5528 ? Sl 14:29 0:05 /usr/lib/virtualbox/VBoxSVC --automate

h1

Crear servicio para VirtualBox

09/01/2009

Para ejecutar máquinas virtuales de VirtualBox, la alternativa libre a Vmware desde el inicio del sistema y como servicios es necesario crear un script para el demonio.

Se puede crear una copia del /etc/init.d/skeleton, pero es más rápido utilizar la siguiente plantilla ya predefinida para VirtualBox. Para ello crearemos el script del servicio:

$ sudo nano /etc/init.d/virtualbox-Monowall

y se introduciría el siguiente contenido que posteriormente hay que adaptarlo a la máquina propia (en el ejemplo se ejecuta una máquina Monowall):

#! /bin/sh
### BEGIN INIT INFO
# Provides: virtualbox-Monowall
# Required-Start: $local_fs $remote_fs vboxdrv vboxnet
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Monowall virtual machine
# Description: Monowall virtual machine hosted by VirtualBox
### END INIT INFO

# Author: Brendan Kidwell
#
# Based on /etc/init.d/skeleton from Ubuntu 8.04.

# 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="Monowall virtual machine"
NAME=virtualbox-Monowall
SCRIPTNAME=/etc/init.d/$NAME

MANAGE_CMD=VBoxManage
VM_OWNER=carlos
VM_NAME="Monowall" #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 $MANAGE_CMD 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 || >/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 $MANAGE_CMD showvminfo "$VM_NAME"|grep "^State:\s*running" >/dev/null || {
echo "$VM_NAME" is already stopped.
return 1
}

sudo -H -u $VM_OWNER $MANAGE_CMD 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 $MANAGE_CMD 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

:

Resumidamente, hay que incluir el nombre de la máquina tal y como está definida en VirtualBox, el usuario que la ejecuta (y que mantiene por tanto sus ficheros de configuración en $HOME/.VirtualBox y el nombre del propio script).

Dar permisos al script:
$ sudo chmod 755 /etc/init.d/virtualbox-Monowall

Y probar a arrancarlo:
$ sudo /etc/init.d/virtualbox-Monowall start

Comprobar su estado:
$ sudo /etc/init.d/virtualbox-Monowall status

Pararlo:
$ sudo /etc/inid.d/virtualbox-Monowall stop

Por último hay que dar de alta ese script en los correspondientes runlevels:

$ sudo update-rc.d virtualbox-Monowall defaults

Fuente Glump.net (en Inglés)

h1

Error Vmware 1.0.8 /usr/lib/libxcb-xlib.so.0 en Kubuntu

07/01/2009

Al arrancar vmware server 1.0.8 en Kubuntu Hardy puede ocurrir el siguiente error:

carlos@ikeys:~/temp$ vmware
Locking assertion failure. Backtrace:
#0 /usr/lib/libxcb-xlib.so.0 [0xb6f86767]
#1 /usr/lib/libxcb-xlib.so.0(xcb_xlib_unlock+0x31) [0xb6f868b1]
#2 /usr/lib/libX11.so.6(_XReply+0xfd) [0xb7e261bd]
#3 /usr/lib/vmware/lib/libXrender.so.1/libXrender.so.1(XRenderQueryFormats+0x109) [0xb7d06969]
#4 /usr/lib/vmware/lib/libXrender.so.1/libXrender.so.1(XRenderFindFormat+0x4c) [0xb7d06f4c]
#5 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b4c180]
#6 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b4cd2c]
#7 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_draw_pixbuf+0x270) [0xb7b1cc14]
#8 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b2924f]
#9 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_draw_pixbuf+0x270) [0xb7b1cc14]
#10 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_pixbuf_render_pixmap_and_mask_for_colormap+0x255) [0xb7b28b34]
#11 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2d298]
#12 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2d586]
#13 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2f77e]
#14 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_cclosure_marshal_VOID__VOID+0xd1) [0xb7c42459]
#15 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0 [0xb7c2a3a1]
#16 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_closure_invoke+0x1b1) [0xb7c2a076]
#17 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0 [0xb7c416eb]
#18 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_signal_emit_valist+0x91e) [0xb7c40d46]
#19 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_signal_emit+0x38) [0xb7c410b8]
Locking assertion failure. Backtrace:
#0 /usr/lib/libxcb-xlib.so.0 [0xb6f86767]
#1 /usr/lib/libxcb-xlib.so.0(xcb_xlib_lock+0x2e) [0xb6f8681e]
#2 /usr/lib/libX11.so.6 [0xb7e25518]
#3 /usr/lib/libX11.so.6(XAddExtension+0x2c) [0xb7e08c9c]
#4 /usr/lib/vmware/lib/libXft.so.2/libXft.so.2(_XftDisplayInfoGet+0x77) [0xb7cfeed7]
#5 /usr/lib/vmware/lib/libXft.so.2/libXft.so.2 [0xb7cfd8b1]
#6 /usr/lib/vmware/lib/libXft.so.2/libXft.so.2 [0xb7cfdd39]
#7 /usr/lib/vmware/lib/libXft.so.2/libXft.so.2(XftDrawPicture+0x10) [0xb7cfdec0]
#8 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b4a9b6]
#9 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b4cd75]
#10 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_draw_pixbuf+0x270) [0xb7b1cc14]
#11 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0 [0xb7b2924f]
#12 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_draw_pixbuf+0x270) [0xb7b1cc14]
#13 /usr/lib/vmware/lib/libgdk-x11-2.0.so.0/libgdk-x11-2.0.so.0(gdk_pixbuf_render_pixmap_and_mask_for_colormap+0x255) [0xb7b28b34]
#14 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2d298]
#15 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2d586]
#16 /usr/lib/vmware/lib/libgtk-x11-2.0.so.0/libgtk-x11-2.0.so.0 [0xb7a2f77e]
#17 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_cclosure_marshal_VOID__VOID+0xd1) [0xb7c42459]
#18 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0 [0xb7c2a3a1]
#19 /usr/lib/vmware/lib/libgobject-2.0.so.0/libgobject-2.0.so.0(g_closure_invoke+0x1b1) [0xb7c2a076]
vmware: ../../src/xcb_lock.c:77: _XGetXCBBuffer: Afirmación `((int) ((xcb_req) - (dpy->request)) >= 0)' fallida.

Debido a un bug en una librería es necesario hacer un downgrade de la misma o actualizar a una más moderna. La segunda solución es la explicada.

En el caso de arquitectura i386, descargar los siguientes paquetes:
http://packages.debian.org/experimental/i386/libxcb1/download
http://packages.debian.org/experimental/i386/libx11-6/download

Instalarlos sobreescribiendo las versiones presentes.
sudo dpkg -i --force-all libx11-6_1.1.99.2-1_i386.deb
sudo dpkg -i --force-all libxcb1_1.1.92-0.1_i386.deb

y reiniciar.