v2ray / discussion

For general discussion over Project V development and usage.
300 stars 34 forks source link

路由器上编译出来的v2ray这个程序文件只有200多K,是对的吗? #613

Closed z16166 closed 4 years ago

z16166 commented 4 years ago

路由器是华硕AC88U,CPU是armv7l,go编译器是在梅林中装的Entware中的go_nohf - 1.12.14-1。

编译步骤如下。编译出来的v2ctl我试了运行后会显示帮助信息,但这个v2ray只有200多K,不是个ELF文件,默认也没给加上可执行属性。加上可执行属性执行的话,会被当做shell脚本来执行,所以报错"",这对吗?

GO111MODULE=off GOPROXY=https://goproxy.io go get  -u  v2ray.com/core/...
cd $(go env GOPATH)/src/v2ray.com/core/main
env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"

cd $(go env GOPATH)/src/v2ray.com/core/infra/control/main
env CGO_ENABLED=0 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/infra/control/main# ls -la /tmp/home/root
drwx------    3 admin    root           160 Mar 21 12:33 .
drwxr-xr-x    3 admin    root            60 Jan  1  1970 ..
-rw-------    1 admin    root          2484 Mar 21 12:35 .ash_history
-rw-rw-rw-    1 admin    root            84 Mar 21 11:37 .gitconfig
drwx------    2 admin    root            60 May  5  2018 .ssh
-rw-rw-rw-    1 admin    root           165 Mar 21 10:20 .wget-hsts
-rwxrwxrwx    1 admin    root       9768200 Mar 21 12:33 v2ctl
-rw-rw-rw-    1 admin    root        213464 Mar 21 12:32 v2ray

admin@RT-AC88U-4AF8:/tmp/home/root# chmod u+x v2ray 
admin@RT-AC88U-4AF8:/tmp/home/root# ls
v2ctl  v2ray
admin@RT-AC88U-4AF8:/tmp/home/root# ldd ./v2ray 
    libcrypt.so.0 => /lib/libcrypt.so.0 (0x2abff000)
    libm.so.0 => /lib/libm.so.0 (0x2acac000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ac1c000)
    libc.so.0 => /lib/libc.so.0 (0x2ac2e000)
    ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2ab81000)
admin@RT-AC88U-4AF8:/tmp/home/root# ./v2ray 
./v2ray: line 1: syntax error: unexpected newline
mzz2017 commented 4 years ago

有的arm阉割了fpu,或许应该检查一下

z16166 commented 4 years ago

AC88U就是阉割了FPU的,所以我装的Go的包的名字是go_nohf,nohf就是no hardware floating point的,是用软件库来模拟浮点数运算的。

神奇了,我刚才又进那个目录编译了一下,这次编出来的v2ray文件14MB,而且自带可执行属性,能执行,等于是问题解决了。有点莫名其妙啊,有可能是这个go_nohf不怎么稳定。

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/main# env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"
go: downloading github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57
go: downloading go.starlark.net v0.0.0-20190919145610-979af19b165c
go: downloading github.com/gorilla/websocket v1.4.1
go: extracting github.com/gorilla/websocket v1.4.1
go: extracting go.starlark.net v0.0.0-20190919145610-979af19b165c
go: extracting github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57
admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/main# ls -la /tmp/home/root/
drwx------    3 admin    root           160 Mar 21 15:22 .
drwxr-xr-x    3 admin    root            60 Jan  1  1970 ..
-rw-------    1 admin    root           855 Mar 21 15:23 .ash_history
-rw-rw-rw-    1 admin    root            84 Mar 21 11:37 .gitconfig
drwx------    2 admin    root            60 May  5  2018 .ssh
-rw-rw-rw-    1 admin    root           165 Mar 21 10:20 .wget-hsts
-rwxrwxrwx    1 admin    root       9768200 Mar 21 12:33 v2ctl
-rwxrwxrwx    1 admin    root      14911584 Mar 21 15:22 v2ray
admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/main# /tmp/home/root/v2ray 
V2Ray 4.23.0 (V2Fly, a community-driven edition of V2Ray.) Custom (go1.12.14 linux/arm)
A unified platform for anti-censorship.
2020/03/21 15:24:01 Using config from STDIN
z16166 commented 4 years ago

编译安装V2ray 4.23.0(华硕RT-AC88U路由器,梅林官方版本384.15)

