玩客云折騰記錄之編譯?ArmBian?系統(tǒng)
寫在前面
最近有幾個有趣的小想法想實踐一下,希望使用低功耗、低成本的硬件跑一些持續(xù)性的獨立的服務(wù)。最初的想法是入手一個樹莓派得了,開發(fā)板尺寸小巧,資源豐富。然而搜索價格的時候發(fā)現(xiàn)最新版的樹莓派,如果搭配上一些常用配件,加一個定制外殼,算下來成本幾乎能和我之前的 NUC 裸機價格一較高下。
那么,有沒有性價比更高的方案呢?
為什么選擇搭載 Amlogic S805 的玩客云
于是,目光就鎖定到了同為 ARM 架構(gòu)的廉價 SoC 上,前一陣群里有同學推薦過“玩客云”,搜索了一番,發(fā)現(xiàn)雖然芯片其實是幾年前的款,但是性能并不差,擁有一個千兆網(wǎng)口,并且機器自帶一個金屬外殼 。因為我不需要使用 GPIO 接口 ,所以相比較樹莓派而言,一套 50 元左右的小主機,性價比高非常多。
玩客云小設(shè)備的外觀
而且設(shè)備因為使用了廉價的 ARM 芯片,不光運行過程中的溫度不算高,日常功耗也非常低。
實際使用過程中的功耗也比較低
玩客云采用的芯片方案是 Amlogic S805,和著名的 Hard Kernel 幾年前推出過的開發(fā)板“ODROID-C1+”幾乎完全一致。這個板子性能基本是樹莓派3B的兩倍,前文中提到的玩客云的成本大概是目前二手樹莓派3的1/5~1/6。
S805 和樹莓派3之間的性能比較
如果追求絕對的性能,在價格差不多的情況下,可以考慮入手搭載 S905 芯片的“電視盒子”,性能和最新的樹莓派4相比也不落下風,甚至在一些環(huán)節(jié)中性能高出不少。不過缺點嘛也是有的,目前這類機器受限于成本問題,很少有利于散熱的金屬外殼;因為性能更高,發(fā)熱量也會更大。不過即便如此,綜合成本也只是樹莓派4的十幾分之一。
系統(tǒng)選擇及“源碼溯源“
相對于硬件而言,軟件系統(tǒng)也非常重要。
擁抱 Linux 讓我們的設(shè)備有了無窮的可能性,樹莓派有 Raspberry Pi OS(Raspbian),玩客云則因為搭載了和 Hard Kernel 之前產(chǎn)品一致的 Soc ,所以可以使用 ArmBian。
在正式介紹如何為玩客云更換系統(tǒng),以及編譯一份干凈的新版鏡像之前,我要介紹一下這個系統(tǒng)的由來,因為這里有太多前人的無私貢獻。
Armbian 官方代碼
Armbian 主要開源項目狀況
2014年末,Armbian 立項,或許是暴風雨來臨之前的沉寂,在 GAP一年多之后的2016年,Armbian 開始了每年千萬行代碼變動的爆發(fā)式成長。截止目前為止,官方項目已經(jīng)支持了接近 150 個不同的硬件設(shè)備的適配。
來自戰(zhàn)斗民族的 Armbian TV 分支
https://github.com/150balbes/build
在2018年7月的時候,一名網(wǎng)名是150balbes的戰(zhàn)斗民族網(wǎng)友出手了,他開始為各種官方原本并不支持的硬件做適配,過程中吸引了來自全世界有相同硬件折騰需求的網(wǎng)友,他第一個適配的 SoC 就是我們本文的主角同源的 s90x 系列的芯片。
在2020年的光棍節(jié)前,他或許是覺得直接在官方原有的代碼文件上進行修改,每次上游代碼(Armbian)更新,他需要合并的內(nèi)容太多了,畢竟Armbian是一個每年千萬行代碼變更的項目,于是他刪除了原本開發(fā)了幾個月的代碼,在官方原有開發(fā)模式上新增了一個只有他自己使用的發(fā)布類型(dev),將之前的代碼遷移了過來。隨后他開始了專注于將 Armbian 適配到電視盒子上,并且將自己的分支命名為 armbian-tv
,持續(xù)更新到了現(xiàn)在。
來自阿拉伯網(wǎng)友 moham96 的分支
https://github.com/moham96/Build-Armbian
阿拉伯網(wǎng)友 moham96 很快關(guān)注到了俄羅斯小伙子的項目,并立馬 fork 了一份,升級了項目使用的 Linux 內(nèi)核到 4.x 版本,并針對設(shè)備 Mac 地址設(shè)置方式進行了調(diào)整。
來自國內(nèi)網(wǎng)友 leo357449107 的分支
https://github.com/Leo357449107/Build-Armbian/tree/20.11
前文提到的 150balbes 在春天的時候進行了一次分支的重構(gòu),其實這次重構(gòu)非常“暴力”,原作者直接刪除了之前一直在維護的 Build-Armbian
項目,重新 fork 了一份新的 Armbian。
一般情況問題不大,但是如果有其他開發(fā)者正在基于他的代碼進行開發(fā)的話,就會遇到類似下面的狀況:
2021/01/23 leo357449107 我正在愉快地Dubug的時候,上游把代碼刪了,我也把代碼回滾了,然后,就沒有然后了。
估計也是沒辦法,網(wǎng)友 leo 只好在 GitHub 上尋找了一份原來項目的 fork 版本(上文中的 moham96 的分支),再次進行 fork,并提交了自己的代碼變更。
隨后網(wǎng)友 leo 的版本也就此停止了更新和維護(Armbian 20.12 Buster with Linux 5.9.0-rc7),不過在停更之前,他為玩客云使用的 Armbian 帶來了下面的內(nèi)容:
- 添加了快速將系統(tǒng)刷入 eMMC 的功能,添加了一些方便使用的軟件源切換腳本。
- 驗證了設(shè)備兩個 USB 端口其實都是正??捎玫模{(diào)整和關(guān)閉都可以根據(jù)修改啟動分區(qū)的 dtb (Device tree)來實現(xiàn)。
- 使用了
meson8b-odroidc1t_noHDMI.dtb
替換了meson8b-odroidc1t.dtb
,讓硬件作為服務(wù)器用途使用的時候,可以更加省電。 - 支持關(guān)閉默認的 USB 網(wǎng)卡支持,可以節(jié)約一些編譯時間。
來自國內(nèi)網(wǎng)友 witallwang 的分支
https://github.com/witallwang/Build-Armbian
今年4月9日,有一位網(wǎng)友在 leo 的基礎(chǔ)上繼續(xù)進行了一些實用的調(diào)整。
- 將內(nèi)核版本升級到了
linux-5.10.y
- 更新了構(gòu)建補丁,調(diào)整了啟動硬件使用的 dtb 文件。
可惜的是,因為上游的中斷,這個系統(tǒng)的版本也被停留在了Armbian 的老版本 (Armbian 20.12 Buster, Linux 5.10.28)。
品嘗最新版本的 Armbian
如果我們將上面的幾份代碼進行合并,是不是就可以讓玩客云的硬件繼續(xù)使新版本的 Armbian 系統(tǒng),以及或許更新的 Linux 內(nèi)核了呢?在萌生了這個想法之后,我將上面的代碼分別溯源和進行了一些整理合并。
整理“硬分叉”的代碼
將 150balbes 的老代碼以及最新代碼提交合并回 armbian,修正時間軸:
https://github.com/soulteary/armbian-build-s805/tree/codebase-merge-150balbes
將 leo 的代碼變更合并到已經(jīng)合并到 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
編譯過程記錄
相信上文已經(jīng)交代清楚了玩客云 S805 Soc 使用的 Armbian 系統(tǒng)代碼的來源,所以在編譯的時候,你可以根據(jù)自己的需求進行選擇,以及二次開發(fā)。
編譯或者開發(fā) Armbian 系統(tǒng)鏡像的方法,其實非常簡單。(如果你希望了解完整的細節(jié),可以閱讀官方文檔。)下文將以合并到最新版本的 150balbes 的源碼為基礎(chǔ)進行敘述。
先將代碼 clone
到本地或者服務(wù)器。
git clone https://github.com/soulteary/armbian-build-s805.git --branch=codebase-on-150balbes
如果你不希望針對系統(tǒng)進行調(diào)整,不在意歷史提交記錄,并且想在國內(nèi)的機器構(gòu)建,也可以使用下面的方式加速下載源碼:
git clone https://github.com.cnpmjs.org/soulteary/armbian-build-s805.git --depth=1 --branch=codebase-on-150balbes
完整代碼差不多接近1個GB,所以下載的時候需要有一些耐心。
建議使用按量付費的海外云主機進行下載和構(gòu)建,可以節(jié)約不少時間。如果你的硬盤空間比較緊張,可以考慮在 Git Clone 完畢之后,刪除根目錄的 .git
目錄,完整源碼尺寸可以降低一半到 500MB 左右。
此外,折騰 Armbian 系統(tǒng)編譯,需要提前預(yù)留15G以上的磁盤空間,因為除了代碼之外,默認構(gòu)建選項下,編譯后的產(chǎn)物會占用 10G 以上的空間。
du -hs armbian-build-s805 13G armbian-build-s805
開始構(gòu)建之前,如果你是在國內(nèi)的話,需要執(zhí)行下面的命令,將代碼中的一些依賴的下載方式切換為國內(nèi),避免因為網(wǎng)絡(luò)問題,導(dǎo)致系統(tǒng)無法構(gòu)建。
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\//' {}
命令執(zhí)行完畢之后,可以繼續(xù)執(zhí)行下面的命令進行檢查,順利的話,將不會有任何輸出(因為都替換完畢了):
find . -type f -name "*.sh" | xargs -I {} cat {} | grep "http://github.com/" find . -type f -name "*.conf" | xargs -I {} cat {} | grep "http://w1.fi/"
在構(gòu)建過程中,你可能會看到一個編譯錯誤:
fit_image.c:19:10: fatal error: libfdt.h: No such file or directory
這個錯誤的原因是 150balbes 的老版本代碼對于缺少一個開發(fā)依賴,這個問題作者在新版代碼中修正了,因為上文提到的歷史原因,這個問題被“繼承”了下來。不過因為這個問題的觸發(fā)場景是無線網(wǎng)卡開啟熱點,所以本身不具備無線能力的玩客云,其實可以忽略掉。當然,如果你需要使用無線網(wǎng)卡,那么可以對此進行一個簡單的依賴修復(fù):
apt install libfdt-dev
在上面的步驟就執(zhí)行完畢之后,便可以通過下面的命令進行構(gòu)建啦:
./compile.sh BOARD=設(shè)備名稱 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
這里的“設(shè)備名稱”,是我們在 config/boards
里存放的文件名稱,所以根據(jù)分支的不同,我們會使用到的名稱有:s805、s812、odroidc1。而“配置類型”則是 config/kernel
中,我們使用的 設(shè)備名稱-*.conf
的配置文件的具體類型,根據(jù)實際分支的不同,我們可以選擇使用的名稱有:leagcy、edge、current、dev。這里沒有好壞,根據(jù)自己的實際代碼情況來即可。
第一次執(zhí)行 complie.sh
會觸發(fā)安裝各種開發(fā)依賴,下載各種源碼包,耗時會比較長,一般會在十來分鐘左右。
正式進行系統(tǒng)鏡像構(gòu)建,根據(jù)硬件規(guī)格的不同,時間長度會有變化,以常見的 16核心的筆記或者服務(wù)器來說,實際測試的構(gòu)建時間都在五至十分鐘左右。
編譯過程火力全開的機器
命令完全執(zhí)行完畢之后,在目錄中的 output/images
目錄中就能夠看到新鮮出爐的鏡像啦。
構(gòu)建不同代碼分支、版本、內(nèi)核的鏡像
按照上面的方法,很輕松的就能夠得到不同代碼基、不同 Linux 內(nèi)核、不同 Armbian 版本的系統(tǒng)鏡像。
比如:
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
如果你的軟件對于系統(tǒng)內(nèi)核有特別的需求,可以考慮使用 https://github.com/xdarklight/linux 這個倉庫中的內(nèi)核對 Armbian 官方內(nèi)核進行替換。不過因為系統(tǒng)依賴的緣故,可以直接升級到的最高版本是“meson-mx-integration-5.10-20201115”。
在系統(tǒng)鏡像構(gòu)建完畢之后,我們就可以進行刷機這個步驟了。
刷機前的準備
給這臺機器換系統(tǒng)的難度非常低,如果采用我們熟悉的“五星評價”的方式來描述難度的話,我覺得難度只有一顆星,其中大半顆還都在拆卸上面。
以往不少帖子會建議大家購置 USB 轉(zhuǎn) TTL 線,以及購買燒錄探針以及電烙鐵,但是隨著網(wǎng)友對于這臺設(shè)備的開發(fā),其實我們可以用更簡單的方式來為這臺設(shè)備更換系統(tǒng),而不需要購置這些裝備,以及進行焊接操作。
我的刷機模式采用了網(wǎng)友“尉遲申棠”的《無TTL線刷機》方案,整個操作流程大體分為四步,整個流程時間大概在十五分鐘~二十分鐘左右:
- 拆機取出 S805 開發(fā)板
- 短接并通過 S805 刷機工具刷入開放的 UBoot
- 使用 U 盤自動刷入網(wǎng)友制作的啟動系統(tǒng)作為基礎(chǔ)
- 借助上面的系統(tǒng)作為跳板,用覆蓋的方式刷入我們自己的系統(tǒng)
拆機過程細節(jié)記錄
設(shè)備拆機可以采用我下面這張圖片中的工具,把家用的剪指甲刀的受力臂拆下來,塞進玩客云背部 SD 卡上方的貼片縫隙中,然后用螺絲刀或者其他的工具,把這個貼滿了雙面膠的背板撬下來,扭下6顆螺絲之后,接下來就可以使用短接金屬線來進行刷機了。
拆機方法和過程一覽
群里的同學郵寄了一臺小設(shè)備,順帶一起拆啦,正好湊齊新版和老版兩種主板。
連帶群友的機器一起拆了
刷機過程細節(jié)記錄
刷機需要使用短接的方式,來迫使玩客云的主板進入 USB 引導(dǎo)模式。短接的工具可以考慮找一根買電子產(chǎn)品時的綁線,然后把金屬線漏出來即可。(上圖中圖一的線被媳婦稱呼為“通往天堂的鑰匙”)
需要注意的是,新舊版本不太一樣,v1.3版的新主板短接在前面,而老主板的短接位置在背后。(順手安裝完畢了,忘記拍圖了,不過網(wǎng)絡(luò)上圖很容易就能搜到,就不補啦)
刷機完畢,登陸系統(tǒng)后,順便看一眼 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
常見問題:刷入引導(dǎo)失敗
此外,如果你采用 MacOS 上的虛擬機進行刷機,很有可能會失敗,因為設(shè)備在通過 USB 公對公數(shù)據(jù)線和 USB_Burning_Tool
刷機的過程中,可能會快速重啟切換模式,這時如果是使用虛擬機,會因為設(shè)備握手重連虛擬機時間過長,導(dǎo)致刷機失敗。提示 “Romcode/狀態(tài)切換/設(shè)備識別/命令結(jié)果返回錯誤”。
如果使用直接安裝的 Windows 系統(tǒng)進行 U-Boot 刷入,就不會出現(xiàn)這個問題了,這個設(shè)備重連導(dǎo)致失敗的情況,至多出現(xiàn)一次。
USB Burning 過程
常見問題:為什么要刷兩次機
第一次是刷入引導(dǎo),第二次是為了避免折騰 TTL 短接,利用網(wǎng)友構(gòu)建的自動安裝鏡像,完成 eMMC (embedded MMC) 刷機,而這個系統(tǒng)的版本和內(nèi)核都比較舊,所以第三次才是真實的刷機,刷入我們自己的系統(tǒng)。
如果你愿意的話,也可以對比分析“eMMC刷機包”中的腳本,在構(gòu)建自己鏡像的時候做一些調(diào)整,減少一次刷機的過程。
常見問題:制作的二次刷機鏡像不起作用
玩客云在引導(dǎo)時,USB 接口存在不能正確掛載 U 盤的情況,所以如果你制作的系統(tǒng)鏡像沒有被正確的加載,可以斷掉電源重新拔插一遍 U 盤再試試引導(dǎo)。
另外,因為設(shè)備供電能力有限(本身低功耗),所以使用的 U 盤也盡量使用傳統(tǒng) U 盤,而不要使用固態(tài)硬盤魔改的 U 盤,可能帶不動。
參考資料
上文雖然已經(jīng)提到了許多來自網(wǎng)友的智慧結(jié)晶,但其實在整個過程中,還參考和學習了其他的網(wǎng)友的經(jīng)驗。
如果你希望更進一步,從 U-Boot 引導(dǎo)開始折騰,或者適配給其他的設(shè)備,或許這些資料對你也會有用處,所以我將它們按照話題進行了分類,并列舉在了下面。
如何構(gòu)建適用于玩客云的引導(dǎo)固件?
- 玩客云的啟動模式 《玩客云Amlogic S805 適配Win10 arm32記錄 - 3 》 by @pigworld
- 《編譯Amlogic S805通用U-Boot關(guān)鍵步驟》by @Couchp95
- 如何構(gòu)建玩客云( S805 )適用的 U-Boot:《How to build kernel,uboot,android sepatately》 by @cary.wu
- “在玩客云上添加SD卡和USB啟動支持” by @jocover
- Unofficial mirror of uboot sources by @not-aml
如何編譯構(gòu)建適用于玩客云的 ARM Linux 操作系統(tǒng)以及內(nèi)核?
- Kernel Amlogic S802 S805 S812 by @takitr
- 《玩客云armbian 高版本內(nèi)核 Linux 5.7.0 自編譯版本 Ubuntu 20.04 LTS》 by @suixin2020
如何為這臺小 ARM 設(shè)備構(gòu)建容器鏡像
玩客云網(wǎng)卡工作不正常?
- 《解決玩客云Armbian下千兆網(wǎng)卡無法工作問題》 by @Couchp95
- https://github.com/endlessm/linux-meson by @endlessm
其他資料
- 《Amlogic S805 Datasheet》 by @Hardkernel
最后
文章至此,玩客云的 Armbian 折騰過程就結(jié)束了。后續(xù)的文章里,我將展開我想折騰的腦洞,用這臺50元成本的設(shè)備,做一些有趣的實驗:一臺能夠快速實現(xiàn)異地組網(wǎng)的設(shè)備,讓你和你的基友快速聯(lián)網(wǎng)打游戲;一臺能夠隨身攜帶的電子筆記服務(wù)器;一臺完善獨立的密碼記錄本;一臺低功耗的監(jiān)控探針。
到此這篇關(guān)于玩客云折騰記錄之編譯 ArmBian 系統(tǒng)的文章就介紹到這了,更多相關(guān)玩客云ArmBian 系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win10環(huán)境下使用Hyper-V進行虛擬機創(chuàng)建的教程(圖解)
這篇文章主要介紹了win10環(huán)境下使用Hyper-V進行虛擬機創(chuàng)建的教程,本文圖文詳解給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11大數(shù)據(jù)HelloWorld-Flink實現(xiàn)WordCount
這篇文章主要介紹了大數(shù)據(jù)HelloWorld-Flink實現(xiàn)WordCount的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08分享下網(wǎng)站開發(fā)人員應(yīng)該知道的61件事
有人在Stack Overflow上發(fā)問,動手開發(fā)網(wǎng)站之前,需要知道哪些事情,這里簡單為大家整理下,方便需要的朋友2014-03-03