起因

由于校园网资费有点贵,在加上学校把校园网口装门上了,桌位又离得远,一直以来我都是用带有大量校内基站流量的校园卡配合随身 wifi 上网的。但是我想过墙方便一些,于是想弄一个路由器装科学插件配合校园卡上网。这种插卡路由器产品称作 cpe,但是看了一圈几乎没有 cpe 能刷 openwrt 等第三方系统的,少数支持的产品,要么价格贵要么买不到,于是只好放弃这条路。又想到随行 wifi 可以通过 usb 接口共享网络,查阅了 openwrt 的 wiki 得知 openwrt 是支持这种上网方式的,于是最后的方案是找一个有 usb 接口,能刷 openwrt 的路由器,将随行 wifi 插到 usb 口上,路由器通过随行 wifi 连接网络。这样以来成本也低,还能利用上已经有的设备。

我手上的产品是华为的随行 wifi 2 mini,型号 E8372h-820,支持 4g 全网通。之所以不买 5g 设备是因为现在的 5g cpe/随行 wifi 产品价格实在太贵,最便宜的是采用紫光春藤芯片的联通 vn007,海鲜市场价格九百多,其余产品价格全都在两千以上,完全承担不起。考虑到 4g 的速率实测只能跑到 10 ~ 30 Mbps,路由器可以不用选多好的,带 usb 2.0 接口的百兆路由器都够了。只要能满足需求,价格越低越好。经过一番调查,最后在闲鱼上 60 块包邮入手了网件 R6220。

R6220 用的是烂大街的 MT7621 方案,soc 是 7621 家族的单核版本 MT7621ST,wifi 方案是 MT7603EN + MT7612EN 的 2.4Ghz + 5Ghz 的搭配,128MB 的 NAND 闪存和 128 MB 的 RAM,有一个 usb 2.0 接口。虽说这一套配置挺垃圾的,不过挂个代理还是够的。关键是这货有 openwrt 官方支持(wiki 页面),MT7621 能刷的固件也多,好玩就行!

机器到手,网件对这个低端产品用料十分扣,整机很轻,一个做工比御三家百元路由差远了的大塑料外壳。。。内部有大量的剩余空间。机器被上家刷了 padavan 并刷入了 breed。

但是我发现随行 wifi 被外壳阻挡插不进去。。。于是只好暴力改造,用老虎钳把上面那块塑料给扬了。

能用就行

物理连接完了,之后开始设置

openwrt

breed 下刷入

rootfskernel 两个 squashfs 的 bin 打包成 zip,路由器上电后捅住 Reset 键进入 breed 控制台,在 breed 中当作固件刷入就可以了。

安装必要软件包

openwrt 的这篇 wiki 提供了详细的指导。要让 openwrt 支持 rndis 模式的 usb 网卡,需要安装 kmod-usb-net-rndisusb-modeswitch 两个软件包。之后重启路由器就可以看到多出来一个 eth1 接口。

但是,由于路由器这样上网的方式很少见,目前绝大多数民间编译的自制固件不会包括这两个软件包,而基于 lean LEDE 源码的那些固件不能用 opkg 软件仓库,这意味着想要以这种方式上网只能用官方 openwrt 或者自己编译。

保留分区

R6220 这机器有 128MB 的 NAND 闪存,然而当我折腾了几个花里胡哨的功能时,再安装软件却提示空间不足。仔细一看,发现 overlay 分区预留的剩余空间只有 20MB,这不像是个 128MB 的机器啊!后来仔细看了一下 R6220 的 wiki,发现 R6220 的出厂分区布局竟然是这样的:

分区布局

最后有个 60MB 的“保留”分区(reserved)!这么大的保留空间就离谱,而 openwrt 为了保持对原厂固件的兼容性,没有改变分区布局,结果用起来就像 64MB 的机器一样。据说是因为网件打算出 R6220 的 64MB 闪存的缩水版机器。。。

