Conectarse a la consola de una Máquina Virtual con Virsh

Un problema típico al comenzar con la virtualización con KVM es plantearnos cómo podemos acceder a nuestras máquinas virtuales. La respuesta inmediata sería por VNC o bien por SSH, pero, ¿qué ocurre si queremos acceder directamente desde la máquina hypervisor?.

En esos casos, lo habitual sería lanzar, desde la máquina hypervisor:

virsh console <dominio>

Pero para nuestra sorpresa, vemos que no se conecta. Se queda esperando sin devolvernos el promp de login.

Pues bien, en este post daremos los pasos que tendremos que seguir para solucionar este problema:

  • Conectarnos a la máquina virtual. Con SSH por ejemplo. Es necesario puesto que tendremos que modificar ciertos valores de la máquina virtual. Otra alternativa sería, en el caso de que trabajáramos con volúmenes lógicos LVM, montar el volumen de la máquina en algún directorio del hypervisor y realizar directamente los cambios que se enumeran a continuación.
  • Editar el fichero /etc/inittab, añadiendo la línea:
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
  • Editar el fichero /etc/default/grub y añadir:
GRUB_CMDLINE_LINUX="console=tty0"
  • Ejecutar “grub-update” como administrador para actualizar el grub.
  • Reiniciar la máquina.

Y ahora si. Ya podemos conectarnos desde la máquina hypervisor a la máquina virtual mediante:

virsh console <dominio>

Espero que os sea de ayuda!

Anuncios

Cifrado de carpetas en Ubuntu con ecryptfs

Uno de los mecanismos de seguridad más utilizados como sistema de protección de la confidencialidad de la información es la criptografía.

Este post no pretende dar los conocimientos teóricos de criptografía, sino más bien lo contrario, cómo ponerlos en práctica de una forma sencilla en nuestros equipos.

Nuestro objetivo es crear, dentro de nuestro home, una carpeta Privado que pueda ser cifrada / descifrada en cualquier momento. Para ello haremos uso del paquete ecryptfs.

ecryptfs es un sistema de ficheros cifrado que puede ser apilado en otro sistema de ficheros, como por ejemplo el ext3, sobre el que está instalado nuestro Ubuntu.

Lo primero que haremos será crear la carpeta que vamos a utilizar para contener la información cifrada / descifrada. Para ello, desde un terminal ejecutaremos lo siguiente:

$ mkdir ~/Privado

Y darle permisos para que solo el propietario pueda acceder a ella:

$ chmod 700 ~/Privado

Estos dos pasos también pueden hacerce desde el entorno gráfico.

Luego, instalaremos el paquete ecryptfs:

$ sudo apt-get install ecryptfs-utils

Y montaremos el sistema de fichero en la carpeta anteriormente creada:

$ sudo mount -t ecryptfs ~/Privado ~/Privado

Para el montaje se nos preguntarán distintas opciones:

Passphrase:
Select cipher:
1) aes: blocksize = 16; min keysize = 16; max keysize = 32 (loaded)
2) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 (not loaded)
3) cast6: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
4) cast5: blocksize = 8; min keysize = 5; max keysize = 16 (not loaded)
Selection [aes]:
Select key bytes:
1) 16
2) 32
3) 24
Selection [16]: 32
Enable plaintext passthrough (y/n) [n]:
Enable filename encryption (y/n) [n]: y
Filename Encryption Key (FNEK) Signature [f833eb8784d1be87]:
Attempting to mount with the following options:
ecryptfs_unlink_sigs
ecryptfs_fnek_sig=f833eb8784d1be87
ecryptfs_key_bytes=32
ecryptfs_cipher=aes
ecryptfs_sig=f833eb8784d1be87
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Would you like to proceed with the mount (yes/no)? : yes
Would you like to append sig [f833eb8784d1be87] to
[/root/.ecryptfs/sig-cache.txt]
in order to avoid this warning in the future (yes/no)? : yes
Successfully appended new sig to user sig cache file
Mounted eCryptfs

De la configuración anterior destacamos la elección de la contraseña para el cifrado así como el método de encriptación y tamaño del bloque. En nuestro caso también hemos optado por ocultar el nombre de los archivos.

A partir de este momento podemos utilizar la carpeta como cualquier otra del equipo.

Cuando hayamos terminado, podremos desmontar la carpeta:

$ sudo umount ~/Privado

La carpeta seguirá existiendo, pero comprobaremos que el contenido está ilegible.

 Para utilizarla de nuevo tan solo tendremos que volver a montarla.

También es posible automatizar el montaje, de forma que nos ahorramos tener que introducir todos los parámetros de configuración cada vez. Para ello haríamos lo siguiente:

$ sudo mount -t ecryptfs ~/Privado ~/Privado -o ecryptfs_sig=f833eb8784d1be87,ecryptfs_fnek_sig=f833eb8784d1be87,ecryptfs_key_bytes=32,ecryptfs_cipher=aes,ecryptfs_unlink_sigs,ecryptfs_passthrough=no

Passphrase: 

Meteremos la clave seleccionada la primera vez y listo.

