|
本帖最后由 flippy 于 2018-10-17 23:57 编辑
从Lean的源码改进的脚本,保持原有的所有特性,但专门为内存大于128M的做了优化。
做这个脚本的起因是这样:
v2瑞体积很大,v2瑞+v2ctl,mipsle版的两个文件加起来有25MB多,平时以压缩格式存放在闪存文件系统里,但初次运行时经常失败,也就是说,路由器上电以后第一次启动的v2瑞一般是失败的,反复重启几次服务以后才能正常运行。原因可能是go语言编译的程序对低速硬盘设备(包括闪存文件系统)的兼容性不好。
经常出现的错误如下:
第一类错误:
root@K2P:/usr/bin/v2瑞# ./v2瑞 -v
Segmentation fault
第二类错误:
root@K2P:/usr/bin/v2瑞# ./v2瑞 -v
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x5 pc=0xfad88]
goroutine 1 [running]:
fmt.(*fmt).fmt_integer(0x90cc1a0, 0xff, 0x0, 0xa, 0x1d101, 0x742f49, 0x11)
/usr/local/go/src/fmt/format.go:216 +0xb0
fmt.(*pp).fmtInteger(0x90cc180, 0xff, 0x0, 0x5261ea01, 0x64)
/usr/local/go/src/fmt/print.go:369 +0x274
fmt.(*pp).printArg(0x90cc180, 0x6836c0, 0x7b4c54, 0x64)
/usr/local/go/src/fmt/print.go:649 +0xb18
fmt.(*pp).doPrintf(0x90cc180, 0x753cf5, 0x2a, 0x900c720, 0x1, 0x1)
/usr/local/go/src/fmt/print.go:1003 +0x1c0
fmt.Sprintf(0x753cf5, 0x2a, 0x900c720, 0x1, 0x1, 0x913e200, 0x10)
/usr/local/go/src/fmt/print.go:203 +0x6c
第三类错误:
root@K2P:/usr/bin/v2瑞# ./v2瑞 -v
SIGILL: illegal instruction
PC=0x56a7c8 m=0 sigcode=128
goroutine 1 [running, locked to thread]:
v2瑞.com/core/proxy/mtproto.init.0()
/v2瑞/src/v2瑞.com/core/proxy/mtproto/client.go:71 fp=0x9445f8c sp=0x9445f8c pc=0x56a7c8
v2瑞.com/core/proxy/mtproto.init()
<autogenerated>:1 +0x284 fp=0x9445fa0 sp=0x9445f8c pc=0x56dec8
v2瑞.com/core/main/distro/all.init()
<autogenerated>:1 +0x100 fp=0x9445fa4 sp=0x9445fa0 pc=0x5e34e0
main.init()
<autogenerated>:1 +0xd8 fp=0x9445fc4 sp=0x9445fa4 pc=0x5e44a4
runtime.main()
/usr/local/go/src/runtime/proc.go:186 +0x1f8 fp=0x9445fec sp=0x9445fc4 pc=0x44b34
runtime.goexit()
/usr/local/go/src/runtime/asm_mipsx.s:850 +0x4 fp=0x9445fec sp=0x9445fec pc=0x7942c
goroutine 18 [syscall]:
os/signal.signal_recv(0x0)
/usr/local/go/src/runtime/sigqueue.go:139 +0x118
os/signal.loop()
/usr/local/go/src/os/signal/signal_unix.go:22 +0x34
created by os/signal.init.0
/usr/local/go/src/os/signal/signal_unix.go:28 +0x50
r0 0x0 r1 0x0
r2 0x948a930 r3 0x4
r4 0x56de98 r5 0x948a930
r6 0x948a930 r7 0x948a934
r8 0x5ab9a95 r9 0x10
r10 0x4 r11 0x10
r12 0x93 r13 0x1
r14 0x80000000 r15 0x94
r16 0x0 r17 0x80000000
r18 0x7fffffff r19 0x0
r20 0x0 r21 0x45bcfc
r22 0x763e24 r23 0xa90000
r24 0x0 r25 0x0
r26 0x0 r27 0x0
r28 0x0 r29 0x9445f8c
r30 0x94000e0 r31 0x56dec8
pc 0x56a7c8 link 0x56dec8
lo 0x0 hi 0x0
错误可能不只上述3类,反复运行多次以后,终于出现正常的提示:
root@K2P:/usr/bin/v2瑞# ./v2瑞 -v
flag provided but not defined: -v
Usage of ./v2瑞:
-config string
Config file for V2Ray.
-format string
Format of input file. (default "json")
-plugin
True to load plugins.
-test
Test config file only, without launching V2Ray server.
-version
Show current version of V2Ray.
这个问题不只v2瑞存在,只要是用go编译的程序好象都会出现,比如kcptun
但如果是在/tmp下(RAMDISK)运行则很稳定,所以,当路由器的内存足够时,完全可以把程序拷到内存里运行啊,这样改过512M内存的K2P就有用武之地了,如果是未改过的128M内存, 则不建议用这种方法,比128M更小的就不用说了。
脚本的算法是:计算/var的总空间和可用空间,以及当前剩余的内存,当总空间>=70M,且可用空间>=35M,且剩余内存>=32M时,把闪存里的v2瑞、v2ctl两个程序拷贝到/var下再启动服务,如果条件不满足则不作变更,这样就兼容了小内存的路由器。上面3个判断条件可以自行更改(我的初始设定就是排除了128M以下内存(含128M)的路由,毕竟这两个文件占用20多M内存,对于小内存的路由器而言显得太多了)。
注:在openwrt里,/var等同于/tmp,都是用内存虚拟出来的磁盘,默认空间是总内存的一半,但对/var的占用情况不一定会反应到剩余内存里,所以要做多重判断
脚本已在512M的k2p上测试通过(刷的是mleaf的openwrt cc 1.7.0),另外,自己用最新lean R8.1.7代码编译的newifi3也可以使用,替换原/etc/init.d/v2瑞pro即可(注意备份原文件)。改用新脚本后,v2瑞基本是秒开,非常稳定。第一次开机时间稍长十来秒不是大问题。
这个是基于lean的源码: luci-app-v2瑞-pro,如果你的路由器装过这个包,那么用winscp等工具把文件拷到/etc/init.d/下面,替换同名文件就可以了。如果你要自己编译固件的话,把这个文件替换 package/lean/luci-app-v2瑞-pro/root/etc/init.d 下面的同名文件
拷入后注意在shell下执行命令(用ssh工具连入路由器): chmod 755 /etc/init.d/v2瑞pro
自编译固件的朋友应该知道这个,就不多说了
附件: 2018-10-17第五次更新
【2018-10-17】第4次优化的版本已经不止是对大内存路由器的优化了,小内存的也做了一定优化(仍然在闪存里执行,但执行前先重复尝试运行命令,直到不出错为止,最多尝试5次);另外参考S-S R-plus的源码,修改了pdnsd域名解析的部分代码;解决了脚本在开机启动时会执行两次的bug(linux系统自己执行一次,由luci调用又执行一次),等等。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|