根据其它人的测试,这个保留分区里面的确没什么有用的东西,要利用它的空间也是可行的,wiki 给出了利用保留分区的方法,不过 wiki 只告诉你如何激活并挂载这个分区,同时警告瞎搞有变成砖的风险。这篇 blog 则提供了让 opkg 安装软件到保留分区的指导,做法就是新建一个 opkg 的安装目标位置到保留分区,然后将保留分区内的软件安装目录添加到环境变量中,这样就真正利用了保留分区的空间。

但是这个做法实际上有很多问题,首先只有在命令行中使用 opkg 才能指定安装位置,在 luci 里仍然是安装到 overlay,而且通过这种方式安装的很多软件仍然是没法用的,而且安装在保留分区内的软件包无法被 opkg 检测到,相当于独立于系统之外了。诚然,理论上是可以解决这个问题的,但是我对 openwrt 和嵌入式 linux 不熟悉,没有能力解决。

之后想到的办法是修改分区布局重新刷入系统。然而,经过研究发现分区布局信息是写入 openwrt 固件的,必须自己克隆源码,手工修改分区表信息然后编译固件。在 openwrt 论坛上有个网件 R7800 的成功案例。但是,分区的起始和结束位置是 16 进制写死的,奇葩的分区布局又让我没法通过合并分区的方法来增大 ubi 分区。要达到目的必须把有用的分区进行备份,修改分区布局后再恢复数据,操作失误就会变砖。同时如果计算分区起始位置出现偏差,也会成砖,最坏的情况下需要把闪存吹下来上编程器重写。我手上没有任何救砖工具,变砖对我来说就等于报废,考虑到操作的难度和风险,还是放弃了这个办法。

意想不到的问题

既然空间有限搞不了那么多花里胡哨的功能,那就只装个小猫咪安心上网,反正最初的需求已经满足了。但是用了一个多星期之后 openclash 突然起不来了(没有更改配置,路由器每晚会随学校断电),日志是说 ruby 未找到,但是 ruby 当初是作为依赖已经安装了的,opkg 也显示已安装。在控制台执行 ruby,没有任何输出,等几分钟都没反应。Ctrl-C 杀掉,抛出错误提示无法载入一些 lib。这个问题很奇怪,在 google 上搜索也找不到什么有关的信息。实在找不到解决方案只好重新刷写了系统。用了一段时间,问题复现。

