玩客云折腾记录之编译 ArmBian 系统

目录
  • 写在前面
  • 为什么选择搭载 Amlogic S805 的玩客云
  • 系统选择及“源码溯源“
    • Armbian 官方代码
    • 来自战斗民族的 Armbian TV 分支
    • 来自阿拉伯网友 moham96 的分支
    • 来自国内网友 leo357449107 的分支
    • 来自国内网友 witallwang 的分支
  • 品尝最新版本的 Armbian
    • 整理“硬分叉”的代码
    • 编译过程记录
    • 构建不同代码分支、版本、内核的镜像
  • 刷机前的准备
    • 拆机过程细节记录
    • 刷机过程细节记录
    • 常见问题:刷入引导失败
    • 常见问题:为什么要刷两次机
    • 常见问题:制作的二次刷机镜像不起作用
  • 参考资料
    • 如何构建适用于玩客云的引导固件?
    • 如何编译构建适用于玩客云的 ARM Linux 操作系统以及内核?
    • 如何为这台小 ARM 设备构建容器镜像
    • 玩客云网卡工作不正常?
    • 其他资料
  • 最后

写在前面

最近有几个有趣的小想法想实践一下,希望使用低功耗、低成本的硬件跑一些持续性的独立的服务。最初的想法是入手一个树莓派得了,开发板尺寸小巧,资源丰富。然而搜索价格的时候发现最新版的树莓派,如果搭配上一些常用配件,加一个定制外壳,算下来成本几乎能和我之前的 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 系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 玩客云折腾记录之编译 ArmBian 系统

    目录 写在前面 为什么选择搭载 Amlogic S805 的玩客云 系统选择及“源码溯源“ Armbian 官方代码 来自战斗民族的 Armbian TV 分支 来自阿拉伯网友 moham96 的分支 来自国内网友 leo357449107 的分支 来自国内网友 witallwang 的分支 品尝最新版本的 Armbian 整理“硬分叉”的代码 编译过程记录 构建不同代码分支.版本.内核的镜像 刷机前的准备 拆机过程细节记录 刷机过程细节记录 常见问题:刷入引导失败 常见问题:为什么要刷两次机

  • 玩客云内置EMMC存储刷入Armbian系统(图文详解)

    目录 设备准备:玩客云 玩客云配置: 系统:Armbian 准备工具 刷机软件及系统准备 刷机 步骤一:连接设备 步骤二:导入镜像 步骤三:烧入安卓底包 步骤四:U盘写入 Armbian 步骤五:U盘写入系统 重启并连接设备 把系统写入EMMC 第三步1:拆机 最近因 Nas 负荷太大,搞了一个玩客云作为微型主机分担了部分压力.要让玩客云成为一台微型主机,需要给它安装一个Armbian系统. 设备准备:玩客云 玩客云是一款前些年很火的矿机,曾经在官网售卖¥599,现在已经沦落到¥45包邮的田地了

  • 玩客云安装青龙面板实现京东签到薅羊毛功能

    目录 准备 青龙面板简介 安装青龙面板 访问青龙面板 设置京东COOKIE 添加签到任务 设置消息推送 拉取各种库的脚本 可能用得到的命令 最近因 Nas 负荷太大,搞了一个玩客云,给它安装一个 Armbian 系统作为微型主机分担部分压力,目的之一就是要把Nas中的docker迁移到玩客云,其中包含青龙面板. 准备 服务器 本人准备的服务器就是玩客云,只需运行一些常用的 docker 容器就行. 环境 需要安装青龙面板,需要具备 docker 环境,所以需要线安装 docker,具体安装方法可

  • 基于云服务MRS构建DolphinScheduler2调度系统

    目录 为什么写这篇文章? 环境准备 安装MRS 客户端 安装MySQL服务 1. 创建ECS用户 2.解压安装包 3. 配置文件初始化 4. 启动数据库 5.登陆,修改密码,预置dolphinscheduler的用户 安装dolphinscheduler服务 1. 建立本机id免密 2. 修改配置参数 3. 将mysql 驱动包放入lib下 5. 服务安装.启停 6. 登录系统 3. 创建任务 为什么写这篇文章? 网上关于DolphinScheduler的介绍很多但是都缺少了与实际大数据平台结合

  • 从源码编译Android系统的Java类库和JNI动态库的方法

    利用源码编译Android系统Java类库 1.编写Java项目和Android.mk文件 ├── Android.mk └── src └── com └── lhw └── framework └── led └── Led.java Led.java文件 package com.lhw.framework.led; /** * LED操作库 * @author Micky Liu */ public class Led { public boolean turnOn() { return

  • 利用源码编译Android系统的APK和可执行命令的方法

    编译Android系统APK 1.设置环境 export ANDROID_HOME=/home/administrator/soft/android export PATH=$PATH:$ANDROID_HOME/out/host/linux-x86/bin export ANDROID_PRODUCT_OUT=$ANDROID_HOME/out/target/product/generic 2.创建项目 android create project -t 1 -k com.lhw.led -a

  • Centos下升级php5.2到php5.4全记录(编译安装)

    升级 目前php最新版虽然是php5.5,但出于各种考虑,还是先升到php5.4比较靠谱. 原php使用的是php5.2.10,已经运行了4~5年了,是时候升级了. 5.4最新稳定版是5.4.21(14 Nov 2013发布了5.4.22...) 复制代码 代码如下: wget http://cn2.php.net/get/php-5.4.21.tar.gz/from/this/mirror tar zxf php-5.4.21.tar.gz cd php-5.4.21 修改源码,如果程序编码是

  • 使用 Docker 搭建适用于 HomeLab 的书签导航应用

    目录 写在前面 在容器中使用 Flame 为什么要制作 Flare 在容器中使用 Flare 其他 最后 写在前面 我目前使用的书签导航工具的界面是这样的(马赛克掉了一部分链接内容): 作为一个使用了十多年 Chrome 的用户,Chrome 书签管理器一直是我的主要的书签管理工具.在漫长的岁月里,我的 Chrome 书签管理器中,最多的时候存放了上千个书签链接. 但是 Chrome 的书签栏面积十分有限,随着折腾的东西越来越多,导致导航栏基本放不了多少东西,许多书签常常需要在书签二级目录甚至三

  • Armbian5.9.0安装docker及部署可视化portainer的详细教程

    目录 安装 docker 如何查看 docker 是否安装成功? 如何启动docker? 如何安装可视化portainer 安装英文版本 安装中文版 什么是docker?Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). bare metal.OpenStack 集群和其他的基础应用平台. Docker通常用于如下场景: web应用的自动化打包和发布: 自动化测试和持续

  • 在阿里云centos下部署mongodb教程

    本教程是在阿里云centos下部署mongodb的过程,整个过程遇到不少坑,浪费了很多时间.在网上查了很多教程,但是由于教程大多太久了,环境都不一样了,所以教程绝大部分走不通.为此走过不少坑,所以在此做一下记录. 环境: 系统:阿里云centos 7.3 64位 mongodb版本: 3.4 因为使用yum安装非常方便,所以下文使用yum安装,. 修改yum包管理配置: vi /etc/yum.repos.d/mongodb-org-3.4.repo   // 会自动新建mongodb-org-

随机推荐