本文将介绍如何从零到一编译 Armbian 系统,适配这台设备的代码来源,并对玩客云小设备进行刷机。为之后的折腾做一个前置准备。

写在前面

最近有几个有趣的小想法想实践一下,希望使用低功耗、低成本的硬件跑一些持续性的独立的服务。最初的想法是入手一个树莓派得了,开发板尺寸小巧,资源丰富。然而搜索价格的时候发现最新版的树莓派,如果搭配上一些常用配件,加一个定制外壳,算下来成本几乎能和我之前的 NUC 裸机价格一较高下。

那么,有没有性价比更高的方案呢?

为什么选择搭载 Amlogic S805 的玩客云

于是,目光就锁定到了同为 ARM 架构的廉价 SoC 上,前一阵群里有同学推荐过“玩客云”,搜索了一番,发现虽然芯片其实是几年前的款,但是性能并不差,拥有一个千兆网口,并且机器自带一个金属外壳 。因为我不需要使用 GPIO 接口 ,所以相比较树莓派而言,一套 50 元左右的小主机,性价比高非常多。

而且设备因为使用了廉价的 ARM 芯片,不光运行过程中的温度不算高,日常功耗也非常低。

玩客云采用的芯片方案是 Amlogic S805,和著名的 Hard Kernel 几年前推出过的开发板“ODROID-C1+”几乎完全一致。这个板子性能基本是树莓派3B的两倍,前文中提到的玩客云的成本大概是目前二手树莓派3的1/5~1/6。

如果追求绝对的性能,在价格差不多的情况下,可以考虑入手搭载 S905 芯片的“电视盒子”,性能和最新的树莓派4相比也不落下风,甚至在一些环节中性能高出不少。不过缺点嘛也是有的,目前这类机器受限于成本问题,很少有利于散热的金属外壳;因为性能更高,发热量也会更大。不过即便如此,综合成本也只是树莓派4的十几分之一。

系统选择及“源码溯源“

相对于硬件而言,软件系统也非常重要。

拥抱 Linux 让我们的设备有了无穷的可能性,树莓派有 Raspberry Pi OS(Raspbian),玩客云则因为搭载了和 Hard Kernel 之前产品一致的 Soc ,所以可以使用 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线刷机》方案,整个操作流程大体分为四步,整个流程时间大概在十五分钟~二十分钟左右:

  1. 拆机取出 S805 开发板
  2. 短接并通过 S805 刷机工具刷入开放的 UBoot
  3. 使用 U 盘自动刷入网友制作的启动系统作为基础
  4. 借助上面的系统作为跳板,用覆盖的方式刷入我们自己的系统

拆机过程细节记录

设备拆机可以采用我下面这张图片中的工具,把家用的剪指甲刀的受力臂拆下来,塞进玩客云背部 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 刷入,就不会出现这个问题了,这个设备重连导致失败的情况,至多出现一次。

常见问题:为什么要刷两次机

第一次是刷入引导,第二次是为了避免折腾 TTL 短接,利用网友构建的自动安装镜像,完成 eMMC (embedded MMC) 刷机,而这个系统的版本和内核都比较旧,所以第三次才是真实的刷机,刷入我们自己的系统。

如果你愿意的话,也可以对比分析“eMMC刷机包”中的脚本,在构建自己镜像的时候做一些调整,减少一次刷机的过程。

常见问题:制作的二次刷机镜像不起作用

玩客云在引导时,USB 接口存在不能正确挂载 U 盘的情况,所以如果你制作的系统镜像没有被正确的加载,可以断掉电源重新拔插一遍 U 盘再试试引导。

另外,因为设备供电能力有限(本身低功耗),所以使用的 U 盘也尽量使用传统 U 盘,而不要使用固态硬盘魔改的 U 盘,可能带不动。

参考资料

上文虽然已经提到了许多来自网友的智慧结晶,但其实在整个过程中,还参考和学习了其他的网友的经验。

如果你希望更进一步,从 U-Boot 引导开始折腾,或者适配给其他的设备,或许这些资料对你也会有用处,所以我将它们按照话题进行了分类,并列举在了下面。

