本帖最后由 lboy 于 2019-1-25 03:22 AM 编辑
tintin++的体积十分小,我想把它放进路由器里运行,这样就可以24小时挂机了。但是网上找不到这方面的教程,经过一番研究,我成功了,于是把方法共享给大家。我使用的是刷了华硕固件padavan的斐讯K2路由器。
由于需要交叉编译,所以过程比较复杂。不会在LINUX下进行编译的话还是不要看了,不然肯定各种问题。
对路由器要求:1.有至少900KB的剩余存储空间和5MB的剩余内存。
2.支持TELNET或SSH,没有这些功能的需要先去刷机,请自行百度怎么给路由器刷机。
下面以我使用的UBUNTU 18.04为例。
首先需要编译用于交叉编译tintin++的GCC套件,你要确保你的编译套件和你的路由器固件兼容。你可以telnet进路由器,输入cat /proc/version命令查看路由器固件的linux内核版本和GCC版本,输入uname -m查看CPU类型,再ls /lib,查看固件用的是glibc还是uClibc以及它们的版本,也要查看固件自带了哪些库。手动配置交叉编译环境是比较繁琐的一件事,最好的办法还是去下载固件的源码,自动配置交叉编译工具。padavan的源码在bitbucket.org上,这个网站的访问速度有点慢,所以我选择去GITHUB上下载别人fork的padavan,我下载的是这个:https://github.com/hanwckf/rt-n56u 。
按它的要求,先安装依赖包
sudo apt-get install autoconf automake autopoint bison build-essential flex gawk gettext git gperf libtool pkg-config zlib1g-dev libgmp3-dev libmpc-dev libmpfr-dev texinfo python-docutils
假设你把源码下载到了/home/xxx/rt-n56u里,打开终端输入
cd /home/xxx/rt-n56u/toolchain-mipsel
./clean_sources
./build_toolchain_3.4.x
这样就开始自动编译交叉编译套件了。注意你编译的版本得和路由器固件的兼容。我们不需要编译完整的固件,只需要编译套件和一些基础库就好了。
然后我们开始编译tintin++的依赖库zlib和libpcre。如果你的固件里自带了zlib和libpcre,那么你其实不需要编译这两个东西,只需要把这两个库下载到编译套件的lib文件夹里,再从源码里把相应的头文件放到include文件夹里就好了。但我用的TELNET,下载东西麻烦,编译也很快,所以我选择编译。
cd /home/xxx/rt-n56u/trunk/libs/libz/zlib-1.2.8
CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure
make
注意把路径替换成你自己的路径。zlib编译好了后就把libz.a、libz.so、libz.so.1、libz.so.1.2.8复制到/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib下。把zlib.h、zconf.h、zutil.h复制到/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include下。
再编译libpcre:
cd /home/xxx/rt-n56u/trunk/libs/libpcre/pcre-8.42
CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure --host=mipsel-linux-uclibc --build=x86_64-linux-gnu --disable-cpp
make
cp ./.lib/libpcre.a /home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib
再把pcre.h复制到/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include下。
我的路由器的固件里自带了zlib但没带libpcre,所以注意zlib用动态连接就好了,而libpcre一定要用静态连接。
以上工作完成后我们就可以准备编译tintin++了,先去官网下载tintin++的源码:http://sourceforge.net/projects/ ... 1.5.tar.gz/download
下载完成后输入tar -xvf tintin-2.01.5.tar.gz进行解压,再
cd tt/src
ac_cv_file__dev_ptmx=yes ac_cv_func_realloc_0_nonnull=yes CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure --host=mipsel-linux-uclibc --build=x86_64-linux-gnu
make
这样就好了。我已经把探索的过程省略了,直接给出最终的编译命令。
再把编译好的tt++程序上传到路由器上,上传的办法很多,我采用的办法是用nginx在本地架设WEB服务器,再在路由器上wget,具体如下:
sudo apt install nginx
安装好了后sudo gedit /etc/nginx/sites-enabled/default,找到root开头的一行,把路径修改成你的tt++所在的目录。然后sudo systemctl restart nginx,重启nginx。
再telnet进路由器,输入
cd /etc/storage
wget http://192.168.2.2/tt++
chmod +x tt++
把192.168.2.2换成你本机的IP。
注意,你需要把tt++放入永久目录里,不然路由器一重启你的tt++就没了。路由器上的绝大部分目录都是临时目录,padavan固件的永久目录就是/etc/storage
接下来你需要把机器人文件也放入/etc/storage目录里,方法和上传tt++的方法类似。
输入./tt\+\+ 一切顺利的话你就能看到tintin++的启动画面了。
到目前为止,我们已经可以让tt++在路由器上运行了,但是一旦我们关掉telnet终端,tt++也会随之关闭。这种结果不是我们想要的,我们想要的是让tt++二十四小时运行。经过痛苦的研究,我最终使用tmux来让tt++长期运行。
tmux依赖libevent和libncurses,你可以从网上下载它们也可以用固件源码里自带的(如果有的话)。
编译libevent还是比较简单的:
cd libevent-2.1.8-stable
CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure --host=mipsel-linux-uclibc --build=x86_64-linux-gnu
make
完成后把.libs目录下的四个后缀名为.a的文件复制到/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib下,再把include文件夹下的所有文件复制到/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include下。
编译libncurses的话需要一点技巧,这是我最终试出来的编译命令,可能不是最好的,但可以正常使用。
cd ncurses-6.1
CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure --host=mipsel-linux-uclibc --build=x86_64-linux-gnu --prefix=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x --without-cxx --without-cxx-binding --disable-db-install --without-progs --without-tack --without-tests
make
make install
cd /home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/lib
ln -s libncurses.a libtinfo.a
这样就好了,不需要手动复制什么了。
源码里没有带tmux,要到https://github.com/tmux/tmux/rel ... 2.8/tmux-2.8.tar.gz 这里下载。
解压后找到tmux源码里的tmux.c文件,找到
if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL &&
setlocale(LC_CTYPE, "C.UTF-8") == NULL) {
if (setlocale(LC_CTYPE, "") == NULL)
errx(1, "invalid LC_ALL, LC_CTYPE or LANG");
s = nl_langinfo(CODESET);
if (strcasecmp(s, "UTF-8") != 0 && strcasecmp(s, "UTF8") != 0)
errx(1, "need UTF-8 locale (LC_CTYPE) but have %s", s);
}
这一段,把它们注释掉或删掉。再在终端中输入
CFLAGS=-I/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/include/ncurses CC=/home/xxx/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-gcc ./configure --host=mipsel-linux-uclibc --build=x86_64-linux-gnu --enable-static
make
这样就得到了tmux程序了,再把tmux上传到路由器上。记住要chmod +x tmux
可以telnet进路由器测试一下。
./tmux
./tt\+\+
看是否正常。
tmux + tintin++的文件体积在2.5mb左右,如果你的路由器存储空间不够,那么可以用upx压缩一下,-9压缩能压到800多KB。
最后,设置让tt++随路由器启动。这个在网页端就可以做,进入路由器的管理页面,找到放启动脚本的位置。padavan的启动脚本是在Advanced Settings - Customization - Scripts - Run After Router Started
在脚本的最后加上
/etc/storage/tmux new -d -s tt "/etc/storage/tt++ -r /etc/storage/test.tt"
test.tt是你的机器人文件的名称。
需要关闭tt++的话就在路由器里输入 /etc/storage/tmux kill-session -t tt
好了,这样就大功告成了。
如果你不会编译,而且和我一样用的也是padavan固件,那么可以尝试用我编译好的tintin++,应该有一定的机率在你的路由器上也能运行。最好还是自己编译一遍!
|