友善之臂 NanoPi NEO3 云服务小记

最近一时兴起想玩玩树莓派那种卡片电脑,国内厂商里面做的比较好要数 FriendlyARM (友善之臂) 了。
最终入了 NanoPi NEO3 这块板子

Nanopi

Nanopi又中文名友善之臂或友善派,下面是nanopineo的官方系统的初始密码:
friendlycore-xenial为我们提供了两个登录账户,分别是:

  1. 普通用户:用户名为pi,密码为pi
  2. 超级用户:用户名为root,密码为fa
    nanopineo系统下载:http://download.friendlyarm.com/nanopineo3
    wiki: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO3/zh

基础

  1. 安装系统固件

官方提供的 FriendlyCore 预装了一堆诸如 samba、ftp 的服务。
但是官方并没有提供内核头文件,内核版本也比较老不适合折腾, 因此转而使用 Armbian 提供的固件

下载 https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/nanopineo3/archive 解压得到 img 文件后使用 USBImager 写入到 TF 卡中

image.png
  1. 网络配置

插上网线和电源,微型电脑就启动了。如何确定 NanoPi 的 IP 呢,方法如下任选其一

  • 登录路由器控制台查看
  • 运行 nmap -n --open -p 22 192.168.1.0/24 扫描 ssh 端口
image.png
# 关闭密码登录
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 清空 root 用户密码
passwd -d root
  1. 本地化设置
  • 替换为国内镜像源
sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn\/debian-security/g' /etc/apt/sources.list
sed -i 's/apt.armbian.com/mirrors.tuna.tsinghua.edu.cn\/armbian/g' /etc/apt/sources.list.d/armbian.list
dpkg --remove-architecture armhf
apt update && apt upgrade -y
  • 修改中文 运行 dpkg-reconfigure locales 后选择 zh_CN.UTF-8
  • 修改时区 运行 dpkg-reconfigure tzdata 选择 Asia/Chongqing
  • 如果遇到 apt update 失败,可能需要同步时间
ntpdate cn.ntp.org.cn
  1. 驱动 USB 无线网卡

某些 WIFI 虽然官方称之为“免驱版”,但实际上是网卡内置了驱动,Windows下如果没有驱动就会被识别为存储设备用于驱动安装,这是需要安装 usb-modeswitch 切换模式

sudo apt install -y usb-modeswitch

翻出了之前买的 翼联WIFI, 安装 usb-modeswitch 后运行 lsusb 查看,设备 ID 已变为

Bus 004 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter

虽然模式切换已经成功,但是网卡仍未被驱动。
后来从 Arch 社区 找到解决方案如下

  • 安装内核头文件
apt install -y linux-headers-current-rockchip64
  • 给驱动源码打补丁
curl -o- http://mirrors.163.com/kernel/v5.x/linux-$(uname -r | cut -f1 -d-).tar.xz | tar Jxf -
cd linux-$(uname -r | cut -f1 -d-)/drivers/net/wireless/mediatek/mt7601u
curl -o- https://launchpadlibrarian.net/419756943/mcu.patch | patch -p0
make -C /lib/modules/$(uname -r)/build/ M=$(pwd) modules

这时编译可能遇到 __stack_chk_guard undefined 错误,这时候在 mcu.c 的适当位置添加如下代码

unsigned long __stack_chk_guard;
void __stack_chk_guard_setup(void)
{
     __stack_chk_guard = 0xBAAAAAAD;  //provide some magic numbers
}
void __stack_chk_fail(void)                         
{                               
}
  • 复制驱动到内核
install -p -m 644 mt7601u.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u
echo > /etc/modprobe.d/mt7601u.conf options mt7601u vnd_reset=0
/sbin/depmod -a $(uname -r)

重启后 WIFI 就能正常驱动了

sudo vnstat -i wlxe84e0685ff49 --create
  1. 安装其他组件
