首頁 > 軟體

玩客雲折騰記錄之編譯 ArmBian 系統

2022-02-09 19:01:46

寫在前面

最近有幾個有趣的小想法想實踐一下,希望使用低功耗、低成本的硬體跑一些持續性的獨立的服務。最初的想法是入手一個樹莓派得了,開發板尺寸小巧,資源豐富。然而搜尋價格的時候發現最新版的樹莓派,如果搭配上一些常用配件,加一個客製化外殼,算下來成本幾乎能和我之前的 NUC 裸機價格一較高下。

那麼,有沒有價效比更高的方案呢?

為什麼選擇搭載 Amlogic S805 的玩客雲

於是,目光就鎖定到了同為 ARM 架構的廉價 SoC 上,前一陣群裡有同學推薦過“玩客雲”,搜尋了一番,發現雖然晶片其實是幾年前的款,但是效能並不差,擁有一個千兆網口,並且機器自帶一個金屬外殼 。因為我不需要使用 GPIO 介面 ,所以相比較樹莓派而言,一套 50 元左右的小主機,價效比高非常多。

玩客雲小裝置的外觀

而且裝置因為使用了廉價的 ARM 晶片,不光執行過程中的溫度不算高,日常功耗也非常低。

實際使用過程中的功耗也比較低

玩客雲採用的晶片方案是 Amlogic S805,和著名的 Hard Kernel 幾年前推出過的開發板“ODROID-C1+”幾乎完全一致。這個板子效能基本是樹莓派3B的兩倍,前文中提到的玩客雲的成本大概是目前二手樹莓派3的1/5~1/6。

S805 和樹莓派3之間的效能比較

如果追求絕對的效能,在價格差不多的情況下,可以考慮入手搭載 S905 晶片的“電視盒子”,效能和最新的樹莓派4相比也不落下風,甚至在一些環節中效能高出不少。不過缺點嘛也是有的,目前這類機器受限於成本問題,很少有利於散熱的金屬外殼;因為效能更高,發熱量也會更大。不過即便如此,綜合成本也只是樹莓派4的十幾分之一。

系統選擇及“原始碼溯源“

相對於硬體而言,軟體系統也非常重要。

擁抱 Linux 讓我們的裝置有了無窮的可能性,樹莓派有 Raspberry Pi OS(Raspbian),玩客雲則因為搭載了和 Hard Kernel 之前產品一致的 Soc ,所以可以使用 ArmBian。

在正式介紹如何為玩客雲更換系統,以及編譯一份乾淨的新版映象之前,我要介紹一下這個系統的由來,因為這裡有太多前人的無私貢獻。

Armbian 官方程式碼

Armbian 主要開源專案狀況

2014年末,Armbian 立項,或許是暴風雨來臨之前的沉寂,在 GAP一年多之後的2016年,Armbian 開始了每年千萬行程式碼變動的爆發式成長。截止目前為止,官方專案已經支援了接近 150 個不同的硬體裝置的適配。

來自戰鬥民族的 Armbian TV 分支

https://github.com/150balbes/build

在2018年7月的時候,一名網名是150balbes的戰鬥民族網友出手了,他開始為各種官方原本並不支援的硬體做適配,過程中吸引了來自全世界有相同硬體折騰需求的網友,他第一個適配的 SoC 就是我們本文的主角同源的 s90x 系列的晶片。

在2020年的光棍節前,他或許是覺得直接在官方原有的程式碼檔案上進行修改,每次上游程式碼(Armbian)更新,他需要合併的內容太多了,畢竟Armbian是一個每年千萬行程式碼變更的專案,於是他刪除了原本開發了幾個月的程式碼,在官方原有開發模式上新增了一個只有他自己使用的釋出型別(dev),將之前的程式碼遷移了過來。隨後他開始了專注於將 Armbian 適配到電視盒子上,並且將自己的分支命名為 armbian-tv,持續更新到了現在。

來自阿拉伯網友 moham96 的分支

https://github.com/moham96/Build-Armbian

阿拉伯網友 moham96 很快關注到了俄羅斯小夥子的專案,並立馬 fork 了一份,升級了專案使用的 Linux 核心到 4.x 版本,並針對裝置 Mac 地址設定方式進行了調整。

來自國內網友 leo357449107 的分支

https://github.com/Leo357449107/Build-Armbian/tree/20.11

前文提到的 150balbes 在春天的時候進行了一次分支的重構,其實這次重構非常“暴力”,原作者直接刪除了之前一直在維護的 Build-Armbian 專案,重新 fork 了一份新的 Armbian。

一般情況問題不大,但是如果有其他開發者正在基於他的程式碼進行開發的話,就會遇到類似下面的狀況:

2021/01/23 leo357449107 我正在愉快地Dubug的時候,上游把程式碼刪了,我也把程式碼回滾了,然後,就沒有然後了。

估計也是沒辦法,網友 leo 只好在 GitHub 上尋找了一份原來專案的 fork 版本(上文中的 moham96 的分支),再次進行 fork,並提交了自己的程式碼變更。

隨後網友 leo 的版本也就此停止了更新和維護(Armbian 20.12 Buster with Linux 5.9.0-rc7),不過在停更之前,他為玩客雲使用的 Armbian 帶來了下面的內容:

  • 新增了快速將系統刷入 eMMC 的功能,新增了一些方便使用的軟體源切換指令碼。
  • 驗證了裝置兩個 USB 埠其實都是正常可用的,調整和關閉都可以根據修改啟動分割區的 dtb (Device tree)來實現。
  • 使用了 meson8b-odroidc1t_noHDMI.dtb 替換了 meson8b-odroidc1t.dtb,讓硬體作為伺服器用途使用的時候,可以更加省電。
  • 支援關閉預設的 USB 網路卡支援,可以節約一些編譯時間。

來自國內網友 witallwang 的分支

https://github.com/witallwang/Build-Armbian

今年4月9日,有一位網友在 leo 的基礎上繼續進行了一些實用的調整。

  • 將核心版本升級到了 linux-5.10.y
  • 更新了構建修補程式,調整了啟動硬體使用的 dtb 檔案。

可惜的是,因為上游的中斷,這個系統的版本也被停留在了Armbian 的老版本 (Armbian 20.12 Buster, Linux 5.10.28)。

品嚐最新版本的 Armbian

如果我們將上面的幾份程式碼進行合併,是不是就可以讓玩客雲的硬體繼續使新版本的 Armbian 系統,以及或許更新的 Linux 核心了呢?在萌生了這個想法之後,我將上面的程式碼分別溯源和進行了一些整理合並。

整理“硬分叉”的程式碼

將 150balbes 的老程式碼以及最新程式碼提交合並回 armbian,修正時間軸:

https://github.com/soulteary/armbian-build-s805/tree/codebase-merge-150balbes

將 leo 的程式碼變更合併到已經合併到 armbian 程式碼中:

https://github.com/soulteary/armbian-build-s805/commits/codebase-merge-leo357449107

將 witallwang 的程式碼變更合併到 armbian 程式碼中:

https://github.com/soulteary/armbian-build-s805/commits/codebase-merge-witallwang

抽取 leo 和 witallwang 的程式碼變更,合併到 150balbes 的最新程式碼以及 armbian 最新程式碼中:

https://github.com/soulteary/armbian-build-s805/commits/codebase-on-150balbes https://github.com/soulteary/armbian-build-s805/commits/codebase-on-offical

幾位作者的程式碼變更時間軸可以參考下面的紀錄檔。

| * 82d18dbad (origin/codebase-on-150balbes, codebase-on-150balbes) s805 with kernel 5.10.x
|/  
| * b8a13a355 (origin/codebase-20211107) fix script
| * aa688d0f4 fix filename
| * 27860835d rm build flag
| * 68ec3eac6 (origin/codebase-merge-witallwang, codebase-merge-witallwang) merge part of https://github.com/witallwang/Build-Armbian/commit/1691d4516893363ae2aaa63a2b73a68e780fbff2
| * e15a48946 (origin/codebase-merge-leo357449107, codebase-merge-leo357449107) merge part of https://github.com/Leo357449107/Build-Armbian/commit/5770744a0004740e378b87b86645919ee33fb630
| *   e170397d9 (origin/codebase-merge-150balbes, codebase-merge-150balbes) Merge pull request #1 from 150balbes/armbian-tv
| |  
| | * e7bdaef83 v20210814

編譯過程記錄

相信上文已經交代清楚了玩客雲 S805 Soc 使用的 Armbian 系統程式碼的來源,所以在編譯的時候,你可以根據自己的需求進行選擇,以及二次開發。

編譯或者開發 Armbian 系統映象的方法,其實非常簡單。(如果你希望瞭解完整的細節,可以閱讀官方檔案。)下文將以合併到最新版本的 150balbes 的原始碼為基礎進行敘述。

先將程式碼 clone 到本地或者伺服器。

git clone https://github.com/soulteary/armbian-build-s805.git --branch=codebase-on-150balbes

如果你不希望針對系統進行調整,不在意歷史提交記錄,並且想在國內的機器構建,也可以使用下面的方式加速下載原始碼:

git clone https://github.com.cnpmjs.org/soulteary/armbian-build-s805.git --depth=1 --branch=codebase-on-150balbes

