本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2025年01月08日 统计字数: 14966字 阅读时间: 30分钟阅读 本文链接: https://soulteary.com/2025/01/08/lightweight-server-under-fifty-yuan-wanke-cloud-speed-running-guide-1.html ----- # 五十元内的轻量服务器:玩客云折腾速通指南(一) 这是一份专注于稳定性的玩客云使用指南。 无论你是想要一台低成本的服务器,还是对类似的嵌入式设备感兴趣,接下来这几篇文章都会告诉你如何让玩客云更稳定、更易维护,以及躲开折腾的时候会遇到麻烦和故障。 ## 写在前面 在知乎经常看到“怎样拥有一台最便宜的服务器”这个话题。除了各种云服务商的学生机优惠外,很多人都推荐了几个选择:嵌入式开发板、可刷机的随身WiFi,以及我们今天要聊的这台,配置看似普通但玩法很多的玩客云。 ![玩客云](https://attachment.soulteary.com/2025/01/08/onecloud.jpg) 最近我重新整理了几年前关于玩客云的文章内容,希望为大家带来一份更实用、更简单的改造指南。这次的重点是:如何让设备运行更稳定,维护更方便。即便设备出现问题,只需更换存储卡或U盘就能快速恢复所有数据和服务。 同时,这篇文章也是后续系列的基础铺垫,让我们能在此基础上探索更多有趣的玩法。 2021 年我写过一篇《[玩客云折腾记录(一):编译 ArmBian 系统](https://soulteary.com/2021/11/10/low-power-device-trial-notes-wyk-part-1.html)》,在这篇文章里,我们从编译系统开始,完整的梳理了官方到各个开发者的贡献,以及如何进行代码更新和整合,刷机等等。 最近,受到群里的小伙伴启发,提到这台设备居然还能实现KVM功能。这让我想起之前文章提到的,给不支持 iLO 的 Gen10 服务器和笔记本添加远程管理功能。但在展开这些有趣的玩法之前,我们得先搞定最基础的问题:如何打造一个稳定可靠的软硬件环境。 毕竟没人愿意看到自己辛苦折腾的成果因为硬件不靠谱或者系统不稳定而付诸东流。 说起来,这几年我分享的许多开源项目都保持了对 ARMv7 架构的支持,但一直没有专门写文章来聊这个话题。借着这个机会,后面也想和大家分享一下这方面折腾的经验。 ### 关于玩客云 WS1608(Amlogic S805) 玩客云在 2024 年 2 月正式停服后,彻底失去了官方渠道的支持。但有意思的是,这台曾经不太成功的硬件,反而在网络社区和二手市场变得更加活跃,价格稳定在了 20~50 元之间(拆机和全新)。 在开始深入探讨之前,我想先和没接触过或不了解这款设备的朋友们分享一下玩客云的基本信息。机器的具体参数([来自官方香港站点](https://wky.onethingcloud.com/hk/site/prodv3_param.html))如下: ![硬件参数信息](https://attachment.soulteary.com/2025/01/08/specs.jpg) 放到 2025 年来看,这些配置确实显得有些寒碜。不过,如果我们把它和树莓派这类产品做个对比,考虑到它的金属机身和硬件规格,性价比其实相当不错: - Amlogic S805 处理器([详细参数 Datasheet](https://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf)):四核心 1.5GHz ARM Cortex-A5 CPU(设计于 2009 年,2011 年开始商用) - Mali-450 GPU(600MHz+):支持硬件加速,最高支持 1080p@60fps 视频输出,配备 HDMI 1.4b 接口 - 内存与存储:1GB DDR3 内存,8GB 板载 eMMC 存储 - 网络支持:螃蟹 RTL6211F 千兆网卡 - 外观与功耗:采用厚实的金属外壳设计,待机功耗仅 1 瓦,Linux 环境下工作功耗在 1-2 瓦,外接一块 2.5 寸 HDD 硬盘,在 4 瓦左右 并且,有社区热心用户发现,设备主板上预留的电视盒子的 Wi-Fi 焊接位置,不仅仅可以接 Wi-Fi 使用,还可以引出许多 GPIO 接口(通用输入输出)使用,有了《[家用万兆网络实践:紧凑型家用服务器静音化改造(二)](https://soulteary.com/2025/01/05/homelab-10-gigabit-network-practice-silent-transformation-of-compact-home-servers.html)》和《[家用网络升级实践:安静的局部万兆组网(三)](https://soulteary.com/2025/01/07/homelab-network-upgrade-practice-quiet-local-10g-networking.html)》中的折腾经验,这个 GPIO 可以拓展出不少有趣的玩法。 ### 相对稳定的使用这台设备 要让玩客云长期稳定运行,我们需要重点关注以下几个核心要素:相对靠谱的硬件备份,稳定靠谱的供电选择,稳定靠谱的引导程序,稳定的操作系统,稳定靠谱的读写介质。 2025年的现在,库存“全新”玩客云的价格在 50 元左右,已经拆机流动过的设备在 10~20 元。如果你计划长期基于它折腾一些轻量服务,建议准备一套低成本的备用配件,以便出现问题时快速替换,而不是花时间维修。 虽然这款 ARM 小设备的功耗很低,对供电要求不高,但稳定的供电可以预防 90% 的问题,包括设备本身和外接硬盘的工作异常等。如果你觉得电源适配器不够可靠,可以考虑更换品质更好的配件。 可靠的引导程序能确保设备每次断电或重启后都能进入我们预期的操作系统,并且支持多种存储介质来运行程序。即便你的设备的内置存储、SD 卡、USB 接口三项中有两种出现问题,也依然能保障正常使用。 最后是稳定的操作系统和数据存储介质,它能正确调用所有硬件,让这个资源有限的设备在运行所需软件时获得较高的利用率和稳定性。USB 和 SD 对于这个设备都是靠谱的,前提是我们选择的某款品牌产品的平均品控靠谱。 让我们先从硬件部分开始吧。 ## 硬件选择 ![玩客云 x4,验证文章内容](https://attachment.soulteary.com/2025/01/08/oneclouds.jpg) 作为验证本文方案的可行性,我特意新购入了两台玩客云库存机。虽然手头已经有两台几年前购入完成了刷机的设备,但为了确保能给大家呈现一个完整的“从零到一”过程,我选择重新开始。这样也能够照顾到后续如果焊接 GPIO 失误,可能的损耗问题。 ![新的电源适配器](https://attachment.soulteary.com/2025/01/08/new-chargers.jpg) 为了确保使用安全,我“斥巨资”(比玩客云本体都贵)购入了四个新的电源适配器。选用的是红米显示器配套的 DC 插座配件,标称功率与玩客云原装保持一致。相比原版电源,这些新配件拿在手里明显分量更足,给人可靠的感觉。 ![我使用的存储介质:致钛 TF 卡](https://attachment.soulteary.com/2025/01/08/zhitai-tf.jpg) 在存储介质的选择上,我倾向于使用 TF 卡作为系统盘。 在存储介质的选择上,我倾向于使用TF卡作为系统盘。这个决定源于我翻阅了许多帖子和开源项目反馈问题后发现,部分玩客云用户的USB接口会出现问题(可能是供电或系统镜像导致)。也有一些用户,因为多次刷写设备内置 eMMC,eMMC 本身质量(未屏蔽坏道)问题导致无法启动。 虽然在这台设备上,IO 性能确实很受限(类似树莓派 3 和 4 的水平),设备自带的也只是 USB 2.0 接口,但选择 TF 卡还是有其优势:更低的功耗,以及释放出两个宝贵的 USB 接口。和 U 盘安装系统一样,这样也不需要重复拆机刷 eMMC 啦。 ![尝试其他卡后,又购入两张致钛 TF 卡](https://attachment.soulteary.com/2025/01/08/tf-cards.jpg) 我在测试阶段,使用了两张原本准备给摄像头用的致钛 TF 卡进行测试。在发现 TF 卡性能并非系统瓶颈后,我还尝试了一些更早前购买的、用在家庭监控摄像头上的存储卡。 不过遗憾的是,这些较早期的 TF 卡在 IO 性能上与近两年的产品相比差距明显,无论是刷写固件还是安装系统都相当耗时。因此,我最终又“斥巨资”(比玩客云本体贵)投资购入了两张新的致钛TF卡。 ## 下载或自己编译硬件引导程序 本篇文章使用的 u-boot 构建代码,以及快速构建工具,基于 [hzyitc/u-boot-onecloud](https://github.com/hzyitc/u-boot-onecloud),开源在 [soulteary/onecloud-u-boot](https://github.com/soulteary/onecloud-u-boot),感兴趣可以自取,欢迎“一键三连”(尤其是原始仓库)。 相关的 Docker 工具镜像,我已经预购建好,分享在 DockerHub [soulteary/onecloud-uboot](https://hub.docker.com/r/soulteary/onecloud-uboot/tags) 和 GitHub [soulteary/onecloud-u-boot/pkgs/container/onecloud-uboot](https://github.com/soulteary/onecloud-u-boot/pkgs/container/onecloud-uboot)。 ### 关于 u-boot u-boot 是什么?简单来说,它是一个开源的引导加载程序,专门为嵌入式系统设计。它采用 GPL-2.0 开源协议,源代码托管在 [u-boot/u-boot](https://github.com/u-boot/u-boot)。其实 u-boot 离我们的生活非常近。每天我们使用的 Android TV 盒子、家中的路由器和网络交换机,它们都有 u-boot 的身影。 当你的设备按下开机键的那一刻,u-boot 就开始默默工作了,当设备启动时,u-boot 会经历这样的工作流程:首先初始化硬件,接着加载内核镜像,然后准备启动参数,最后将控制权交给内核。开发者可以根据项目需求,通过调整配置文件和环境变量来自定义这个过程。 u-boot 的功能十分强大。它支持 ARM、RISC-V 等处理器运行,支持多种文件系统,还能够使用 TFTP、NFS 网络协议,它不仅能从 NAND Flash、SD 卡甚至网络等多种存储设备启动系统,还提供了便捷的命令行支持。 ### 关于玩客云专用 u-boot 2022 年年中,GitHub 社区的 hzyitc 同学开始了玩客云的折腾,从六月份开始折腾玩客云的[引导构建问题](https://github.com/hzyitc/u-boot-onecloud/commit/e3e214b82089fc4eadac955fe6caaba460820497),直到十月份完成了[最后一次提交](https://github.com/hzyitc/u-boot-onecloud/commit/0038d741ed1c77a77570c3a6bf88fe6189c11733),实现了将 u-boot 的环境变量存储在实际启动的设备上,这样不论是想使用 eMMC 或者 USB 设备还是 SD 卡,都能够正确的启动和使用这台设备啦。因为在此之前的九月中的一次提交里,[实现了从 SD 卡启动设备](https://github.com/hzyitc/u-boot-onecloud/commit/8cd43899c5f7237d0420e482f3e7caa3af7b8c5d#diff-594a15f92b793806056d83fc148334a400635f0bdea6ee6faef83ab598b66ef9R235)。 ![下载设备专用的 u-boot 引导程序](https://attachment.soulteary.com/2025/01/08/u-boot-release.jpg) 这个时候,我们折腾玩客云这个设备,其实只需要刷入用这个项目构建好的 eMMC.burn.img 引导文件即可([本文构建的 u-boot 发布地址](https://github.com/soulteary/onecloud-u-boot/releases/tag/2025.01.06)、[hzyitc u-boot 发布地址](https://github.com/hzyitc/u-boot-onecloud/releases/tag/build-20221028-0940))。 除了玩客云之外,hzyitc 同学还对高通 ipq50xx 提供了以太网和 Wi-Fi 的驱动支持:[OpenWRT 社区记录](https://github.com/openwrt/openwrt/pull/17182)。 可惜的是,网上的许多教程并没有和这位勤奋同学构建的仓库一样持续迭代,设备的使用和初始化,依旧是复杂、冗长的方案,非常不利于折腾。并且,随着时间的推移,仓库中的方案也不能够顺利的一次性完成构建,而构建对于更深度的折腾这台高性价比的小盒子,是一个绕不开的事情。 想要构建玩客云或类似开发板设备的同学,都可以参考文章中接下来聊到的方法 ,来进行你的设备引导程序的制作。 ## 快速构建你的 u-boot 程序 让我们先从快速构建 u-boot 这个话题开始聊起。 在两年前,这个项目确实很容易上手。你可能只需要参考一下 `.github/workflows` 的配置就能轻松获得新的 u-boot 文件。 但随着时间推移,各种依赖和环境都在不断升级,项目本身也有一些文档未指出的额外的小细节,构建就有了一些新的变化。如果现在还想直接通过项目的 CI 文件来生成镜像,你可能会遇到不少问题。为了解决这个问题,我对项目进行了一些调整,制作了两个简单易用的 Docker 工具镜像: - [soulteary/onecloud-u-boot](https://github.com/soulteary/onecloud-u-boot) - [soulteary/u-boot-logo-maker](https://github.com/soulteary/u-boot-logo-maker) 现在,让我们一步步来看如何快速构建 u-boot。 首先,你需要获取适配特定设备的代码。这个很简单,用 `git clone` 就可以了。 ```bash # git clone {你要使用的 Git 仓库地址} onecloud-u-boot git clone https://github.com/soulteary/onecloud-u-boot.git ``` 接着,我们需要下载专门的 Docker 工具镜像。你可以选择从 DockerHub 或者 ghcr.io 下载。如果你选择从 ghcr.io 下载,记得给镜像重命名,这样后面执行命令会更方便。 ```bash # 从 DockerHub 下载 docker pull soulteary/onecloud-uboot:builder-2025.01.06 docker pull soulteary/onecloud-uboot:packer-2025.01.06 # 从 ghcr.io 下载 docker pull ghcr.io/soulteary/onecloud-uboot:builder-2025.01.06 docker pull ghcr.io/soulteary/onecloud-uboot:packer-2025.01.06 # 从 ghcr.io 下载后,可以对镜像进行重命名,方便后续命令执行 docker tag ghcr.io/soulteary/onecloud-uboot:builder-2025.01.06 soulteary/onecloud-uboot:builder-2025.01.06 docker tag ghcr.io/soulteary/onecloud-uboot:packer-2025.01.06 soulteary/onecloud-uboot:packer-2025.01.06 ``` 有了这些准备,接下来就是见证奇迹的时刻了。 执行构建命令,在我的 13 代 Intel CPU 上大概只需要 10 秒就能完成构建。然后再执行打包命令,1-2 秒就能生成最终的刷机镜像。 ```bash docker run -v `pwd`/onecloud-u-boot:/uboot -it soulteary/onecloud-uboot:builder-2025.01.06 docker run -v `pwd`/onecloud-u-boot:/uboot -it soulteary/onecloud-uboot:packer-2025.01.06 ``` 构建完成后,你可以在 `onecloud-u-boot/build/eMMC.burn.img` 目录找到最终的镜像文件。另外,如果你打算做深度定制,项目中的 `build` 和 `pack` 文件夹里的中间产物可能会对你有帮助。 ### 自定义 u-boot 启动 Logo 在获取代码后,如果你想更换启动 Logo,只需要按照以下步骤操作。 首先,将项目预设的新 Logo 示例文件复制到指定位置(`onecloud-u-boot/resource/bootup.bmp`): ```bash cp onecloud-u-boot/resource/bootup.example.bmp onecloud-u-boot/resource/bootup.bmp ``` 然后执行构建命令,新的启动 Logo 就会生效。 如果你想制作自己的启动 Logo,我准备了一个专门的 Docker 工具镜像。你可以通过以下任一方式获取: ```bash # 从 DockerHub 下载 docker pull soulteary/onecloud-uboot:logo-maker-2025.01.06 # 从 ghcr.io 下载 docker pull ghcr.io/soulteary/onecloud-uboot:logo-maker-2025.01.06 docker tag ghcr.io/soulteary/onecloud-uboot:logo-maker-2025.01.06 soulteary/onecloud-uboot:logo-maker-2025.01.06 ``` ![准备一张适合做 Logo 的图片](https://attachment.soulteary.com/2025/01/08/cat-logo.jpg) 制作自定义 Logo 图片也很简单:准备一张 640x320 像素(或相同比例)的 PNG 图片,将其命名为 `logo.png`,然后运行下面的命令即可生成 U-Boot 所需的 `bootup.bmp` 文件: ```bash docker run --rm -v `pwd`:/app soulteary/onecloud-uboot:logo-maker-2025.01.06 /app/logo.png ``` 最后,把生成的文件放到上面提到的项目的指定路径下,重新构建即可完成 Logo 的更换。 如果你想继续了解“如何快速制作高效的 u-boot 构建环境”,可以翻阅文末“其他”小节。 ## 对设备进行刷机 为了避免来回更换刷机包、过度折腾带来的麻烦,我们采用“一次性拆机刷机”的方式,这样可以省下 90% 不必要的软件层面的折腾工作。 ### 必备工具清单 刷机之前,我们需要准备这些工具。 ![折腾玩客云需要的工具](https://attachment.soulteary.com/2025/01/08/tools.jpg) 一把十字螺丝刀;一根导线(或金属镊子);一根USB-A转USB-A数据线(我用的是旧硬盘的连接线);一张废弃的卡片(用于从SD卡槽处打开机器);一把吹风机(用来加热背板,方便拆卸)。 ![玩客云拆机过程](https://attachment.soulteary.com/2021/11/10/wankeyun-out-of-box.jpg) 对于拆机的具体步骤,在我几年前的文章“[刷机前的准备](https://soulteary.com/2021/11/10/low-power-device-trial-notes-wyk-part-1.html#%E5%88%B7%E6%9C%BA%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87)”中有详细说明,这里就不再重复了。 ### 激活主板调试模式 这次我要补充一下之前文章中没有详细说明的内容(当时偷懒,没有补图)。 ![玩客云的两种主板](https://attachment.soulteary.com/2025/01/08/boards.jpg) 玩客云主板分为两个版本。1.0 版本:SD卡槽处没有“V1.3”标识;1.3 版本:SD卡槽处有明显的“V1.3”标记。 ![两种主板的短接位置](https://attachment.soulteary.com/2025/01/08/short-circuit.jpg) 两种版本的短接方式有所不同:1.0 版本需要在主板背面的白色线框附近短接;1.3 版本则在主板正面 RX 标记附近的未焊接点位短接。 完成短接后,用USB线连接主板和电脑,接通电源,就可以开始刷机了。 ### 准备刷机系统环境 考虑到刷机只是一次性工作,我没有特意去折腾用 Linux 工具替代 Windows 刷机工具。虽然手头没有 Windows 设备,但我有一台装了 ESXi 的闲置 NUC8,可以随时用来模拟各种操作系统环境。 ![2021 年,近期家用设备(NUC、猫盘、路由器)散热升级记录](https://attachment.soulteary.com/2021/10/14/nuc-shell.jpg) 如果你也对 NUC 上折腾 ESXi 感兴趣,可以看看我之前写的《[NUC 折腾笔记 - 安装 ESXi 7](https://soulteary.com/2021/06/22/nuc-notes-install-esxi7.html)》和《[快速构建和安装干净的 ESXi 8 镜像指南](https://soulteary.com/2023/01/29/how-to-easily-create-and-install-a-custom-esxi-image.html)》,这些文章会帮你搭建一个“万能实验环境”。 ![准备刷机环境](https://attachment.soulteary.com/2025/01/08/windows-on-esxi.jpg) 我建议用 Windows 10 来做刷机平台,这样能避免很多不必要的麻烦。系统是临时用的,刷完机后直接删掉虚拟机就行。 刷机使用的工具,我上传到了 [soulteary/onecloud-u-boot/releases/download/2025.01.06/USB\_Burning\_Tool\_v2.1.3.exe](https://github.com/soulteary/onecloud-u-boot/releases/download/2025.01.06/USB_Burning_Tool_v2.1.3.exe),文件校验信息如下: ```bash MD5: b295bfeb3e8dabf9e28464cdd63e5048 SHA1: 1620d296783464a3650d006cd3b7c3ce03f7d6ba ``` ### 开始设备刷机 工具安装好后打开,按之前说的方法用 USB 线连接玩客云主板和刷机系统,然后接通主板电源。 ![完成刷机](https://attachment.soulteary.com/2025/01/08/connect-device.jpg) 如果你直接用 Windows 电脑,此时工具和主板就已经连接好了,可以直接开始刷机。如果像我一样用 ESXi,需要先编辑虚拟机,添加 USB 设备,把“Amlogic product 0x003”分配给虚拟机,这样工具和主板就能连接上了。 第一次连接可能会出现红字提示,如果担心的话可以重新连接试试。然后用工具加载我们准备好的“[eMMC.burn.img](https://github.com/soulteary/onecloud-u-boot/releases/download/2025.01.06/eMMC.burn.img)”文件,用默认设置直接刷机就行。 因为我们的镜像只包含 u-boot 程序,所以刷机过程很快。完成后点停止,拔掉 USB 线,就可以把主板装回外壳了。 除非要焊接,这应该是你的最后一次需要拆机了。 ## 验证设备 完成引导程序刷写后,玩客云就具备了多重启动能力,可以从eMMC、SD卡或U盘启动系统。无论你使用 Windows 还是 macOS,都可以通过 balenaEtcher 来制作系统启动盘。 Windows 版本的 balenaEtcher 我也上传到 [soulteary/onecloud-u-boot/releases/download/2025.01.06/balenaEtcher-Portable-1.5.115.exe](https://github.com/soulteary/onecloud-u-boot/releases/download/2025.01.06/balenaEtcher-Portable-1.5.115.exe) 文件校验信息: ```bash MD5: 6e1ef94af0bae31a1e74ba7a83d2c082 SHA1: 5d7d8c61afe941b7e9b5fd3b412750ba739e94b5 ``` macOS 用户可以使用 [v1.19.25 版本的 balenaEtcher](https://github.com/balena-io/etcher/releases/tag/v1.19.25)。 这里用U盘或SD卡都行,我选择了SD卡,原因前面已经说过了。关于系统镜像的详细折腾经验,我打算放到下篇文章分享。这里我们先用 hzyitc 分享的定制镜像([hzyitc/armbian-onecloud/releases/download/ci-20240311-162146-UTC/Armbian-unofficial\_24.5.0-trunk\_Onecloud\_jammy\_edge\_6.7.9.img.xz](https://github.com/hzyitc/armbian-onecloud/releases/download/ci-20240311-162146-UTC/Armbian-unofficial_24.5.0-trunk_Onecloud_jammy_edge_6.7.9.img.xz))来测试。这个镜像包含了他的两个自定义补丁,目前还未合并到 Armbian 主线。 下载镜像后,解压得到 `img` 文件,然后用 balenaEtcher 将系统写入 U 盘或 SD 卡。 ![ESXi 刷机同样需要添加 USB 设备](https://attachment.soulteary.com/2025/01/08/make-sd-on-windows.jpg) 如果你和我一样在 ESXi 环境中操作,别忘了添加 USB 设备。而对于 Windows 或 macOS 用户来说,直接刷写就可以了。 ![macOS 刷机后,点击“推出“即可](https://attachment.soulteary.com/2025/01/08/make-sd-on-macos.jpg) 特别提醒 macOS 用户,由于系统默认不识别刷写后的分区文件系统,看到提示信息时直接点击“推出”就好。 最后,将写好系统的存储设备插入玩客云,接通电源,就能看到系统正常启动了。 ![启动任意我们想启动的系统](https://attachment.soulteary.com/2025/01/08/boot-wky.jpg) 关于系统的进一步定制和使用技巧,我们留到后面的文章再细聊。毕竟这台小设备能够折腾的东西太多了。 ## 其他 这篇文章已经写了很多内容了,但是趁着拆机和刷写 u-boot,我们再来展开聊聊一些相关的内容。 ### 为设备芯片加装散热片 既然已经拆开机器准备刷机了,不妨再聊聊一些实用的升级建议。 ![顺带增强一下散热](https://attachment.soulteary.com/2025/01/08/cool-down.jpg) 拆机过程中,我们不妨给芯片加装一个散热片。这个小改动其实很有意义:**提升散热效果。** - 玩客云采用的是封闭式"闷罐"设计 - 加上老旧制程的芯片本身就容易发热 - 散热片能帮助降低运行温度,让设备性能发挥得更稳定 在刷好新系统的玩客云上跑了一天 Docker 服务后,设备的温度情况如下: ![设备稳定运行温度状况](https://attachment.soulteary.com/2025/01/08/temp-watch.jpg) 所以建议大家趁着拆机的机会,顺手给芯片加个散热片,这个“小投资”还是很划算的。 ### 如何快速制作高效的 u-boot 构建环境 下面这部分内容,我想分享给有想法定制类似嵌入式设备等可折腾硬件 u-boot 的同学。 首先,我们来看看最终完成的构建环境 Dockerfile,然后再和大家详细讲解每个步骤的作用和注意事项。 ```Docker FROM i386/ubuntu:20.04 SHELL ["/bin/bash", "-c"] ENV DEBIAN_FRONTEND=noninteractive RUN sed -i 's#http://archive.ubuntu.com#http://mirrors.tuna.tsinghua.edu.cn#g' /etc/apt/sources.list && \ sed -i 's#http://security.ubuntu.com#http://mirrors.tuna.tsinghua.edu.cn#g' /etc/apt/sources.list && \ ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apt-get update && apt-get install -y build-essential git curl && \ curl -L -O https://redirect.armbian.com/_toolchain/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz && \ tar xf gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz --strip-components=1 -C /usr/local && \ rm -rf ./gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz # COPY gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz ./ COPY scripts/builder/build-image /bin/ RUN chmod +x /bin/build-image RUN git config --global user.email "soulteary@gmail.com" && \ git config --global user.name "soulteary" && \ git config --global safe.directory '*' WORKDIR /uboot CMD ["build-image"] ``` 接下来,让我带大家一步步理解这个构建环境是如何搭建起来的。 原始项目的构建脚本中默认使用的是 `ubuntu-latest`,但直接使用这个环境会遇到很多问题,特别是在下载开发环境软件包时。 ```Docker FROM ubuntu:latest ``` 考虑到代码是三年前提交的,我们可以推测当时使用的是 Ubuntu 20.04,所以先把系统环境锁定在这个版本。 ```Docker FROM ubuntu:20.04 ``` 因为要使用 Armbian 官方的交叉编译工具 `gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz` ,而且目标设备是 32 位架构,所以我们可以直接切换成相同架构的镜像 `i386/ubuntu:20.04`。这样可以避免在容器内使用虚拟机带来的复杂性。 ```Docker FROM i386/ubuntu:20.04 ``` 为了让构建过程更顺畅,我们还需要做几个关键调整。将默认 shell 切换为 `bash`,避免编译脚本的兼容性问题。 ```Docker SHELL ["/bin/bash", "-c"] ``` 在我们进行系统安装的过程中,尤其是涉及到类似 `tz-data` 类似依赖的安装时,会进入交互式终端,从而打断 Docker 镜像的构建。所以在进行镜像构建时,我们一般要声明,“你自己看着办,别问我”: ```Docker ENV DEBIAN_FRONTEND=noninteractive ``` 使用国内镜像源加速软件包下载,完成基础开发环境的依赖安装。 ```Docker RUN sed -i 's#http://archive.ubuntu.com#http://mirrors.tuna.tsinghua.edu.cn#g' /etc/apt/sources.list && \ sed -i 's#http://security.ubuntu.com#http://mirrors.tuna.tsinghua.edu.cn#g' /etc/apt/sources.list && \ ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apt-get update && apt-get install -y build-essential git curl && \ curl -L -O https://redirect.armbian.com/_toolchain/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz && \ tar xf gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz --strip-components=1 -C /usr/local && \ rm -rf ./gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz ``` 考虑到后续我们可能会调整构建命令,我们把它抽象到单独的脚本文件中。这样后续修改起来更方便,不用重新构建整个镜像。只需要对镜像打个小补丁即可。 ```bash #!/bin/bash make distclean make m8b_onecloud_config make -j$(nproc) ``` 将上面的文件保存在 `scripts/builder/build-image` 后,我们可以通过 `COPY` 命令,将我们封装好的命令脚本扔到容器里,并赋予执行权限: ```Docker COPY scripts/builder/build-image /bin/ RUN chmod +x /bin/build-image ``` 我们的构建过程会使用到 `git` 命令。Git 2.35.2 之后引入了一个安全措施,用来防止在不同用户间共享的目录中可能出现的权限问题。 为了确保构建过程不会因为权限问题而中断,我们可以使用下面这个小技巧。 ```Docker RUN git config --global user.email "soulteary@gmail.com" && \ git config --global user.name "soulteary" && \ git config --global safe.directory '*' ``` 最后,我们设置了工作目录和默认启动命令,这样用户使用起来会更便捷。 ```Docker WORKDIR /uboot CMD ["build-image"] ``` 在镜像构建的时候,也记得指定目标平台(`linux/386`),这样在使用的时候就可以非常简单,不需要添加额外的命令。 ```Docker docker build --platform linux/386 -t soulteary/onecloud-uboot:builder-2025.01.06 . -f Dockerfile.builder ``` ## 最后 好了,今天的文章就先写到这里。这些基础工作完成后,玩客云就具备了“重获新生”和后续“简单折腾”的必要条件。 在接下来的文章中,我会继续分享如何让这台设备变得更加实用和有趣。我们会一步步完成前面提到的那些“小作业”,让这个小盒子设备可以变的更实用、也更有意思。 下篇文章,再见。 --EOF