fix(starry-kernel): expose proc boot ID - #1904
Conversation
There was a problem hiding this comment.
本 PR 为 StarryOS 补齐 /proc/sys/kernel/random/boot_id,并新增 grouped QEMU 回归用例;目标是让依赖该 Linux procfs 接口的程序不再收到 ENOENT。实现位置和 grouped qemu/system 测试布局均与现有模式一致,但 boot ID 的核心随机性契约未满足,当前不能合入。
审查与兼容性
book/guideline/feature-development.md:不适用。本次是修复既有 Linux procfs 缺失接口,不扩展公共抽象、crate 或平台能力。book/guideline/starry/syscall.md:适用。该 procfs 节点由既有路径解析及open(2)、read(2)、lseek(2)、newfstatat(2)路径间接暴露。逐项映射:
| syscall | 结论 | 标准/依据 | 简要理由 |
|---|---|---|---|
openat |
存在问题(F-001) | open(2);sd_id128_get_boot(3) | 路径可打开,但读到的 ID 不能保证是每次启动新生成的随机 ID。 |
read |
存在问题(F-001) | read(2);sd_id128_get_boot(3) | 同上,返回内容违反 boot ID 的跨启动身份语义。 |
lseek |
未发现本次改动引入的问题 | lseek(2) | SimpleFile 路径及新增用例覆盖 seek 后重读。 |
newfstatat |
未发现本次改动引入的问题 | stat(2) | 新节点按现有伪文件设置 regular/0444 属性;新增用例覆盖。 |
验证
- helper 已确认工作区和
HEAD=0f3022ebe4424e51e8666e8605dc6967e23bbc27;git diff --check origin/dev...HEAD、cargo fmt --check、新增 C 用例的 host 编译与在 Linux/proc上的 9/9 断言均通过;CMake 也能经qemu/system的子用例选择构建。 - 当前 head 的组织 CI:格式化和 clippy 成功。
Test starry x86_64 qemu、Test starry riscv64 qemu因路径路由被跳过,因此没有把它们视为本 PR QEMU 证据;工作流唯一失败为未改动的Test axloader HTTP smoke,与本 PR 的 Starry procfs/test-suit 路径无关。 - PR 描述提供的 x86_64 红/绿 QEMU 结果已阅读,但不足以验证跨启动随机性。
重叠、历史评论与剩余风险
- base 未包含该 procfs 节点;相关开放 PR 搜索未发现同一
boot_id实现,未见重复或依赖顺序风险。无历史 review/comment 需要处理。 test-suit/starryos/qemu/system的新增用例会被根 CMake GLOB 发现、安装到/usr/bin/starry-test-suit,且 grouped wrapper 会将失败传播为非零;测试布局本身无阻塞问题。- 完成的审查项:约束/代码质量/Starry syscall 指南、差异与既有 procfs 和 grouped-test 模式、CI、测试发现、重复与重叠检查。硬件/ABI、应用运行和 feature-development 设计门不适用;没有新增或变更 app。唯一未关闭项为下列阻塞随机性缺陷。
请先修复 inline finding 后再请求复审。
Powered by gpt-5.6-terra
There was a problem hiding this comment.
本 PR 为 StarryOS 添加只读 /proc/sys/kernel/random/boot_id,并把随机设备与内核消费者收敛到共享随机流,同时新增 qemu/system 回归。procfs 节点、0444 属性、UUIDv4 格式化和 grouped C 子测例布局与现有模式一致;改变会通过既有 VFS 路径影响 openat、read、lseek 与 newfstatat 的用户态可见行为,除随机性契约外看起来是隔离的。
feature-development.md 不适用:这是补齐既有 Linux procfs 接口,不引入公共抽象、crate 或平台能力。starry/syscall.md 适用,已按其间接 ABI 路径审查。
验证与 CI
- 当前 head
1ed4fec743bc30c2df2d6b8bdd65602784a51b1a已复核,工作树干净,git diff --check origin/dev...HEAD与cargo fmt --check通过。 - 新增 C 子测例可由根
qemu/system/CMakeLists.txt选择并构建;其安装路径和 grouped wrapper 的失败标记符合测试套件指南。 - 当前组织 CI 共有
success=35、skipped=35、cancelled=1;格式化与 clippy 成功。Starry x86_64/riscv64 QEMU 任务因路径路由跳过,不能作为该用例的执行证据;取消的 axloader HTTP smoke 未涉及本 PR 的 Starry procfs/test-suit 路径。 - 作者声明的 RISC-V axtest 与 x86_64 QEMU 结果已考虑,但现有测试只覆盖格式及单次启动内稳定性,不能证明下列跨启动随机性要求。
历史反馈、重叠与待办
此前关于自行播种局部 RNG 的反馈在当前 head 已改为共享 KERNEL_RANDOM,但其实际播种仍是确定性的,因此根因尚未解决,保留以下阻塞问题。基线未实现该节点;以 boot_id、procfs random 和变更路径检索开放 PR,未发现另一个独立实现或合入顺序依赖。没有 app、硬件/ABI 或 crates.io patch 变更。审查待办除该阻塞项外均已完成。
请修复 inline finding 后再请求复审。
Powered by gpt-5.6-terra
There was a problem hiding this comment.
本 PR 为 StarryOS 补齐只读 /proc/sys/kernel/random/boot_id,新增 UEFI RNG/FDT rng-seed 的启动熵传递链,并增加 qemu/system 回归。procfs 的 UUIDv4 格式、0444 属性、同次启动稳定性,以及 grouped C 子测例的根 CMake 发现、安装和失败传播均符合现有模式;但缺失可信熵源的正常平台能力分支会使内核在 procfs 初始化中 panic,尚不能合入。
适用准则与 ABI
book/guideline/feature-development.md适用:PR 新增了跨 someboot/somehal/axplat-dyn/ax-hal 的 boot entropy 平台能力;按低风险能力扩展审查,采用现有分层转发边界而非新增 crate 是合理的,但“所有支持启动配置均有可信源或显式可用性处理”的成功标准未满足。book/guideline/starry/syscall.md适用:新节点通过 VFS 间接影响以下入口:
| syscall | 结论 | 对应标准 | 简要依据 |
|---|---|---|---|
openat |
存在问题(F-001) | open(2) | 缺失熵源时,打开前的 procfs 构建已 panic,不能返回受控的用户态结果。 |
read |
存在问题(F-001) | read(2) | 同一初始化 panic 使该节点没有可读的 ABI 行为。 |
lseek |
未发现本次引入的问题 | lseek(2) | SimpleFile 路径与新增用例覆盖了重定位后重读。 |
newfstatat |
未发现本次引入的问题 | stat(2) | 新节点按现有伪文件设置 regular/0444,测试覆盖该属性。 |
验证与 CI
- helper 已确认工作区、
HEAD=b7e5f6aaf63cf8c4fb9ad3bdffdb5ef03bc9917b和 baseorigin/dev;git diff --check origin/dev...HEAD通过。 - 已在当前 head 执行
cargo xtask starry test qemu --arch riscv64 -c qemu/bugfix-proc-sys-kernel-random-boot-id:1/1通过,guest 内新增用例9 passed, 0 failed,grouped wrapper 正确传播成功。该成功路径不能证明无 UEFI RNG 且无 FDTrng-seed的分支。 - 当前组织 CI:格式化成功;
Test starry x86_64 qemu / run_container失败,且该任务直接覆盖本 PR 修改的 Starry QEMU 启动面,因此不能视为无关失败。Starry 其余相关矩阵有路径路由跳过,不能替代该分支验证。
历史反馈、重叠与风险
- 之前关于可重放 PRNG 播种的反馈在当前 head 已改为固件熵来源;本轮发现的是其缺失来源处理仍不正确。base 未实现该节点;以
boot_id、rng-seed、someboot 路径检索开放 PR,未发现重复实现、合入顺序依赖或 crates.io patch。 - 没有新增或变更 app;应用运行检查不适用。维护者匹配:
platforms/**命中 @bullhh,test-suit/**命中 @ZCShou;当前没有 reviewer request,本次阻塞先不追加请求。 - 审查清单已完成:约束和三个适用指南、启动数据流、VFS/ABI、测试发现和失败传播、组织 CI、重复分析、格式和定向 QEMU。唯一未关闭项为 inline F-001。
请先修复该 panic 和相应缺失熵源回归覆盖,再请求复审。
Powered by gpt-5.6-terra
There was a problem hiding this comment.
本 PR 通过 someboot → somehal → axplat-dyn → ax-hal 传递可信启动熵,并在有熵时新增只读 /proc/sys/kernel/random/boot_id;UEFI RNG 优先、FDT rng-seed 后备及 UUIDv4 格式化的实现与既有分层相符。该变更会经现有 VFS 路径影响 openat、read、lseek 与 newfstatat;有熵路径看起来隔离,缺熵时按 PR 设计保留目录但返回 ENOENT。
审查结论与适用准则
book/guideline/feature-development.md不适用:本次为补齐既有 Linux procfs 接口的 bugfix,未新增公共 crate/API 或平台能力。book/guideline/starry/syscall.md适用;审查了 procfs 节点通过现有 VFS 间接暴露的 ABI:
| Syscall | 结论 | 对应标准 | 简要依据 |
|---|---|---|---|
openat |
存在问题(F-001) | open(2) | 缺少可信熵时实现预期 ENOENT,但新增回归却无条件要求打开成功,导致当前 LoongArch QEMU 失败。 |
read |
未发现实现问题 | read(2) | 有熵时文件内容为固定的 37 字节 UUID 加换行,新增用例覆盖读取长度与 EOF。 |
lseek |
未发现实现问题 | lseek(2) | SimpleFile 路径与新增用例覆盖 rewind 后重复读取。 |
newfstatat |
未发现实现问题 | stat(2) | 节点用现有伪文件模式设置为 regular/0444,新增用例覆盖该属性。 |
验证与 CI
review_pr_helper.py prepare-review、changed-files 与 rust-plan 已执行;git diff --check origin/dev...HEAD和cargo fmt --check通过。- 当前组织 CI 的格式化成功;
Test starry loongarch64 qemu / run_container为 failure,属于本 PR 相关失败,不是基础设施问题。 - 本地在当前 head 执行
cargo xtask starry test qemu --arch loongarch64 -c qemu/system完整复现:新增用例因open返回ENOENT输出失败标记,外层正确以退出码 1 失败。 - 新 C 子例位于
qemu/system/<subcase>/CMakeLists.txt,会由根 CMake 发现、安装,且 grouped wrapper 能将失败传播;测试发现和传播本身没有问题。
历史反馈、重叠和剩余风险
前一轮关于可重放随机源的反馈已被当前可信固件熵链路取代,当前实现不再使用时间、地址等伪熵。基线和开放 PR(boot_id、rng-seed)检查未发现重复实现;未引入 [patch.crates-io]。没有新增或变更 app,应用运行要求不适用。唯一未关闭项是下面的回归与可选能力语义冲突;修复后请重新运行 LoongArch 的 qemu/system 用例。
Powered by gpt-5.6-terra
boot_id is an optional procfs node: platforms lacking a trusted boot
entropy source (UEFI RNG or a 32-byte FDT /chosen/rng-seed) omit it,
so open("/proc/sys/kernel/random/boot_id") must fail with ENOENT while
the parent /proc/sys/kernel/random directory still exists.
The previous test unconditionally asserted open() success, which failed
on platforms without trusted entropy (e.g. loongarch64) and broke the
Test starry loongarch64 qemu job. Treat ENOENT as the valid omit
outcome; any other errno remains a regression. When boot_id is present
the full format, mode-0444, EOF, and cross-reader stability checks are
unchanged.
There was a problem hiding this comment.
本 PR 在可信固件熵可用时为 StarryOS 增加只读 /proc/sys/kernel/random/boot_id,并通过 someboot → somehal → axplat-dyn → ax-hal 传递启动熵;缺少可信熵时省略该可选 procfs 节点。实现的 UEFI RNG/FDT rng-seed 优先级、早于 ExitBootServices 的捕获时机、UUIDv4 格式和 grouped qemu/system 的目录/安装/失败传播方式均符合现有模式,变更主要影响既有 open/read/lseek/stat 的 procfs ABI,未涉及 app 工作流或 crates.io patch。
feature-development.md 适用:这是跨启动层的共享能力,按中等风险审查;PR 描述和 platforms/someboot/src/entropy.rs 说明了可信熵来源、缺失时的非目标降级及实现边界。starry/syscall.md 也适用,已检查该节点经 VFS 暴露的 open/read/lseek/stat 路径。
验证:git diff --check origin/dev...HEAD 通过;helper 已确认工作区为固定 head。新增 C 用例可在宿主以 cc -std=gnu11 -Wall -Wextra -Werror 编译并运行。组织当前 head 的 CI 汇总为 success=25、skipped=34、cancelled=9、failure=1;格式化、clippy 及 Starry x86_64/aarch64 QEMU 成功,Starry riscv64 QEMU 仍失败,因其覆盖本次改动面且未取得足够日志将其排除为无关,本次不将其作为独立结论。CI 已有充分格式/构建和相关 QEMU 覆盖,因此未重复完整本地 QEMU。
已复查先前关于可重放随机种子的意见:当前 head 已改为仅接受 UEFI RNG 或精确 32 字节 FDT rng-seed,该问题已解决。基线不含该功能;以 boot_id、someboot entropy 和 procfs random 搜索开放 PR 未发现重复或依赖顺序风险。审查清单除下列回归覆盖缺陷外均已完成。
剩余阻塞项:新增 QEMU 用例在应有 UEFI RNG 的 x86_64 配置下允许 base 同样会返回的 ENOENT,因此无法证明 procfs 节点真的被注册。请修复 inline finding 并提供会在修复前失败的回归验证。
Powered by gpt-5.6-terra
There was a problem hiding this comment.
本 PR 为 StarryOS 增加只读 /proc/sys/kernel/random/boot_id,并在 someboot → somehal → axplat-dyn → ax-hal 建立启动熵传递链;UEFI RNG 优先、精确 32 字节 FDT rng-seed 后备,缺失可信熵时保持父目录但省略可选节点,避免启动期 panic。新增的 grouped qemu/system C 回归覆盖节点存在时的 UUIDv4/0444/EOF/跨 fd 稳定性,以及节点缺失时的 ENOENT。
设计与兼容性
book/guideline/feature-development.md适用:这是跨层共享启动能力和用户可见 procfs 接口的扩展;按共享、中等风险审查。PR 已说明问题(依赖 Linux procfs 接口的程序)、非目标(不以时钟/地址等可重放状态降级)、替代方向(可信固件熵与显式缺失能力)及数据流。实现保持 boot-protocol 细节在 someboot,OS 消费端只经 HAL facade 读取,边界和依赖方向合理。book/guideline/starry/syscall.md适用。间接受影响的 ABI 入口为openat、read、lseek、newfstatat:节点存在时分别提供可读 regular/0444 文件、稳定内容、可重读的SimpleFile语义和对应属性;没有可信熵时按既有路径返回ENOENT。这次未改变其他 syscall 分派或 errno 转换。- 已复核历史反馈:先前关于可重放随机播种和缺失熵导致 panic 的问题,当前 head 已用 UEFI RNG/FDT seed 和可选节点注册处理;没有仍适用的阻塞评论。
验证
python3 /tmp/review_pr_helper.py test:7/7 通过;prepare-review确认工作区和HEAD=a4b133bade7dd6b743c8d85dfd6665ac412245ce。git diff --check origin/dev...HEAD、cargo fmt --all -- --check:通过。cargo test -p someboot:51 单元测试及 16 个契约/集成测试通过;cargo test -p ax-hal:5/5 通过。- 以 root CMake 的实际选择路径构建/安装新增 C 子用例并运行:9/9 通过。
cargo xtask starry test qemu --arch x86_64 -c qemu/bugfix-proc-sys-kernel-random-boot-id:当前 head 实际 QEMU 运行通过,guest 输出 9/9,外层命令退出码 0;布局、安装、选择和 grouped failure marker 均已复核。
组织 CI 当前仅 Cancel stale CI runs 成功;Detect changed paths 在 setup 阶段失败,后续检查因此跳过。该失败未执行 PR 改动的构建或测试,无法归因于本 PR;上述本地定向 QEMU 和单元测试补足了相关验证。
基线未实现该接口;检查过既有 procfs、启动路径、测试发现规则、Cargo manifests(无新增 [patch.crates-io]),未发现重复实现或依赖顺序风险。新增测试位于正确的 test-suit/starryos/qemu/system 根子目录,根 CMake 自动发现,且运行器会把 guest 失败传播为外层失败。没有新增或变更 app,应用运行要求不适用;硬件外设/裸机 ABI 不在本变更范围。审查 todo 已完成,当前没有未解决问题或测试缺口。
Powered by gpt-5.6-terra
问题
StarryOS 缺少
/proc/sys/kernel/random/boot_id。依赖 Linux procfs boot ID 接口的程序会在打开该路径时得到ENOENT;例如 systemd-journald 在追加日志项前需要读取当前 boot ID。本 PR 从
004-add-starry-nixos分支的原提交040968350拆出,通过git cherry-pick保留原实现与回归测试。原提交同时修改了仅存在于 004 分支的apps/starry/nixos/compatibility.md;该文件在upstream/dev已删除,因此 cherry-pick 冲突按上游保持删除处理。修改
/proc/sys/kernel/random/boot_id,节点权限为0444,一次启动内保持稳定。someboot的 primary early init 阶段捕获一次 32 字节可信启动熵,并保证发生在 UEFIExitBootServices之前。/chosen/rng-seed,且仅接受恰好 32 字节的属性。someboot -> somehal -> axplat-dyn -> ax-hal将启动熵传递给 Starry kernel;boot ID 取其中 16 字节,再设置 UUIDv4 version/variant 位并格式化。rng-seed均不可用时,将熵可用性作为显式平台能力处理:保留/proc/sys/kernel/random/目录但不注册可选的boot_id节点,访问时得到常规ENOENT,不在 procfs 构建阶段 panic。/dev/random、/dev/urandom共享弱随机池的修改;该文件现与upstream/dev完全一致,避免把未受信任的随机设备播种误称为 boot entropy。boot_id。同步更新架构移植 skill 中可选启动能力不得 panic 的契约。qemu/system下的bugfix-proc-sys-kernel-random-boot-id用例与“可选能力”契约对齐:open(BOOT_ID_PATH)失败时断言errno == ENOENT(无可信熵平台省略节点),成功时保留 UUIDv4 格式、0444权限、EOF 与跨 fd 稳定性检查。方案逻辑
boot_id的跨启动唯一性不能依赖单调时钟、计数器、地址等可重放状态,因此本实现只接受 UEFI RNG 或精确长度的 FDTrng-seed。另一方面,可信熵不是所有平台都保证提供的必选能力,正常缺失不能阻止内核启动;因此 procfs 仅在能力存在时暴露该可选节点,不提供弱随机降级。验证
使用项目 Podman 镜像
ghcr.io/rcore-os/tgoskits-container:latest,并挂载对应的.ci-cache/cargo、.ci-cache/rustup、.ci-cache/tmp、.ci-cache/target/pr1904和.ci-cache/axbuild-tmp/pr1904执行:E0425编译失败。cargo xtask clippy --package starry-kernel:1 个 package、25 组检查全部通过。398/398通过,boot_id_formats_firmware_entropy与boot_id_is_omitted_without_trusted_entropy均通过,最终匹配AXTEST_SUITE_OK。cargo fmt --all --check与git diff --check通过。前一轮可信熵链路验证:
someboot单元测试51/51通过,ax-hal单元测试5/5通过。qemu/system:410/410通过;启动日志明确显示Boot entropy source: UEFI RNG。9/9、1/1通过;观测到的 boot ID 分别为50e6bffc-4800-4bb3-a588-9b184a8a383d与abd15bdf-d48b-4797-a266-1ccd4f0c4b62。最新提交(
88390623b,对齐用例与省略契约)的跨架构验证:bugfix-proc-sys-kernel-random-boot-id通过(断言ENOENT),整套匹配STARRY_GROUPED_TESTS_PASSED,退出码 0(此前该项STARRY_GROUPED_TEST_FAILED、退出码 1)。Boot entropy source: UEFI RNG,用例9/9通过,观测到boot_id=64b698e3-a850-4626-8c0a-fcd9eb36cf47,整套STARRY_GROUPED_TESTS_PASSED,退出码 0。cargo fmt --all --check与git diff --check通过。