完整程式碼差不多接近1個GB,所以下載的時候需要有一些耐心。

建議使用按量付費的海外雲主機進行下載和構建,可以節約不少時間。如果你的硬碟空間比較緊張,可以考慮在 Git Clone 完畢之後,刪除根目錄的 .git 目錄,完整原始碼尺寸可以降低一半到 500MB 左右。

此外,折騰 Armbian 系統編譯,需要提前預留15G以上的磁碟空間,因為除了程式碼之外,預設構建選項下,編譯後的產物會佔用 10G 以上的空間。

du -hs armbian-build-s805
13G	armbian-build-s805

開始構建之前,如果你是在國內的話,需要執行下面的命令,將程式碼中的一些依賴的下載方式切換為國內,避免因為網路問題,導致系統無法構建。

find . -type f -name "*.sh" | xargs -I {} sed -i 's///github.com////github.com.cnpmjs.org//' {}
find . -type f -name "*.conf" | xargs -I {} sed -i 's///github.com////github.com.cnpmjs.org//' {}
find . -type f -name "*.conf" | xargs -I {} sed -i 's/http://w1.fi//git://w1.fi//' {}

命令執行完畢之後,可以繼續執行下面的命令進行檢查,順利的話,將不會有任何輸出(因為都替換完畢了):

find . -type f -name "*.sh" | xargs -I {} cat {} | grep "//github.com/"
find . -type f -name "*.conf" | xargs -I {} cat {} | grep "http://w1.fi/"

在構建過程中,你可能會看到一個編譯錯誤:

fit_image.c:19:10: fatal error: libfdt.h: No such file or directory

這個錯誤的原因是 150balbes 的老版本程式碼對於缺少一個開發依賴,這個問題作者在新版程式碼中修正了,因為上文提到的歷史原因,這個問題被“繼承”了下來。不過因為這個問題的觸發場景是無線網路卡開啟熱點,所以本身不具備無線能力的玩客雲,其實可以忽略掉。當然,如果你需要使用無線網路卡,那麼可以對此進行一個簡單的依賴修復:

apt install libfdt-dev

在上面的步驟就執行完畢之後,便可以通過下面的命令進行構建啦:

./compile.sh BOARD=裝置名稱 BRANCH=設定型別 RELEASE=focal BUILD_MINIMAL=yes BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img DOWNLOAD_MIRROR=china MAINLINE_MIRROR=tuna EXTRAWIFI=no

這裡的“裝置名稱”,是我們在 config/boards 裡存放的檔名稱,所以根據分支的不同,我們會使用到的名稱有:s805、s812、odroidc1。而“設定型別”則是 config/kernel 中,我們使用的 裝置名稱-*.conf 的組態檔的具體型別,根據實際分支的不同,我們可以選擇使用的名稱有:leagcy、edge、current、dev。這裡沒有好壞,根據自己的實際程式碼情況來即可。

第一次執行 complie.sh 會觸發安裝各種開發依賴,下載各種原始碼包,耗時會比較長,一般會在十來分鐘左右。

正式進行系統映象構建,根據硬體規格的不同,時間長度會有變化,以常見的 16核心的筆記或者伺服器來說,實際測試的構建時間都在五至十分鐘左右。

編譯過程火力全開的機器

命令完全執行完畢之後,在目錄中的 output/images 目錄中就能夠看到新鮮出爐的映象啦。

構建不同程式碼分支、版本、核心的映象

按照上面的方法,很輕鬆的就能夠得到不同程式碼基、不同 Linux 核心、不同 Armbian 版本的系統映象。

比如:

  • Armbian_21.11.0-trunk_Aml-s805_focal_current_5.9.0_minimal.img
  • Armbian_21.11.0-trunk_Aml-s805_focal_current_5.10.0_minimal.img
  • Armbian_21.08.0-trunk_Aml-s812_focal_current_5.9.0-rc7_minimal.img
  • Armbian_20.12_Aml-s812_focal_current_5.9.0-rc7_minimal.img

如果你的軟體對於系統核心有特別的需求,可以考慮使用 https://github.com/xdarklight/linux 這個倉庫中的核心對 Armbian 官方核心進行替換。不過因為系統依賴的緣故,可以直接升級到的最高版本是“meson-mx-integration-5.10-20201115”。

在系統映象構建完畢之後,我們就可以進行刷機這個步驟了。

刷機前的準備

給這臺機器換系統的難度非常低,如果採用我們熟悉的“五星評價”的方式來描述難度的話,我覺得難度只有一顆星,其中大半顆還都在拆卸上面。

以往不少貼文會建議大家購置 USB 轉 TTL 線,以及購買燒錄探針以及電烙鐵,但是隨著網友對於這臺裝置的開發,其實我們可以用更簡單的方式來為這臺裝置更換系統,而不需要購置這些裝備,以及進行焊接操作