Eso es todo amigos!


Navegación visual: mejoras I

Tras trabajar la cabeza y el código, he incluido las siguientes mejoras:

  1. He acotado la visión del robot, dado que a partir de una cierta distancia, las medidas son menos exactas. Con ello generamos menos segmentos imprecisos.
  2. He añadido una navegación sencilla, donde la aceleración (positiva / negativa) es progresiva, con lo que evitamos los movimientos bruscos del robot (y consecuentemente de la cámara) que nos daba coordenas incorrectas de los puntos.
  3. He afinado aún más las constantes de fusión, con lo que se fusionan más segmentos y por tanto se almacenan menos.

Aún cuento con dos problemas que explico en el foro de la asignatura y con la negativa de recordmydesktop para grabar los vídeos…

Una prueba de los resultados:

resultado11

En la imagen se ve al robot después de haber girado hacia el pasillo de la derecha. Se ve claramente el mapa en memoria generado desde su salida hasta que ha alcanzado la posición en la que se encuentra.

Otra imagen más, esta vez le he dado la vuelta al robot..

resultadoatras

Y en breve os colgaré un par de vídeos.

Navegación Visual: “viendo” obstáculos

Una de las aplicaciones interesantes de la navegación visual es la detección de obstáculos que no son detectados por el láser, dado que están en el suelo por debajo de este.

Veamos cómo se traduce esto en nuestro esquema.

El obstáculo utilizado es una puerta que he tirado (bueno, más bien ha sido el robot guiado por mi malicia) como terapia anti-stresss, tras pasar una hermosa tarde de verano frente al ordenador sin solucionar los problemas del movimiento (os lo recomiendo, te deja relajado y feliz!).

Bueno, vamos al tema. Os dejo una imagen donde podéis comprobar cómo el láser no detecta ningún obstáculo, mientras que el mapa me muestra el segmento que me impide pasar:

Navegación Visual: problemas con el movimiento

Es hora de darle movimiento a nuestro robot y afinar el diseño para que pueda navegar de forma autónoma, basándose en los datos extraidos de las imágenes capturadas. Y con esto llegaron más problemas…

Resulta que al iniciar la marcha, parar, acelerar, frenar o bien girar (aunque un poco menos en este último caso), la cámara sufre un movimiento que hasta ahora no había considerado importante y que está produciendo segmentos basura en el mapa construido por el robot.

Al cambiar la posición de la cámara, las coordenadas de los puntos detectados no son exactas, lo que genera errores.

Esto podemos intentar solucionarlo acelarando/frenando de forma progresiva… algo así como el controlador PID programado para la práctica del siguelíneas (en este punto me encuentro trabajando).

Otro problema lo encontramos cuando detectamos segmentos pero a una gran distancia del robot. Al acercarse, la posición de estos no coincide, quedando generalmente por detrás del nuevo detectado:

Por último, otro efecto negativo del movimiento es la imprecisión de los puntos detectados al aumentar la velocidad, lo cual nos lleva a definir segmentos incorrectos… ¿solución? tendremos que pensarlo…

Navegación Visual: cambio de estrategia

Como dice Juanes en una de sus canciones, “It’s time to change”… ¿y por qué?. Porque después de complicar cada vez más el código intentando mantener la detección de la “frontera” descrita en los posts anteriores, me he dado cuenta de que para comprobar si existen obstáculos en el suelo se complica todo tanto que el código generado se ha vuelto demasiado ineficiente (da demasiadas vueltas).

Por ello he dado marcha atrás y he puesto a funcionar mi cabecita en busca de una solución mejor y…. ¡eureka! la encontré.

El nuevo método para obtener tanto la frontera como los obstáculos es el siguiente:

La idea es recorrer la imagen por columnas, de izquierda a derecha y de abajo hacia arriba. De esta forma buscamos el primer punto que no coincida con el color del suelo.

También comprobamos si detrás de ese primer punto encontrado, en la siguiente fila, hay suelo.  En ese caso el punto detectado no se corresponde con un límite, si no más bien con una esquina que no me deja ver lo que hay detrás…

Con ello estamos simulando, mejor que con el método anterior, el funcionamiento del laser, obteniendo un total de 340 puntos.

Realmente hemos reducido a una cuarta parte el código tanto del escaneado de la pantalla como de la construcción de segmentos.

Resultados:

Y un detalle de una esquina:

Navegación Visual III: Segmentación

Esta es quizás una de las tareas más sencillas, dado que vamos a reutilizar el código de la práctica anterior (construcción de mapas), modificándolo para que trabaje con los puntos obtenidos de la “frontera” en vez de con el laser.

Dado que estamos escaneando la imagen de abajo a arriba, y con el fin de simular un comportamiento similar (que no igual) al laser, realizaremos dos bucles:

  1. Recorrido por todos los límites izquierdos del suelo (de abajo a arriba).
  2. Lo mismo pero con el lado derecho.

De esta forma, cada punto frontera será traducido a su correspondiente punto en el mundo (coordenadas absolutas – explicado en el post anterior) y pasado al constructor de mapas.

Resultado:

funcionando