2026-09-19 接管进展与验收边界
本记录补充 review-package-2026-09-19.md,不把原交接的部分验收升级为全量通过。 基线为 648ca17;本次修改尚未提交、推送。原重建计划仍有效。
修复的基础问题
- 输出目录锁的“发布 PID 后按顺序比较”存在竞争窗口;改为短时 flock 保护所有者检查与发布,长期所有权仍由 Make PID 和启动时间判断。
- 递归 Make 的锁令牌必须来自真实祖先进程;清理不会删除锁守卫。清理拒绝符号链接父目录与伪造标记。
- Kconfig 的多输出改为 grouped targets,避免并行重复执行同一生成器。
- 认证安装戳原先写在 work 而规则查找 auth;现在在成功后发布到规则声明位置。
- musl/auth 的缺失输出会触发恢复,不再用空规则假装目标存在。
- grouped outputs 中保留上游旧时间的文件会导致反复构建;成功后先验证声明输出,再更新时间。
- doctor 除了检测 Clang 头文件,还验证 compiler-rt 归档和目标整数除法链接。默认 PATH 的 Neutron Clang 缺少该归档;本次构建使用
/usr/bin:/bin。
旧 verification.md 中对原锁算法的通过描述是历史记录,不能作为当前锁算法的证明。
新迁移范围
Linux-PAM
tools/build/pam/ 为锁定 Linux-PAM 1.7.2 的 Make 适配,不调用 Meson/Ninja/Python。 父适配器校验下载和补丁、隔离源目录、构建成功后发布 stage。 包含三类 PAM 库、模块、辅助程序和安装数据,以及 LeonOS 的 pam_leonos_password.so。保留 pam_unix 对认证与密码存储的所有权。 合并 UAPI/crypt 头目录时单独放置 crypt.h,避免误用 musl 的简化 crypt 声明。 目录发布使用备份与重命名;它不是对外部并发读者的原子事务,消费者必须由同一 O 的依赖图调度。
Runtime
make runtime 生成普通与 installer 两套共享、静态运行库。 新 C 工具生成 GBK 表;libpng 配置通过小型 Shell/awk 适配生成。 对象有头依赖,源文件清单参与链接签名,归档重建不保留已删除成员。
musl SDK 子集
make musl-sdk 生成 O/sdk/leonos-musl-sdk 和 O/packages/leonos-musl-sdk.tar.gz。 编译包装器是 C 程序,通过 argv 执行编译器,依据可执行文件位置寻找 SDK,支持搬移。 归档固定排序、所有者与 SOURCE_DATE_EPOCH,gzip 不记录当前时间。 这不等于完整 make sdk:Developer SDK、示例及 API 安装包仍待迁移。
已有验证及范围限制
- PAM 适配器的独立集成记录见
tools/build/pam/VERIFICATION.md;来宾认证未验证。 - 新 runtime 四种产物实际编译链接成功。
- 新 SDK 已打包;最小 C 程序动态、静态编译成功并在 Linux 宿主 musl 环境运行。
tests/integration/pam-product.sh检查专用模块 ELF 架构、PAM 依赖和入口符号;不代表密码变更流程通过。- GBK 生成器和 SDK 包装器有针对性测试。锁、配置 grouped outputs、compiler-rt 检查均有回归用例。
- 最终 make test、stage recovery 与无操作构建的结果另追加于下方;未结束的命令不计为通过。
下一阶段与尚未解决事项
- 审查与扩展 PAM/SDK 全安装清单;目前只有部分关键输出列为 Make 目标,删除其他已安装文件的恢复尚未覆盖。
- 编译器二进制身份及上游源/补丁变更对全部适配器的失效规则仍需统一审查。
- 迁移 middlelayer、loader 和完整 userland;loader 完整性摘要必须对应本次生成的内核,不能混用旧输出。
- 完整 SDK、APK 签名仓库、rootfs、三类镜像、安装与升级,以及资源生成链。
- 来宾启动仍没有成功证据。原 SeaBIOS/OVMF 新旧一致不能替代启动验收。
- 完成全量断网、写失败、真实 Ctrl-C、重复清单、SDK/镜像链的验收矩阵。
生产链迁移完成以前保留旧入口作为对照。不得通过删除旧功能、静默跳过目标或返回成功来填平差异。
最终验证补充
PATH=/usr/bin:/bin sh tests/long/test-stage-recovery.sh:退出 0,包括辅助工具更新后连续构建稳定性。PATH=/usr/bin:/bin make O=out/takeover -j4 runtime musl-sdk:退出 0。- 重复该命令:退出 0,无编译、链接、打包;仍输出一条配置 GEN。配置生成工具更新但内容不变后的重复检查尚需优化,不能声称完全零操作。
PAM_ROOT="$PWD/out/takeover/pam/root" sh tests/integration/pam-product.sh:退出 0。- 最新 SDK 动态/静态 hello 程序均再次输出
new Make/C SDK works,运行平台为 Linux 宿主。 - 首轮完整回归在执行期间遇到配置规则的临时试验修改,A02 失败。该试验已撤回,独立 grouped-config 测试重新通过;完整测试重新运行,以重跑结果为准。
独立审查追加
- 发现 SDK 的
-nostdlib链接遗漏 compiler-rt,__int128除法动态/静态链接均失败。已将选定目标 compiler-rt 归档装入 SDK 并显式链接;tests/integration/sdk-link.sh两种模式编译并运行退出 0(宿主 Linux)。 - runtime 两种共享库现在直接依赖 compiler-rt 文件,避免同路径更新时只检查路径签名。
- SDK 安装清单恢复不完整的问题仍开放:删除未列出的头文件/启动对象不一定触发重建。当前 SDK 不能作为全量 A07/A15 验收通过的依据。
- 长测试首次失败于过时的“runtime 必须拒绝执行”断言。现在仅对仍未迁移目标保持该断言,runtime 的正向验证见上文;长测试重新运行。
- 并行启动 test 与 test-long 的重跑无效:两者修改共享源文件时间戳,出现 A03 额外重编译和 A08 对比不一致。已改为同一 Shell 顺序运行
make test && make test-long。即便使用不同 O,也不能并行运行这些会改变源码状态的测试;未来应隔离源码 fixture 或加测试级互斥。 - 串行
make test中:C 普通/ASan+UBSan 各 74+66 项,auth 23、bootstrap 22、concurrency 17、deps 44、incremental 21、reproducible 11,以及新增 config/doctor/GBK/lock/SDK 套件均通过。最后 third-party 因复用旧 stamp、未先更新基线而失败;测试已修正为总是先构建基线,单独重跑 29 项全部通过、退出 0。不能把原失败命令的退出码写成 0。 - 最后串行
PATH=/usr/bin:/bin make test-long:退出 0;execchain 19 项、jobs 19 项、stage-recovery(缺失 auth/musl 输出、戳位置、辅助工具更新后稳定 no-op)通过。日志/tmp/leonos-takeover-serial-long.log。 - 最终
git diff --check:退出 0。尚未提交或推送;全量迁移和来宾验收仍未完成。