Miao's Blog

GL.iNet MT3600BE 路由器折腾备忘

在帝都读博需要租房装网,借此理由买了一个 OpenWrt 路由器折腾。在比较之后,我选了最新发布的 GL-MT3600BE,基于联发科的 MT7981B Dual-core CPU,还有 WiFi 7 可以战未来。一直以来对 GL.iNet 广联智通这个品牌都很有好感,因为它的路由器都是基于 OpenWrt,开放系统可玩性强,可以自行编译定制,出海做的也做的很好,属于是在国外比国内名气大得多。

这台机器很小巧精致,也很有分量。用了一段时间,总体来说非常满意,但是运行内存只有 512M 就实在有点吝啬了,但是也不是不能用。本文记录对 GL.iNet MT3600BE 路由器进行的一系列深度定制操作,包括修改地区代码以解锁功率和频段限制、安装 ZRAM 压缩内存、手动部署 PassWaXX、OpenClaXX 以及优化 AdGuard Home 的存储限制,给自己以后折腾留个操作备忘。

1. 修改地区为 US 1

GL.iNet 的 CN 版本固件在特殊网络软件、无线功率和频段上存在限制。通过修改底层工厂数据中的地区代码,可以解锁 US 区域限制。

风险警示:此部分涉及直接读写 /dev/mtdblock 分区。该操作具有设备特异性,错误的偏移量会导致设备变砖。在执行前务必核对设备型号及分区表,并做好备份。

首先确认当前代码位置。如果输出不包含 CN 或其他预期代码,请勿继续执行

dd if=/dev/mtdblock3 bs=1 count=2 skip=16520 2>/dev/null | hexdump -C

确认无误后,将 US 写入对应偏移量并强制同步数据:

echo -n "US" | dd of=/dev/mtdblock3 bs=1 seek=16520 conv=notrunc
sync

再次读取检查,确认输出已变为 US,随后重启设备生效。

dd if=/dev/mtdblock3 bs=1 count=2 skip=16520 2>/dev/null | hexdump -C
reboot

2. 软件源与依赖准备

切换为 US 地区后,GL.iNet 的 OpenWrt 的默认镜像源会指向其海外服务器 fw.gl-inet.com,在国内网络环境下速度极慢。所以需要将其切回国内:

sed -i 's/fw.gl-inet.com/fw.gl-inet.cn/g' /etc/opkg/distfeeds.conf
opkg update

PassWaXX 依赖 luci-compat 以及特定的 OpenSSL 和 Lua 运行时环境,因此首先安装系统源中的兼容层:

opkg install luci-compat

接着,我们需要下载并安装以下两个特定的 IPK 包(来自 wukongdaily/gl-inet-onescript 仓库)2

wget https://github.com/wukongdaily/gl-inet-onescript/raw/master/theme/libopenssl3.ipk
wget https://github.com/wukongdaily/gl-inet-onescript/raw/master/theme/luci-lua-runtime_all.ipk
opkg install libopenssl3.ipk luci-lua-runtime_all.ipk

3. 安装 ZRAM 压缩内存

对于只有 512MB 内存的设备,启用 ZRAM 可以有效缓解内存压力。ZRAM 会在内存中创建一个压缩的交换分区,通过牺牲少量 CPU 资源来换取更多可用内存。

opkg update
opkg install zram-swap

安装完成后,系统通常会自动启动一个默认容量(内存的一半)和默认算法(lzo)的 zram 设备。MT3600BE 的 CPU 不错,因此可以考虑更换压缩效率更高的算法。在更换算法前,先确认内核支持哪些算法:

cat /sys/block/zram0/comp_algorithm

可以得到类似 lzo lzo-rle lz4 zstd 的输出。列表里出现的都是可选的,方括号 [] 里的表示当前正在使用的。zstd 效果应该是最好但是实测在 GL-MT3600BE 上无法初始化,会报 write error: Out of memory,这是因为 zstd 初始化时申请内存过大。最终只能使用平衡的 lzo-rle。由于 GL.iNet 设备将 ZRAM 配置集成在主系统配置文件中,使用 uci 工具进行修改:

# 设置压缩算法(推荐 lzo-rle,平衡型,OpenWrt 官方默认)
uci set system.@system[0].zram_comp_algo='lzo-rle'

# 设置 zram 容量大小(例如 256MB)
uci set system.@system[0].zram_size_mb='256'

# 保存配置
uci commit system

重启服务使配置生效:

/etc/init.d/zram restart

验证最终状态:

# 查看内存挂载情况,确认 Swap 栏的 total 数值与设置的大小接近
free -m

# 查看详细压缩统计,确认算法和容量是否正确
/etc/init.d/zram status

4. 手动安装 PassWaXX

由于官方源通常不包含此类插件,我们需要下载适配架构(aarch64_cortex-a53)的安装包。需要通过 GitHub 下载 PassWaXX 的 Release 包并解压:

wget https://github.com/OpenWrt-Passwall/OpenWrt-passwall/releases/download/26.1.13-1/passwall_packages_ipk_aarch64_cortex-a53.zip
unzip passwall*.zip

然后再安装透明代理模块。在安装前,先确保系统安装了 TProxy 相关的内核模块和 iptables 扩展:

opkg update
opkg install kmod-ipt-tproxy iptables-mod-tproxy

执行命令安装核心组件。这里精简了非必要的组件,仅保留核心功能以节省空间:

opkg install \
    chinadns-ng*.ipk \
    dns2socks*.ipk \
    microsocks*.ipk \
    tcping*.ipk \
    sing-box*.ipk \
    luci-app-passwall*.ipk \
    luci-i18n-passwall*.ipk

压缩包内的其他插件可根据实际需求按需安装。

5. 优化 AdGuard Home 存储限制

非 CN 版本的固件虽然内置 AdGuard Home,但受限于部分设备的内存/存储策略,其过滤器规则的存储镜像(Image)大小被硬编码限制在 5MB。这会导致稍微多加几条规则就无法保存,因此需要手动扩容该镜像文件。

首先停止服务并清理旧镜像,必须先卸载挂载点并删除旧的 .img 文件,否则系统不会重新创建:

/etc/init.d/adguardhome stop
umount /etc/AdGuardHome/data/filters/
rm /etc/AdGuardHome/data.img

编辑初始化脚本,将创建镜像的大小从 5M 修改为 10M

sed -i 's/5M/10M/g' /etc/init.d/adguardhome

重启路由器,系统在启动 AdGuard Home 时会自动创建一个新的 10MB 镜像文件,这下能多开启几个规则了。

reboot

虽然将存储空间扩大到了 10MB,但在内存较小的设备上(如 512MB RAM),加载过多的拦截规则(几十万条)极易触发 OOM (Out Of Memory) 导致进程崩溃或系统重启。

6. 安装 OpenClaXX

没忍住去闲鱼将内存升级到了 2GB,这一下子从老破小搬到大平层了。不用受制于内存,我就将 PassWaXX 换到了我觉得更好用的 OpenClaXX。

OpenClaXX 的安装更方便,根据项目说明来操作就行了。首先还是安装依赖:

pkg update
# 首先移除默认安装的精简版 Dnsmasq(如果有)
opkg remove dnsmasq
opkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base

然后去 OpenClaXX 仓库的 Release 页面选择对应的版本进行下载和安装:

wget https://cdn.gh-proxy.org/https://github.com/vernesong/OpenClash/releases/download/v0.47.055/luci-app-openclash_0.47.055_all.ipk -O openclash.ipk
opkg install openclash.ipk

安装完成后重启 OpenWrt 并重新登录控制台,就可以在菜单中看到 OpenClaXX 了。

不知道为啥 OpenClaXX 对内核的更新检测有些偏差,所以安装完毕后最好还是手动上传最新的 MihoXX 内核吧,不让用内置的自动更新了。

rm -f /etc/openclash/core/clash_meta
wget -O mihomo.gz https://cdn.gh-proxy.org/https://github.com/MetaCubeX/mihomo/releases/download/v1.19.20/mihomo-linux-arm64-v1.19.20.gz
gunzip -c mihomo.gz > /etc/openclash/core/clash_meta
chmod +x /etc/openclash/core/clash_meta
rm -f mihomo.gz

结语

折腾完毕,这台小路由器终于被我调教成了差不多理想中的样子。512MB 内存虽然捉襟见肘,但胜在稳定够用内存大了用得还是更爽。GL.iNet 的开放性确实名不虚传,希望能尽快适配新的 OpenWrt 版本,如果能升级内存大小那就更好了,主要是当前版本的联发科驱动占用内存太大。这应该不会是我最后一台 GL.iNet。

  1. GitHub: Zayrick/GL-iNet-GeoChanger

  2. GL.iNet 中文论坛