内容分为三个部分 : 一、背景介绍; 二、编译; 三、运行。
一、背景介绍
1. 为什么要在软路由里运行 nConnect 服务端?
-
在软路由里运行 nConnect 服务端有几个好处:
- 最大好处是,通过反向代理,访问家里局域网中的所有设备;
- 其次是,软路由基本上全天开机,并且性能上有比较大的冗余,所以最适合作为内网穿透的中转站;
- 最后是,相比较于将 nConnect 服务端安装到群晖和电脑,通过软路由访问终端设备路径是最短的。(理论上是这样)
-
当前面临的问题:
- nConnect 服务端有群晖版、QNAP版、Windows版、 docker版,甚至有 Linux 的 arm64 版本,但就是无法运行在我的软路由里。(nConnect官方技术小伙伴给我的反馈是,我软路由环境里的C库不是stdc,而是musl C库, 等官方针对 musl libc 预先编译一个 nConnect 二进制,大家就不需要看我的教程了)
- 折腾一周后, 所以就决定自己在软路由的环境里编译一个出来使用。
2. 硬件环境介绍
- 软路由是性能还不错的 R2S;
- R2S的CPU架构:ARMv8 Processor rev 4 (v8l) x 4 (1200MHz)
3. 系统环境介绍
- 我在R2S里安装的系统是基于 openwrt-18.06 的分支 ImmortalWrt
- 这个系统缺少了编译环境,所以第一步就是要先安装各种基础的编译工具
二、编译
编译的过程简单说就是三步, 1 搭建环境;2 下载源码; 3 编译;
但编译过程会有一些坑,根据编译环境里的改变,可能会遇到不一样的坑。遇到问题可以联系 NKN 的技术人员,只要他们有时间都会热心解答。 或者直接跟我要编译好的程序。
下面开始编译
- 搭建编译环境:
其实就是安装一些基础编译工具的过程,有两个方法:
- 方法一,一句命令搞定 opkg install gcc automake autoconf libtool make golang
- 方法二,打开 openwrt 的后台 > 系统 > 软件包,一个个安装以下编译工具:
- gcc、automake、autoconf、libtool、make、golang
2. 下载源码
- 安装git (openwrt没有自带git):opkg install git git-http
- 创建 nConnect 目录:
- mkdir /nkn
- cd /nkn
- 拉代码:git clone https://github.com/nknorg/nconnect.git
3. 开始编译
-
进入 nConnect 源码目录:
- cd /nkn/
-
编译:
- 方法一,make
- 方法二, go build
- 当源码目录下出现 nConnect 文件时即代表编译成功
4. 编译时遇到的坑
- 编程时出现错误: /usr/bin/ld: cannot find -lpthread
- 解决办法只需要创建一个空的libpthread,运行:ar -rc /usr/lib/libpthread.a
三、运行
- 首先进入 nConnect 的工作目录 (Working Directory):
- cd /nkn
- 这一步是必须的, 如果没进入工作目录,后面将打不开 nConnect 的配置页面
2. 运行 nConnect
- 运行 ./nConnect -s --tuna --admin-http=172.0.0.1:6666
- 后面的 6666 是端口地址,可以自定义
- 注意:不能直接用绝对路径来运行,如: /nkn/nConnect -s --tuna --admin-http=172.0.0.1:6666
3. 运行成功后,
用浏览器打开 「路由器的IP+端口」 的地址即可开始配置 nConnect 服务端, 如:192.168.1.1:6666
关于如何配置服务端请参考 nConnect 官方的其它教程。
四、 开机自启动
先来补充几个小知识:
- Systemd
- ( d 即单词:daemon,亦称后台进程)
- 网上搜索了解当虽然争议比较大,但比较新的 Linux 发行版基本上用的都是这个。
- 通过命令 systemctl --version 检查版本时发现,我当前用的 Openwrt 没有 Systemd 。
- 所以需要 procd + init.d 来替代,如下
- Procd (process management daemon)
- Procd 是 Openwrt 中的进程管理服务, 它是一种守护进程,用来监控系统进程的状态,保证某些进程异常退出后自动重启。 需要结合 init 脚本使用。
- 初始化脚本管理:/etc/init.d/
- /etc/rc.d/ 是 Linux 系统的启动目录
- 但是所有的启动脚本都放在 /etc/init.d/, 再软链到/etc/rc.d。
- 管理服务的常用命令:
- 以下两种命令都可以,结果一样
- service nConnect + start , stop, restart, reload, status, enable, disable
- /etc/init.d/nConnect + start , stop, restart, reload, status, enable, disable
- 关键的三个命令
- service nConnect start 启动服务
- service nConnect stop 停止服务
- service nConnect enable 将服务设为自启动
下面开始分五个步骤完成设置:
第一步:
- 创建开机运行脚本:
- vi /etc/init.d/nConnect
- 填入以下内容
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
start_service() {
procd_open_instance nConnect run
procd_set_param command sh /nkn/sr/run.sh
procd_set_param respawn
procd_close_instance
echo service nConnect start
}
stop_service() {
killall nConnect
echo service nConnect stop
}
restart_service() {
stop
start
}
第二步:
- 更改脚本权限,让脚本能够被执行
- chmod -R 777 /etc/init.d/nConnect
第三步:
- 创建执行脚本文件:vi /nkn/sr/run.sh
- 填入以下内容
rm -f /nkn/nkn.log
echo service nConnect start
cd /nkn/sr/
./nConnect -s --tuna --admin-http="192.168.2.1:33333" > /nkn/nkn.log
第四步:
- 打开开机自启动:
- /etc/init.d/nConnect enable
- 重启系统
- reboot
第五步:
- 验证是否打开了自启动
- 在 Openwrt 后台 > 系统 > 启动项 里查看开机启动项,找到 nConnect,看下是否已经设为开机自启动
- 验证是否成功启动 nConnect
- 运行 ps -ef |grep nConnect
- 如果看到 ………nConnect -s --tuna --admin-http=“192.168.2.1:33333” 则代表启动成功
- 或者能打开 nConnect 即代表启动成功