给 Steam Link 装上 NixOS
来源: feyor.sh — 2026-09-26
概述
作者在衣柜里翻出一台 2018 年闪购的 Steam Link,想到这台常年在线、带以太网、WiFi、蓝牙和多个 USB 口的低功耗 ARM 设备很适合跑点东西,于是开始折腾 NixOS。难点在于 bootloader 只认 Valve 签名的内核,所以要先进入官方内核再用 kexec 切换;而官方内核没开 CONFIG_KEXEC,他就把相关源码塞进一个最小内核模块,给运行中的系统补上 kexec 系统调用。全文记录了交叉编译、盲测启动、精简系统闭包的全过程。
核心要点
- Steam Link 的 bootloader 只引导 Valve 签名的内核,绕过的办法是先启动官方内核、再用 kexec 载入自己的内核。
- 官方内核没有开启 CONFIG_KEXEC,作者把 machine_kexec.c、kexec.c、relocate_kernel.S 拼成一个最小内核模块,为运行中的内核补上 kexec 系统调用。
- 他拒绝直接下载别人编译好的内核模块,选择自己从源码构建,并为此打了多个适配新 GCC 的补丁才能编过基于 3.8.13 的老内核。
- 交叉编译目标从 Valve 工具链的 armv7a 改用 armv7l,因为 armv7a-unknown-linux-gnueabihf 与 nixpkgs 中的 Go 构建管线配合不佳。
- 调试过程几乎是全盲的:HDMI 输出在新内核下不可用,又不想拆机接 UART,于是一开始用会在若干秒后自动重启的 BusyBox initramfs 作为成功信号。
- 后续通过开启 initrd 网络、向笔记本做 Netcat 反弹 shell,并给 availableKernelModules 加上 reset_berlin 才能读 USB 盘,最终成功进入用户空间并 SSH 登录。
- 精简系统闭包时最大的收获是:体积庞大的 linux-firmware 里其实只需要一个固件 blob,单独复制出来即可省下大量空间。
- 因为 kexec 启动流程让 NixOS 的运维工具失去意义,他连 Nix 本身都从系统里删掉,最终把一个 2.3GB 的 USB 镜像压到 1.2GB 并宣布「够用了」。
金句
这里最巧妙的地方在于:我们可以把 kexec 相关的源码文件拼成一个极小的内核模块,从而给正在运行的系统补上 kexec 系统调用。
👍 0
👎 0
← 返回 Lobsters 首页