balena:你的樹莓派的強力後援

語言: CN / TW / HK

樹莓派是一個小巧的裝置,由英國樹莓派基金會開發的微型單板,設計的目標是以低價硬體和自由軟體促進學校的基本電腦科學教學。麻雀雖小,樹莓派本身也是一個五臟俱全的計算機,並且提供通用的 USB 介面、RJ45 網口以及 GPIO 排針介面予以擴充套件。且由於其較低的售價,受到了各種人群的喜歡。

但是,並不是喜歡樹莓派的所有人都有電腦科學的背景,相當大一部分小白都在通過關注極客玩家們的教程,一步一步跟著教程操作來複刻他們做出來的東西。可是,儘管有了教程的幫助,小白在實際操作的過程中也還是會遇到很多失敗的情況且不知道如何獨立解決。

所以我打算向大家介紹 Balena 這個一站式的解決方案。

Balena: 完整的生態

Balena 是一套完整用於開發、部署、管理 IOT 裝置,並提供了雲用於連線這些 IOT 裝置們的工具和服務。它包括了:

  • balenaEngine 是一個為嵌入式裝置優化的執行引擎,等同於 Docker 的存在,但勝在軟體體積更小,需要傳輸的映象層更小,記憶體佔用也更少。
  • balenaOS 是一個極簡的 Linux 系統,不同於 Raspberry Pi OS,僅包含了 balenaEngine 以及一些必要的系統元件,使得硬體資源能夠被最大化目標軟體的使用,但藉助 Balena 的其他服務,又可以很輕鬆的部署我們想要的工具。。
  • balenaHub 是一個類似 Github 的地方,開發者把軟體裝載進 balenaOS 中併發布到這裡,使用者可以從這裡免費下載已經打包好的「系統映象」。
  • balenaEtcher 是一個開源跨平臺的系統映象燒錄工具,有精美易用的 UI 介面,可以把上述系統映象燒錄到 tf 卡中,然後插入樹莓派直接開始使用。
  • balenaFin 一個建立於樹莓派計算模組之上的開發板,有更好的儲存和電源擴充套件等。
  • balenaCloud 就是承載了上述的開發互動介面,包括打包映象、管理裝置的雲端等功能,balenaCloud 我們後面展開細說。
  • openbalena 則是 balenaCloud 的開源版本,如果不信任由 Balena 這家商業公司提供的雲,那麼就可以考慮自己部署雲端,不過只支援單使用者,也沒有 Web UI。後者在 Github 上有第三方的開源版本可以使用。

從該生態版圖可見,Balena 基本包含了嵌入式開發中的所有環節, 哪怕你會說沒有樹莓派 ,都給你考慮到了。

Balena 服務的定價策略比較良心,對於個人使用者來說,前 10 個裝置使用 balenaCloud 都是全功能且免費的,基本上普通的使用者也不會超過 10 個 IOT 裝置需要連線雲吧。後續的服務收費檔位主要是根據裝置的數量來決定的。

對於上述的小白使用者來說,最有價值的莫過於 balenaHub 這個大倉庫,可以直接下載極客玩家們開發打包好的應用程式的系統映象,然後燒錄到自己的樹莓派中即可享用。

balenaHub: Airplay 伺服器

下面我將以 balena-rpiplay 專案作為案例在樹莓派進行部署,讓大家可以清晰直觀的看到專案部署的流程有多簡單。

balena-rpiplay 可以把你的樹莓派變成 Airplay Server,使用者把蘋果裝置的螢幕映象串流到樹莓派上,而樹莓派則通過 HDMI 連線電視/顯示器/投影儀,部署了這個專案以後算是 Apple TV 盒子中 Airplay 功能的平替。

balena-rpiplay 專案包含了 RPiPlay 專案,後者的安裝原本需要你手動安裝 cmake 包管理器、一堆 C 語言的依賴庫、OpenMAX 庫和客戶端。直接在 Raspberry Pi OS 安裝時需要從原始碼開始構建軟體,對於沒有 Linux 基礎的普通玩家來說,整個部署流程十分硬核且枯燥。但是如果進入 balena-rpiplay 的專案主頁看,裡面沒有一行實體程式碼,只有簡單的配置檔案描述,整個過程被大幅度地簡化了。

