在 iKuai 爱快软路由上原生运行 OpenWrt 软件包

4 月 19 日
 Nyarime

熬了一个通宵,在爱快软路由 iKuaiOS 系统上实现了 musl 兼容层,使整个 OpenWrt 的软件包生态可以原生运行在爱快上,不需要虚拟机、Docker 装 OpenWrt ,总之也是 https://v2ex.ih06.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 程序就能跑。

实现步骤

1. 放置 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

2. 配置库搜索路径

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

3. 安装 opkg 包管理器

opkg 是 OpenWrt 的包管理器。我们使用了一个glibc 静态编译版本( 680KB ),可以在 iKuai 上原生运行:

opkg update    # 更新 6 个 OpenWrt 仓库
opkg install --force-depends --force-space --force-checksum htop

4. 验证

$ /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 插件版本老旧。很多时候你只是想装个小工具,不值得开 Docker 。

不用 chroot

最初我们尝试了 chroot 方案(下载一个 mini OpenWrt rootfs ,chroot 进去用)。可以工作,但:

不用刷 OpenWrt

有些人直接刷 OpenWrt 。但 iKuai 的多 WAN 、流控、行为管理是 OpenWrt 做不到的。

musl 兼容层是最轻量的方案:一个 symlink + 一个 path 文件 = 整个 OpenWrt 生态。


Naixi 项目

我们把这些工作整合成了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 用的是 uClibc ,不是 glibc

很多人以为 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

这意味着:

overlay 持久化

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 包

理论上 OpenWrt x86_64 仓库的所有包都能安装。已验证:

包名 版本 状态
htop 3.3.0
tcpdump 4.99.4
opkg 0.7.0
curl - 待测试
python3 - 待测试
luci - 需要 ubus ,受限

下载安装

用户名:sshd ,密码就是你设置的那个远程维护密码,登录后就是 root 权限。

安装 OpenWrt 运行环境

  1. 安装 opkg 插件:naixi install https://dl.naixi.net/ikuai-plugin/opkg.tar.gz

  2. 开始使用:opkg update && opkg install htop

  3. 执行htop可见 ik_rc_client 等爱快进程

  4. 插件可通过 naixi list查询列表及运行状态


安全声明

仅用于探索 iKuai 系统的可扩展性,使用naixi指令前请了解:


关于

11139 次点击
所在节点    OpenWrt
113 条回复
Cooky
4 月 19 日
大佬牛逼
xiaowowo
4 月 19 日
大佬牛逼,这种操作官方不会找麻烦吗?
Nyarime
4 月 19 日
@xiaowowo 1 没收钱 2 资料来自于网上 3 那些闲鱼收钱的官方应该先去找 4 留后门 sm 答毕
laminux29
4 月 19 日
倒反天罡了。

之所以买 iKuai 的硬件,因为要跑有授权的 iKuai ,这玩意某些功能比 OpenWRT 要方便得多,但因为这个原因,iKuai 的硬件的性价比,比闲鱼上的 x86 或 Arm 的迷你小主机低得多。

如果你想跑 OpenWRT ,应该自己去买 x86 或 Arm 的迷你小主机,这样性价比更高。
Nyarime
4 月 19 日
@laminux29 其实免费版和企业版就 5KB 差距,一个 sed 命令就能变企业版:
sed -i 's/FIRMWAREID=10001/FIRMWAREID=10002/' /etc/release
imnpc
4 月 19 日
ssh 登陆后好像不能运行命令行?只能 选择 ikuai 操作菜单?
mikj
4 月 19 日
大佬厉害
jxlpjdh88
4 月 19 日
大佬牛逼!
Kinnice
4 月 19 日
ikuai 的老版本因为内核低,实际性能并不如新版 op ,有看下 4.0 有什么提升吗
Nyarime
4 月 19 日
@imnpc 你得传我做的 bin 上去升级... 官方版的就是 rc.console
chengran630
4 月 19 日
大佬 你这个会被官方远程格式化么
Nyarime
4 月 19 日
@lcy630409 已经 hook 掉了,如果你要自己解包组装 bin 可以用下 nyarcPro
# 0. 装工具:xz-utils + e2fsprogs
apt install xz-utils e2fsprogs # Debian/Ubuntu

# 1. 看一眼是啥版本
nyarc --fw-detect iKuai8_x64_3.7.19.bin
nyarc --ikuai-header iKuai8_x64_3.7.19.bin

# 2. 解密 rootfs (自动判断 fixed/dynamic key )
nyarc --ikuai-decrypt iKuai8_x64_3.7.19.bin rootfs.xz

# 3. 解压成 ext2 镜像并挂载
xz -d rootfs.xz # → rootfs (ext2)
mkdir -p /tmp/rootfs
mount -o loop rootfs /tmp/rootfs

# 4. 改你想改的(示例:改 root 密码 / 加开机脚本 / 屏蔽云控)
sed -i 's|^root:[^:]*:|root:$1$naixi233$AgpY4n3TdEDVt/AjLuM/y.:|' /tmp/rootfs/etc/shadow
sed -i 's/59.110.6.135/127.0.0.1/g' /tmp/rootfs/usr/ikuai/script/client.sh

# 5. 改完卸载
umount /tmp/rootfs

# 6. 重新 XZ 压缩(必须 CRC32 !内核不认 CRC64 )
xz -6 --check=crc32 rootfs # → rootfs.xz

# 7. 加密回去
nyarc --ikuai-encrypt rootfs.xz rootfs.enc fixed
# 3.7.22+/4.x 是 dynamic key:
# nyarc --ikuai-encrypt rootfs.xz rootfs.enc dynamic <对应版本 key>

# 8. 整包打回 .bin (自动算 hash + 拼 header )
nyarc --ikuai-repack <unpack-dir> iKuai8_x64_3.7.19_modded.bin
s1oz
4 月 19 日
佬能补下 tproxy 吗,残缺手动补了启动就噶了
Nyarime
4 月 20 日
@s1oz 目前在更新 v62 处理掉 vim 、nano 这类安装问题,已推送到 dl 可自行更新(老版本卸载 openwrt 环境时会把整个 libc 都移除导致 ikuai 无法进入,只能到控制台( rc.console )执行 6 恢复,或者使用官方免费版 ISO 引导保留配置升级
# v69 升级包
https://dl.naixi.net/ikuai-naixi/iKuai8_x64_3.7.19_Naixi_v69.bin
# 升级后在 SSH 执行
naixi openwrt uninit # 卸载原先的分包
naixi openwrt init # 获取最新的
注:如果在国内请自行下载 https://dl.naixi.net/ikuai-plugin/naixi-compat-x86_64.tar.gz 然后使用直链
naixi openwrt init <url>
# 案例:安装 nano 、vim
opkg install nano
opkg install vim

尽量迭代(因为 ikuai 的配置分区是保持的,所以不管 rootfs 用哪个版本的都会保留读取
也修复了应用列表里的 naixi list ,如果要装 proxy 类插件可能确实是需要适配一下的
beck8
4 月 20 日
大佬最近有在玩 4.0 不 4.0 也是差不多的搞 root 方法吗
domingocbk
4 月 20 日
大佬牛逼
Nyarime
4 月 20 日
@beck8 nyarc 是可以拆 4.0 的
我在修补 v69 后发了一个详版,你可以使用工具自己组装定制自己的爱快
https://forum.naixi.net/thread-11395-1-1.html
beck8
4 月 20 日
@Nyarime 我好像反应过来了,我还关注你推特了。naixi 请问邀请码我应该从哪获取呢?
Nyarime
4 月 20 日
@beck8 你直接找我 t.me/BaiPiaoZhenXiang 就好,v 站好像没私信功能
jhsunnyshine
4 月 20 日
大佬,太牛逼了,你们这群貂毛为什么这么雕👍🏻

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1206946

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX