Usa el mismo teclado en dos máquinas Linux a la vez: KVM Virtual

¿Necesitas usar un mismo teclado y ratón entre dos ordenadores diferentes? Entonces estás leyendo en el lugar adecuado. Había tenido la misma necesidad, así que me dediqué a buscar y encontré una herramienta: netevent.

Para empezar, he de admitir que no es una herramienta tremendamente intuitiva de utilizar, y si es lo que estás buscando, creo que Synergy es una herramienta más completa y cuyo núcleo es de software libre, compatible con casi cualquier sistema operativo. Sin embargo, las compilaciones y el soporte es de pago. Creo que merece la pena echarle un ojo.

Volviendo con netevent, lo poco que he estado usando la herramienta me ha parecido tremendamente útil, aunque algo difícil de configurar. Aunque espero que este pequeño tutorial te ayude algo.

Lo primero, creo que es importante destacar que esta herramienta sólo sirve para métodos de entrada (teclado y ratón, pero no vídeo). Tampoco comparte el portapapeles, característica que sí que tiene Synergy.

Segundo: toda la configuración que necesitamos hacer se debe hacer en la máquina host, es decir, aquella que tiene los dispositivos USB conectados. Asimismo, todo el intercambio de datos se realiza por ssh, por lo que lo recomendable es que tengas configurado el acceso ssh sin contraseña desde el host hasta los clientes. Eso sí, ten claro que necesitamos instalarlo en todos los ordenadores, ya sean host o clientes.

Instalación

Si estamos en una distro de la familia Arch Linux, como Manjaro, con acceso al aur, el paquete netevent-git.

yay -S neteven-git

Si por el contrario usamos Ubuntu o cualquier otra distro, lo que necesitaremos será descargar el código fuente, compilarlo y copiarlo al destino /usr/bin/netevent.

git clone https://github.com/Blub/netevent.git
cd netevent
./configure
make

# Finalmente, lo instalamos en el sistema
sudo cp netevent /usr/bin/

Además, vamos a crear un directorio con permisos de lectura y escritura para nosotros en /etc/netevent, donde pondremos nuestros ficheros de configuración. ¡Atentos!: estamos usando el usuario user, por lo que lo deberéis sustituir allí donde sea necesario.

sudo mkdir /etc/netevent
sudo chown user:user /etc/netevent

Y ya por último, lo que crearemos va a ser un archivo de servicio para systemd. Abrimos un editor de texto cualquiera (sustituye nano por vim o emacs, según prefieras)

sudo nano /etc/systemd/system/netevent@.service

Y copia las siguientes líneas. Atentos a la línea donde pone User=user, sustituye lo que hay a la derecha del = por tu nombre de usuario.

[Unit]
Description=Launches netevent daemon with config file %i
After=network.target

[Service]
User=user
Type=simple
ExecStart=/usr/bin/netevent daemon -s %i netevent-command.sock
WorkingDirectory=/etc/netevent
Restart=always

[Install]
WantedBy=multi-user.target

Vamos a necesitar también añadir nuestro usuario al grupo input, para poder tener acceso a todos los dispositivos como usuario y no como root.

sudo gpasswd -a user input

Ahora sólo nos falta escribir nuestro fichero de configuración. Por comodidad, todo lo vamos a hacer en la carpeta /etc/netevent que habíamos creado antes.

cd /etc/netevent

Configuración

El siguiente paso que necesitamos es crear un archivo de configuración. El propio repositorio ofrece dos ejemplos diferentes. Nosotros nos vamos a basar en el ejemplo básico.

Para configurar vamos a necesitar los siguientes elementos

  • Id de dispositivo tanto del teclado como del ratón
  • Una tecla hotkey, que cuando se pulse, redirigirá ambos periféricos hacia la otra máquina.
  • Configurar SSH en la máquina que usará el teclado remotamente, con su correspondiente usuario e IP.

ID de dispositivo

Todos los dispositivos que podemos acceder estarán listados de una u otra forma en /dev/input. En la carpeta by-id nos será más fácil identificar al nuestro. Normalmente podremos identificar el teclado porque acaba con kbd y al ratón porque acaba con mouse. Podemos listarlos a todos con el siguiente comando:

ls -l /dev/input/by-id/

