BookinglyTech News
Software

NixOS en un Steam Link: kexec como módulo para saltarse el kernel firmado de Valve

Un desarrollador documenta cómo instalar NixOS en un Steam Link de 2018 y cómo compilar el soporte de kexec como módulo de kernel para el firmware de Valve.

2 min de lecturaLobsters0 vistas

Un Steam Link comprado de rebajas en 2018 y todavía encendido sin quejarse puede servir para bastante más que para recibir el streaming de juegos. Un desarrollador ha documentado cómo instalar NixOS en el aparato y, de paso, ha tenido que resolver un problema que se repite en muchos dispositivos cerrados: cómo arrancar un kernel propio cuando el bootloader solo acepta kernels firmados por Valve.

El Steam Link tiene justo lo que se le pide a un cacharro siempre encendido: ARM de bajo consumo, Ethernet, WiFi, Bluetooth y varios puertos USB. La parte difícil ya la había resuelto antes un tal fijam: el bootloader solo arranca kernels firmados, así que el truco consiste en entrar con el kernel bendecido y hacer kexec al nuevo. El problema es que el kernel que Valve distribuye no está compilado con CONFIG_KEXEC, o sea que no hay llamada al sistema que invocar.

Kexec, pero como módulo

La salida pasa por juntar los ficheros fuente de kexec en un módulo de kernel mínimo que añade la llamada al sistema en caliente. Varios proyectos ya habían usado esta técnica, pero copiando el binario y el módulo ya compilados de la web de fijam. El autor prefiere no bajarse módulos de kernel de internet, así que lo compiló él mismo.

Ahí está el trabajo real: el kernel objetivo es un fork vendorizado de hace trece años, la versión 3.8.13 del SDK de Steam Link. Compilar un módulo contra eso obliga a apuntar Kbuild a un checkout del kernel ya construido con make modules, como explica la documentación oficial de módulos del kernel. La wiki de NixOS ayuda con las trampas de las flags de hardening que stdenv activa por defecto y que rompen este tipo de compilaciones. Hay además parches heredados de postmarketOS para los avisos de gcc 10 y algún bug del compilador en arch/arm.

Cross-compilar con Nix

Montar el espacio de usuario y el initrd de NixOS es la parte sencilla: se le pasa el system y los pkgs correctos a lib.nixosSystem y se añaden los módulos. Elegir la arquitectura fue menos directo. El toolchain de Valve usa armv7a, pero importar nixpkgs con crossSystem.config = "armv7a-unknown-linux-gnueabihf" se lleva mal con la maquinaria de compilación de Go, así que el autor tiró por armv7l, que considera equivalente. El resultado está en el repositorio de Ondra-Zik que recoge configuraciones de este tipo para el aparato, con la definición del módulo kexec y la del kernel antiguo.

El interés de la pieza no está en el Steam Link, que Valve descatalogó hace años, sino en el método. El kernel mainline ya lleva un device tree para este dispositivo, así que el hardware no está muerto del todo y sirve como nodo de bajo consumo con un Linux moderno encima, siempre que a alguien le apetezca mantenerlo. La técnica de inyectar kexec como módulo se puede repetir en cualquier aparato cuyo bootloader solo acepte firmas del fabricante, que no son pocos.