作者:架構師李肯(全網同名)
1 前言
本文重點介紹了基于RT-Thread和RA6M4實現samba服務的移動網盤,包括RT-Thread操作系統的使用情況、硬件載體RA6M4處理器、Samba服務的適配移植等核心內容。
關于Samba服務,使用Linux系統作為開發環境的小伙伴一定非常熟悉,它是Linux操作系統中的文件系統與Windows操作系統的文件系統溝通的重要橋梁。更多關于它的更多介紹,可以詳見 Samba 。
2 項目簡介
2.1 項目名稱
基于RT-Thread和RA6M4實現samba服務的移動網盤
2.2 設計思路
基于RT-Thread操作系統,使用RA6M4硬件載體實現samba服務器的功能,把文件通過 samba 協議共享出去。
2.3 主要解決的問題
在使用場景上,這個嵌入式移動網盤的投入使用,可以滿足一定程度上解決云主機快速免費存儲空間擴容的難題,且數據本地可控。
2.4 項目創新點
samba服務在小型RTOS設備上的移植和使用。
3 系統架構介紹
系統核心架構圖如下圖所示:
一言以蔽之:Windows系統通過samba協議訪問搭載RT-Thread操作系統的RA6M4實現的smdb服務 。
4 系統設計說明
下面就系統的各個組件的設計,做簡要的說明。
4.1 硬件部分
硬件部分主要分為四大部分:MCU主控、Wi-Fi模組。
MCU主控 :RA6M4
Wi-Fi模組 : ESP8266
我這里使用的搭建ESP8266 Wi-Fi芯片的模組ESP-12F,它是由安信可科技開發的,該模塊核心處理器 ESP8266 在較小尺寸封裝中集成了 業界領先的 Tensilica L106 超低功耗 32 位微型 MCU,帶有 16 位精簡模式,主頻支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板載天線。
4.2 軟件部分
RT-Thread內核部分
本項目使用了最新版本的RT-Thread,由于本項目需要使用 at-server 的功能,而Studio更新的 4.1.0 版本并沒有很好地支持這個特性,后面在最新的代碼倉庫中看到了有關 at-server 的更新,于是手動更新到了最新的版本。
軟件包部分
這里主要用了 at_device 軟件包,并且使用它搭載 ESP8266 Wi-Fi模塊,建立server角色的網絡服務。在測試工程中,還使用了 ramdisk 這個軟件包,但是使用過程中,發現了一些問題,后面沒有再使用。
samba服務部分
本次移植samba源碼,考慮到嵌入式設備的ROM/RAM比較緊張,特意找了很老的samba源碼,最終的實現也證實了這一點,太新的版本壓根不夠資源去移植,且它依賴了大量Linux原生的接口,根本無從適配。
經過簡單驗證和挑選,我選的是 smaba-1.9.13,這個版本大概是 1995年發布的,大家可以想象下:
更多samba的歷史版本,可以查看 這里
https://download.samba.org/pub/samba/old-versions/
應用邏輯部分
應用邏輯部分,比較簡單,基本就是初始化系統、初始化Wi-Fi網絡,初始化文件系統、初始化smbd的配置文件,以及啟動smbd服務器,并處于監聽狀態,等待客戶端來連接。
5 項目實施過程
主要實施過程如下所示:
5.1 項目預研
早期有做了一個 嵌入式移動網盤 的初步方案,不過當時是想自己實現協議,真正實現下來,難度可是非常大;不僅要自己設計協議,還要自己設計客戶端、服務端,這期間的穩定性也沒辦法保證。
后來,我考慮到了使用 現在的samba協議做移植,但看了最新版本的smaba協議源碼,感覺一般的嵌入式設備壓根可能跑不起來,因為實現得太龐大了。
在這次項目前期,我想到會不會samba早期的實現包會比較輕量呢,也許能夠在RTOS上基于嵌入式設備把它跑起來?抱著試一試的態度,才有了這個項目。
5.2 方案設計
整體方案設計,延續上文有提及的系統架構示意圖,整體上思路還是比較簡單,核心工作就是完成samba協議基于RT-Thread和RA6M4上的移植適配。
這個方案下,客戶端(Windows側)都是現成的,并不存在障礙,但是要保證實現的smbd服務能兼容Windows10的samba掛載請求。
5.3 方案移植
真正做方案移植的時候,我分三步走,每一步的輸出都是后一步輸入的重要前提:
第一步:檢索可用的samba源碼版本,使用原生的Linux系統快速驗證
這一部分,重點是要快速驗證可行性,并且只能是源碼編譯那種移植,不能用軟件包,期間我總共下載了近 20 個版本,最終選定使用 1.9.13 版本,理由是它使用了SMB2協議版本,同時,它的源碼結構是一開始的簡單版本模式的最后一個版本,后面的版本源碼目錄就變得復雜了,層次關系比較亂。
第二步:使用Qemu-vexpress-A9做基于RT-Thread操作系統的移植適配
單在Linux上跑通了并不稀奇,也不見得就一定能在RT-Thread系統上跑通,所以為了盡快驗證在RT-Thread跑通的可能性,我選用Qemu-vexpress-A9做仿真驗證,解決一些接口移植的問題,同時還要調通smbd跑起來后,對Windows10的samba請求的兼容。
幸運地是,在Qemu上移植還是比較順利的,我把一些操作系統沒有實現的接口玻璃出來,同時一些RTT無法支持的特性就使用宏定義屏蔽,只要不影響核心邏輯功能即可。
另外一個,使用QEMU模擬器,使用使用 網卡橋接或網卡共享 使得windows可以鏈接QEMU建立的服務器,這個課題也在這部分的移植中有所收獲,以后有時間可以寫篇教程介紹介紹。
第三步:將Qemu模擬器跑通的源碼移植到RA6M4上
最后一步才是真正的上戰場,這里就需要先熟悉RA6M4的開發環境,工程模板的主題框架等等。
隨后才慢慢開始移植ESP8266的接入,samba源碼的接入,下載調試等等。
這期間也遇到了一個很坑的的事,在接入ESP8266的時候,不知參考了論壇哪篇文章,它展示的UART3的引腳號是錯誤的,結果把我誤導了,導致ESP8266死活不成功。
后面還是自己翻手冊,找到了配置引腳的地方,終于把Wi-Fi模塊搞定了,真的是 盡信書,不如無書 !
5.4 方案調試
方案調試,一個是把ESP8266接入進來,讓RA6M4具備對外的網絡能力;另一個就是把samba服務在RA6M4上給跑起來。不過這說起來,真的就是一把鼻涕,一把累。后面的項目總結會祥講,每一個成功的項目背后一定少不了困難。
5.5 方案優化
后續提升下RA6M4的server網絡模式的穩定性、將文件系統掛載在flash上的可能性,同時實現samba服務中對用戶名和密碼的校驗。
6 項目效果顯示
相關的展示圖片和演示視頻,見下文:
【項目展示圖片】
【項目演示視頻】點擊 這里 播放。
【項目開源代碼】
REPO: RT-Thread_RA6M4_Samba
https://gitee.com/recan-li/rt_thread_ra6m4_samba
7 項目復盤
搞了幾個項目了,RT-Thread Studio還是用不慣,可能一直以來開發我都習慣了遠離這種集成式的編程IDE,移植傾向于類似sublime這種輕量級的編輯工具,它只負責編輯,構建編譯還是使用其他的方式進行。我總是覺得這樣收放更加自如,現在使用Studio,有些時候總覺得縮手縮腳的,可能真的是使用不夠熟吧。
RTT中實現 at-server 的可參考例程很少,在論壇里也發現好幾個朋友有類似的困惑:第一個是如何使用,第二個是穩定性如何。后續有時間我再總結總結我使用這個 at-server 的一些經驗。
在我的這個項目中,說實話 RA6M4 這個使用起來還是比較 吃力,主要由兩個方面:
1)這個項目強烈依賴網絡,而本身資源環境并不帶網絡適配器,只能使用類似ESP8266這種外設網卡,而且是AT模式,加上RTT中的 at-server “并不穩定好用”,所以前期我這里摸索困惑了好久好久,一度有放棄的念頭;
2)這個項目強烈依賴文件系統,而RA6M4的例程里,對文件系統這一塊也暫時未看到好的適配例程,只能自己去玩;所以為了加快方案的驗證,我采用了 ramfs 用內存去仿真文件系統,一定程度上解決了一些問題;但是偏偏ramfs又不支持創建目錄,經過搜索軟件包,得知ramdisk這個軟件包可以解決這個問題。結果使用后,掛載是掛載上了,也可以創建目錄,但是/tmp目錄下一堆的莫名文件,每個文件幾百MB,也可能是一些配置搞錯了,但是掛載出來的文件系統有問題;最后還是放棄了ramdisk。
綜上兩個最大的需求,都沒有很好的解決方案,所以最終在RA6M4上實現的并不是很穩定。
類似的,同樣的samba源碼,在QEMU-VEXPRESS-A9上,跑得非常優秀,非常穩定,這個真就比不了。
samba 源碼的移植過程中,遇到很多Linux原生對文件系統權限管理的接口或內容,考慮到RTT這邊實現的文件系統肯定沒有相關的,所以裁掉了很多關于這方面的校驗。同時,實現的samba目前還是guest模式,即不檢驗用戶名和密碼,后續可以再改進改進。
RA6M4的下載真的太慢了,下載的過程都可以打個瞌睡了,比較影響調試。
8 致謝
感謝論壇各路大佬的支持,感謝瑞薩和RT-Thread的大力支持,期待后續有更多這樣的優秀活動開放。
9 更多分享
架構師李肯
架構師李肯(全網同名),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲CSDN博客專家、CSDN物聯網領域優質創作者、2021年度CSDN&RT-Thread技術社區之星、2022年RT-Thread全球技術大會講師、RT-Thread官方嵌入式開源社區認證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯網架構設計師)等榮譽。堅信【知識改變命運,技術改變世界】!歡迎關注我的gitee倉庫01workstation ,日常分享一些開發筆記和項目實戰,歡迎指正問題。
評論
查看更多