再一次准备刷机时突然想到这路由器是 NAND 闪存,NAND 闪存是有坏块问题的。于是开始推测这是不是问题根源,在网上找了个自编译固件刷入,发现重启后会丢失所有配置还原到刚刷入时的状态,开始有理由肯定坏块是问题根源了。但坏块问题是无解的,出厂时会做屏蔽坏块处理,我这么频繁刷机恐怕也会刷出新的坏块了。于是放弃挣扎,重新刷入系统配置好一切后在 luci 面板里备份 openwrt 所在的 ubi 分区(对应 mtd3),当问题再次复现时,使用 scp 传分区镜像到路由器的/tmp 分区,然后 ssh 上去使用 mtd 命令刷 ubi 分区,重启就活过来了。(mtd 的详细用法参见 openwrt wiki

这个问题倒也不是很频繁的出现,一个月两三次,手动刷一下倒也不不是很麻烦,想着干脆就这样用下去了,哪天刷到闪存报废,就直接换个路由器。

然而,就在这个星期,开始出现早上来电后系统无法启动, usb 口也不上电的问题,断开电源几秒后再通电又能正常启动。。。这样的玄学问题实在是忍不了了。不过既然上家用的好好的,只好认为问题是“openwrt 固件 + 这台机器与众不同”导致的。于是刷了 padavan 看看能不能解决。

padavan

padavan 源码有提供对 R6220 的支持,不过 padavan github 仓库和 bitbucket 上没有提供 R6220 的预固件下载。用的是恩山论坛上这个帖子提供的固件,USB 应用里打开 USB 网卡就能用了。固件自带酸酸乳,用了几天没有出现问题,非常惊喜,也许从此就能稳定使用了!

启用 USB 网卡

11月27日更新:WAN 设置那里开了硬件 NAT 加速之后会极频繁地断网,可能是用 USB 网卡不支持该功能或者固件不支持,而开启 shoutcut-fe 加速后稳定使用,测速了几次,开启之后貌似快了 0.几 Mbps,提升巨大(瓶颈在 4g 上所以看不出明显提升)

编译 padavan

目前这个 padavan 固件很稳定,不过 padavan 还是有更多插件的,就打算自己编译一个玩玩

padavan 最初的源码在 bitbucket 上,国内的 hanwckf 大神做了一个修改版放在 github 上,不过 hanwckf 的源码里不包括插件,更为广泛使用的是 chongshengB 的源码,集成了一些插件,然后还有无数的 fork 自 chongshengB 的基于机型定制优化的源码…

hanwckf 的源码给 R6220 提供了支持,但是需要插件所以不用。chongshengB 的源码又没有支持 R6220,最后还是用了目前用的这个固件的源码。根据管理页面的页脚信息找到源码仓库,folk 了一份,给 R6220 单独做一点定制。

编译准备

参考 hanwckf 源码仓库的 README,要注意源码一定要克隆到 /opt/rt-n56u 下。全程用 root 用户操作。

修改管理页面页脚信息

trunk/user/www/Makefile 文件内的 LABEL_COPYRIGHT_TEXT= 的内容就是管理轧棉的页脚 copyright 信息,注意 / 前需要加 \ 转义

替换 trunk/user/www/n56u_ribbon_fixedhttps://img.moe233.net/bootstrap/img/asus_logo.png,注意文件大小。

修改默认管理地址、wifi、ntp 设置等信息

编辑 trunk/user/shared/defaults.h,这些是默认配置,大部分都可以之后在管理页面里修改的。

为 R6220 定制

修改插件设置

编辑 /trunk/build_firmware_modify,选择哪些插件功能要添加到固件中,取消注释就是不添加这个功能,注意固件不能超大小不然不能正常使用。

去掉了文件管理

编译

/opt/rt-n56u/trunk 目录中执行 fakeroot ./build_firmware_modify R6220 进行编译,编译完成后会在 trunkhttps://img.moe233.net 目录下生成 trx 文件,这个就是固件文件。可直接在 breed 下刷入。

11月29日更新:由于换了个 trojan 机场,padavan 上的科学插件不支持,所以用回 openwrt 了,在恩山上找了个固件,目前稳定使用中

题外话

上网卡托的工作模式

RNIDS 是微软主导开发的一个网络共享协议,意在提高诸如 usb 上网卡这样的设备的易用性。在这种工作模式下设备和电脑之间形成一个局域网,设备作为网关。RNDIS 简化了设备的设置过程,只需要像普通路由器登录一个 Web 管理页面就能完成网络设置。缺点是多了一层 NAT,对性能有影响,相当于路由器 lan 口接路由器。目前市场上绝大部分 usb modem 都是这种工作模式

一些 usb modem 支持切换工作模式。NCM(Network Control Model) 是其中的一种,它是一个 usb 上的网络控制协议,提供更底层的网络配置接口。openwrt 支持该协议,详见 wiki,除此之外,使用高通芯片的产品支持 qmi 协议,支持一些移动网络相关的配置,openwrt 也支持 qmi 协议,看 wiki 获取更多信息。

使用 NCM 或者 QMI 模式的意义在于让 modem 把自己的控制权交给 openwrt,没有 RNDIS 的那层 NAT,性能会更好。还能让 openwrt 收发短信,实现通话功能,变成真正意义上的 cpe。但是最难一步的是改变 modem 的工作模式,厂商不公开产品资料,网上成功更改工作模式的案例极少。