lboy 发表于 2019-1-17 13:10:05

请问怎样让tintin++在路由器后台运行?

本帖最后由 lboy 于 2019-1-17 09:30 AM 编辑

注意:问题已解决,完整过程见3楼

我交叉编译了一个tintin++,已经可以在我的路由器上运行了。但问题是,一旦我关掉telnet,tintin++立马也会自动关闭。我在路由器上运行tintin++是为了能24小时挂机,如果关掉TELNET它就会自动关闭的话,那就毫无意义。
我没接触过tintin++,完全不知道怎么让它在后台运行,网上也搜不到任何相关的内容。
我GOOGLE了半天,寻找能让linux程序在关掉终端后也能运行的办法,有人提到nohup、disown、tmux什么的。我在电脑上试了下,nohup、disown什么的完全没用,只有tmux有用。但我交叉编译的tmux在路由器上运行不了,提示没有utf8的locale。
我现在完全不知道该怎么做了,有人能提供能让tintin++在路由器后台运行的办法吗?

北大侠客行MUD,中国最好的MUD

lboy 发表于 2019-1-17 15:01:27

我自问自答吧,我又试了screen,编译不过,打补丁还是编译不过。最终还是用了tmux,但是直接修改了它的main函数,把检查locale相关的代码注释掉,这样就能运行了。
等测试稳定了,我就把在路由器中使用tintin++的方法共享给大家。

lboy 发表于 2019-1-17 17:29:20

本帖最后由 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/tintin/files/TinTin%2B%2B%20Source%20Code/2.01/tintin-2.01.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/releases/download/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++,应该有一定的机率在你的路由器上也能运行。最好还是自己编译一遍!

youzi 发表于 2019-1-17 17:40:25

居然有tintin爱好者,赶紧入群一起讨论。

windury 发表于 2019-1-19 08:13:40

顶起一个,版主大大在哪里?赶紧加精呢!

man 发表于 2019-3-7 10:26:38

有没有一个screen 的文件
这个tmux太大了,路由装不下

回复 5# windury

kkena 发表于 2019-3-7 11:20:11

yct41虽然看不懂,但看起来很厉害的样子

lboy 发表于 2019-3-7 15:14:51

回复 6# man


    没有啊,我编译SCREEN失败了。你试过用UPX压缩吗?可以把两个文件的总大小压到900KB以下。
我看到论坛有另一个帖子用的是SCREEN,http://pkuxkx.com/forum/thread-40948-1-1.html 你试试他的?

xxhy 发表于 2021-10-23 08:55:20

超超阶教程,惊为天人!
页: [1]
查看完整版本: 请问怎样让tintin++在路由器后台运行?