我的刷機模式採用了網友“尉遲申棠”的《無TTL線刷機》方案,整個操作流程大體分為四步,整個流程時間大概在十五分鐘~二十分鐘左右:

  • 拆機取出 S805 開發板
  • 短接並通過 S805 刷機工具刷入開放的 UBoot
  • 使用 U 盤自動刷入網友製作的啟動系統作為基礎
  • 藉助上面的系統作為跳板,用覆蓋的方式刷入我們自己的系統

拆機過程細節記錄

裝置拆機可以採用我下面這張圖片中的工具,把家用的剪指甲刀的受力臂拆下來,塞進玩客雲背部 SD 卡上方的貼片縫隙中,然後用螺絲刀或者其他的工具,把這個貼滿了雙面膠的背板撬下來,扭下6顆螺絲之後,接下來就可以使用短接金屬線來進行刷機了。

拆機方法和過程一覽

群裡的同學郵寄了一臺小裝置,順帶一起拆啦,正好湊齊新版和老版兩種主機板。

連帶群友的機器一起拆了

刷機過程細節記錄

刷機需要使用短接的方式,來迫使玩客雲的主機板進入 USB 引導模式。短接的工具可以考慮找一根買電子產品時的綁線,然後把金屬線漏出來即可。(上圖中圖一的線被媳婦稱呼為“通往天堂的鑰匙”)

需要注意的是,新舊版本不太一樣,v1.3版的新主機板短接在前面,而老主機板的短接位置在背後。(順手安裝完畢了,忘記拍圖了,不過網路上圖很容易就能搜到,就不補啦)

刷機完畢,登陸系統後,順便看一眼 CPU 資訊。

root@aml:~# lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
Model:                 1
Model name:            ARMv7 Processor rev 1 (v7l)
BogoMIPS:              2.00
Flags:                 half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 vfpd32

常見問題:刷入引導失敗

此外,如果你採用 MacOS 上的虛擬機器器進行刷機,很有可能會失敗,因為裝置在通過 USB 公對公傳輸線和 USB_Burning_Tool 刷機的過程中,可能會快速重啟切換模式,這時如果是使用虛擬機器器,會因為裝置握手重連虛擬機器器時間過長,導致刷機失敗。提示 “Romcode/狀態切換/裝置識別/命令結果返回錯誤”。

如果使用直接安裝的 Windows 系統進行 U-Boot 刷入,就不會出現這個問題了,這個裝置重連導致失敗的情況,至多出現一次。

USB Burning 過程

常見問題:為什麼要刷兩次機

第一次是刷入引導,第二次是為了避免折騰 TTL 短接,利用網友構建的自動安裝映象,完成 eMMC (embedded MMC) 刷機,而這個系統的版本和核心都比較舊,所以第三次才是真實的刷機,刷入我們自己的系統。

如果你願意的話,也可以對比分析“eMMC刷機包”中的指令碼,在構建自己映象的時候做一些調整,減少一次刷機的過程。

常見問題:製作的二次刷機映象不起作用

玩客雲在引導時,USB 介面存在不能正確掛載 U 盤的情況,所以如果你製作的系統映象沒有被正確的載入,可以斷掉電源重新拔插一遍 U 盤再試試引導。

另外,因為裝置供電能力有限(本身低功耗),所以使用的 U 盤也儘量使用傳統 U 盤,而不要使用固態硬碟魔改的 U 盤,可能帶不動。

參考資料

上文雖然已經提到了許多來自網友的智慧結晶,但其實在整個過程中,還參考和學習了其他的網友的經驗。

如果你希望更進一步,從 U-Boot 引導開始折騰,或者適配給其他的裝置,或許這些資料對你也會有用處,所以我將它們按照話題進行了分類,並列舉在了下面。

如何構建適用於玩客雲的引導韌體?

如何編譯構建適用於玩客雲的 ARM Linux 作業系統以及核心?

如何為這臺小 ARM 裝置構建容器映象

玩客雲網絡卡工作不正常?

其他資料

最後

文章至此,玩客雲的 Armbian 折騰過程就結束了。後續的文章裡,我將展開我想折騰的腦洞,用這臺50元成本的裝置,做一些有趣的實驗:一臺能夠快速實現異地組網的裝置,讓你和你的基友快速聯網打遊戲;一臺能夠隨身攜帶的電子筆記伺服器;一臺完善獨立的密碼記錄本;一臺低功耗的監控探針。

到此這篇關於玩客雲折騰記錄之編譯 ArmBian 系統的文章就介紹到這了,更多相關玩客雲ArmBian 系統內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com