那麼實際部署流程是怎麼樣的呢?

  • 首先在 balenaHub 找到 balena-rpiplay ,點選圖中的 Get started 按鈕。
  • 在彈出介面選擇自己的樹莓派版本。
  • 輸入自己家的 WiFi 連線方式(SSID 和密碼),也可以選擇用網線連線。
  • 下載映象,通過 balenaEtcher 刷入到 tf 卡中,並插入到樹莓派中。
  • (可選) 對於沒有自帶 WiFi 模組的樹莓派 (2代及以下),需要自備 WiFi 介面卡。
  • 然後通電,靜待幾分鐘,就擁有了自己的 Airplay 伺服器。

整個過程不需要使用者用終端配置任何的東西,最麻煩的步驟僅是燒錄系統到 tf 卡中。燒錄映象到樹莓派的步驟,可以參考這篇文章:

整個部署上沒有手動輸入命令,修改配置檔案的體驗,背後多虧 balenaCloud 的幫助。當你燒錄好系統的時候,它的軟體架構是上圖這個樣子的。當你第一次給硬體通電的時候,首先如同絕大多數 Linux 發行版一樣,systemd 作為第一個守護程序啟動,並帶起 NetworkManager 通過預設的 WiFi 資訊連線你家裡的網路,另一方面喚醒並守護你安裝的容器,完成整個工作流程。

而從使用者的角度來看,整個過程就像是通了電就能自動完成安裝 Airplay Server 一樣,最後只需要拿出的蘋果裝置搜尋並連線上該樹莓派就可以進行投屏了。

balenaCloud:你的 IOT 管家

細心的同學可能還會發現,圖中還有一個抓眼球的 Device Supervisor Container (DSC),它一方面跟雲端的 balenaCloud 進行通訊,一方面也在本地網路廣播自己的存在,使得整個開發部署管理流程有了更多的可能。根據我自己的經驗,我會從幾個痛點聊聊 balena 是如何幫助開發者更好地解決 DevOps 的問題的。

開發

當要利用樹莓派進行開發的時候,我們首先遇到的問題就是「如何互動」。一般來說,在樹莓派上開發,你需要準備一個鍵盤、一個滑鼠、一個顯示器以及一根 HDMI 線,才能滿足基本的開發要求。

雖然新的 Raspberry Pi OS 系統版本支援了通過 txt 配置 WiFi 連線和啟動 sshd 服務,讓你可以通過無線 ssh 直接操作終端命令列。但是你又會發現缺少順手的開發工具、必要的執行時等,等把這些又千辛萬苦地安裝好後,相信你的熱情已經被消磨了一大半了。

DSC 是幫助開發者解決這個問題的關鍵。首先,balena 提供了 balenaOS base 映象給使用者燒錄到 tf 卡中,啟動它,DSC 會不斷廣播自己的存在。然後,使用者在自己熟悉的 PC/Laptop 中安裝 balena 這個 client 軟體,通過 sudo balena scan 命令即可搜尋到自己的樹莓派的 ip 地址。

Reporting scan results
-
  host:          63ec46c.local
  address:       192.168.86.45
  dockerInfo:
    Containers:        1
    ContainersRunning: 1
    ContainersPaused:  0
    ContainersStopped: 0
    Images:            4
    Driver:            aufs
    SystemTime:        2020-01-09T21:17:11.703029598Z
    KernelVersion:     4.19.71
    OperatingSystem:   balenaOS 2.43.0+rev1
    Architecture:      armv7l
  dockerVersion:
    Version:    18.09.8-dev
    ApiVersion: 1.39

