树莓派(Raspberry Pi)是为计算机编程教育设计的廉价电脑,只有信用卡大小。

久闻树莓派盛名,第一次动购买的念头是看了 Kitten Yang 基于 Home Assistant 搭建智能家居的博文后,但装修时最终采用了小米智能家居的整体方案(目前已经使用一年有余,今后会专门写一篇使用体验)。今年上半年做了一些贴近硬件的软件开发,萌生了探索硬件的念头,遂购入树莓派。

我选购的是彼时最新型号树莓派3B+,最新发布的树莓派4有着不俗的性能提升。回顾折腾树莓派的过程,有几点经验分享:

1.网线和HDMI视频线不是必须的,将系统烧录到SD卡后,配置WIFI连接功能和SSH功能。然后使用同一局域网的电脑ping raspberrypi.local获得IP地址,使用ZSH(或手机使用Termius)连接到树莓派。

2.风扇的噪音比较大,可以选择铝合金外壳来改善散热或通过三极管调节风扇风速减小噪音。

3.默认的APT源下载速度比较慢,建议换成清华或中科大的源。

4.APT源中的golang版本比较老,需要通过APT安装golang后再下载新版本源码自行编译。

树莓派买来后我主要用在以下几方面:

1.搭建SAMBA文件共享服务,当一个简易的NAS,备份了一些照片和文件。

2.搭建Aria2+YAAW配合VLC的简易影视系统,用来看了几部电影,印象最深刻的当属《泰坦尼克号》。

3.将一些格式转换的任务丢给FFmpeg慢慢执行。

4.定时运行一些简易的定时脚本。

当然,就像「盖Kindle 面更香」一样,树莓派最主要的用途还是吃灰。

贸易战的消息此起彼伏,对美国,大家的态度多是忌惮和愤恨兼而有之。最近更是曝出Github受到美国出口管理条例的管制,无故停用了几个伊朗开发者的账号。

就像华为有HarmonryOS作为Android备胎那样,我决定部署一个自己的Git服务,不使用GitHub也不依托云主机,树莓派刚好派上用场。

说干就干,摆在眼前的第一个问题是,我的宽带是移动冰淇淋套餐赠送的家庭宽带,没有公网IP。解决方案主要有三个:

  • 花生壳等DDNS解析
  • Ngrok
  • FRP
    付费服务花生壳不考虑,Ngrok免费版不支持自定义域名,这次决定挑没玩过的FRP下手。

FRP是Fast Reverse Proxy的缩写,一款支持TCP/UDP快速反向代理的开源软件,可以很方便的内网穿透。和花生壳、Ngrok等不同,FRP客户端和服务端的控制权都在自己手中,这也意味着你需要准备一台有公网IP的VPS运行服务端程序。

以上来自Chinsyo Blog


由于扶墙,我手头有两三台服务器,正好可以试试可以给树莓派frp用,这里以阿里云香港为例子,记录自己的frp搭建教程。

1、查看服务器与树莓派的系统架构

服务器

树莓派

到frp的release页面下载最新的frp安装包。

树莓派端下载:

$ mkdir -p app/install & cd app/install
$ wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_arm.tar.gz
$ tar -zxvf frp_0.33.0_linux_arm.tar.gz 
$ sudo mv frp_0.33.0_linux_arm /usr/local/frp

服务器端把下载地址替换成:https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz

然后我们可以开始修改配置文件,树莓派配置文件为frpc.ini,服务器配置文件为frps.ini,对应C/S架构中的服务端和客户端。服务器采用默认配置,树莓派将表示服务器地址的x.x.x.x替换为实际地址。

服务器端配置情况:

# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080  # 我这里搭建了一个网页,如果只用ssh的话这行不要哈

服务器端很简单

客户端配置情况:

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000


[web]                    # 我这里搭建了一个网页,如果只用ssh的话,web这部分不用写
type = http
local_port = 80
custom_domains = frp.loll.cc

接着切换到上面的工作路径/usr/local/frp(以自己的为准,就在frp这个文件夹里),服务端执行./frps -c frps.ini,树莓派执行./frpc -c ./frpc.ini

电脑打开ssh连接工具,输入ssh -oPort=6000 pi@x.x.x.x测试我们的连接。注意这里pi代表在树莓派上的用户名,而x.x.x.x代表服务器的IP地址,正常情况下这个时候你会看到熟悉的Linux登录成功提示。

加入开机自动启动

树莓派端

首先创建service:

sudo vi /etc/systemd/system/frpc.service

# /etc/systemd/system/frpc.service

[Unit]
Description=frpc Service
daemonAfter=network.target syslog.target
Wants=network.target

[Service]
User=root
Type=simple
ExecStartPre=/bin/sleep 20
ExecStart=/var/frp/frp_0.33.0_linux_arm/frpc -c /var/frp/frp_0.33.0_linux_arm/frpc.ini

[Install]
WantedBy=multi-user.target

frpc.service 配置情况

服务器端

与树莓派端类似,这里贴一下我的配置:

[Unit]
Description=frps
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/var/frp/frp_0.33.0_linux_amd64
ExecStart=/var/frp/frp_0.33.0_linux_amd64/frps -c /var/frp/frp_0.33.0_linux_amd64/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target

常用命令:

# 刷新服务
sudo systemctl deamon-reload
# 允许开机启动
sudo systemctl enable frpc.service
# 运行服务
sudo systemctl start frpc.service
# 查看状态
sudo systemctl status frpc.service

注意:服务器端把frpc改为frps。

服务器端成功启动frp

树莓派端成功启动frp

远程ssh成功

成功!树莓派在家里,我在外面也能访问啦!

附:树莓派4Bfrp设置开机自动启动失败解决方案

一般教程都是教大家使用Systemctl来设置开机自动启动的,但是用Systemctl来给树莓派设置开机自启的话,我出现unreachable错误,一直需要手动启动才能成功。
如果树莓派不在自己边上,这个frp功能不是相当于废掉了么,所以探寻一下解决方案。

谷歌了一圈,发现unreachable就是路由表里没这个项,路由表里没这个项是因为没联网,没联网是因为联网服务还没起它就起了。

解决方案是延迟启动20s-30s,下面是我的配置情况,供参考。

目前自己使用的方法:

[Unit]
Description=frpc Service
daemonAfter=network.target syslog.target
Wants=network.target

[Service]
User=root
Type=simple
ExecStartPre=/bin/sleep 20.  # Debian下应该都有这个问题,目前我是延迟启动解决的就是sleep 20秒 然后启动frpc就没问题,至少10秒
ExecStart=/var/frp/frp_0.33.0_linux_arm/frpc -c /var/frp/frp_0.33.0_linux_arm/frpc.ini

[Install]
WantedBy=multi-user.target

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

鸡起犬眠,豕餐牛作。苏才郭福,姬子彭年。