最近一时兴起想玩玩树莓派那种卡片电脑,国内厂商里面做的比较好要数 FriendlyARM (友善之臂) 了。
最终入了 NanoPi NEO3 这块板子
Nanopi
Nanopi又中文名友善之臂或友善派,下面是nanopineo的官方系统的初始密码:
friendlycore-xenial为我们提供了两个登录账户,分别是:
- 普通用户:用户名为pi,密码为pi
- 超级用户:用户名为root,密码为fa
nanopineo系统下载:http://download.friendlyarm.com/nanopineo3
wiki: https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO3/zh
基础
- 安装系统固件
官方提供的 FriendlyCore 预装了一堆诸如 samba、ftp 的服务。
但是官方并没有提供内核头文件,内核版本也比较老不适合折腾, 因此转而使用 Armbian 提供的固件
下载 https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/nanopineo3/archive 解压得到 img 文件后使用 USBImager 写入到 TF 卡中
image.png- 网络配置
插上网线和电源,微型电脑就启动了。如何确定 NanoPi 的 IP 呢,方法如下任选其一
- 登录路由器控制台查看
- 运行
nmap -n --open -p 22 192.168.1.0/24
扫描 ssh 端口
# 关闭密码登录
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 清空 root 用户密码
passwd -d root
- 本地化设置
- 替换为国内镜像源
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
- 驱动 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
- 安装其他组件
- 安装 Docker 社区版
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
- 安装 MySQL
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
- 安装 PostgreSQL
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的界面说明已经配置成功。
动态域名解析
注册并登录DNSPOD,购买域名,购买后点击我的域名
,再点击ontheroad.work(你注册的域名)
进入到记录管理
界面,点击添加记录
,按下图样子添加默认域名解析2个
再添加对自己域名的解析,记录值先随便填一个IP地址
image.png
因为我们要解析的ip是动态变化的,因此刚随便填写的记录值也要跟随着变化,下面在开发板上配置一个定时任务,利用别人封装好的bash,调用API,更改记录值
首先在DNSPOD账号中心,秘钥管理界面创建秘钥
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"
根据情况修改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并自动更新至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
会打开当前用户的cron任务表
在最底下添加两个任务,第一个每隔一分钟调用dnshpod.sh更新域名解析记录值,第二个每隔30分钟从github pull你更新的博客
# m h dom mon dow command
*/1 * * * * ./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帐号
- 打开浏览器准备好手机号去pubyun注册一个帐号。
- 可能需要身份证信息的验证,所以准备好身份证电子档。
安装必要的支持环境
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服务器让你能够在除家里以外的任何有互联网的地方访问获取上面的资源和文件。
网友评论