初始化奇妙小屏幕控制器项目

This commit is contained in:
2026-09-08 22:56:52 +08:00
commit 8d368de3b5
491 changed files with 67678 additions and 0 deletions
@@ -0,0 +1,52 @@
# 离线镜像 1.0.3 启动分区空间修复记录
## 结论与产物身份
- 旧 1.0.3 IMG 的 SHA-256 为 `de3c9bc88b25cd11b0450e50f219398d973dd78d997a5c6e3c91c0f4d23d9f64`,已确认不可用并从正式目录删除,不得再写卡或发布。
- 修复后仍使用软件版本和文件名 `1.0.3`,新 IMG SHA-256 为 `a5676576fb63a913ed9e40a02ce206e5ef71f47b1005a98a8758479b51413e0b`。
- `核桃派软件源代码/VERSION` 始终为 `1.0.3`;`发布记录.json` 中仍只有一条 1.0.3 记录,已原子更新到新摘要。
- 原 65,536 字节双槽配置区逐字节复用,新镜像未写入账户、密码、IP 或 Wi-Fi 等现场值。
- 本轮未写 TF 卡。真实首次启动、SSH、sudo、网页、候选内核和再次重启须由用户写卡后继续验收,本文不把这些项目写成通过。
## 首次启动失败根因
- 现场 FAT 日志为 `install: error writing '/boot/Image-matrix-axp313a1': No space left on device`,随后回滚并留下 `FAILED: stage=kernel; code=1; line=150`。
- 现场工具报告 FAT 容量 `149,778,432` 字节、剩余 `17,678,336` 字节;独立 FAT16 簇解析得到分区字节数 `149,946,368`、可分配空间 `17,694,720`。两种口径有 BPB/簇取整差异,但都小于新内核单文件 `22,468,616` 字节。
- 旧 `/boot/MSCBOOT.TGZ` 占 `76,117,351` 字节。即使不计双份 DTB、System.map、kernel config、启动脚本临时文件和原始脚本回滚副本,只写候选 Image 也至少短缺约 4.8 MB。
- 基础 Debian 和网络已先完成,因此设备可 ping;控制服务、网页和成功重启位于失败点之后,不能由 ping 可达推断为已安装。
## 设计修复
- 镜像元数据从 v2 升级为 v3。FAT 只保存 `MSCCFG.BIN`、`MSCMETA.JSN` 和 `MSCINIT`;应用离线包迁入 `/opt/matrix-image-bootstrap/app/MSCBOOT.TGZ`,内核载荷继续位于相邻的 `axp313a/`。
- rootfs 注入前检查“应用压缩载荷 + 内核压缩载荷 + 256 MiB”。首次启动失败保留两类压缩载荷供完整重试,全部成功后才删除整个 bootstrap 根。
- 构建端和内核安装器共用同一 FAT 预算算法,按 4,096 字节簇计入五个候选 boot 文件、原始回滚脚本、临时/最终受管脚本、摘要和健康标记,再额外保留固定 `32 MiB`。
- 新镜像实测 FAT 空闲 `93,814,784` 字节,实际文件预算 `26,279,936`,安全余量 `33,554,432`,总门槛 `59,834,368`,门槛之外仍有 `33,980,416` 字节。
- 新应用 bundle 为 `76,123,924` 字节、SHA-256 `74e90c7b93d3ffc55226d52bfb5cee214255704341ac40564cd9afc823b19616`;最终 FAT 明确不存在 `MSCBOOT.TGZ`。
## 导出入口报错与修复
- 先前正式脚本在创建发布锁和版本目录之前报远端系统 Python 缺少 FontTools;本机 bare Python 复现时先报缺少 Pillow。
- 根因不是镜像构建需要字体包,而是导出器导入 `app.ota.package` 时执行了 `app.ota.__init__`,后者提前加载 OTA manager、显示服务、Pillow 和 FontTools。
- 当时用已校验 wheelhouse 创建临时 Python 3.11 venv 可以绕过报错,但这不是正确的长期依赖边界。
- `app.ota` 现改为惰性导出。`python3 -S scripts/export_release.py --help` 在没有 site packages 的 Linux 系统 Python 上通过;正式镜像导出不再创建应用 venv 或访问网络。
- 旧 `refresh_sd_image_payload.py` 原地刷新方式已停用。同版本坏包只能通过 `image --repair-current` 从官方基线完整重建,验证后替换原目录和原记录。
## 构建和传输过程中的防坑记录
- Windows 端只创建不含凭据的最小项目快照,并对项目快照、官方基线压缩副本和旧 IMG 压缩副本分别做传输前后 SHA-256;三项全部一致后才解压。
- Windows Git tar 不能直接把带盘符的输出路径交给其 gzip 子进程;本轮改用 Windows 自带 bsdtar 生成项目快照。以后仍应把传输产物放在 Codex 临时目录,不放进项目。
- 官方镜像 `SHA256SUMS` 使用相对文件名,校验必须在清单所在目录执行或显式筛选 IMG 条目;不能在项目根直接执行整份清单。
- PuTTY SCP 对远端中文路径发生过编码失败。下载阶段使用同文件系统、ASCII 名称的临时硬链接目录;启用 `protected_hardlinks` 时由 sudo 只创建硬链接,不复制第二份 3.3 GB IMG。下载后仍以正式侧车摘要校验。
- 远端工具先按远端 PATH 检查;普通账户 PATH 不含 `/usr/sbin/losetup`,root 构建使用明确的系统 PATH。没有因本机具备工具而假设远端具备。
## 自动验证结果
- 本机聚焦镜像/内核测试:`27 passed`。
- 本机完整 Python:`356 passed, 8 skipped`;警告均为既有 FastAPI/Pillow 弃用警告。
- Node 前端:`72 passed`。
- 四个相关 shell 脚本通过 `bash -n`;远端 bare Python 参数入口通过。
- 官方基线 IMG 在解压后、构建后分别按项目清单复核为 `OK`。
- 正式构建输出 `rootfs bootstrap installed` 与 `rootfs bootstrap verified`;提交后又从 IMG 复制应用 bundle 为独立文件,再次运行只读 rootfs/FAT 验证并通过。
- 新 manifest、侧车摘要、实际整镜像摘要和唯一发布记录四者一致;发布锁、`.building` 和 `.invalid-backup` 均不得残留。
本记录是一次性故障和发布证据,不得作为后续构建输入;后续构建不得引用 `发布更新相关/导出包/1.0.3` 中的任何文件。