Skip to content

fix(starry-kernel): expose proc boot ID - #1904

Draft
silicalet wants to merge 6 commits into
rcore-os:devfrom
silicalet:fix/starry-proc-boot-id-from-004
Draft

fix(starry-kernel): expose proc boot ID#1904
silicalet wants to merge 6 commits into
rcore-os:devfrom
silicalet:fix/starry-proc-boot-id-from-004

Conversation

@silicalet

@silicalet silicalet commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

问题

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 字节可信启动熵,并保证发生在 UEFI ExitBootServices 之前。
  • 熵源优先使用 UEFI RNG protocol;不可用时读取 FDT /chosen/rng-seed,且仅接受恰好 32 字节的属性。
  • 通过 someboot -> somehal -> axplat-dyn -> ax-hal 将启动熵传递给 Starry kernel;boot ID 取其中 16 字节,再设置 UUIDv4 version/variant 位并格式化。
  • 当 UEFI RNG 与 FDT rng-seed 均不可用时,将熵可用性作为显式平台能力处理:保留 /proc/sys/kernel/random/ 目录但不注册可选的 boot_id 节点,访问时得到常规 ENOENT,不在 procfs 构建阶段 panic。
  • 撤回上一轮 review 修复中对 /dev/random/dev/urandom 共享弱随机池的修改;该文件现与 upstream/dev 完全一致,避免把未受信任的随机设备播种误称为 boot entropy。
  • 新增 someboot 单元测试,覆盖 UEFI 优先级、FDT 后备、缺失熵源,以及 FDT seed 的正确长度/缺失/错误长度。
  • 新增 Starry axtest,分别验证可信固件熵到 UUIDv4 的格式映射,以及缺失可信熵时省略 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 或精确长度的 FDT rng-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 执行:

cargo fmt --all --check
cargo xtask clippy --package starry-kernel
cargo xtask ktest qemu --package starry-kernel --test axtest_kernel --arch x86_64
git diff --check
  • 红测:先加入缺失熵回归,旧实现因不存在用于表达省略结果的测试 helper 而以 E0425 编译失败。
  • cargo xtask clippy --package starry-kernel:1 个 package、25 组检查全部通过。
  • x86_64 内核 axtest QEMU:398/398 通过,boot_id_formats_firmware_entropyboot_id_is_omitted_without_trusted_entropy 均通过,最终匹配 AXTEST_SUITE_OK
  • cargo fmt --all --checkgit diff --check 通过。

前一轮可信熵链路验证:

  • someboot 单元测试 51/51 通过,ax-hal 单元测试 5/5 通过。
  • x86_64 完整 qemu/system410/410 通过;启动日志明确显示 Boot entropy source: UEFI RNG
  • x86_64 定向用例连续独立启动两次,均为 9/91/1 通过;观测到的 boot ID 分别为 50e6bffc-4800-4bb3-a588-9b184a8a383dabd15bdf-d48b-4797-a266-1ccd4f0c4b62

最新提交(88390623b,对齐用例与省略契约)的跨架构验证:

cargo xtask starry test qemu --arch x86_64     -c qemu/system
cargo xtask starry test qemu --arch loongarch64 -c qemu/system
cargo fmt --all --check
git diff --check
  • loongarch64:bugfix-proc-sys-kernel-random-boot-id 通过(断言 ENOENT),整套匹配 STARRY_GROUPED_TESTS_PASSED,退出码 0(此前该项 STARRY_GROUPED_TEST_FAILED、退出码 1)。
  • x86_64:启动日志确认 Boot entropy source: UEFI RNG,用例 9/9 通过,观测到 boot_id=64b698e3-a850-4626-8c0a-fcd9eb36cf47,整套 STARRY_GROUPED_TESTS_PASSED,退出码 0。
  • cargo fmt --all --checkgit diff --check 通过。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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=0f3022ebe4424e51e8666e8605dc6967e23bbc27git diff --check origin/dev...HEADcargo fmt --check、新增 C 用例的 host 编译与在 Linux /proc 上的 9/9 断言均通过;CMake 也能经 qemu/system 的子用例选择构建。
  • 当前 head 的组织 CI:格式化和 clippy 成功。Test starry x86_64 qemuTest 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

Comment thread os/StarryOS/kernel/src/pseudofs/proc.rs Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 为 StarryOS 添加只读 /proc/sys/kernel/random/boot_id,并把随机设备与内核消费者收敛到共享随机流,同时新增 qemu/system 回归。procfs 节点、0444 属性、UUIDv4 格式化和 grouped C 子测例布局与现有模式一致;改变会通过既有 VFS 路径影响 openatreadlseeknewfstatat 的用户态可见行为,除随机性契约外看起来是隔离的。

feature-development.md 不适用:这是补齐既有 Linux procfs 接口,不引入公共抽象、crate 或平台能力。starry/syscall.md 适用,已按其间接 ABI 路径审查。

验证与 CI

  • 当前 head 1ed4fec743bc30c2df2d6b8bdd65602784a51b1a 已复核,工作树干净,git diff --check origin/dev...HEADcargo fmt --check 通过。
  • 新增 C 子测例可由根 qemu/system/CMakeLists.txt 选择并构建;其安装路径和 grouped wrapper 的失败标记符合测试套件指南。
  • 当前组织 CI 共有 success=35skipped=35cancelled=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_idprocfs random 和变更路径检索开放 PR,未发现另一个独立实现或合入顺序依赖。没有 app、硬件/ABI 或 crates.io patch 变更。审查待办除该阻塞项外均已完成。

请修复 inline finding 后再请求复审。

Powered by gpt-5.6-terra

Comment thread os/StarryOS/kernel/src/pseudofs/proc.rs Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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 和 base origin/devgit diff --check origin/dev...HEAD 通过。
  • 已在当前 head 执行 cargo xtask starry test qemu --arch riscv64 -c qemu/bugfix-proc-sys-kernel-random-boot-id1/1 通过,guest 内新增用例 9 passed, 0 failed,grouped wrapper 正确传播成功。该成功路径不能证明无 UEFI RNG 且无 FDT rng-seed 的分支。
  • 当前组织 CI:格式化成功;Test starry x86_64 qemu / run_container 失败,且该任务直接覆盖本 PR 修改的 Starry QEMU 启动面,因此不能视为无关失败。Starry 其余相关矩阵有路径路由跳过,不能替代该分支验证。

历史反馈、重叠与风险

  • 之前关于可重放 PRNG 播种的反馈在当前 head 已改为固件熵来源;本轮发现的是其缺失来源处理仍不正确。base 未实现该节点;以 boot_idrng-seed、someboot 路径检索开放 PR,未发现重复实现、合入顺序依赖或 crates.io patch。
  • 没有新增或变更 app;应用运行检查不适用。维护者匹配:platforms/** 命中 @bullhhtest-suit/** 命中 @ZCShou;当前没有 reviewer request,本次阻塞先不追加请求。
  • 审查清单已完成:约束和三个适用指南、启动数据流、VFS/ABI、测试发现和失败传播、组织 CI、重复分析、格式和定向 QEMU。唯一未关闭项为 inline F-001。

请先修复该 panic 和相应缺失熵源回归覆盖,再请求复审。

Powered by gpt-5.6-terra

Comment thread os/StarryOS/kernel/src/pseudofs/proc.rs Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 通过 someboot → somehal → axplat-dyn → ax-hal 传递可信启动熵,并在有熵时新增只读 /proc/sys/kernel/random/boot_id;UEFI RNG 优先、FDT rng-seed 后备及 UUIDv4 格式化的实现与既有分层相符。该变更会经现有 VFS 路径影响 openatreadlseeknewfstatat;有熵路径看起来隔离,缺熵时按 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...HEADcargo 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_idrng-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.

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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_idsomeboot entropyprocfs random 搜索开放 PR 未发现重复或依赖顺序风险。审查清单除下列回归覆盖缺陷外均已完成。

剩余阻塞项:新增 QEMU 用例在应有 UEFI RNG 的 x86_64 配置下允许 base 同样会返回的 ENOENT,因此无法证明 procfs 节点真的被注册。请修复 inline finding 并提供会在修复前失败的回归验证。

Powered by gpt-5.6-terra

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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 入口为 openatreadlseeknewfstatat:节点存在时分别提供可读 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...HEADcargo 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant