2013-12-05

Mi router-consola

La nueva generación de consolas ha llegado al mercado y todos los gamers están sobreexcitados, decidiendo si comprar la PS4, Xbox One o ambas si sus bolsillos se lo permiten. Ciertamente, la nueva generación es muy interesante por muchos motivos pero no es lo suficientemente geek. Por suerte, en este blog siempre apostamos por las soluciones absurdas para problemas que no existen y así es como llegamos a la conclusión de que teníamos que fabricar nuestra propia consola con el frikismo como leitmotiv.

Todos los fieles seguidores de este blog conocen nuestro experimento de refrigeración por inmersión en aceite de la Xbox 360 pero esta vez queríamos ir más allá, transformando mi router en una "flamante" consola.

Cuando la gente normal ve un router no piensa en lo que realmente es. Un ordenador con Linux. En mi caso es un TP-Link TL-WR841n v.8.4 con un procesador de 535Mhz, 32MB de RAM y un almacenamiento de 4MiB. Es un router de gama baja, de 20€, nada espectacular pero lo suficiente como para lanzar algún juego desde la terminal.

Voy a explicar todo el proceso de instalación de un videojuego en mi router y de paso, criticar algunos tutoriales sobre compilación cruzada para OpenWRT que he visto en la web y que no me han gustado demasiado. Pero antes una advertencia: Este tutorial no es extrapolable. Sus métodos no se pueden utilizar exactamente para compilar cualquier otro programa, en otro modelo de router, ni siquiera en versiones anteriores del mismo modelo. Con esto quiero decir que si sigues al pie de la letra el tutorial, te vas a cargar el router y no es seguro que puedas arreglarlo...

Lo primero que hay que hacer es descargar OpenWRT, el sistema operativo para routers que vamos a usar como base para correr los videojuegos. (pongo el prompt completo para que nadie se pierda cuando empiecen las conexiones.)
edkalrio@alexandra:~$ wget http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841n-v8-squashfs-factory.bin
Hay que conectarse con el router por la puerta de enlace (192.168.0.1) desde un navegador web e instalar el firmware como si fuera una actualización normal del sistema original.

También se descarga, extrae y descomprime el toolchain, un conjunto de herramientas que nos permitirán hacer una compilación cruzada del código. En otros tutoriales se complican la vida innecesariamente compilándolo cuando ya vienen preparados si buscamos un poco por el servidor de OpenWrt.
edkalrio@alexandra:~$ wget http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_r2-gcc-4.6-linaro_uClibc-0.9.33.2.tar.bz2
edkalrio@alexandra:~$ tar -xjf OpenWrt-Toolchain-ar71xx-for-mips_r2-gcc-4.6-linaro_uClibc-0.9.33.2.tar.bz2
Estas descargas se podían haber hecho en el entorno gráfico pero como casi todo el tutorial es para la terminal, no cuesta nada descargarlo con wget.

El juego que he elegido para instalar en el router es, como no podía ser de otro modo, los quinquiluñes. No solo porque es el juego que programamos +Ruben Velasco y yo sino porque su tamaño, estructura monolítica y sin bibliotecas externas ni apenas punteros hace que la compilación sea mucho más fácil de lo que otros tutoriales nos quieren hacer creer. Obtenemos el código de github y ya que estamos lo movemos y cambiamos el nombre porque a Rubén le gustan los nombres descriptivos aunque sean tan largos.
edkalrio@alexandra:~$ git clone https://github.com/ruvelro/Quinquilunes.git
edkalrio@alexandra:~$ cp ~/Quinquilunes/quinquilunes.c ~/qq.c
Lo esencial de este tutorial es la compilación cruzada. Como el router no tiene capacidad para albergar un compilador propio, hay que construir los programas desde otro ordenador que obviamente tendrá una arquitectura distinta. El toolchain proporciona las funciones necesarias para compilar código para MIPS desde nuestro procesador AMD64 y muchísimo más rápido que si usáramos el procesador del router. Para utilizar estas herramientas, hay otros tutoriales que crean asignan variables de entorno para enlazar estas herramientas con GCC pero no vale la pena complicarse la vida con una solución que, tal y como la plantean solo sirve para una sesión. Lo mejor es utilizar este sencillo comando para compilar nuestro código en C. Los parámetros del script son los mismos que podemos usar en GCC, por si se quisiera añadir alguno.
edkalrio@alexandra:~$ sh ~/OpenWrt-Toolchain-ar71xx-for-mips_r2-gcc-4.6-linaro_uClibc-0.9.33.2/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc -o qq qq.c
Ahora que ya tenemos el binario preparado, hay que llevarlo al router. Las soluciones que se plantean en aquellos tutoriales, a través de servidores FTP son bastante enrevesadas y suponen que previamente tengamos montado uno de esos servidores y tener configurado el router para poder acceder a internet, cosa que yo todavía no he hecho porque solo quería que se pudiera usar como consola.

Primero hay que conectarse al router por telnet. No uso telnet por la misma razón por la que no uso Whatsapp así que intentaré estar lo menos posible. Simplemente le ponemos una contraseña y salimos (yo además aproveché para cambiar la puerta de enlace pero eso no tiene que ver con este tutorial sino con la configuración del router como tal) para volver a conectarnos, esta vez sí, por SSH.
edkalrio@alexandra:~$ telnet root@192.168.1.1

root@OpenWrt~# passwd

root@OpenWrt~# exit

edkalrio@alexandra:~$ ssh root@192.168.1.1
Entonces, la solución al problema de la instalación es hacer un copia-pega de toda la vida pero esta vez de forma remota a través de SSH. Hay que tener cuidado porque no estamos trabajando con un ordenador con 1TB de disco duro sino con solo 4MiB de almacenamiento. Por suerte, el sistema operativo ocupa 3932160B y el binario de los quinquiluñes 16184B, por lo que todavía nos sobran 245960B para instalar más juegos.
root@OpenWrt~# scp edkalrio@192.168.0.101:/home/edkalrio/qq /bin
Como lo hemos copiado al directorio /bin no hace falta moverse hasta ahí para invocar los programas que hayamos instalado. Ya solo queda pulsar qq para jugar a los quinquiluñes en nuestro router a través de una conexión SSH.
root@OpenWrt~# qq
Nos ha quedado una consola geek, retro y única para demostrar la versatilidad de Linux y la flexibilidad del código en ANSI-C. Para terminar voy a dejar un par de capturas de pantalla de algunas partidas desde mi estación de trabajo y mi iPod. Si tuviera una IP estática o DDNS se podría jugar desde cualquier lugar. Solo se tendría que abrir el puerto 22 para permitir el acceso online.

Quizás otro día le haga overclock...