梅林使用的libc库是uClibc,所需要的V2ray得在路由器上编译出来。假定已经刷了梅林,安装好了Entware。我是在RT-AC88U的USB 3.0口上外挂了一个12T的硬盘,就是最近几个月比较火的那款西数WD Elements 12T,亚马逊一上架基本秒无的。/opt是Entware建的一个符号链接,指向/tmp/opt,最终指向的是/tmp/mnt/WD12T/entware。root帐号的主目录是/tmp/home/root(这个目录下空间有限,而且重启路由器后会消失,一般不在这里干活)

安装Go编译器

Entware中有两个go包,要安装go_nohf这个包。nohf是no hardware floating point的意思,也就是用软件指令模拟浮点运算,因为AC88U没有浮点硬件。如果你的路由器有浮点硬件,就下载go,而不是go_nohf。git之类的工具假定已经用opkg装好了。

opkg install go_nohf
export GOROOT=/opt/bin/go
export GOPATH=/tmp/mnt/WD12T/home/go
export GOCACHE=/tmp/mnt/WD12T/home/.cache/go-build
export GOPROXY=https://goproxy.io
export GO111MODULE=off
export CGO_ENABLED=0

设置代理

下载go代码要用。尽量设置为http代理,我发现SOCKS5代理容易报错。

export http_proxy=http://192.168.2.73:8118
export https_proxy=http://192.168.2.73:8118
git config --global http.proxy "http://192.168.2.73:8118"
git config --global https.proxy "http://192.168.2.73:8118"
git config --global http.sslVerify false  (临时的)

下载代码

第二项可能不是必须的。

go get -insecure -u v2ray.com/core/...
go get -insecure -u v2ray.com/ext/...

编译

cd $GOPATH/src/v2ray.com/core/main
go build -o $HOME/v2ray -ldflags "-s -w"
cd $GOPATH/src/v2ray.com/core/infra/control/main
go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

编译产物v2ray、v2ctl放在$HOME下。其中v2ray我编译了几次都是200多K的文件,默认也没有可执行属性,无法运行。后来又尝试了一次,居然好了,得到一个14M的产物。怀疑是go编译器不稳定导致的,未深究。

添加开机启动项

从官网github下载预编译的v2ray-linux-arm.zip,解压到目录/tmp/mnt/WD12T/v2ray下; 把这目录下官方编译出来的v2ray、v2ctl都删了; 把我们编译好的v2ray、v2ctl从$HOME复制到这个目录下; 从Windows客户端v2rayN中拷贝其config.json到这个目录下(如果没有在v2rayN中生成过,就自己新配一个config.json吧,此处不再赘述如何配置config.json),注意用dos2unix转一下格式;

创建符号链接(可选):

ln -s /tmp/mnt/WD12T/home/v2ray/v2ray /opt/bin/v2ray
ln -s /tmp/mnt/WD12T/home/v2ray/v2ctl /opt/bin/v2ctl

新建开机脚本文件/opt/etc/init.d/S81v2ray,内容为:

#!/bin/sh
ENABLED=yes
PROCS=v2ray
ARGS="-c /tmp/mnt/WD12T/home/v2ray/config.json"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/tmp/mnt/WD12T/home/v2ray

. /opt/etc/init.d/rc.func

注意这个脚本最后调用的是/opt/etc/init.d/rc.func,确保这个文件存在。这文件是Entware的服务管理框架脚本,参看https://github.com/Entware/entware-ng-rtndev/blob/master/entware-opt/files/rc.func。

脚本存盘后记得给S81v2ray加上可执行属性: chmod u+x /opt/etc/init.d/S81v2ray

至此大功告成!

lalinking commented 3 years ago

路由器是华硕AC88U,CPU是armv7l,go编译器是在梅林中装的Entware中的go_nohf - 1.12.14-1。

编译步骤如下。编译出来的v2ctl我试了运行后会显示帮助信息,但这个v2ray只有200多K,不是个ELF文件,默认也没给加上可执行属性。加上可执行属性执行的话,会被当做shell脚本来执行,所以报错"",这对吗?

GO111MODULE=off GOPROXY=https://goproxy.io go get  -u  v2ray.com/core/...
cd $(go env GOPATH)/src/v2ray.com/core/main
env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"

cd $(go env GOPATH)/src/v2ray.com/core/infra/control/main
env CGO_ENABLED=0 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/infra/control/main# ls -la /tmp/home/root
drwx------    3 admin    root           160 Mar 21 12:33 .
drwxr-xr-x    3 admin    root            60 Jan  1  1970 ..
-rw-------    1 admin    root          2484 Mar 21 12:35 .ash_history
-rw-rw-rw-    1 admin    root            84 Mar 21 11:37 .gitconfig
drwx------    2 admin    root            60 May  5  2018 .ssh
-rw-rw-rw-    1 admin    root           165 Mar 21 10:20 .wget-hsts
-rwxrwxrwx    1 admin    root       9768200 Mar 21 12:33 v2ctl
-rw-rw-rw-    1 admin    root        213464 Mar 21 12:32 v2ray

admin@RT-AC88U-4AF8:/tmp/home/root# chmod u+x v2ray 
admin@RT-AC88U-4AF8:/tmp/home/root# ls
v2ctl  v2ray
admin@RT-AC88U-4AF8:/tmp/home/root# ldd ./v2ray 
  libcrypt.so.0 => /lib/libcrypt.so.0 (0x2abff000)
  libm.so.0 => /lib/libm.so.0 (0x2acac000)
  libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ac1c000)
  libc.so.0 => /lib/libc.so.0 (0x2ac2e000)
  ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2ab81000)
admin@RT-AC88U-4AF8:/tmp/home/root# ./v2ray 
./v2ray: line 1: syntax error: unexpected newline

哥们能共享一下编译出来的文件吗,我这编译老提示这个

asm: writing output: write $WORK/b122/asm_linux_arm.o: no space left on device
go build v2ray.com/core/common/dice: write /tmp/go-build568245200/b131/importcfg: no space left on device
go build golang.org/x/net/internal/timeseries: write /tmp/go-build568245200/b149/importcfg: no space left on device
go build google.golang.org/grpc/backoff: write /tmp/go-build568245200/b194/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpclog: write /tmp/go-build568245200/b198/importcfg: no space left on device
go build google.golang.org/grpc/attributes: write /tmp/go-build568245200/b200/importcfg: no space left on device
go build google.golang.org/grpc/metadata: write /tmp/go-build568245200/b204/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpcrand: write /tmp/go-build568245200/b208/importcfg: no space left on device
go build google.golang.org/grpc/codes: write /tmp/go-build568245200/b209/importcfg: no space left on device
go build google.golang.org/grpc/encoding: write /tmp/go-build568245200/b210/importcfg: no space left on device
go build google.golang.org/grpc/internal/buffer: write /tmp/go-build568245200/b227/importcfg: no space left on device
go build google.golang.org/grpc/internal/envconfig: write /tmp/go-build568245200/b229/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpcsync: write /tmp/go-build568245200/b230/importcfg: no space left on device
go build golang.org/x/text/transform: write /tmp/go-build568245200/b243/importcfg: no space left on device
go build golang.org/x/text/unicode/bidi: write /tmp/go-build568245200/b244/importcfg: no space left on device
go build golang.org/x/net/http2/hpack: write /tmp/go-build568245200/b246/importcfg: no space left on device
go build google.golang.org/grpc/keepalive: write /tmp/go-build568245200/b248/importcfg: no space left on device
go build google.golang.org/grpc/tap: write /tmp/go-build568245200/b251/importcfg: no space left on device
go build v2ray.com/core/common/crypto/internal: write /tmp/go-build568245200/b271/importcfg: no space left on device
go build v2ray.com/core/common/strmatcher: write /tmp/go-build568245200/b278/importcfg: no space left on device
go build golang.org/x/net/dns/dnsmessage: write /tmp/go-build568245200/b284/importcfg: no space left on device
go build go.starlark.net/internal/spell: write /tmp/go-build568245200/b289/importcfg: no space left on device
go build go.starlark.net/syntax: write /tmp/go-build568245200/b290/importcfg: no space left on device
go build golang.org/x/crypto/chacha20: write /tmp/go-build568245200/b307/importcfg: no space left on device
go build golang.org/x/crypto/poly1305: write /tmp/go-build568245200/b309/importcfg: no space left on device
go build golang.org/x/crypto/hkdf: write /tmp/go-build568245200/b310/importcfg: no space left on device
go build github.com/dgryski/go-metro: write /tmp/go-build568245200/b322/importcfg: no space left on device
go build golang.org/x/crypto/sha3: write /tmp/go-build568245200/b325/importcfg: no space left on device
go build github.com/lucas-clemente/quic-go/internal/protocol: write /tmp/go-build568245200/b343/importcfg: no space left on device
go build golang.org/x/crypto/cryptobyte: write /tmp/go-build568245200/b349/importcfg: no space left on device
go build golang.org/x/crypto/curve25519: write /tmp/go-build568245200/b351/importcfg: no space left on device
go build golang.org/x/sys/cpu: write /tmp/go-build568245200/b352/importcfg: no space left on device
go build github.com/gorilla/websocket: write /tmp/go-build568245200/b359/importcfg: no space left on device
# google.golang.org/protobuf/internal/impl
compile: writing output: write $WORK/b081/_pkg_.a: no space left on device
kslr commented 3 years ago