假設你已經在 PC/Laptop 開發並測試好了軟體和應用,下一步需要的就是驗證在樹莓派上也可執行。那隻需要一行命令 balena push 63ec46c.local 即可把當前專案的資訊一鍵傳送到樹莓派中,DSC 負責接收並自動執行構建和執行,所有的命令列輸出會回傳到自己的 PC/Laptop 中,檢視並解決可能的錯誤,大大減輕了需要反覆檢視日誌的繁瑣過程。

[Info]    Starting build on device 63ec46c.local
[Info]    Creating default composition with source: .
[Build]   [main] Step 1/9 : FROM balenalib/raspberrypi3-node:10-stretch-run
[Build]   [main]  ---> 383e163cf46d
...
[Build]   [main] Successfully built 88065a1a3f00
[Build]   [main] Successfully tagged local_image_main:latest

[Info]    Streaming device logs...
...
[Logs]    [1/9/2020, 1:47:03 PM] [main] > node server.js
[Logs]    [1/9/2020, 1:47:03 PM] [main]
[Logs]    [1/9/2020, 1:47:04 PM] [main] Example app listening on port  80

部署

到了真正需要部署的時候,一個比較麻煩的事情是,給不同的硬體適配性地打包。回想我們給樹莓派開發部署好的軟體和應用,由於只有一張 tf 卡且暫時要把樹莓派挪作他用,等到想回顧這個應用或者重新玩一下的時候,又需要重頭再來折騰。

balena 幫助開發者把這件事情放到了 balenaCloud 中執行。開發者只需要編寫一份 balena.yml 檔案描述一些必要的資訊,比如支援的硬體如樹莓派 1、2、3、4 等,專案名稱等展示在 balenaHub 中。通過輸入 balena deploy 命令,即可把專案資訊傳送給 balenaCloud 然後構建出所有描述中支援的硬體的系統映象。當然,必要的 balena login 步驟還是需要的。

只需要開發完成,並上傳到 balenaHub 以後,想要重溫重溫以前的美好隨時都可以在 balenaHub 中下載回來這個映象,只需要做燒錄的步驟就可以了。

管理

管理的需求因人而異,但是對我而言曾經遇到的問題似乎都覆蓋到了。balenaCloud 提供了 Web 介面友好地讓使用者檢視自己的裝置資訊,並實現互動。

裝置狀態檢視。有的時候自己編寫的軟體穩定性不夠高,總會發生一些奇奇怪怪的事情,比方說:連不上自己的服務了。這時我們可以 balenaHub 裡 Logs 的位置檢視服務在命令列的輸出,它還支援 Filter 功能方便我們進行篩選分析。通過輸出,我們可以檢視軟體遇到了什麼問題,甚至在 Terminal 介面進行互動,相當於提供了遠端 SSH 內網穿透。一個機器多個服務的情況下,也可以友好地切換。

遠端重啟 / 關機。如果實在是不知道出了什麼問題,萬能的重啟大法總沒錯,面板上的 Restart 按鈕可以重啟特定的服務,Reboot 可以重啟整個機器。

更新軟體。如果你 debug 能力比較強,在修復 bug 以後,通過 balena deploy 重新推送新的版本,DSC 會根據系統映象下載頁面中的高階配置項「自動檢查更新間隔」來定期自動更新軟體。當然,急於用上修復後的版本,也可以通過 Web 介面手動觸發更新。

公網訪問。在我們的日常網路中,由於 IPv4 地址的耗盡,一般情況下已經基本沒有家用頻寬能獲得公網地址了。balena 提供了內網穿透服務,如圖中的 PUBLIC DEVICE URL,啟用該功能即可通過旁邊箭頭按鈕跳轉訪問服務,不過當你服務比較多的時候要自己手動加埠號。

以上,就是我在探索 balena 生態時發現的好功能,著實是驚豔了我一番,後續如果有更好玩實用的用法我會再繼續分享。感謝閱讀。

> 下載少數派 2.0 客戶端、關注少數派公眾號,讓你輕鬆玩轉樹莓派:bulb:

> 實用、好用的正版軟體,少數派為你呈現 :rocket: