Jan 02

Introducción.

Hace dos días cuando empecé la revisión de documentación acerca de KVM leí que uno de los puntos débiles era la falta de herramientas gráficas (UI) para la administración remota de las máquinas virtuales.  A pesar de que esto es cierto, Virtual Manager la herramienta adhoc disponible, no es la opción de administración remota mas completa que se pueda encontrar en el mercado, también me dejó un grato sabor porque esperaba que fuera aún mas sencilla y eso que tuve la posibilidad de probar la versión 0.7.0 (disponible en los repositorios de Ubuntu) mientras que ya hay nuevas versiones liberadas (la 0.8.2 de mediados del mes pasado).

Virtual Manager parece ser una herramienta de pocas opciones pero muy útiles y precisas, y que se encuentra bajo un considerablemente activo desarrollo.  Varias de sus funciones se implementan a través de asistentes que evitan la manipulación directa de los archivos XML con la especificación de las máquinas virtuales.

  • Conexión con múltiples servidores de máquinas virtuales: KVM y XEN.
  • Consultar las máquinas virtuales disponibles en un servidor junto con su estado y los recursos que utilizan.
  • Ejecutar y detener máquinas virtuales.
  • Consultar la información y estado del servidor de máquinas virtuales.
  • Administrar la información de las redes virtuales y los almacenamientos.
  • Información de las máquinas virtuales.
  • Crear nuevas máquinas virtuales.
  • Remover máquinas virtuales disponibles.
  • Conectarse con la consola gráfica de las máquinas virtuales en ejecución a través de VNC.

Instalación.

$ sudo apt-get install virt-manager

Ejecución.

De manera local.

$ virt-manager -c qemu:///system

De manera remota mediante SSH.

$ virt-manager -c qemu+ssh://ip_del_servidor/system


Enlaces.

Tagged with:



En January 2 de 2010, Jorge Iván Meza Martínez escribió acerca de Administrar gráficamente máquinas virtuales con KVM remotamente en Ubuntu 9.10.
Jan 02

Clonar una máquina virtual.

--connect Hypervisor al cual se realiza la conexión
-o Identificador de la máquina virtual orígen
-n Identificador de la nueva máquina virtual a crearse
-f Ruta del disco duro de la nueva máquina virtual, puede
ser un archivo, un volúmen lógico o una partición.
--debug Mostrar información de depuración.

Permite crear una nueva máquina virtual exactamente igual a otra existente.

$ virt-clone --connect=qemu:///system \
-o PruebaVM \
-n CopiaVM \
-f /u/vms/CopiaVM.img

Listar las máquinas virtuales disponibles.

$ virsh -c qemu:///system list --all

Connecting to uri: qemu:///system
Id Name                 State
----------------------------------
1 PruebaVM             running
- CopiaVM              shut off

Iniciar una máquina virtual.

$ virsh -c qemu:///system start PruebaVM

Detener una máquina virtual.

Apagado normal.

$ virsh -c qemu:///system shutdown PruebaVM

Apagado abrupto (desconectar el cable eléctrico).

$ virsh -c qemu:///system destroy PruebaVM

Reiniciar una máquina virtual.

$ virsh -c qemu:///system reboot PruebaVM

Guardar el estado actual de una máquina virtual.

$ virsh -c qemu:///system save PruebaVM PruebaVM-20100102_1830.state

Restaurar una máquina virtual desde un estado previo.

$ virsh -c qemu:///system restore PruebaVM-20100102_1830.state

Suspender una máquina virtual.

$ virsh -c qemu:///system suspend PruebaVM

Despertar una máquina virtual suspendida.

$ virsh -c qemu:///system resume PruebaVM

Montar un dispositivo real en la máquina virtual.

$ virsh -c qemu:///system attach-disk PruebaVM /u/isos/CentOS-5.4-i386-LiveCD.iso /media/cdrom

Desmontar real un dispositivo de la máquina virtual.

$ virsh -c qemu:///system detach-disk PruebaVM hdc

Configurar el inicio de una máquina virtual al inicio del servidor.

$ virsh -c qemu:///system autostart PruebaVM

Conectarse a una máquina virtual en ejecución.

De manera local.

$ virt-viewer -c qemu:///system PruebaVM

De manera remota.

$ virt-viewer -c qemu+ssh://direccion_ip_servidor/system PruebaVM

Remover una máquina virtual.

$ virsh -c qemu:///system undefine PruebaVM

Este procedimiento remueve a la máquina virtual (PruebaVM en este caso) del Hypervisor, lo cual significa que físicamente se remueven del servidor el archivo XML con la especificación de la máquina virtual (ubicada por defecto en /etc/libvirt/qemu/) y los archivos IMG con los medios de las máquinas virtuales (ubicados para estos artículos bajo /u/vms/).

Instalar una máquina a partir de su especificación.

$ virsh -c qemu:///system define /etc/libvirt/qemu/PruebaVM.xml

Para hacer esto en Hypervisor, se requiere que se cuente con el archivo XML que contiene la especificación de la máquina virtual ubicado en /etc/libvirt/qemu/ y con los correspondientes archivos o particiones asociados como discos.

Este comando también es muy útil para indicarle al Hypervisor que se han realizado cambios en el archivo XML de especificación de una máquina virtual para que él lo lea nuevamente y los tenga en cuenta.

Obtener la especificación actual de una máquina virtual activa.

$ virsh -c qemu:///system dumpxml PruebaVM > /tmp/PruebaVM.xml

Enlaces.

Tagged with:



En January 2 de 2010, Jorge Iván Meza Martínez escribió acerca de Administrar máquinas virtuales con KVM desde línea de comando en Ubuntu 9.10.
Jan 02

Procedimiento.

Instalar las herramientas de instalación y el visor.

$ sudo aptitude install python-virtinst virt-viewer

Crear la máquina virtual.

Con el siguiente comando se solicita a KVM la creación de uma máquina virtual con las siguientes características.

Nombre de la máquina virtual (-n | --name) PruebaVM
Cantidad de memoria RAM asignada (-r | --ram) 256 MB
Tipo de sistema operativo (--os-type) Linux
Subtipo de sistema operativo (--os-variant) Ubuntu Karmic
Utilizar virtualización completa (-v | --hvm)
CDROM (-c | --cdrom) Imagen a montar como CDROM
Tipo de conexión a la red (-w | --network) Por defecto
Discos (--disk) Almacenado en /u/vms/PruebaVM.img con 5GB.
Exportar consola virtual a través de VNC (--vnc)
No conectar automáticamente a la consola (--noautoconsole)

$ sudo virt-install \
--connect qemu:///system \
-n PruebaVM \
-r 256 \
--os-type linux \
--os-variant ubuntukarmic \
--hvm \
--cdrom /u/isos/ubuntu-9.10-server-amd64.iso \
--network network:default \
--disk path=/u/vms/PruebaVM.img,size=5 \
--vnc --noautoconsole \
--accelerate

Verificar la creación de la imágen del disco del invitado.

$ ls -l /u/vms/PruebaVM.img

-rwxr-xr-x 1 root root 5368709120 2010-01-01 22:29 /u/vms/PruebaVM.img

Verificar la creación de la máquina virtual.

$ virsh -c qemu:///system list

Connecting to uri: qemu:///system

Id Name                 State
----------------------------------
1 PruebaVM running

Conectar a la máquina virtual para realizar la instalación del sistema operativo.

De manera local.

$ virt-viewer -c qemu:///system PruebaVM

De manera remota a través de SSH.

$ virt-viewer -c qemu+ssh://DIRECCION_IP_SERVIDOR/system PruebaVM

Apagar la máquina virtual.

Después de terminada la instalación del sistema operativo se hace un apagado forzoso (desconectar el cable) ya que el apagado normal no parece tener algún efecto.

$ virsh --connect qemu:///system destroy PruebaVM

$ virsh --connect qemu:///system list --all

Connecting to uri: qemu:///system

Id Name                 State
----------------------------------
- PruebaVM shut off

Remover el CDROM de instalación.

$ sudo vi /etc/libvirt/qemu/PruebaVM.xml

<os>
<type arch=’x86_64′ machine=’pc-0.11′>hvm</type>
<boot dev=’cdrom‘/>
</os>

Reemplazar el dispositivo de inicio del CDROM (cdrom) al disco duro (hd).

<boot dev=’hd‘/>

$ virsh --connect qemu:///system define PruebaVM

Iniciar la máquina virtual recién instalada.

$ virsh -c qemu:///system start PruebaVM

$ virt-viewer -c qemu:///system PruebaVM

Enlaces.

Tagged with:



En January 2 de 2010, Jorge Iván Meza Martínez escribió acerca de Crear máquinas virtuales con KVM desde línea de comando en Ubuntu 9.10.
Jan 02

Introducción.

Estos se ubican entre el usuario y la aplicación.  Su función es la de controlar la comunicación entre los modelos y la vistas según la solicitud (requerimiento) que ha hecho usuario.

Su clase base es CController y en ellos se implementan Acciones (definen la lógica de la aplicación) y Filtros (establecen validaciones o controles antes y después de la ejecución de las acciones).

El usuario invoca indirectamente a los controladores especificando un ruta a través del controlador frontal o Application.

La ruta del requerimiento.

El URL solicitado determina que controlador y que acción se van a ejecutar para resolver el requerimiento del usuario.

Los URL tienen el siguiente formato.

Sin URL limpias (por defecto).

http://servidor/index.php?r=ControladorId/AcciónId

Con URL limpias.

http://servidor/ControladorId/AcciónId

Si se utilizan módulos (y URL limpias para este ejemplo).

http://servidor/MóduloId/ControladorId/AcciónId

  • El archivo fuente del controlador se ubica en protected/controllers/ControladorIdController.php.
  • El nombre de la clase allí contenida deberá ser ControladorIdController.
  • Se invoca a la acción (ver mas adelante) AcciónId.  En caso de no haberse especificado una se considera la acción por defecto del controlador, comúnmente index.

Las acciones.

Pueden implementarse de dos maneras.

  • Como métodos del mismo controlador.
  • Como clases que heredan de CAction.

Acciones implementadas como métodos del controlador.

  • El nombre del método deberá ser actionAcciónId.

En el siguiente ejemplo se muestra al controlador User que implementa la acción add como un método suyo.

class UserController extends CController
{
    public function actionAdd()
    {
        // Implementación ...
    }
}

Acciones implementadas como clases independientes.

  • Los objetos acción heredan de CAction.
  • El nombre de la clase es AcciónIdAction (por convención, no es obligatorio).
  • Se almacena en un archivo bajo la ruta protected/controllers/controladorId/AcciónIdAction.php.
  • Su ubicación puede referenciarse mediante alias de esta manera: application.controllers.controladorId.AcciónIdAction.
  • Es obligatorio sobreescribir el método run() de la acción para definir allí su implementación.

En el siguiente código se muestra la acción remove del controlador User implementada como una clase independiente.

class RemoveAction extends CAction
{
    public function run()
    {
        // Implementación ...
    }
}

Esta clase se almacena entonces en el archivo protected/controllers/user/RemoveAction.php.

Como paso final de su implementación, es necesario indicarle al controlador de la existencia de la acción.  Para hacer esto es necesario sobreescribir el método actions del controlador de la siguiente manera.

class UserController extends CController
{
   public function actions()
   {
       return array(
           'remove' => 'application.controllers.user.RemoveAction'
       );
   }
}

Los filtros.

  • Permiten realizar verificaciones y validaciones antes y después de la ejecución de las acciones.
  • Una acción puede tener asociados múltiples filtros.
  • Los filtros se ejecutan en el orden en que fueron especificados.
  • Un filtro puede abortar la ejecución de los demás filtros y de la acción misma.
  • De manera análoga a las acciones, los filtros pueden implementarse de dos maneras también.
    • Como métodos del mismo controlador.
    • Como clases que heredan de CFilter.

Filtros implementados como métodos del controlador.

  • El nombre del método debe empezar por la palabra filter.
  • Deberá recibir como parámetro a $filterChain.

En el siguiente ejemplo se muestra al controlador User que implementa al filtro checkUser como un método suyo.

class UserController extends CController
{
    public function filterCheckUser($filterChain)
    {
        // Implementación ... invocar $filterChain -> run()
        // para continuar con el próximo filtro
    }
}

Filtros implementados como clases independientes.

  • Los objetos acción heredan de CFilter.
  • El nombre de la clase es FiltroIdFilter (por convención, no es obligatorio).
  • Se almacena en un archivo bajo la ruta protected/filters/FiltroIdFilter.php.
  • Su ubicación puede referenciarse mediante alias de esta manera: application.filters.FiltroIdFilter.
  • Es obligatorio sobreescribir los métodos preFilter($filterChain) y postFilter($filterChain) del filtro para definir que hacer antes y después de ejecutar la acción.

En el siguiente código se muestra al filtro isValid del controlador User implementado como una clase independiente.

class IsValidFilter extends CFilter
{
    public $admin;

    public function preFilter($filterChain)
    {
        // Se aplica antes de ejecutarse la acción.
        // Si retorna true continúa el proceso, false lo
        // aborta y no se ejecuta la acción solicitada.

        return $exito;
    }

    public function postFilter($filterChain)
    {
        // Se aplica después de ejecutarse la acción.
    }
}

Esta clase se almacena entonces en el archivo protected/filters/IsValidFilter.php.

Como paso final de su implementación, es necesario indicarle al controlador de la existencia del filtro y determinar su alcance sobre las acciones del mismo.  Para hacer esto es necesario sobreescribir el método filters del controlador de la siguiente manera.

class UserController extends CController
{
   public function filters()
   {
       return array(
           'checkUser + add, remove',

           array(
               'application.filters.IsValidFilter - add, remove',
               'admin' => false
           )
       );
   }
}
  • checkUser es un filtro basado en un método del controlador.
  • isValid es un filtro basado en una clase externa.
  • Es posible especificar los filtros con una notación de arreglo para determinar valores específicos para los atributos del filtro.

Los operadores + y - actúan como determinadores del alcance de los filtros sobre las acciones especificadas de la siguiente manera.

  • + determina exactamente a cuales acciones se les debe aplicar el filtro.  De esta manera, el filtro checkUser se aplicará a las acciones add y remove únicamente.
  • - determina a cuales acciones NO se les debe aplicar el filtro.  Así, el filtro isValid se aplicará a todas las acciones EXCEPTO a add y remove.
  • Si no se especifica ninguno de los dos modificadores, el filtro aplicará a todas las acciones del controlador.

Enlaces.

Tagged with:



En January 2 de 2010, Jorge Iván Meza Martínez escribió acerca de Los controladores en Yii.