路由器是华硕AC88U,CPU是armv7l,go编译器是在梅林中装的Entware中的go_nohf - 1.12.14-1。 编译步骤如下。编译出来的v2ctl我试了运行后会显示帮助信息,但这个v2ray只有200多K,不是个ELF文件,默认也没给加上可执行属性。加上可执行属性执行的话,会被当做shell脚本来执行,所以报错"",这对吗?

GO111MODULE=off GOPROXY=https://goproxy.io go get  -u  v2ray.com/core/...
cd $(go env GOPATH)/src/v2ray.com/core/main
env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"

cd $(go env GOPATH)/src/v2ray.com/core/infra/control/main
env CGO_ENABLED=0 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/go/src/v2ray.com/core/infra/control/main# ls -la /tmp/home/root
drwx------    3 admin    root           160 Mar 21 12:33 .
drwxr-xr-x    3 admin    root            60 Jan  1  1970 ..
-rw-------    1 admin    root          2484 Mar 21 12:35 .ash_history
-rw-rw-rw-    1 admin    root            84 Mar 21 11:37 .gitconfig
drwx------    2 admin    root            60 May  5  2018 .ssh
-rw-rw-rw-    1 admin    root           165 Mar 21 10:20 .wget-hsts
-rwxrwxrwx    1 admin    root       9768200 Mar 21 12:33 v2ctl
-rw-rw-rw-    1 admin    root        213464 Mar 21 12:32 v2ray

admin@RT-AC88U-4AF8:/tmp/home/root# chmod u+x v2ray 
admin@RT-AC88U-4AF8:/tmp/home/root# ls
v2ctl  v2ray
admin@RT-AC88U-4AF8:/tmp/home/root# ldd ./v2ray 
    libcrypt.so.0 => /lib/libcrypt.so.0 (0x2abff000)
    libm.so.0 => /lib/libm.so.0 (0x2acac000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ac1c000)
    libc.so.0 => /lib/libc.so.0 (0x2ac2e000)
    ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2ab81000)
admin@RT-AC88U-4AF8:/tmp/home/root# ./v2ray 
./v2ray: line 1: syntax error: unexpected newline

哥们能共享一下编译出来的文件吗,我这编译老提示这个

