15 de febrero de 2014

Xen y Virt-Manager: Problemas de conexión

El otro día me comentaron la posibilidad de instalar un servidor de virtualización y por las condiciones de las máquinas virtuales a alojar, la mejor solución es correr Xen como anfitrión. Una de las condiciones principales es poder virtualizar una PBX basada en Asterisk con hardware para conectar a la red PSTN o a la red RDSI. Mirando los resultados de la siguiente presentación está claro que Xen se asemeja bastante, y mucho, a los resultados recibidos en el sistema sin virtualizar.

Para la instalación del servidor Xen no voy a entrar en detalles. Recomendaré la guía para principiantes de la página oficial que explica paso a paso la instalación sobre un sistema Debian stable y old-stable.


Hasta aquí todo muy bien, fácil y sencillo. Pero ¿cómo administrar nuestro servidor de virtualización y las máquinas virtuales desde un entorno más amigable?

Virt-manager es una herramienta bastante completa y sencilla, lease liviana también, con la que administrar nuestros servidores Xen, KVM y contenedores LXC de manera gráfica tanto local como remotamente a través de SSH, certificados digitales u otros...


Pues bien, después de este pequeña introducción vienen los problemas que he tenido a la hora de conectar virt-manager con un servidor Xen y cómo poder solucionarlos.

SSH: Intercambio de clave

Si no tenemos configurado el intercambio de claves entre nuestro equipo y el servidor nos mostrará el siguiente error:


Detalles:

Unable to connect to libvirt.

You need to install openssh-askpass or similar
to connect to this host.

Libvirt URI is: xen+ssh://root@192.168.173.150/

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/connection.py", line 1185, in _open_thread
    self.vmm = self._try_open()
  File "/usr/share/virt-manager/virtManager/connection.py", line 1167, in _try_open
    flags)
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 102, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: Cannot recv data: ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied (publickey,password).
: Conexión reinicializada por la máquina remota

Aparte de la opción que el propio mensaje nos aporta, yo prefiero copiar la clave pública de mi usuario en el servidor remoto ya sea a la antigua usanza* o a través de opciones más modernas.

* cat ~/.ssh/id_rsa.pub | ssh user@address 'cat - >> ~/.ssh/authorized_keys'

Netcat version OpenBSD

Es posible encontrarse con el siguiente error


Detalles:

Unable to connect to libvirt.

The remote host requires a version of netcat/nc
which supports the -U option.

Libvirt URI is: xen+ssh://root@192.168.173.150/

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/connection.py", line 1185, in _open_thread
    self.vmm = self._try_open()
  File "/usr/share/virt-manager/virtManager/connection.py", line 1167, in _try_open
    flags)
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 102, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: End of file while reading data: nc: invalid option -- 'U'
nc -h for help: Error de entrada/salida

Para solucionarlo es necesario instalar la versión OpenBSD del paquete Netcat que utiliza la opción -U para la conexión por sockets Unix.

Demonio libvirtd

Si el demonio libvirtd no está instalado y en ejecución recibiremos el siguiente error


Detalles

Unable to connect to libvirt.

End of file while reading data: nc: unix connect failed: No such file or directory: Error de entrada/salida

Verify that the 'libvirtd' daemon is running
on the remote host.

Libvirt URI is: xen+ssh://root@192.168.173.150/

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/connection.py", line 1185, in _open_thread
    self.vmm = self._try_open()
  File "/usr/share/virt-manager/virtManager/connection.py", line 1167, in _try_open
    flags)
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 102, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: End of file while reading data: nc: unix connect failed: No such file or directory: Error de entrada/salida

Para solucionarlo, es necesario instalar el paquete libvirt-bin en el servidor.

Xen: Servidor HTTP

El siguiente error, a diferencia de los anteriores, no se soluciona instalando ningún paquete


Detalles

Unable to connect to libvirt.

unable to connect to 'localhost:8000': Conexión rehusada

Verify that the 'libvirtd' daemon is running
on the remote host.

Libvirt URI is: xen+ssh://root@192.168.173.150/

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/connection.py", line 1185, in _open_thread
    self.vmm = self._try_open()
  File "/usr/share/virt-manager/virtManager/connection.py", line 1167, in _try_open
    flags)
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 102, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: unable to connect to 'localhost:8000': Conexión rehusada

Para solucionarlo basta con editar el fichero de configuración /etc/xen/xend-config.sxp, añadir la siguiente línea (xend-http-server yes) y reiniciar el servicio con /etc/init.d/xen restart.


Listo, ya está conectado virt-manager a nuestro servidor Xen. He realizado varias instalaciones con el mismo comportamiento, todas ellas realizadas en máquina virtual sobre VirtualBox con Debian Wheeze versión 7.4 como sistema base.

Un saludo, Brixton Cat.