Una vez tengamos identificado a nuestro teclado o ratón podemos escribir el siguiente comando para ver si «responde» a la entrada, ya sea con una tecla o con mover el ratón. Debemos cambiar la parte que aparece después de /dev/... por nuestros dispositivos que hemos encontrado con el comando de antes.

sleep 0.3 && netevent show /dev/input/by-id/usb-Complicated-Manufacturer-event-mouse

Si nos responden a los eventos físicos, es que vamos por buen camino. Si por el contrario nos sale el error: error: failed to query device name: Inappropriate ioctl for device, entonces probamos otro, ya que puede ser que estén repetidos y algunos dispositivos no se usen.

Encontrando nuestra tecla hotkey

Lo siguiente que tendremos que hacer es encontrar la tecla hotkey que mejor se adapte a nuestra configuración. En mi caso decidí optar por el Ctrl derecho por similitud a VirtualBox. Con el comando de antes, cuando el dispositivo se trata de un teclado, entonces podremos ver la siguiente salida:

MSC:4:458980
KEY:97:1
SYN:0:0
MSC:4:458980
KEY:97:0
SYN:0:0
MSC:4:458980
KEY:97:1
SYN:0:0
MSC:4:458980

La línea que nos interesa pone delante KEY:. En los tres casos vemos que la que acaba en :1 es que se pulsa y la que acaba en :0 es porque cesa la pulsación. De momento nos quedamos con esa tecla, que la necesitaremos cuando escribamos nuestro fichero de configuración.

Túnel SSH con el cliente

Por último vamos a necesitar una conexión SSH para contactar con el cliente. Este paso es probable que no necesites hacerlo si ya has accedido por ssh a la otra máquina.

Lo primero que deberás hacer es habilitar el servidor SSH en dicha máquina. En Ubuntu se consigue instalando el paquete ssh y habilitando el servicio con systemd. En Arch/Manjaro, lo único necesario es habilitar el servicio. En esta entrada te cuento cómo hacerlo.

sudo apt install ssh

# Habilitamos el servicio con systemd
sudo systemctl enable sshd
sudo systemctl start sshd

Lo siguiente es crear una clave si no tenemos ninguna en la máquina host (la que tendrá el teclado)

ssh-keygen

Dejamos los parámetros por defecto y si nos pregunta por contraseña decimos que no.

Por último, enviamos el fichero a nuestro servidor SSH, la que recibirá la conexión cliente de teclado y ratón. Necesitarás cambiar el usuario y la IP por las que correspondan.

ssh-copy-id remoteuser@192.168.1.293

Creando el fichero de configuración

Si hemos seguido todos los pasos, deberíamos tener permisos de escritura con nuestro propio usuario en /etc/netevent. Creamos allí el siguiente fichero, con ell nombre que queramos. De nuevo, podemos sustituir nano por nuestro editor favorito

sudo nano /etc/netevent/remote1

Y vamos cambiando a cada punto aquellos parámetros que hemos descubierto en los pasos anteriores

# Add mouse & keyboard
device add my-mouse /dev/input/by-id/usb-MyCoolMouse-if01-event-mouse
device add my-kbd /dev/input/by-id/usb-MyCoolKeyboard-event-kbd


# Add toggle hotkey (on press, and ignore the release event)
hotkey add my-kbd key:189:1 grab toggle
hotkey add my-kbd key:189:0 nop


# Add my usual output:
output add laptop exec:ssh remoteuser@192.168.1.293 netevent create
# Cause grabbing to write to that output
use laptop

Y ya sólo nos faltará ponerlo en marcha. Para ello, usaremos el servicio de systemd que creamos anteriormente. Una apreciación: a la derecha del símbolo arroba es donde va el nombre del fichero de configuración.

sudo systemctl start netevent@remote1

Y ya si queremos que se inicie a la vez que el ordenador:

sudo systemctl enable netevent@remote1

¡Ya sólo nos queda probarlo en ambos ordenadores!

Resolución de problemas

Error opening uinput device: permission denied

Esto es porque en la máquina destino o bien el dispositivo uinput no está creado o el módulo uinput no está cargado en el módulo. Si es el caso: usar modprobe para cargar el módulo.

sudo modprobe -i uinput

Otra opción es que el usuario de la máquina destino no tenga permisos para escribir/usar uinput. Esto lo solucionamos con:

remoteuser@laptop$ sudo setfacl -m "u:remoteuser:rw-" /dev/uinput

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.