asm: writing output: write $WORK/b122/asm_linux_arm.o: no space left on device
go build v2ray.com/core/common/dice: write /tmp/go-build568245200/b131/importcfg: no space left on device
go build golang.org/x/net/internal/timeseries: write /tmp/go-build568245200/b149/importcfg: no space left on device
go build google.golang.org/grpc/backoff: write /tmp/go-build568245200/b194/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpclog: write /tmp/go-build568245200/b198/importcfg: no space left on device
go build google.golang.org/grpc/attributes: write /tmp/go-build568245200/b200/importcfg: no space left on device
go build google.golang.org/grpc/metadata: write /tmp/go-build568245200/b204/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpcrand: write /tmp/go-build568245200/b208/importcfg: no space left on device
go build google.golang.org/grpc/codes: write /tmp/go-build568245200/b209/importcfg: no space left on device
go build google.golang.org/grpc/encoding: write /tmp/go-build568245200/b210/importcfg: no space left on device
go build google.golang.org/grpc/internal/buffer: write /tmp/go-build568245200/b227/importcfg: no space left on device
go build google.golang.org/grpc/internal/envconfig: write /tmp/go-build568245200/b229/importcfg: no space left on device
go build google.golang.org/grpc/internal/grpcsync: write /tmp/go-build568245200/b230/importcfg: no space left on device
go build golang.org/x/text/transform: write /tmp/go-build568245200/b243/importcfg: no space left on device
go build golang.org/x/text/unicode/bidi: write /tmp/go-build568245200/b244/importcfg: no space left on device
go build golang.org/x/net/http2/hpack: write /tmp/go-build568245200/b246/importcfg: no space left on device
go build google.golang.org/grpc/keepalive: write /tmp/go-build568245200/b248/importcfg: no space left on device
go build google.golang.org/grpc/tap: write /tmp/go-build568245200/b251/importcfg: no space left on device
go build v2ray.com/core/common/crypto/internal: write /tmp/go-build568245200/b271/importcfg: no space left on device
go build v2ray.com/core/common/strmatcher: write /tmp/go-build568245200/b278/importcfg: no space left on device
go build golang.org/x/net/dns/dnsmessage: write /tmp/go-build568245200/b284/importcfg: no space left on device
go build go.starlark.net/internal/spell: write /tmp/go-build568245200/b289/importcfg: no space left on device
go build go.starlark.net/syntax: write /tmp/go-build568245200/b290/importcfg: no space left on device
go build golang.org/x/crypto/chacha20: write /tmp/go-build568245200/b307/importcfg: no space left on device
go build golang.org/x/crypto/poly1305: write /tmp/go-build568245200/b309/importcfg: no space left on device
go build golang.org/x/crypto/hkdf: write /tmp/go-build568245200/b310/importcfg: no space left on device
go build github.com/dgryski/go-metro: write /tmp/go-build568245200/b322/importcfg: no space left on device
go build golang.org/x/crypto/sha3: write /tmp/go-build568245200/b325/importcfg: no space left on device
go build github.com/lucas-clemente/quic-go/internal/protocol: write /tmp/go-build568245200/b343/importcfg: no space left on device
go build golang.org/x/crypto/cryptobyte: write /tmp/go-build568245200/b349/importcfg: no space left on device
go build golang.org/x/crypto/curve25519: write /tmp/go-build568245200/b351/importcfg: no space left on device
go build golang.org/x/sys/cpu: write /tmp/go-build568245200/b352/importcfg: no space left on device
go build github.com/gorilla/websocket: write /tmp/go-build568245200/b359/importcfg: no space left on device
# google.golang.org/protobuf/internal/impl
compile: writing output: write $WORK/b081/_pkg_.a: no space left on device

你的空间不足了。为什么要在路由器上编译,go是可以跨平台的

lalinking commented 3 years ago

路由器是华硕AC88U,CPU是armv7l,go编译器是在梅林中装的Entware中的go_nohf - 1.12.14-1。 编译步骤如下。编译出来的v2ctl我试了运行后会显示帮助信息,但这个v2ray只有200多K,不是个ELF文件,默认也没给加上可执行属性。加上可执行属性执行的话,会被当做shell脚本来执行,所以报错"",这对吗? ... ... libc.so.0 => /lib/libc.so.0 (0x2ac2e000) ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2ab81000) admin@RT-AC88U-4AF8:/tmp/home/root# ./v2ray ./v2ray: line 1: syntax error: unexpected newline

哥们能共享一下编译出来的文件吗,我这编译老提示这个

asm: writing output: write $WORK/b122/asm_linux_arm.o: no space left on device
go build v2ray.com/core/common/dice: write /tmp/go-build568245200/b131/importcfg: no space left on device
go build golang.org/x/net/internal/timeseries: write /tmp/go-build568245200/b149/importcfg: no space left on device
go build google.golang.org/grpc/backoff: write /tmp/go-build568245200/b194/importcfg: no space left on device
... ... 
go build github.com/gorilla/websocket: write /tmp/go-build568245200/b359/importcfg: no space left on device
# google.golang.org/protobuf/internal/impl
compile: writing output: write $WORK/b081/_pkg_.a: no space left on device

你的空间不足了。为什么要在路由器上编译,go是可以跨平台的

因为正如@z16166 说的那样,我需要用go_nohf来编译。我也试过官方现成的二进制文件,不能运行。 有办法让它不使用 /tmp 作为临时路径吗?我有外接U盘,空间还很大。

已经通过 export GOTMPDIR="/opt/tmp" 解决这个问题