feat(m53): 自写 timeout(1) 并接入 devkit 本地源码构建路径
设备没有 timeout,busybox 1.31 也无该 applet;2026-11-11 18:44 一条挂在 硬件上的 bluetoothctl 累积 55 个残留进程耗尽进程表,dropbear 无法 fork, 整机在线却不可登录。本单给设备一个可用的 timeout。 - scripts/build/devkit-src/timeout.c(新,Apache-2.0,489 行) 独立实现,未拷贝 busybox/GPL 代码;fork+setpgid(0,0) 后 kill(-pgid), 孙进程一并终止;waitpid 回收直接子进程不留僵尸;-s/-k 两阶段终止; 退出码 124/137/128+N/125/126/127 对齐 coreutils 语义。 计时不用 timerfd(musl 的 timerfd_settime 在 4.4 上静默失效,实测 timeout 2 sleep 30 等满 30s 才返回),改用 setitimer(ITIMER_REAL)+SIGALRM, 与 SIGCHLD 一起进 signalfd,由一次 ppoll 等待,零轮询、不读时钟。 - build_devkit.sh:新增 build_local(B 路径,不碰上游 procps/lsof/ncurses 流程);TOOLS/TOOL_NAMES/MANIFEST/licenses/stamp/--with-sources 接入; 产物同时标注 Apache-2.0 并随附许可证原文。 - test_build_devkit.sh:T9(产物静态/架构/零 NEEDED/MANIFEST/license)、 T10(源码纪律:独立实现、不调 clock_gettime、不用 timerfd、进程组模型)。 - DEVKIT.md/README.md:产物表、PATH 实测(ssh 非登录 shell 无 opt/bin, 且设备无 bash → 用 sh -lc 或绝对路径)、禁裸跑纪律与 18:44 事故时间线、 timerfd 静默失效的第二类 time64 坑、2026-11-11 真机验收原始输出。
This commit is contained in:
1 parent
a41b61198e
commit
80c0bd4eb4
5 files changed
+855
-22
No files matched your search
+32
-2
@@ -12,7 +12,8 @@
|
||||
|---|---|
|
||||
| `build_fw_apps.sh` | **通用打包脚本**(配置驱动)。读清单 → 组树 → repack → 校验 → 出固件。**不要改它的逻辑**,除非打包流程本身要变。 |
|
||||
| `fw_content.conf` | **固件内容清单**(默认配置)。每行一条 `<src>|<dst>|<md5>|<desc>`,声明"哪个本地文件装到固件哪里"。**改固件内容只改这里。** |
|
||||
| `build_devkit.sh` | **TF 卡调试工具集**交叉编译脚本(zig → 静态 MIPS32r2):`vmstat/slabtop/free/ps/pmap/sysctl/lsof` → `fw_apps/devkit/`。与固件打包无关,独立跑。详见 `DEVKIT.md`。 |
|
||||
| `build_devkit.sh` | **TF 卡调试工具集**交叉编译脚本(zig → 静态 MIPS32r2):`vmstat/slabtop/free/ps/pmap/sysctl/lsof`(上游包)+ `timeout`(本仓 `devkit-src/` 本地源码)→ `fw_apps/devkit/`。与固件打包无关,独立跑。详见 `DEVKIT.md`。 |
|
||||
| `devkit-src/` | devkit 的**本地源码**(Apache-2.0,本仓自有):`timeout.c`。`build_devkit.sh` 的 `build_local` 路径编译它,不下载、不 patch、不混入上游流程。 |
|
||||
| `rebuild_binaries.sh` | **进固件的那批组件重编驱动**:`bash scripts/build/rebuild_binaries.sh [bootmenu netmgrd audiod audio launcherd]`。在干净 checkout / git worktree 里**开箱可跑**:兼容 HOME 里补 `.tools`(zig 工具链)与 `patch_v2`,`meow_ui.a` 自动从主 checkout 取(取不到会报错列出试过的路径),产物就地写回 `patch_v2/<组件>/`。 |
|
||||
| `verify_fingerprints.sh` | **产物语义指纹自证**:`bash scripts/build/verify_fingerprints.sh`(`--self-test` 自检判据非空)。重编后 md5 必变,能证明「产物含哪些源码改动」的是字符串/动态段/4263 反汇编判据;time32 门禁的退出码计入 FAIL,不会假绿。 |
|
||||
| `test_build_devkit.sh` | `build_devkit.sh` 的回归测试(不重编;热缓存约 15s,冷启动需先重建基线 1–2 分钟):stamp 命中时 `--with-sources` 必须产出完整 `src/`;`licenses`/`README` 被删要能恢复、`--verify-only` 必须拒绝;MANIFEST 漂移检测。 |
|
||||
@@ -124,13 +125,42 @@ md5sum patch_v2/meow_launcherd/meow_launcherd
|
||||
|
||||
---
|
||||
|
||||
## 4.1 devkit 本地源码(`timeout`)与「设备禁裸跑」纪律
|
||||
|
||||
`build_devkit.sh` 有两条互不干扰的编译路径:
|
||||
|
||||
| 路径 | 输入 | 流程 |
|
||||
|---|---|---|
|
||||
| A. 上游包 | ncurses / procps-ng / lsof 的 tarball | 固定版本 + sha256 → configure/make(缓存命中不联网) |
|
||||
| B. 本地源码 | `scripts/build/devkit-src/*.c` | 一次 `zigcc -O2 -static`(无下载、无 patch、不进上游流程) |
|
||||
|
||||
`timeout` 走 B 路径:**本仓 Apache-2.0 独立实现**(`devkit-src/timeout.c`),
|
||||
不是 busybox 的 GPL 代码。产物 `fw_apps/devkit/bin/timeout` 与其它工具一起自检
|
||||
(static / ELF32 / MIPS32r2 / 0 NEEDED)、写进 `MANIFEST.txt`(Apache-2.0 行)、
|
||||
`licenses/meowos-timeout-LICENSE` 附 Apache-2.0 原文;`--with-sources` 会把
|
||||
`timeout.c` 一起放进 `src/`。新增本地小工具只需往 `devkit-src/` 丢一个 `.c`。
|
||||
|
||||
**为什么要有它(别跳过这段)**:2026-11-11 18:44,设备因为**裸跑会挂在硬件上的外部命令**
|
||||
(`bluetoothctl`,累积 55 个挂死客户端)耗尽进程表:18:44:13 launcher 最后日志、
|
||||
18:44:14 sshd 最后 child 退出,之后 11 分钟 `ssh.log` 一行都没有(fork 失效),
|
||||
只能重启。完整时间线与纪律见 **`DEVKIT.md` §1.1**。最短版本:
|
||||
|
||||
```sh
|
||||
timeout 8 bluetoothctl connect <MAC> # 设备侧禁止裸跑,一律加超时并封顶重试次数
|
||||
timeout 5 sh -c 'sleep 100 & sleep 100 & wait' # 孙进程也必须死
|
||||
```
|
||||
|
||||
设备上没有 `timeout(1)`(busybox 1.31 也无此 applet),所以这个工具是那条纪律的可执行形态。
|
||||
|
||||
---
|
||||
|
||||
## 5. 踩坑记录(重要)
|
||||
|
||||
- **脚本共享目录互相清空**:早期每个版本一个脚本、都 `rm -rf fw_apps`,并行跑会删掉彼此的 `.upt` 产物。→ 已改为 `fw_apps/build/`(工作区)+ `fw_apps/out/`(归档)分离,且删光独立脚本。
|
||||
- **改源码忘更新 md5**:清单里 md5 是强校验,源变了但 md5 没改 → 打包直接失败。**凡是动了清单里列的源文件,先 `md5sum` 更新对应行。**
|
||||
- **SDK 库(`meow_ui.a`)不入固件**:它由 APP(如 hello)链接,走 TF 卡 `MeowAPPs/` 热更新,**不要**加进清单。
|
||||
- **`fw_apps/` 被 gitignore**:固件产物与组装树都是构建产物,勿提交。
|
||||
- **`scripts/build/` 根目录 gitignore**:构建产物与组装树勿提交。但本目录的 **`README.md`/`build_fw_apps.sh`/`fw_content.conf`/`build_devkit.sh`/`test_build_devkit.sh`/`DEVKIT.md` 已 `git add -f` 入库**(这几个是仓库侧应保留的脚本/配置/说明);其余(`fw_apps/` 产物、devkit 编译树等)不入库。
|
||||
- **`scripts/build/` 根目录 gitignore**:构建产物与组装树勿提交。但本目录的 **`README.md`/`build_fw_apps.sh`/`fw_content.conf`/`build_devkit.sh`/`test_build_devkit.sh`/`DEVKIT.md`/`devkit-src/*.c` 已 `git add -f` 入库**(这几个是仓库侧应保留的脚本/配置/说明/本地源码);其余(`fw_apps/` 产物、devkit 编译树等)不入库。新增 `devkit-src/*.c` 后记得同样 `git add -f`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user