熬了一个通宵,在爱快软路由 iKuaiOS 系统上实现了 musl 兼容层,使整个 OpenWrt 的软件包生态可以原生运行在爱快上,不需要虚拟机、Docker 装 OpenWrt ,总之也是 https://www.v2ex.com/t/1206925 闲鱼插件哥给的灵感,不过 iKuai 的国内用户量是真的很大,稳定性和多 IPv6 线路、流控能力都广受好评,那么好的系统连一个 root 都没有,生态封闭得爱快云上只有一个 Docker 插件,想装个 htop 、tcpdump 都不行。
大概研究了下,iKuai 的 binary 用的是 uClibc ,而新的 OpenWrt 用的是 musl libc ,因此两者不兼容直接跑会报错。得益于 OpenWrt 有 20k+的软件包,我从一开始补 opkg 、chroot openwrt 到最后的 musl 支持,向各位 V 友汇报。
不过爱快都在搞 4.0 了,3.7.x 本身就没在维护了,就当 EOL 前的狂欢吧。
Linux 内核支持同时运行多种 libc的程序,每个 ELF 二进制文件在 header 里指定了自己的动态链接器( interpreter ):
uClibc 程序: /lib/ld64-uClibc.so.0
musl 程序: /lib/ld-musl-x86_64.so.1
glibc 程序: /lib64/ld-linux-x86-64.so.2
内核根据 ELF header 自动选择对应的 linker 。只要把 musl 的 linker 放到 iKuai 上,musl 程序就能跑。
# 从 OpenWrt rootfs 中获取 musl linker
# ld-musl-x86_64.so.1 实际上就是 musl libc.so 的 symlink
ln -sf /path/to/musl/libc.so /lib/ld-musl-x86_64.so.1
musl 的 linker 使用/etc/ld-musl-x86_64.path(类似 glibc 的ld.so.conf):
echo "/path/to/musl/libs" > /etc/ld-musl-x86_64.path
echo "/path/to/musl/usr/lib" >> /etc/ld-musl-x86_64.path
echo "/usr/lib" >> /etc/ld-musl-x86_64.path
opkg 是 OpenWrt 的包管理器。我们使用了一个glibc 静态编译版本( 680KB ),可以在 iKuai 上原生运行:
opkg update # 更新 6 个 OpenWrt 仓库
opkg install --force-depends --force-space --force-checksum htop
$ /usr/bin/htop --version
htop 3.3.0
$ /usr/bin/tcpdump --version
tcpdump version 4.99.4
libpcap version 1.10.4
musl 程序和 uClibc 程序在同一个 iKuai 系统上和平共处!
Docker 在软路由上需要额外资源(内存、存储),而且官方 Docker 插件版本老旧。很多时候你只是想装个小工具,不值得开 Docker 。
最初我们尝试了 chroot 方案(下载一个 mini OpenWrt rootfs ,chroot 进去用)。可以工作,但:
有些人直接刷 OpenWrt 。但 iKuai 的多 WAN 、流控、行为管理是 OpenWrt 做不到的。
musl 兼容层是最轻量的方案:一个 symlink + 一个 path 文件 = 整个 OpenWrt 生态。
我们把这些工作整合成了Naixi——一个 iKuai 增强固件:
Naixi Plugin Manager
插件管理:
naixi list 列出所有插件
naixi install <file|url> 安装插件(tar.gz)
naixi enable <name> 启用插件
naixi disable <name> 禁用插件
OpenWrt 兼容层:
naixi opkg install <包名> 安装 OpenWrt 包(原生运行)
naixi opkg update 更新包列表
naixi opkg list 列出可用包
# https://dl.naixi.net/ikuai-naixi/naixi_latest.sh
=== 已安装组件 ===
✓ docker v202102031900 [naixi] 运行中
✓ lucky v1.1.16 [naixi] 运行中
✓ opkg v1.0.0 [naixi] 运行中
✓ shell v202306081801 [pmd] 运行中
· htop 3.3.0-1 [opkg] 已安装
· tcpdump 4.99.4-1 [opkg] 已安装
云平台控制: Level 2
musl 兼容层: ✓ 已初始化 (12.6M)
opkg 原生环境: ✓ 已初始化 (opkg version 0.7.0)
四种来源的组件统一管理:
iKuai 的 rootfs 在内存中,重启后 opkg 装的包会丢失。Naixi 通过 boot 脚本自动恢复:
# 安装时自动记录
opkg list-installed > /etc/log/naixi/opkg-installed.txt
# 重启时自动恢复
opkg update && cat opkg-installed.txt | awk '{print $1}' | xargs opkg install --force-*
很多人以为 iKuai 基于标准 Linux 发行版( glibc )。实际上 iKuai 使用的是uClibc:
$ /lib/ld-musl-x86_64.so.1 --list /usr/sbin/tcpdump
/lib/ld64-uClibc.so.0 (0x7f4b1e325000)
libc.so.0 => /lib/ld64-uClibc.so.0
这意味着:
iKuai 自带 overlay filesystem 在/usr上:
overlay on /usr type overlay (rw,relatime,lowerdir=/usr,upperdir=/overlay/upper,workdir=/overlay/work)
opkg 安装的文件通过 overlay 写入,但/overlay/upper在 tmpfs 中。Naixi 通过记录+重装方式解决持久化。
理论上 OpenWrt x86_64 仓库的所有包都能安装。已验证:
| 包名 | 版本 | 状态 |
|---|---|---|
| htop | 3.3.0 | ✅ |
| tcpdump | 4.99.4 | ✅ |
| opkg | 0.7.0 | ✅ |
| curl | - | 待测试 |
| python3 | - | 待测试 |
| luci | - | 需要 ubus ,受限 |
安装任意官方爱快 ISO ,由于是 rootfs 系统随便装个3.7.x 版本就行
Naixi v61v3 (3.7.19): 下载固件并升级
启动 SSH ,前往系统设置-->登录管理-->远程访问-->远程维护:

用户名:sshd ,密码就是你设置的那个远程维护密码,登录后就是 root 权限。
安装 opkg 插件:naixi install https://dl.naixi.net/ikuai-plugin/opkg.tar.gz
开始使用:opkg update && opkg install htop
执行htop可见 ik_rc_client 等爱快进程
插件可通过 naixi list查询列表及运行状态
仅用于探索 iKuai 系统的可扩展性,使用naixi指令前请了解:
修改固件可能影响稳定性
云控阻断可能影响官方功能更新
建议在测试环境验证后再用于生产
启动时,将会由naixi_boot进行挂载,可使用cat /tmp/naixi_boot.log查看日志

102
Crueyl Apr 24
@earpiece5631 大好人,我备份的 naixi-compat-x86_64.tar.gz 的包不小心发错人了,碰巧自己的还删了,如果您那有备份,本人不胜感激,如果还能发给我的话,本人愿意忍痛割爱一下,,[email protected]
|
103
CCNemo Apr 27
这个牛了~分析的不错,官方不会找麻烦吧?
|
104
earpiece5631 7 days ago
@Crueyl 我没有备份,而且已经想好不玩爱快了,网络环境越来越严峻了,早点抽身免喝茶吧。
|
105
loveyouluobin 7 days ago
大神,搞出一个成品出来,造福一下广大的,爱快使用者们。。
|
106
loveyouluobin 5 days ago
@lxxiil 能不能有一个集成好了直接装 OP 应用的版本放出来呢,那真的会成为一代经典了。
|