如何构建适用于玩客云的引导固件?

  • 玩客云的启动模式 《玩客云Amlogic S805 适配Win10 arm32记录 - 3 》 by @pigworld
  • 《编译Amlogic S805通用U-Boot关键步骤》by @Couchp95
  • 如何构建玩客云( 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

如何编译构建适用于玩客云的 ARM Linux 操作系统以及内核?

  • Kernel Amlogic S802 S805 S812 by @takitr
  • 《玩客云armbian 高版本内核 Linux 5.7.0 自编译版本 Ubuntu 20.04 LTS》 by @suixin2020

如何为这台小 ARM 设备构建容器镜像

  • 《Building Multi-Arch Images for Arm and x86 with Docker Desktop》by @ ADAM PARCO

玩客云网卡工作不正常?

  • 《解决玩客云Armbian下千兆网卡无法工作问题》 by @Couchp95
  • https://github.com/endlessm/linux-meson by @endlessm

其他资料

  • 《Amlogic S805 Datasheet》 by @Hardkernel

最后

文章至此,玩客云的 Armbian 折腾过程就结束了。后续的文章里,我将展开我想折腾的脑洞,用这台50元成本的设备,做一些有趣的实验:一台能够快速实现异地组网的设备,让你和你的基友快速联网打游戏;一台能够随身携带的电子笔记服务器;一台完善独立的密码记录本;一台低功耗的监控探针。

–EOF


我们有一个小小的折腾群,里面聚集了几百位喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(添加好友,请备注实名,注明来源和目的,否则不会通过审核)

关于折腾群入群的那些事


如果你觉得内容还算实用,欢迎点赞分享给你的朋友,在此谢过。


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2021年11月10日
统计字数: 11442字
阅读时间: 23分钟阅读
本文链接: https://soulteary.com/2021/11/10/low-power-device-trial-notes-wyk-part-1.html

玩客云折腾记录(一):编译 ArmBian 系统相关推荐

  1. 玩客云折腾之路 - (Armbian/Armv7l) 搭建Gitea - 通过二进制文件安装

    玩客云折腾之路 基于Armbian,完成docker.挂载U盘.gitea部署等 文章目录 玩客云折腾之路 前言 一.Git托管工具的选择? 二.Gitea安装步骤 1. docker安装(失败) 2 ...

  2. 玩客云折腾记3-omv安装

    玩客云安装omv armbian-config安装失败 手动安装方法: 安装OMV源key 下载key的deb包并安装 wget http://packages.openmediavault.org/ ...

  3. 【矿渣】【玩客云】玩客云驱动OLED屏幕

    玩客云上驱动iic的OLED屏幕 在闲鱼买了花50块买了一台玩客云,拆开刷了armbian系统后发现玩客云这块板子预留了一个单片机芯片的封装,心想这个单片机应该是连接玩客云的GPIO的,所以查了点资料 ...

  4. 玩客云刷Armbian详细教程

    网上放出了很多关于玩客云的刷机玩法,有电视盒子/复古游戏机/Armbian Linux操作系统搭建自己的私有云.可玩性还是很高的,而且价格还便宜就入手了一台.下面记录一下我的玩客云折腾之旅,机器刷了A ...

  5. fstab自动挂载_玩客云刷机系统之armbian挂载U盘增加空间

    点击上方蓝字关注我们 回顾前几期和大家分享了玩客云刷机电视盒子.armbian系统.宝塔面板(5.9).wrodpress博客.后面我准备搭建可道云做nas以方便给大家固件分享.但是因为玩客云内存只有 ...

  6. 玩客云刷armbian的坑

    所需硬件 玩客云一台: USB公对公数据线: 拆机螺丝刀,摄子等: SD卡/TF卡/U盘/硬盘一个(可选,玩客云自带存储8G,系统用掉30%,可用空间太少) 设备一览 设备一览 刷机教学 刷机我是参考 ...

  7. 玩客云root成功一键获取root权限

    话不多说,先上图 玩客云设备其实也是linux系统的,偶然间发现玩客云root大师,就试了试,没想到真的可以一键root成功. 好东西,当然要和大家一起分享了,第一步,如下图,去下载root软件,玩客 ...

  8. 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1.可以刷成电视+游戏盒子的双系统.也可以刷成单独的电视盒子和游戏盒子.不过因为内存有限放不了多少游戏.还是建议用外置SD卡存储游戏比较合适. 2.刷成Armbian linux系统( ...

  9. 我的NAS折腾记录系列-玩客云

    零.基础概念介绍 smb webdev nas与私人网盘的区别 nas与路由器连接硬盘的区别 硬盘挂载 armbian 软路由 路由与交换机的区别 玩客云和网心云的区别 实际上一样的因为玩客云凉了 网 ...

  10. 玩客云刷armbian安装php环境_玩客云刷armbian记录

    参考 写在前面 主要参考了玩客云内置 eMMC 存储刷入 armbian帖子, 本文的很多配图(水印:知乎@梨数码)也来自这个帖子,会额外补充一些注意事项. 工具 USB公对公 用于刷入带uboot的 ...

最新文章

  1. 获得虚拟服务器相对路径,在web应用中获取相对路径和绝对路径
  2. SSM-SpringMVC-30:SpringMVC中InitBinder的骇客级优化
  3. 怎样做反向域名解析?
  4. Java中JMX管理器的作用,项目中有什么具体使用?
  5. pdo mysql like_PHP PDO准备的语句-MySQL LIKE查询
  6. 高并发库存秒杀场景,阿里巴巴数据库是这样应对的
  7. php只能用浏览器触发吗,PHP只允许某个域名或者URL访问调用不允许浏览器直接执行的方法...
  8. linux系统检测脚本,脚本检测linux系统资源
  9. SpringMVC框架----SpringMVC 概述
  10. Dart基础第4篇:运算符、条件判断、类型转换
  11. Java HttpResponse 详解
  12. Python书籍推荐:《Python编程之美:最佳实践指南》
  13. coreseek4.1
  14. Java首选项Preferences
  15. zencart bohase 模板
  16. ffmpeg合并多mp4视频
  17. python编程爱心编码_用python画爱心及代码演示
  18. VS2019 测试使用libusb
  19. Git HEAD 分支游离,切回master导致代码丢失的处理
  20. dsf5.0获取嵌入页面的数据

热门文章

  1. intel服务器最新主板芯片组,intel主板芯片组的介绍大全
  2. Spring cloud ribbon实现灰度发布
  3. Niubility!华为天才少年自制机械臂能给葡萄缝针
  4. ubuntu截屏软件
  5. POI合并单元格后边框显示问题
  6. Jmeter性能测试脚本搭建与测试步骤流程
  7. R语言基础数据分析——双因素方差分析
  8. 使用Patch激活CleanMyPC时报错找不到文件
  9. PCB 设计流程(allegro 为例)
  10. OFDM中的帧(frame)、符号(symbol)、子载波(subcarriers)、导频(Pilot)、保护间隔(guard)的关系图解以及代码详解--MATLAB