为 骁龙410棒子换上 Alpine 系统

利用现成的 Debian 刷机包,只构建 rootfs 得到更轻量的 Alpine 系统。

本教程面向小白,大部分工作都借助如codex,opencode等 AI Agent 工具完成操作。

利用现成的 Debian 刷机包,只替换 rootfs,得到更轻量的 Alpine 系统。应该适用于所有有可用 Debian 包的 骁龙410 随身 WiFi 设备。


操作流程

1. Fork 仓库并克隆到本地

Fork kinsamanka/OpenStick-Builder 到自己的 GitHub 账号。 注意:Fork 时取消勾选「仅复制 main 分支」,我们需要 alpine 分支。

Fork 完成后把 alpine 分支克隆到本地(建议将 Fork 后的仓库地址告诉 Agent,由 Agent 完成克隆,避免分支选错等问题)。

1
克隆 https://github.com/kinsamanka/OpenStick-Builder 的 alpine 分支到本地,先不要改代码,阅读这个项目结构,说明主要目录、使用方式

这里的项目地址需要替换为你 Fork 后的仓库地址

2. 准备工作区

在工作区放两个文件夹:

1
2
3
工作区/
├── OpenStick-Builder/    ← 克隆的项目(alpine 分支)
└── 刷机包/               ← 你的设备的完整 Debian 刷机包(含 boot.img、rootfs.img等)

刷机包就是你设备当前能用的那个 Debian 刷机包。

3. 复制提示词,发送给 Agent

打开你的 AI Agent,把工作区两个文件夹都加进去,然后复制发送下面的提示词(系统配置按需修改):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
请先不要改代码,先阅读 OpenStick-Builder 项目代码,理解项目结构。

背景:
- 刷机包文件夹里是一个可用的 Debian 一键刷机包(MSM8916 平台)
- 项目代码里已经有完整的构建脚本(alpine 分支)
- 我需要你帮我把这套构建适配到我的设备

你要做的事:
1. 从刷机包的 rootfs.img 里提取内核模块(/lib/modules/ 整个目录)和WiFi 固件(/lib/firmware/ 下的 wcnss.b00-b11、wcnss.mdt、wlan/prima/WCNSS_qcom_wlan_nv.bin、mba.mbn、qcom/a300_*.fw、qcom/venus-1.8/),放到项目的 prebuilt/<设备名>/ 对应目录。
2. 从刷机包复制底层固件(aboot.bin、gpt_both0.bin、hyp.mbn、rpm.mbn、sbl1.mbn、tz.mbn 等)到 prebuilt/<设备名>/,供 extract_fw.sh 使用。如果刷机包里没有这些文件,可以从工作流中去掉 extract_fw.sh 步骤。
3. 修改构建脚本(alpine_rootfs.sh、extract_fw.sh),把里面的路径改为 prebuilt/<设备名>/
4. 内核模块的目标目录名必须和内核版本字符串完全一致(从 /lib/modules/ 下的目录名获取)
5. 修改主机名、root 密码为我指定的值
6. 修改 .github/workflows/build.yml 里的 artifact 名称为我的设备名

核心规则(违反会导致设备变砖):
- 绝对不要修改、重新打包、或重新生成 boot.img
- boot.img 直接使用刷机包里的原始文件
- 我们只构建 rootfs.img,boot.img 由刷机包提供

系统配置:
- 主机名:OpenStick
- root 密码:password
- SSH:PermitRootLogin yes,host keys 在宿主机用 ssh-keygen 预生成
- USB 网络:NCM gadget,VID=0x1D6B PID=0x0104,IP 192.168.5.1/24 shared
- WiFi 热点:SSID Openstick,密码 12345678,IP 192.168.4.1/24 shared
- WiFi 模块自动加载:/etc/modules-load.d/wcnss.conf 写入 qcom_wcnss_pil
- 首次启动自动扩容:/etc/local.d/resize-rootfs.start,
  用 awk '$2 == "/" {print $1}' /proc/mounts 获取根设备,resize2fs 扩容
- 不需要 ModemManager(不插 SIM 卡)
- 频率由内核 schedutil 动态管理,不需要额外配置
- 需要安装 e2fsprogs-extra(提供 resize2fs)
- rc-update add local default(否则 local.d 脚本不执行)

构建环境:GitHub Actions ubuntu-latest,qemu-aarch64-static 交叉构建。
Alpine v3.24,postmarketos 仓库 v25.12(msm-firmware-loader、rmtfs)。
rootfs 镜像:512MB ext4,分区标签 rootfs,img2simg 转 sparse。

完成后请检查所有改动是否完整一致,给我总结完成情况。

4. Agent 完成后,推送到仓库

Agent 改完代码后,把改动提交并推送到你 Fork 仓库的 alpine 分支。 也可以直接让 Agent 完成提交和推送。

1
提交代码至 Github 仓库的 alpine 分支,并根据当前 git diff,生成一条清晰的 commit message。

5. 触发 GitHub Actions 构建

打开你 Fork 的仓库页面 → Actions(操作) → 对应的工作流 → Run workflow(运行工作流程) → 选 alpine 分支 → 点绿色按钮。

等构建完成(大约 2 分钟),刷新页面,底部会多出一个 Artifact(附件)。下载附件到本地,里面有构建出的 rootfs.img。 如果报错就带着日志发给 Agent ,让他修复后重新推送和触发构建。

6. 处理产物

把下载的附件解压,将 rootfs 复制到刷机包文件夹里,替换原来的 rootfs 。

注意与刷机包的 rootfs 后缀保持一致,如附件中的 rootfs 为 .bin 格式,但是实际刷机包中为 .img 格式,就需要将附件中的 rootfs 修改为 .img 格式。

7. 刷机

运行刷机包原有的脚本刷入即可。

刷入完毕后,Windows 设备管理器里出现「Linux Foundation NCM」网卡即说明启动成功。然后 ssh root@192.168.5.1 登录。


验证是否成功

  • 设备管理器出现 PID:0104 → 正常
  • 设备管理器出现 PID:9006 → 内核未启动,检查 boot.img 是否为刷机包原始文件
  • 能 ping 通 192.168.5.1 → USB 网络正常

出问题怎么办

  • 设备变砖:进入 9008 模式擦除 boot 分区,设备即可自动进入 fastboot 模式
  • SSH 连不上但设备管理器有 NCM 网卡:等 30 秒再试,首次启动要生成熵和扩容
使用 Hugo 构建
主题 StackJimmy 设计