樹莓派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,業務派)。