Archivos Mensuales: agosto 2010

Iniciar máquinas virtuales de VirtualBox al inicio

Tengo una máquina virtual que quiero que inicie cada vez que bootea el servidor. Tanto mi VM como el servidor físico son Debian Lenny, ambos con openssh-server instalado como demonio de SSH para administrarlos, por lo que adrede no habilito el RDP de la VM y la corro como headless.

1. Iniciar las máquinas virtual

Para iniciar las máquinas ponemos esto en nuestro archivo /etc/rc.local :

#/bin/bash -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# VirtualBox start virtual machines on boot
# VMs Run user
RUN_USER=userexecutesvm
# VM run type. Options are [gui|sdl|vrdp|headless]. Check 'VBoxManage startvm'
VM_RUN_TYPE=headless
# Put the ID of the VMs. You can  put the unique id (ex. da52db1a-5b6e-4297-b4b6-aa9e293efcc8)
# or the human friendly VM name (ex. "Name of the VM").
# Check 'VBoxManage --nologo list vms' for information about your VMs
# Example variable:
# VMS=("Name of the VM 1" "Name of the VM2" da52db1a-5b6e-4297-b4b6-aa9e293efcc8)
VMS=("Name of the VM")
# Check for missing binaries
VIRTUALBOX_BIN=/usr/bin/VBoxManage
test -x $VIRTUALBOX_BIN || { echo "$VIRTUALBOX_BIN not installed"; exit 5; }
# Start the VMs
for i in "${VMS[@]}"
        do
		su - $RUN_USER -c "$VIRTUALBOX_BIN --nologo startvm '${i}' --type $VM_RUN_TYPE"
        done
exit 0

Es importante que cambien el usuario con el que ejecutarán las VM y que no sea root por seguridad. Está de más decir que el usuario es el mismo que con el que ejecutan normalmente la VM. El script /etc/rc.local es llamado sin argumentos por el script /etc/init.d/rc.local , pueden revisarlo para conocer como funciona. Ese script se encuentra enlazado como S99rc.local en los Run Levels 2 al 5 (link simbólico /etc/rcX.d/S99rc.local), que en Debian significan lo mismo. Por lo que entonces tenemos cubierto el inicio de la VMs.

2. Detener las VMs

Inicialmente cree mi propio script para detener las VMs. Sin embargo noté que existe el script /etc/init.d/vboxdrv . Al revisarlo, observé una buena implementación llamada stop_vms. El encabezado de la función menciona:

# enter the following variables in /etc/default/virtualbox:
# SHUTDOWN_USERS="foo bar"
# check for running VMs of user foo and user bar
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
# select one of these shutdown methods for running VMs

Por lo que creamos el archivo /etc/default/virtualbox (ya que por defecto no existe) de esta forma:

host:~# nano /etc/default/virtualbox

SHUTDOWN_USERS="usuarioejecutavms"
SHUTDOWN=savestate

Ese script se encuentra enlazado como S20vboxdrv en los Run Levels 2 al 5 (link simbólico /etc/rcX.d/S20vboxdrv). Y como K20vboxdrv en los Run Levels 0, 1 y 6 (link simbólico /etc/rcX.d/K20vboxdrv). Es decir, que se llamará el script /etc/init.d/vboxdrv con el argumento stop cuando se apague el sistema (Run Level 0), se inicie como single-user mode (Run Level 1) o se reinicie el sistema (Run Level 6). El script vboxdrv sólo llama a stop_vms cuando se le llama con el argumento stop. Es decir, que las máquinas virtuales de los usuarios de la variables se apagarán usando el método especificado (en mi caso puse savestate) en dichos casos.

Con esto ya queda funcionando el sistema.

En resumen: El sistema al ejecutar rc.local se encarga de iniciar nuestras VMs. Al apagar o reiniciar vboxdrv se encarga de apagar nuestras VMs de forma como lo configuramos en /etc/default/virtualbox.

Etiquetado , ,

Redirección de puertos con VirtualBox

Mi router es una cochinada, es un DSL-2640T y desgraciadamente no se le puede poner DD-WRT o similares :S Tiene un bug terrible, que los “Virtual Servers”, o en español, redirección de puertos, no funcionan. O se borran al reiniciar el router o desaparecen después de unos minutos. Tengo una máquina en la DMZ y esta máquina tiene máquinas virtuales con diversos servicios. Ya que no puedo redireccionar puertos específicos a las máquinas virtuales configuradas en bridge con IP estáticas, las puse en NAT y con DHCP y seguí estos pasos en el host para redireccionar los puertos del (de los) guests:


VBoxManage modifyvm "Nombre de la VM" --natpf1 "guesthttp,tcp,,2080,,80"
VBoxManage modifyvm "Nombre de la VM" --natpf1 "guestssh,tcp,,2022,,22"

En este ejemplo estoy “publicando” el puerto 80 de una máquina virtual (un apache) en el puerto 2080 de nuestra máquina host (mi máquina en la DMZ). También hago lo mismo para el SSH.

Nota muy importante, no se pueden asignar puertos menores que 1024 sin ejecutar VirtualBox como root y escalar permisos (super desaconsejado!). Por eso puse 2022 y 2080 en lugar de 1022 y 1080.

La documentación de esta característica está en el manual aquí.

Etiquetado ,

Administrar MySQL de forma remota por SSH

A veces queremos administrar nuestro MySQL de forma remota. Aunque el MySQL Query Browser y el MySQL Navigator ya tienen aviso de End Of Line a favor de MySQL Workbench, todavía sigo usándolos. Lo que hacemos es entrar a nuestro servidor por SSH con el siguiente comando:

ssh -L 6666:127.0.0.1:3306 usuario@servidor.com

Y ahora, al entrar a alguna de las herramientas visuales ponemos:

Server hostname: 127.0.0.1
Port: 6666
Username: su usuario
Password: su password

Y listo!

Etiquetado , ,