LEDE 17.01 en un Ubiquiti UniFi AC AP Lite: la guía definitiva

Hola!

Desde que Ubiquiti haya cerrado la posibilidad de usar firmware alternativo en los aparatos que distribuye (incluso violando la GPL una vez más al distribuir un U-Boot modificado sin código fuente), se ha vuelto más difícil intentar instalar OpenWrt o LEDE. Pero, gracias a la experiencia obtenida en algunas tareas, he podido armar esta guía para hacerlo (mas una explicación al final).

Quizás haya contenido que no necesariamente aplica a tu aparato. Piensa dos veces y guíate por el sentido común antes de hacer pasos peligrosos. De todas maneras, si arruinas el proceso, los routers Ubiquiti te permiten cargar firmware (oficial) por TFTP y así poder volver a empezar.

Igualmente, sería bueno que hagas copias de los bloques /dev/mtdblock* en el firmware original y los saques a tu máquina con scp, para estar más protegido, por si acaso.

Cómo instalar LEDE en el UniFi AC AP Lite

Necesitamos los siguientes archivos:

Ahora podemos empezar a trabajar.

Fase 0: Desbloqueando el firmware

Por defecto los APs con los que trabajé venían con la versión 3.4.14 del firmware oficial. Como éste ya implementa verificación de las firmas digitales para el firmware de Ubiquiti, tenemos que hacer un downgrade (desactualizar) a la versión 3.4.7, que no implementa ésta restricción.

  1. Enciende el AP y conéctate. Si está ya configurado, debes resetearlo. De preferencia, el router no debe tener acceso a Internet ahora mismo.
  2. Conéctate al servicio ssh de la IP por defecto 192.168.1.20, con las credenciales ubnt/ubnt.
  3. Copia el fichero BZ.qca956x.v3.4.7.3284.150911.1650.bin a la carpeta /tmp del aparato, usando el nuevo nombre fwupdate.bin. Puedes hacerlo con un miniservidor http (python3 -m http.server 8080) o con scp.
  4. Luego de tener ya el archivo /tmp/fwupdate.bin, ejecuta syswrapper.sh upgrade2.
  5. Espera unos minutos a que el router se reinicie.

Fase 1: Instalando el firmware intermedio

Ubiquiti usa un formato un poco extraño para el firmware de sus APs, y gracias a éso, no podremos instalar OpenWrt/LEDE así nada más, ya que tratará de ejecutar el firmware desde una partición no esperada. Usaremos un firmware intermedio para corregir éso.

  1. Conéctate al AP por ssh. La vieja IP (192.168.1.20) y las credenciales ubnt/ubnt aún deberían servir.
  2. Copia el archivo lede-r3435-ubnt-unifiac-lite-enmaskarado-phase1.bin a la carpeta /tmp del AP.
  3. Ejecuta:
    1. mtd write /tmp/lede-r3435-ubnt-unifiac-lite-enmaskarado-phase1.bin kernel0
    2. mtd -r write /tmp/lede-r3435-ubnt-unifiac-lite-enmaskarado-phase1.bin kernel1
  4. El aparato se reiniciará, y luego de unos minutos, el firmware de primera fase estará funcionando. Deberías tener acceso por ssh a la IP 192.168.1.1, sin credenciales.
  5. Ejecuta:
    1. insmod mtd-rw i_want_a_brick=1
  6. Ahora todas las particiones se han desbloqueado y habilitado como lectura/escritura. Revisa la estructura del chip SPI, para identificar a la partición bs (que en nuestro caso, está en mtd7).
    root@n16p1:~# cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 00060000 00010000 "u-boot"
    mtd1: 00010000 00010000 "u-boot-env"
    mtd2: 00790000 00010000 "firmware"
    mtd3: 00140000 00010000 "kernel"
    mtd4: 00650000 00010000 "rootfs"
    mtd5: 002a0000 00010000 "rootfs_data"
    mtd6: 00790000 00010000 "ubnt-airos"
    mtd7: 00020000 00010000 "bs"
    mtd8: 00040000 00010000 "cfg"
    mtd9: 00010000 00010000 "EEPROM"
    
  7. Descarga al router el archivo UnifiAcApLite_mtd7_bs_kernel0.bin, en la carpeta /tmp.
  8. Vamos a sobreescribir esta partición bs, quizás quieras tener backups. Ahora ejecuta:
    1. mtd write /tmp/UnifiAcApLite_mtd7_bs_kernel0.bin bs

Fase 2: Instala el firmware final que desees

  1. No reinicies. Ahora sí, descarga el firmware LEDE que quieras usar (versión sysupgrade), y ejecuta:
    1. sysupgrade -n /tmp/lede-17.01.3-ar71xx-generic-ubnt-unifiac-lite-squashfs-sysupgrade.bin
  2. Si el aparato te pregunta reiniciar, dile que sí. Luego de ésto, ya tendrás LEDE en el AP.
  3. Fin.

Explicando los pasos

Ubiquiti maneja una estructura de la memoria en sus APs un poco rara, pero que cada vez es más común en entornos profesionales y alguno doméstico: dos particiones para el firmware. Así, estos aparatos se pueden actualizar automáticamente y de forma masiva, sin riesgos. Si una actualización falla, el antiguo firmware puede ejecutarse de nuevo y minimizar el tiempo de no-actividad del AP.

LEDE se conforma bien con tomar la primera partición, pero el proceso de instalación de Ubiquiti no le garantiza que sea así:

  • Por defecto los APs vienen con su firmware en kernel0.
  • Al desactualizar el aparato a la versión 3.4.7, éste firmware se carga en kernel1, y el bootloader de Ubiquiti se configura para bootear éste kernel1, modificando un byte en la partición bs.
  • LEDE espera estar en kernel0.
  • Por eso necesitamos instalar el firmware de fase 1 en ambas particiones:
    • si se copia sólo en kernel0, LEDE nunca se ejecutará.
    • Si se copia en sólo kernel1, LEDE arrancará bien su kernel, pero intentará montar los sistemas de archivos (la base squashfs y el jffs2) desde kernel0, donde obviamente no están: ésto genera un kernel panic, y por consiguiente, un soft brick.
  • Si copiamos nuestro firmware final a ambas particiones, puede funcionar, pero será un caos terrible intentar actualizarlo, etc. Es mejor corregir ésto.
  • Para arreglar éste desastre, copiamos el firmware de fase 1 a ambos bloques y corregimos la partición arrancable del bootloader, flasheando con mtd-rw una partición bs modificada.
  • Así el bootloader arrancará kernel0 y LEDE estará contento. Tareas como el sysupgrade volverán a funcionar.

Partición bs

  • ¿Qué significa bs? Quizás boot-selector, o algo así.
  • Ésta partición prácticamente no tiene datos propios del AP: en varios AP de un mismo batch, he verificado que no hay diferencias entre particiones bs, y que un sólo bs modificado sirve para todos.
  • El primer byte hexadecimal de la partición bs determina la partición a arrancar: un 0 significa kernel0, y un 8 significa kernel1.
  • Aquí tengo un bs que bootea kernel0 y otro bs que bootea kernel1, por si quieres ver las diferencias de ambos con hexdump.
  • Si estás seguro de que tu AP (sea un AC AP Lite o no) bootea su firmware oficial desde kernel0, puedes copiar su partición bs al principio, y luego restaurarla cuando necesites corregir el orden, teniendo LEDE ya.