树莓派4b搭建编译服务器
A. 使用树莓派打造一个私人NAS+博客(2)——硬件篇
title: 树莓派NAS_硬件篇
date: 2021-01-27 8:36:00
tags:
- 树莓派
- NAS
- 硬件
blog_home: http://www.smcbaq.top:8081/
我的计划是使用树莓派搭建一个 个人博客+NAS 的组合,一开始使用的是 树莓派3b+ ,已经做到了搭建基于 hexo 的个人博客,但是之前因为条件原因在电源,接线等问题上做出了各种妥协,最后导致有一定的问题,这次我重新使用 树莓派4b 部署一次,并且记录下这次的搭建过程留个记录,如果有人发现了这个系列文章,有兴趣可以试试,毕竟我也不知道这个可能能有多少人看。
这篇文章承接 上文 的网络篇,主要描述硬件的选取和理由,方便阅读者摸清自己的需求,并且排除一些硬件上的坑点。
首先列举一些我的需求:
可以看到基本上还是很简单的,但是这就牵扯到两个细节:
由于我家内网里埋的是1000M的超五类线(虽然不是万兆但还是感谢爸妈当时装修有相当的前瞻性),所以对于这个 NAS 我列出了如下清单:
之前由于造树莓派3b+被坑过一次这次我选择格外小心,但是还是列举出坑点:
其实组装就是按照想要的组装就好了,要求不高只接线都行,但是我还是买了微积木(最近很火的用来diy便携显示器的那种)来装一个我觉得还行的外壳:
这个积木是8mm的,可以支持卡一半的位置,也就是精度4mm,挺灵活的,充分利用这个性质
先做硬盘架的壳:
然后做树莓派的壳:
然后做整体的壳,先底座,再前盖,最后支撑,由于3000个有点少就支撑少做点,记得留出树莓派的接口位置:
最后把树莓派和路由器接好就完事了。
之后还可以在前面加个开关讲究点,但是由于这个要长期在线就暂时这样吧。
最后提一嘴本文 灵感来源 ,重点感谢!!!
B. 树莓派利用ftp搭建文件服务器教程
在局域网内共享文件除了可以使用SAMBA外还有FTP服务器
这里我们选用的FTP服务器是VSFTP
vsftpd是一个基于GPL发布的类UNIX操作系统上使用的FTP服务器软件,它的全称是“very secure FTP ”,从名称可以看出来高安全性是它的特点,除了安全性它的高速性与稳定性也是它的重要特点。
把配置文件修改成如下图(最简单配置)
修改后保存并退出(ctrl x)
更多详细配置
新建会话
名称自己起名字
主机处填写树莓派IP
端口号21
用户名为树莓派用户名默认为pi
密码为树莓派登录密码默认为raspberry
确定后就成功了
C. RaspberryPi4B树莓派4B,ThonnyIDE配置python解释器为虚拟环境
如图所示,单击Tools,选择Manage packages。
如图所示,IDE查询到的包和之前安装的一样。
D. 《树莓派4B家庭服务器搭建指南》第七期:使用树莓派解锁网易云灰色音乐
网易云横跨Window, macOS,linux ,安卓, iOS平台,而且提供了免费的音乐云盘存储各种无版权歌曲,本文提供一种通过树莓派解锁网易云灰色歌曲,并将歌曲存储到网易云网盘,实现全平台听各种灰色无版权歌曲的方法;本文也提供了,将解锁服务通过内网穿透发布到了互联网上的方法,你也可以将解锁服务分享给自己的小伙伴。
在某宝上,这套解锁服务还能当商品来卖,一本万利。
如果测试没有问题,可以Ctrl + C组合键关闭服务,然后使用 sudo docker-compose up -d 后台启用服务
我们可以将树莓派8686端口的服务,映射到云端服务器
如果对frpc配置有疑问,请查看往期 《树莓派4B家庭服务器搭建指南》刷Ubuntu Server 20.04,绑定公网域名,对公网提供http服务,SSH登录服务 https://www.v2fy.com/p/2021-10-01-pi-server-1633066843000/
由于我们前几期已经将frp.v2fy.com绑定到云服务器
这里可以直接通过 http://frp.v2fy.com:8686 访问树莓派的网易云解锁服务
云盘有免费60GB的空间,对于普通人而言,只要不大量传无损音乐,完全够用了
另外, 最近网易云PC版更新了全屏纯享功能
大屏唱片机风格的UI,非常震撼!
本文已经完成了公网的解锁服务,Windows版是最容易配置解锁的,如果你想在iOS, 安卓等移动平台解锁,理论上也是可行的,但配置操作起来比较繁琐,感兴趣的可以参考 https://github.com/nondanee/UnblockNeteaseMusic/issues/22
E. 树莓派4B+ Centos7 部署k3s集群工具
kubernetes用于大型集群管理,而k3s属于kubernetes的一个轻量级版本,常用于嵌入式设备使用。现把它安装到树莓派上使用。
这里用到树莓派的系统是:CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2009-sda.raw,型号是4B+,8g内存。
树莓派初次启动需要扩容,并且做一些基本调整:
cgroup是linux用来对进程分配cpu、内存资源的工具,需要在启动系统时开启他,k3s会用到。
在/boot/cmdline.txt后加入这个,然后reboot
k3s是一个轻量级的k8s,适用于树莓派这种嵌入式设备。
这个脚本跑完的时候,会把k3s添加到systemd里面,可以通过systemctl status k3s来查看运作状态。启动成功就可以使用啦
官方参考: https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/
等它重启个好几次之后,基本就成功了。
如果一直失败,可以输入命令刷一下iptable缓冲
iptables --flush
iptables -tnat --flush
等第二个结点加入后,在任意结点执行命令,都能查看到已有的2个Server(Master)结点了
当Server结点数大于等于3个且为奇数时,集群才可以实现高可用。
大于等于3是因为k3s使用了Raft算法来实现一致性,而Raft算法的容崩率为1/3,也就是只要集群中有2/3台机器正常运作,集群就能正常运作,所以3台机器是最低要求;要奇数个结点是因为Raft算法过程中有一个很重要的随机投票选Leader的流程,结点们通过定期投票选举出一个Leader角色,然后其他结点在它的任期内就向他同步数据,这个时候如果结点数是偶数,那么容易出现平票问题,选不出leader,并且,崩溃后集群进行数据恢复过程中,实现一致的方法是多数服从少数,如果是偶数Master结点,且刚好被分割成2个结点规模一样的集团,就没办法恢复数据了[裂开],所以需要奇数个结点以避免权力平分问题。
以上为个人理解。
有兴趣的同学可以一起探讨这类共识算法,与此类似的还有联盟链的PBFT类算法,比特币PoW算法等等。
因为集群并非开放式集群,加入集群需要获取一个token作为校验。这个token可以从Master服务器上获取。(手动加入的话,仅需要使用相同的K3S_TOKEN参数启动即可。)
这样,结点就正常连接上啦:
关闭k3s进程后,后台还留存一些服务占用着端口,需要用官方脚本关闭他们
可以flush一下iptables,等他自己重启就行了。
有可能发生了一些冲突,可以试下重装k3s-agent
目前系统已经伴随k3s安装的一些软件:
crictl :类似与docker的命令行工具,比如:
k3s :封装了kubeneters基本工具在里面的集成,如使用kubectl:
这里示范部署一个最简单的web应用
--net host 代表与本机享受同一个网络命名空间
这里可以在docker容器内开启ssh服务: https://blog.csdn.net/Leo_csdn_/article/details/96150534
做好docker镜像后,就可以部署到集群上了。
等一会儿就能在pods列表里面看到了:
但这时候,这个pod并没有对外开放,只能在集群内部相互访问,通过get services命令查看集群的服务,发现并没有我们的hello-node服务。
expose命令其实是创建了一个service,用于给这个pod提供访问入口。
(如果使用--type=LoadBalancer,则代表一个deployment上管理的所有POD进行均衡负载,但这里还没用上deployment,第四章节会使用到)
等一会儿,pod上就有一个结点IP的对外端口,供外部访问了。
运行结束后,刚启动过的pod和service就不见了,服务也停止了。
docker容器,其实就是一个运行的轻量级系统,里面可以跑我们的业务应用。
而POD则是代表容器的集合,一个POD可以运行多个容器,一台机器上可以运行多个POD。
POD未必是一个对外开放的服务,他可能只是内部计算的程序,默认只能集群内部通信,所以还有Service的概念,用于让POD对外开放端口,供外部访问。这里的service本质上是个集群内部的负载均衡器,用来给同一个Deployment分流;对应的还有Ingress,外部负载均衡器,用于给多个Deployment分流。
而Deployment顾名思义,就是一次部署的抽象实例,比如说,现在需要部署一个3台机器均衡负载的nodejs业务应用,那么这个部署任务则代表一个deployment实例。
很快,我们可以看到POD和deployment的部署情况,都已经正常运作。
进入容器后可以使用基本linux命令,也可见8080端口已经被我们的node应用占用了。
但是此时service还没有他们,也就是正处于无法提供外部服务的状态。
这里对一个deployment里面的3个pod启动了个默认均衡负载服务,暴露出来的一个端口是30057,访问可通。
也能够通过logs命令查看控制台输出的日志。
因为deployment实例中包含了pod的部署配置,所以删除deployment时,k3s就会直接把pod也删除掉。
但service并不在deployment部署的范围内,所以需要同步删除它,在删除命令中通过","与deployment分割开来即可。
至此已经把刚起来的服务全部关闭掉了。
这里我们看到3个Server(Master)结点由于需要维护集群高可用,对CPU持续20%左右的消耗,内存也需要一个G左右。而Agent(Wroker)结点只需要执行部署任务,所以对内存与CPU的需求都相对低一些,仅维持在10%左右的CPU和半个G左右的内存消耗。
参考: https://zhuanlan.hu.com/p/120171512
参考: http://kubernetes.kansea.com/docs/hellonode/
F. 在鸿蒙(OHOS3.0)编译框架中添加树莓派4B
之前在树莓派4b上点亮了OHOS3.0,不过内核是用tftp拉取的,根文件系统挂在了NFS上,拔了网线就无法启动。当然这么操作只是为了方便调试,而最终需要的是一个可以烧录到TF卡上的img镜像文件。这就需要将所有调试好的内容添加到OHOS3.0的编译框架,本以为是很简单的事情,好家伙,整了这么久,感觉添加编译框架比移植本身更复杂。于是我整理了添加树莓派单板到编译框架的内容,希望对各位有所帮助,为大家避坑。
主要参考 hisilicon build组件仓,添加一个procts编译组件,这个组件是在产品配置文件中指定的。比如
proctdefinecommonproctsRPI4B.json
其他部分参考Hi3516,但是其中2条,指定单板组件路径,并添加组件。如果删除这两条,将不能编译内核,只生成OHOS的文件系统。
接下来在device目录下,新建一个raspberrypi编译组件文件夹,并添加 ohos.build 文件。和前面产品配置文件中的设置对应起来了。
deviceraspberrypibuildohos.build
新建 deviceraspberrypibuildBUILD.gn 当然每个厂家不可能只有1个板子,如果有其他单板就在这里指定,比如树莓派2B、3B等
既然前面指定了rpi4b的编译配置组件,那么就在 deviceraspberrypi 新建一个 rpi4b 的目录,可以参考 hi3516dv300 build组件
deviceraspberrypirpi4bBUILD.gn
至此一个rpi4b build组件就添加到OHOS3.0的编译框架了,之后相关内容添加到这个文件夹下就可以了。
接下来分析下目前移植了树莓派4B的哪些内容,如何将这些内容编译进OHOS3.0。
关于补丁可以参考 Patch组件,可以得知内核编译由kernel.mk来执行
kernellinuxbuildkernel.mk
所以补丁文件需要放到正确的路径下,以正确的名字命名就可以patch到内核。
hdf.patch补丁文件,现在还没有移植HDF相关内容,所以可以先使用Hi3516的
rpi4b.patch补丁文件,使用树莓派的官方镜像,https://github.com/raspberrypi/linux
kernellinuxconfiglinux-5.10archarmconfigsrpi4b_standard_defconfig
内核配置文件目前已知的需要开启下面内容,但是肯定不止这些,以后会继续更新
Pi4的GPU是VideoCore VI支持OpenGL ES 3.2,而Pi3的GPU是VideoCore IV支持OpenGL ES 2.0。VideoCore IV 驱动程序是 VC4,VideoCore VI 驱动程序的 V3D。内核已经提供驱动,参考rpi4b_standard_defconfig将驱动直接编入到内核。
同时需要在config.txt中开启设置
OHOS中修改weston的配置文件,指定显示驱动
systemetcweston.ini
具体思路就是先查找设备号,根据设备号找到驱动程序。
前面内核配置的时候rpi4b_standard_defconfig中已经将触摸驱动编入内核,所以后面不需要在init加载模块了,修改下eudev的配置文件即可。
third_partyeudevrules.d ouchscreen.rules
正常情况下内核是由uboot进行引导的,而且OHOS默认生成uImage。但是树莓派自带BootLoader,虽然可以先用树莓派自带的BootLoader启动uboot,再用uboot加载uImage,但是这样会比较麻烦,而且会增加启动时间。不过目前 zImage是写死在kernel.mk中的,没办法改下编译脚本把。
kernellinuxbuildkernel.mk 将 uImage 改为 zImage moles dtbs
kernellinuxbuildbuild_kernel.sh
kernellinuxbuildBUILD.gn
kernellinuxbuildkernel_mole_build.sh
这里内核编译会依赖proct_path="vendor/$proct_company/$proct_name"下的hdf.hcs文件,得先新建一个应付下,不然会报下面这个错误。
ninja: error: '../../vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs', needed by 'gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb', missing and no known rule to make it
新建:vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs
对于镜像烧录,Hi3516会将uImage、system.img、vendor.img等镜像烧写到emmc,但是树莓派使用TF卡启动,所以需要对TF卡进行分区,然后复制对应的内容到各个分区。首先制作树莓派boot目录,这个用来目录存放树莓派设备树、config.txt、cmdline.txt、内核镜像等信息。写一个简单的mkboot.py脚本来实现这个功能,位置在码仓.py将会生成boot.img。
为了方便烧录,需要将boot.img、system.img、updater.img、vendor.img、userdata.img合并成一个rpi4b.img。还是写一个简单的脚本来处理这个步骤.py。
不过有个问题,主分区只支持4个,所以updater.img暂时先不合并了,这个问题等以后再来处理。
最后将会得到一个rpi4b.img的镜像文件,将这个文件烧录到SD卡就可以了。
Linux:可以使用dd命令
windows:使用Win32 Disk Imager工具烧录即可。
到这里总算是跑通了一个完整的添加新单板的流程,只不过目前只适配了显示和触摸。接下来打算尝试HDF或者distributed部分。
G. 使用树莓派打造一个私人NAS+博客(1)——网络篇
title: 树莓派NAS_网络篇
date: 2021-01-26 10:35:00
tags:
- 树莓派
- NAS
- 网络
blog_home: http://www.smcbaq.top:8081/
我的计划是使用树莓派搭建一个 个人博客+NAS 的组合,一开始使用的是 树莓派3b+ ,已经做到了搭建基于 hexo 的个人博客,但是之前因为条件原因在电源,接线等问题上做出了各种妥协,最后导致有一定的问题,这次我重新使用 树莓派4b 部署一次,并且记录下这次的搭建过程留个记录,如果有人发现了这个系列文章,有兴趣可以试试,毕竟我也不知道这个可能能有多少人看。
在这个系列文章中,有的步骤可能按照别人的文章博客可以直接完成没有什么坑点,我就不再赘述了,直接使用链接,重点是中间可能涉及的坑点。
电脑一台、路由器一台(我使用安装了改版梅林的网件R6300U)、树莓派一个(带电源,我使用4b)、网线一根(可选,我使用支持千兆的超五类线)
家庭组网重点是把路由器搞好就成了,我们这一步的目标就是让树莓派可以内网访问,我家网络是如下结构:
很简单的结构,简单来讲就是主路由管客厅,从路由管房间,由于主路由性能更加优良树莓派计划接到主路由上,而我大部分时间是在房间里面连接从路由的WiFi,所以需要注意主从路由不能打开 AP隔离 ,不然电脑不能访问到路由,其他的默认就行了,路由器尤其是主路由推荐使用 dhcp模式 ,要想验证很简单,手机连接主路由,电脑连接从路由,电脑手机能互相ping通即可,安卓手机ping电脑使用APP: termux 。
树莓派安装好系统打开ssh连接即可,我使用的是 Raspberry Pi OS(Raspbian) 的desktop版,没有安装推荐软件的版本,具体开启方式是在boot盘符下添加一个名为 ssh 的文件即可,不要任何后缀。
安装树莓派系统可以学习这个 教程
然后将树莓派接好电源,插好网线连接到主路由的 LAN口 ,等待一段时间,在路由器管理界面找到树莓派分配到的 IP (设备名通常为 pi 或者 raspberrypi ),电脑ssh连接树莓派成功即可,树莓派初始用户名为 pi ,默认密码为 raspberry ,记得使用 passwd 和 sudo passwd root 来分别修改 pi 用户和 root 用户的密码。
如果没有网线,则先提前给树莓派 设置好WLAN连接 ,然后找IP连ssh都一样了,但是不建议这样做,具体原因后面的文章中 软件篇 会提到,当然如果到时候看了则另说。
公网访问其实并不是一个硬需求,可以通过 frp 来做内网穿透,但是这就需要一个额外的服务器,这就有点有违初心了,毕竟我本来搞这个的目的之一就是为了多出一个服务器嘛。
公网访问重点就是要有公网IP,有的运营商会直接给一个公网IP,比如我在学校的电信寝室宽带,但是绝大多数都不会给,所以需要提前判断一下,主要有两个方法:
如果没有公网IP,那么打自己家宽带提供商的电话叫客服开通一下,一般来说都是包含在了宽带服务中的,如果问起来你要干什么用可以说自己家里要弄监控需要公网IP随时查看,一般很快就开通了,免去扯皮的功夫。
虽然说拿到了公网IP但是一般来说运营商提供的都是动态IP,之后外网访问的时候会比较麻烦(路由器一般会提供远程查看软件,可以看到IP,但是经常都得换IP访问这根本方便嘛),所以我们需要使用动态域名解析——DDNS,这样就可以使用域名直接访问了
首先是梅林自带的华硕家的免费DDNS,由于我的网件刷魔改梅林的版本有BUG,DDNS经常会自己断掉,就得手动操作路由器打开,由于过于频繁大概2-3天一次所以我最后选择放弃,但是实测华硕AC68U的官方梅林不会出现这个BUG。
最后我的选择是阿里云的DDNS,魔改梅林的优势在这里就体现出来了,可以直接安装插件,设置好以下 标记 内容即可。
购买域名有一系列的实名制操作,如果已经有这个需求了请耐心完成
最后我购买的是一个比较便宜的域名,个人博客正在使用的就是这个域名 http://www.smcbaq.top:8081
这个很好理解,因为内网的设备不能直接访问,所以我们需要设置路由器做一个端口转发来映射设备,梅林固件在以下 标记 中设置通信端口和本地端口即可
通信端口是外网设备连接时访问的端口,本地端口是本地设备(这里是树莓派)开启的服务占用的端口,前者随便设,后者需要注意配置,例如:
我希望访问8081端口来访问我的博客,那么通信端口设置8081,这个博客服务运行在树莓派的8080端口上,那么本地端口设置为8080,本地IP是树莓派的IP,通信协议使用TCP。
添加后保存即可。
ps:这里面的操作我完成得比较早,教程是写文临时找的,可能在你的电脑上有点坑,记得仔细操作不要看见命令盲目 ctrl+c/v 。
如果从路由功能比较齐全,可以打开 AP模式 的话,则可以使用两个同名WiFi在家里无缝切换相当方便。
可以给树莓派设置一个固定分配的内网IP地址,虽然一般不会变动但是一旦变动了会比较麻烦。
ssh连接可以将电脑的公钥交给树莓派实现 免密ssh登录 ,具体教程 在这里 , windows生成公钥 教程是 这个 。
电脑可以使用vs-code安装Remote-SSH插件来方便文件操作,具体使用自行查找,挺简单的。
H. 如何用树莓派搭建个人 web 服务器
1、安装Apache
Apache可以用下面的命令来安装
sudo apt-get install apache2
Apache默认路径是/var/www/
其配置文件路径为:/etc/apache2/
可以通过:sudo vi /etc/apache2/ports.conf修改监听端口号
重启服务生效:sudo service apache2 restart
2、安装mysql
sudo apt-get install mysql-server
安装过程中,会出现一个提示符让你输入一个密码。
这个密码是mysql root用户的密码。
3、安装PHP
输入下面的命令,就可以安装PHP 5,以及PHP访问mysql数据库所需要的库。
sudo apt-get install php5
sudo apt-get install php5-mysql
4、测试
安装完成后,可以在浏览器中输入你路由器的IP或域名,就可以访问你的网站了。
你应该能看到一个页面显示“It works”,但是没有其它内容。
创建一个/var/www/index.php
5、外网访问
这里使用蒲公英组建异地局域网实现外网访问
先将蒲公英安装包预先上传至树莓派(路径:/home/oray/下载/PgyVPN_CentOS_2.0.0_x86_64.rpm)
通过cd命令进入存放蒲公英安装软件的目录,输入rpm命令进行安装;
cd 下载/
rpm -ivh PgyVPN_CentOS_2.0.0_x86_64.rpm
安装成功后,任意路径下输入“PgyVistor”命令即可调出交互界面,按照界面指示输入账号进行登录,可以选择打开自动登录。
之后,外网设备同样安装蒲公英客户端,用同一账号登录就可以访问树莓派的Web服务了~
I. 树莓派4B安装 docker 和 docker-compose
有几个镜像可供选择(反正我是选择阿里云镜像源成功的)
J. 树莓派服务器集群架设
实际上每个派都要装系统,但是装的不是完整系统而是核心,和必要软件,某个pi要被设置为中心机,上面带完整系统和 相关软件安装文件。
理想情况是,一个pi接入网络,中心机配置后就在该pi上部署相关软件,然后接入集群开始工作。但是要想完成这个集群需要做很多工作,比如部署,接入,运行,监控,分离,分类(存储类型pi,业务派)。