sudo curl -Lo /etc/apt/trusted.gpg.d/docker-ce.asc https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg
echo "deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list
apt update && apt install -y docker-ce
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C718D3B5072E1F5
echo "deb http://mirrors.tuna.tsinghua.edu.cn/mysql/apt/debian $(lsb_release -cs) mysql-5.7" | sudo tee /etc/apt/sources.list.d/mysql.list 
wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt $

Nanopi 环境配置

因为我采用的是将Hexo的编译渲染环境与托管环境分开的方法,所以Nanopi 上只需要安装nginx,php即可
1.安装nginx web服务器

$ sudo apt-get install nginx

2.启动nginx

$ sudo /etc/init.d/nginx start

nginx的www根目录默认在/var/www/,稍后会将hexo blog 的html文件放置于该目录下
3.安装php

$ sudo apt-get install php7*-fpm php7*-sqlite

4.修改nginx的配置文件

$ sudo vim /etc/nginx/sites-available/default

找到listen行,将其前面的#号注释去掉,在路由器端口映射时,内网端口设置的是8678,listen为8678

server {
        listen 8678 default_server;
        listen [::]:8678 default_server;

找到index行,加入index.php

# Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;
        server_name _;

找到php的定义段,按如下内容修改

location ~ \.php$ {
                #include snippets/fastcgi-php.conf;

                # With php7.0-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php7.0-fpm:
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

5.重新加载nginx的配置

$ sudo /etc/init.d/nginx reload

这时打开浏览器输入192.168.0.6:8678可以看到一个nginx的界面说明已经配置成功。

天翼网关及路由器设置

连接上天翼网关的wifi,转到192.168.1.1路由配置界面,利用超级用户名和超级密码登录路由管理界面

用户名: telecomadmin
密  码: nE7j%5m

点击网络将连接名称改为1_INTERNET_B_VID_41桥接模式,其它选项保持默认,点击保存/应用即可

image.png

进入开发板连接的路由器管理界面在上网设置里面将工作模式选择为宽带PPPOE,分别在PPPoE账户和PPPoE密码设置为你的宽带用户名和密码,点击确定即可。如果忘记了用户名和密码可直接拨打电信客服重置密码。

image.png

配置路由端口映射

首先给你的开发板绑定ip/mac,我使用的是电信送的360安全路由T3,登录路由器管理界面,
点击功能扩展,防火墙(IP/MAC)


image.png
IP地址:填入你想分配给开发板的ip,一般就用它当前的ip就可以
MAC地址:填入开发板mac地址
备注:随便写
接口:LAN

绑定好后,进行端口映射,点击功能扩展,找到端口映射


image.png
虚拟服务名称:随便填
内网主机ip地址:你绑定的设备的ip地址
外部端口:选择TCP+UDP 外部访问的端口填一些不常用的端口
内部端口:你的开发板开放的端口

动态域名解析

注册并登录DNSPOD,购买域名,购买后点击我的域名,再点击ontheroad.work(你注册的域名)进入到记录管理界面,点击添加记录,按下图样子添加默认域名解析

image.png

因为我们要解析的ip是动态变化的,因此刚随便填写的记录值也要跟随着变化,下面在开发板上配置一个定时任务,利用别人封装好的bash,调用API,更改记录值,此时记录值可随便写,如127.0.0.1
创建密钥
首先在DNSPOD账号中心,秘钥管理界面创建秘钥(https://console.dnspod.cn/account/token/token)

image.png

创建成功后获得ID和Token,复制保存这两个信息,后面调用API需要
下载ArDNSPod客户端
建议下载到当前用户的根目录下,以方便定时任务的添加

$ cd ~
$ git clone https://github.com/imki911/ArDNSPod

将之前得到的ID和token写入dns.conf 文件, 并指定要绑定的子域名

# 1. Combine your token ID and token together as follows
arToken="你的token ID,你的token"

# 2. Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
arDdnsCheck "你的域名" "www"

注意: www 对应上面添加的域名前缀
根据情况修改ddnspod.sh文件中IPtype的值,我定义为1(WAN)

#Please select IP type
IPtype=1  #1.WAN 2.LAN 3.IPv6

运行

$ ./ddnspod.sh

这时你会看到

Type: A
OS: Linux
Address: 117.64.253.248
Updating Domain: www.ontheroad.work
hostIP: 117.64.253.248
lastIP: 114.97.203.112
update to 117.64.253.248 successed.

那么你的客户端部署就成功了,可以在DNSPOD控制台中看到我们随便填的记录值变成了自己的路由器ip。

服务器设置

固定ip

从前你需要根据不同的管理工具编写网络配置,现在 Netplan 将管理工具差异性给屏蔽了。 你只需按照 Netplan 规范编写 YAML 配置,不管底层管理工具是啥,一份配置走天下!
注意,ubuntu20设置固定ip如下:
创建网络配置文件
$sudo vim /etc/netplan/01-network-manager-all.yaml

# Let NetworkManager manage all devices on this system
network:
  ethernets:
     eth0:
       addresses: [192.168.0.101/24]
       dhcp4: no
       gateway4: 192.168.0.1
       optional: true
  version: 2

注意,网卡的名字要用本机器上的名字,如eth0,可以使用ifconfig查看。
执行 netplan apply 应用生效。

自动启动程序

使用 rc-local.service
rc-local.service 是系统自带的一个开机自启服务,但是在 ubuntu 20.04 上,该服务默认没有开启。

  1. 修改rc-local.service
    在终端输入: sudo vim /lib/systemd/system/rc-local.service

在文件的最后面添加 [Install] 段的内容,


image.png
  1. 创建 /etc/rc.local

Ubuntu 20.04 默认不存在 /etc/rc.local,需要自己创建,
在该文件中添加脚本内容,即开机脚本需要实现的功能

echo "========user service start==========\n" > /usr/local/user_service.log
cd /home/vue-serve
sh ./area/start.sh
sh ./crud/start.sh
echo "========user service end==========\n" > /usr/local/user_service.log

exit 0
  1. 修改 /etc/rc.local 权限

脚本要想运行,还需要设置脚本的可执行权限,使用 sudo chmod 777 /etc/rc.local 或 sudo chmod +x /etc/rc.local 修改该文件的权限。


image.png
  1. 启动 rc-local.service

输入 sudo systemctl enable rc-local.service 或 sudo systemctl enable rc-local 使能 rc-local 服务,实际上就是在 /etc/systemd/system/ 目录下创建了一个软链接。


image.png
  1. 检查服务状态

使用 sudo systemctl status rc-local.service 查看 rc-local 服务的状态, 显示 loaded 和 enabled。


image.png

创建定时任务

需要创建两个定时任务
一个用于实时监测IP并自动更新至DNSPOD,另一个用于定时抓取github上我们更新的博客内容。

修改ddnspod.sh文件中的DIR变量值(这个地方我找了好久,因为cron定时任务只支持绝对路径,所以bash中的命令需要使用绝对路径)

DIR=$(dirname -- "$(readlink "$0")")
DIR=./ArDNSPod #添加这一行

修改完后你会发现在当前目录下运行./ddnspod.sh,会出现以下错误

Type: A
OS: Linux
Address: 114.97.203.119
./ddnspod.sh: line 282: ./ArDNSPod/dns.conf: No such file or directory

因为没有bash编程的基础,暂时也没有学习bash的打算,强制修改DIR变量导致的错误,可以在当前目录新建一个ArDNSPod把dns.conf复制进去就行了,这只是敷衍自己,后期有时间再做更正。

$ sudo mkdir ArDNSPod
$ cp dns.conf ./ArDNSPod/

创建定时任务

crontab -e    创建
crontab -l    查看

会打开当前用户的cron任务表
在最底下添加两个任务,第一个每隔一分钟调用dnshpod.sh更新域名解析记录值,第二个每隔30分钟从github pull你更新的博客

# m h  dom mon dow   command
*/5 *   *   *   *   cd /home/tools/ArDNSPod/ && ./ddnspod.sh
*/30 *   *   *   *   cd /var/www/html/ && sudo git pull

注意: 不建议将第二个更新时间设置得太短,因为github的访问速度不快,为避免更新出错,适当调整时间。
重启cron使配置生效

$ service cron restart

如果时间到了,执行了你的定时任务,恭喜你,在Nanopi 上部署Hexo 博客已经圆满完成!可以通过你的域名+端口号来访问自己的博客啦

查看日志

如果没有执行,好吧,你最先想到的应该是查看log,但是默认情况下ubuntu 没有安装rsyslog
安装rsyslog

sudo apt-get install rsyslog

开启cron日志功能,#将cron前面的注释符去掉

$ sudo vim /etc/rsyslog.d/50-default.conf

重启rsyslog

$sudo  service rsyslog  restart

查看crontab日志

$ vim /var/log/cron.log 

这时你可能会发现一个(CRON) info (No MTA installed, discarding output)的问题,这时因为没有配置邮件服务器
可以通过安装邮件服务器解决该问题

$ sudo apt-get install postfix

重新配置邮件服务

sudo dpkg-reconfigure postfix

按提示一直ok或yes,配置完邮箱后也部署也就完成了!
注意:记得回去关闭cron的log,在重新配置一下邮箱容量,否则随着时间的推移,log会占用大量空间。

NanoPi通过pubyun进行动态域名解析

NanoPi作为一台家用的微型服务器需要一个比较固定的域名,这样可以方便外网访问。 但是家庭网络一般都是动态的ip地址,所以就算NanoPi能24小时开机但只要出了外网还是不能访问的,这样一来还是非常的不方便。 那么什么样的方法可以在外网访问家里的NanoPi呢?答案就是你用动态域名进行解析。 这个教程将告诉大家如何使用NanoPi进行动态域名的解析,方便用户通过外网也能够连接家里的NanoPi服务器。

申请PUBYUN帐号

  1. 打开浏览器准备好手机号去pubyun注册一个帐号。
  2. 可能需要身份证信息的验证,所以准备好身份证电子档。

安装必要的支持环境

apt-get update 更新系统补丁
apt-get install python 安装PYTHON环境
iptables -L 查看防火墙是否阻止网络
iptables -F 如果有阻止则清楚
*/5 * * * * python /bySD32G/Python/PubIP/PubIP.py 做个计划任务每个5分钟检查并提交一次最新IP地址

编写Python程序来想PUBYUN提交动态IP的信息

#! /usr/bin/python
# -*- coding:utf-8 -*-
#3322.NET网API方式动态IP主动上报PY客户端
import urllib
import urllib2
headers={
'Host':'members.3322.net',
'User-Agent':'myclient/1.0 me@null.net',
'Authorization': 'Basic cHViNjxxxxxxxxxxxxxxxxx='};#把字符串(user:passwd)进行BASE64编码
data=None;
fname='/byUData1/Python/PubIP/cip.log';
def fun1():
request = urllib2.Request('http://ip.3322.net ')
response = urllib2.urlopen(request)
return response.read().replace('\n','')#查询并返回本机的公网IP地址
def fun2(cip):
url='http://members.3322.net/dyndns/update?hostname=XXXX.f3322.net&myip='+cip+'&wildcard=OFF&offline=NO';
request = urllib2.Request(url,data,headers)
response = urllib2.urlopen(request)
print response.read()
def byLog(cip):
f=open(fname, "a");
f.write(cip+'\n');
f.close();#写入查询到的公网IP地址并写入HTM记录文件
def readLog():
f=open(fname, "r");
lines = f.readlines() #读取所有行
last_line = lines[-1] #取最后一行
return last_line.replace('\n','')
cip=fun1(); #获取最新公网IP地址
lip=readLog(); #读取历史最后一次IP地址
if lip!= cip: #判断当前查询的最新IP是否和历史最后一次IP相同
fun2(cip); #更新IP到3322.NET
byLog(cip); #把更新的IP写入日志HTM文件
print 'OK-UpIP';
else:
print 'No-UpIP';

通过以上的操作,你将能够获得一台具有动态域名解析的家庭NanoPi服务器让你能够在除家里以外的任何有互联网的地方访问获取上面的资源和文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容