为OpenWRT交叉编译mentohust


前段时间买了个GL-MT300N V1回来折腾,二手的也不贵,自带OpenWRT折腾起来也方便,干脆就计划整个mentohust用来在寝室过锐捷用无线网,但是因为自带的OpenWRT版本是15.05的上古版本,为了找到合适的SDK着实是给我坑了一把,后来经过IRC#Openwrt大佬们帮忙,成功把固件升级到了19.07.7的最新版,过程暂且不表,下次再说。今天就先简单记录一下交叉编译mentohust的过程。

参数信息

设备型号: GL-MT300N Version1
OpenWRT版本: 19.07.7
Soc: MediaTek MT7620N

准备工作

  • 已刷入OpenWRT的路由器
  • 安装了Linux的物理机/VPS/虚拟机或者已经安装了WSL的Windows10
  • 如果中国大陆境内进行编译操作,个人建议为Linux环境更换软件源,推荐使用清华大学开源软件镜像站

本次我使用了已经安装了Ubuntu 18.04LTS的VPS进行编译

依赖安装

打开终端,输入以下指令安装编译必要程序

1
sudo apt-get install build-essential bison flex zlib1g-dev libncurses5-dev subversion quilt intltool ruby fastjar unzip gawk autogen autopoint ccache gettext libssl-dev xsltproc zip git

准备编译文件夹

  1. 在终端中建立一个文件夹便于管理,例如我创建的文件夹为 openwrt ,文件夹命名可以根据自己需要变化
    1
    2
    3
    cd ~
    sudo mkdir openwrt
    cd openwrt
  2. 前往OpenWRT官网下载和你的路由器芯片以及系统版本所对应的SDK,在这里我们使用的GL-MT300N的芯片为mt7620,系统为19.07.7:
    1
    2
    3
    4
    wget https://downloads.openwrt.org/releases/19.07.7/targets/ramips/mt7620/openwrt-sdk-19.07.7-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64.tar.xz -O sdk.tar.xz
    tar xvf sdk.tar.xz
    mv openwrt-sdk-19.07.7-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64 sdk
    rm -rf sdk.tar.xz
  3. 下载libpcap的源码到 libpcap 文件夹,本文成文时最新版本为1.10.1
    1
    2
    3
    4
    wget https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz
    tar xvf libpcap-1.10.1.tar.gz
    mv libpcap-1.10.1 libpcap
    rm -rf libpcap-1.10.1.tar.gz
  4. 下载mentohust的源代码到 mentohust 文件夹,github 上目前有大量的 mentohust 源码包,可以自行选择,此处我们选择使用 hyrathb/mentohust
    1
    git clone https://github.com/hyrathb/mentohust.git mentohust

    交叉编译

    从这里开始就是我们今天的大头,交叉编译的部分

    配置交叉编译环境

    在终端内输入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PATH=$PATH:~/openwrt/sdk/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
    export PATH
    STAGING_DIR=~/openwrt/sdk/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
    export STAGING_DIR
    export CC=mipsel-openwrt-linux-gcc
    export CPP=mipsel-openwrt-linux-cpp
    export GCC=mipsel-openwrt-linux-gcc
    export CXX=mipsel-openwrt-linux-g++
    export RANLIB=mipsel-openwrt-linux-ranlib
    export ac_cv_linux_vers=3.18.27
    export LDFLAGS="-static"
    export CFLAGS="-Os -s"

请不要直接复制粘贴,这里需要根据你的自身情况进行更改
需要更改的地方有:

  • CCCPPGCCCXXRANLIB 请对比参考…/staging_dir//bin 内的对应文件名进行修改
  • RANLIB 要根据 sdk 里目录的结尾修改。在本例中,结尾是 uClibc,因此 export RANLIB=mipsel-openwrt-linux-uClibc-ranlib。如果你的结尾是 musl,就应该改成 export RANLIB=mipsel-openwrt-linux-musl-ranlib
  • ac_cv_linux_vers 为你所编译目标 OpenWrt 当前 Linux 内核版本号

编译libpcap

  1. 进入 libpcap 文件夹
    1
    cd ~/openwrt/libpcap
  2. 编译libpcap
    1
    2
    ./configure --host=mipsel-linux --prefix=~/openwrt --with-pcap=linux
    make

请不要直接复制粘贴,这里需要根据你的自身情况进行更改
需要更改的地方有:

  • --host 需要对应你的路由器芯片架构进行修改 (arm-linux/mipsel-linux)
  • --prefix 更换成你的编译路径,本例中为~/openwrt

原则上来说 ./configure 部分不应出现报错,make 部分可能会出现 libpcap.so 编译出错的报错,无需理会,只要 libpcap.a 没有报错即可,编译完成后记得查看一下目录下是否出现了libpcap.a

编译mentohust

  1. 进入 mentohust 文件夹并生成Makefile:
    1
    2
    cd ~/openwrt/mentohust
    sh autogen.sh
    获取自己所在的平台
    1
    ./config.guess
    输出的信息替换到下方代码的 --build 中,然后执行命令进行编译:
    1
    2
    ./configure --build=x86_64-pc-linux-gnu --host=mipsel-linux   --disable-encodepass --disable-notify --with-pcap=~/openwrt/libpcap/libpcap.a
    make
    其中 --with-pca 后内容请修改为自己的对应路径
    如果运行无误,完成后就可以在 ~/openwrt/mentohust/src 中获取所需要的 mentohust 文件了

上传运行

OpenWRT原生内嵌了 SCP 服务,在我们完成编译后,打开 WinSCP 添加工作区,选择SCP协议链接到OpenWRT,将编译出来的 mentohust 粘贴进OpenWRT
粘贴进去之后,我们需要通过 SSH 链接路由器并改变 mentohust 的权限并设置环境变量

1
2
chmod 777 mentohust
cp mentohust /usr/bin/mentohust

完成之后,直接在终端内输入 mentohust 即可启动运行。如果不确定使用哪张网卡请自行通过 ifconfig 判断。

参考文章