在给我的渣米r3路由器刷pandora固件后,发现从软件源直接安装的luci-app-ssr-plus 版本过低,所以尝试自编译大佬最新的release并通过opkg来安装,中间踩了不少坑(基本都是吃了guo内网络的亏)。

下面以自编译luci-app-ssr-plus插件为例。

运行环境:小米路由器R3,MT7620,pandora固件

准备编译需要的工具

  • Lean大神的开源插件
  • 编译环境:推荐Ubuntu 64bit,我选Ubuntu 18.04 LTS
  • OpenWrt SDK:链接 (注意:请根据自己的路由器的架构选择,我的r3选openwrt-sdk-19.07.0-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64.tar.xz

    下载对应架构的SDK
    下载对应架构的SDK

编译插件

注意:不要在root下编译!

  1. 更新依赖

    sudo apt-get update
    sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib linux-libc-dev:i386
  2. 解压准备好的SDK并命名为openwrt-sdk;克隆L大的源码到本地,将lede/package 下的文件全部拷贝并覆盖至openwrt-sdk/package
  3. 进入openwrt-sdk文件夹,安装feeds软件包

    cd openwrt-sdk
    ./scripts/feeds update -a && ./scripts/feeds install -a
  4. 个性化openwrt组件,这一步要把需要编译的软件以及相应的插件选上(复选框变为M,单独编译出模块)

    make menuconfig

    menuconfig界面
    menuconfig界面

    进入LuCI → Applications,并选上luci-app-ssr-plus。(下面插件自己决定选不选,kcptun不建议)

    勾选ssr-plus及其相应插件
    勾选ssr-plus及其相应插件

    然后save,并esc退出即可。

  5. 预下载软件包

    这里强烈建议全局科学上网,真全局的那种,比如surge的增强模式。
    -j8指用8个线程下载,这里将数字改为你电脑cpu的线程数+1就行。耐心等待下载完,这样可以避免编译的时候出现网络错误导致浪费大量时间。

    make download -j8 V=s
  6. 校验下载的文件的完整性(可选)

    方法出处
    find dl -size -1024c -exec ls -l {} \;

    如果有小于1k的文件,说明下载可能不完整,可以再次make download

    不过我编译时用此命令检测出三个文件不正常,我下了很多次这三个都存在,但最后却不影响编译,所以如果(小于1k文件)数目多且明显时,可以反复检查。

  7. 开始编译插件

    ssr-plus依赖于luci的一些组件,故先编译luci-base

    make package/feeds/luci/luci-base/compile V=s

    然后单独编译插件即可,时间很长,可以去喝杯coffee。

    make package/lean/luci-app-ssr-plus/compile -j1 V=s
    首次编译请选单线程编译(-j1),因为多线程下若出错不容易debug。
  8. 编译顺利的话,可以在bin/packages/你的路由器架构/base/ 下找到编译完的ipk。

编译中可能的出错

  1. ERROR: module 'xxxx' is missing.

    多半是下载软件包时出现了问题,有module没有下载下来。

    这体现开真全局代理下载的重要性,重新跑下make download吧。

  2. 编译v2ray包时,出现bash:/.../staging_dir/host/bin/upx: No such file or directory

    坑爹问题,我的解决办法如下:

    先确保ubuntu里装了upx,然后将/usr/bin下的upx和upx-ucl复制到报错目录就行了

    whereis upx
    cd /usr/bin/
    cp upx /home/jarvis/Desktop/openwrt-sdk-19.07.0-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64/staging_dir/host/bin/
    cp upx-ucl /home/jarvis/Desktop/openwrt-sdk-19.07.0-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64/staging_dir/host/bin/

安装ipk插件至路由器

将ipk文件复制到/tmp目录下,然后执行:

opkg install /tmp/luci-app-ssr-plus_149-1_all.ipk

此时可能会报架构不兼容错误:

  • pkg_hash_fetch_best_installation_candidate: Packages for xxx found, but incompatible with the architectures configured

详细解决方法看文章:修改opkg.conf解决incompatible with the architectures configured问题

# 查看当前安装的软件包的架构
opkg info | grep Architecture   

# 根据架构,修改/etc/opkg.conf,在后面追加下面的代码
# 下面是我的架构,请根据自己路由的架构来修改,100,200代表优先级
arch all 100
arch mipsel_24kec_dsp 200
arch mipsel_24kc 300

再次执行opkg install 可能还会报没有相应依赖

# 没有安装依赖导致无法安装此包
* satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-app-ssr-plus:
...
* opkg_install_cmd: Cannot install package luci-app-ssr-plus.

其实它的依赖包在编译的时候也都编译好了,均在bin/packages/你的路由器架构/base/ 下,把这些同样拷贝到路由的/tmp下,先安装这些依赖包即可。

安完后,如果在左侧菜单栏看不到插件,执行下面代码即可:

echo 0xDEADBEEF > /etc/config/google_fu_mode

修改软件包配置并再次编译的问题

现在我的luci-app-ssr-plus 软件包是默认全勾选相关插件的

若我不想要编译kcptun ,重新编译该怎么操作?

# 先修改插件配置,比如我把kcptun取消勾选
make menuconfig

# 清除编译缓存,可以把bin下先前编译完的ipk也删了,保险吧
rm -rf tmp

# 再次重新编译即可
make package/lean/luci-app-ssr-plus/compile -j1 V=s

参考资料

[1] GL-iNet AR750 官方固件安装 SSR Plus 插件

[2] 为原版Openwrt安装SSR-plus插件

[3] OpenWrt 编译步骤与命令详解

[4] openwrt单独编译lean的ssrplus(ssr-plus)

[5] Ubuntu 使用Openwrt SDK交叉编译ipk包过程全纪录(超多图)