Skip to content

feat(starry): expose root block device /dev/vda + strengthen busybox applet tests#1213

Merged
ZR233 merged 1 commit into
rcore-os:devfrom
Lfan-ke:bb-rdev-vda
Jun 11, 2026
Merged

feat(starry): expose root block device /dev/vda + strengthen busybox applet tests#1213
ZR233 merged 1 commit into
rcore-os:devfrom
Lfan-ke:bb-rdev-vda

Conversation

@Lfan-ke

@Lfan-ke Lfan-ke commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

本 PR 是我们负责的 busybox 六个 applet(resize · remove-shell · rdev · setlogcons · killall5 · fdflush)的 busybox 单元:一处内核 feature(rdev 的根块设备节点)+ 六个 applet 的真实行为回归测。

内核:/dev/vda 根块设备节点(给 busybox rdev)

busybox rdev(报告挂载于 / 的设备)stat "/"st_dev,再扫 /dev 找一个 st_rdev 与之相等的块设备节点,打印 <node> /。starry 没有根挂载的真实块设备后端,此前 /dev 下无这样的块节点,rdev 解析不到根设备。

pseudofs/dev 暴露占位块设备节点 /dev/vda,其 rdev 等于根文件系统 st_dev(根挂载是第一个 mount,设备 id 为 1 = DeviceId::new(0, 1)),于是 rdev 解析出 /dev/vda /。这是解析用占位符,非可用磁盘:RootBlk::{read_at,write_at} 返回 EIO 而非静默成功,绝不为 dd/blkid/fsck 伪装成工作磁盘。

内核回归(test-suit/starryos/qemu-smp1/system/syscall-test-rdev-vda):stat "/";/dev/vda 存在且 S_ISBLK;/dev/vdast_rdev == st_dev(busybox rdev 解析前提);openread 返回 EIO(占位、无伪盘 I/O)。x86_64 / aarch64 / riscv64 / loongarch64 各 6/6 PASS。

应用:强化六个 busybox applet 的 sh 测例

apps/starry/qemu/busybox/sh/busybox-tests.sh 此前对这些 applet 是弱测(裸 rc≠124-h usage)。改为真实行为断言,并补上缺失的 remove-shell。busybox app-qemu harness 命中首个 ^FAIL: 即整体失败,故六条必须全绿:

  • rdev:要求恰一行 ^/dev/<无空格> /$(配合上面的 /dev/vda,实打印 /dev/vda /)——原为 rc≠124
  • fdflush:要求 ioctl/文件诊断 且拒绝 "applet not found",防止未注册 applet 靠裸非零退出蒙混。
  • killall5:拒绝 "applet not found";其依赖的真实 SIGSTOP/SIGCONT job-control 已由专门的 test-job-control-stop(fork 子进程、不影响本套件)安全覆盖——在本套件内跑会话级 SIGSTOP 会有停掉测试 harness 自身的风险。
  • setlogcons:真实 TIOCLINUX setlogcons 0(非 -h);接受 rc=0 或 /dev/tty0 打开失败回退;拒绝 "applet not found"。
  • resize:拒绝 "applet not found",并接受 要么 完整 COLUMNS=;LINES=;export COLUMNS LINES;要么 干净的非零退出。busybox-shell 的 stdio 控制台暂不支持 TCSETS raw-mode ioctl,故 resize 无法完成光标探测、在打印尾之前退出;该测例正向兼容(控制台一旦支持 TCSETS 即走打尾分支),同时仍拒绝静默 exit-0 stub 与被丢弃的 applet。(控制台 TCSETS 路由根因已记录,留待与 tty 子系统协调后单独修。)
  • remove-shell(新增):seed /etc/shells 两行,移除其一,要求被删的没了、留的还在——真实文件编辑,非 -h

验证

aarch64 / riscv64 / loongarch64 busybox app-qemu 各 PASS: 320 FAIL: 0(SUCCESS PATTERN MATCHED),六条 applet 测全部 PASS;x86_64 经 CI(本地 x86 app-qemu 受 PVH ELF-note 加载器阻挡;rdev 的内核 C 测已四架构含 x86,其余五个 applet 为架构无关的 busybox 行为)。conflict-free(基于当前 dev,pseudofs/dev 无其它 open PR 触及)。

@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.

审查结论:APPROVE ✅

改动概要

本 PR 在 pseudofs/dev 中新增占位块设备节点 /dev/vdaRootBlk 结构体),其 st_rdev == DeviceId::new(0, 1).0 == 1,与根文件系统挂载点的 st_devDEVICE_COUNTER 起始值 = 1)一致,从而让 busybox rdev 能够解析出 /dev/vda /RootBlk::read_at/write_at 始终返回 EIO,确保不会伪装成可用磁盘。同时新增回归测例 syscall-test-rdev-vda(6 项断言:节点存在、S_ISBLK、rdev 匹配、read → EIO)。

实现逻辑评估

  • DeviceId 计算正确DeviceId::new(0, 1) 编码后的 raw value 为 1,恰好等于 DEVICE_COUNTER 起始值(第一个挂载点拿到 1),st_rdev == st_dev 的断言成立。major=0/minor=1 在 Linux 惯例中属于 unnamed 设备号区间,不会与真实块设备冲突。
  • 占位语义安全read_at/write_at 返回 AxError::Io(对应 Linux EIO),不会为 dd/blkid/fsck 静默冒充工作磁盘。与 Null/Zero/Full 同文件中的类似占位设备保持一致的模式。
  • 代码风格:结构体、impl、builder 注册方式均与同文件中已有的 Null/Zero/Full/CpuDmaLatency 等设备遵循相同模式,注释充分(中英文混合说明用途和限制)。
  • 测试覆盖:C 测例覆盖了 /dev/vda 存在性、S_ISBLKst_rdev == st_devread → EIO 四个关键语义,断言失败时打印文件名+行号+errno,便于定位。
  • [patch.crates-io]:本 PR 不涉及 Cargo.toml 或依赖元数据变更。
  • test_framework.h:相比已有测例(如 syscall-test-getrandom)新增了中文注释和分区标题,逻辑完全一致,属于文档增强。

验证结果

检查项 结果
cargo fmt --check(本地) ✅ PASS
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings(本地) ✅ PASS,0 warnings
cargo test --manifest-path os/StarryOS/kernel/Cargo.toml --all-features(本地) ⚠️ 预存 linker 错误(_etbss/__percpu_start 等),非本 PR 引入,需 QEMU/board 测试
CI: Check formatting / run_host ✅ SUCCESS
CI: Run sync-lint / run_container ✅ SUCCESS
CI: Test starry *_qemu / run_container(四架构) 🔄 进行中(x86_64/aarch64/riscv64/loongarch64)

CI 状态说明

  • 格式化和 sync-lint 检查已通过。
  • Starry QEMU 测试(run_container 矩阵)四架构正在执行中,截至提交时无失败。run_host 矩阵因环境限制被跳过属正常。
  • ArceOS/axvisor/board 等无关测试被路径过滤器跳过,属预期行为。

重复与重叠分析

  • base 分支检查origin/devpseudofs/dev/mod.rsrdev/RootBlk/vda 相关代码,无重复。
  • 相关 open PR 搜索:搜索 rdev vda RootBlkpseudofs dev 等关键词,仅命中本 PR #1213。PR #1114(pseudofs 其他文件)和 #1156(cgroupfs)与本 PR 无重叠。
  • 结论:本 PR 是独立的增量功能,不与任何 open PR 冲突或重复。

遗留问题

无阻塞性问题。Starry QEMU CI 正在运行,但从代码审查、格式化、clippy 和作者本地四架构验证来看,合并风险较低。


建议:如果希望后续增强,可考虑在 /dev 下同时暴露 /dev/root 符号链接(部分 Linux 发行版惯例),但这不是本 PR 的范围。

Powered by deepseek-v4-pro

@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.

审查结论:APPROVE ✅

本审阅基于对 PR #1213 的独立代码审查,覆盖实现逻辑、测试覆盖、本地验证和 CI 状态。

改动概要

本 PR 在 pseudofs/dev 中新增占位块设备节点 /dev/vda(通过 RootBlk 结构体实现),其 st_rdev 与根文件系统的 st_dev 一致(均为 DeviceId::new(0, 1).0 == 1),使得 busybox rdev 能正确解析出根设备 /dev/vda /。同时新增回归测例 syscall-test-rdev-vda,覆盖 6 项断言:节点存在、S_ISBLK 类型检查、st_rdev == st_dev 匹配、以及 read 返回 EIO(确保不会伪装成可用磁盘)。

共修改 4 个文件,184 行新增,0 行删除。

实现逻辑评估

  • DeviceId 计算正确DeviceId::new(0, 1) 编码后的 raw value 为 1,而 DEVICE_COUNTER 起始值为 1(AtomicU64::new(1)),第一个挂载点通过 fetch_add(1) 取得值 1。因此 st_rdev == st_dev 断言成立。major=0 / minor=1 属于 Linux 惯例中的 unnamed 设备号区间,不会与真实块设备冲突。
  • 占位语义安全read_at / write_at 返回 AxError::Io(对应 Linux EIO),不会为 dd / blkid / fsck 静默冒充工作磁盘。与同文件中的 Null / Zero / Full 等占位设备模式一致。
  • 代码风格RootBlk 结构体、DeviceOps 实现、builder() 注册方式均与已有模式完全一致,注释充分(中英文混合说明用途和限制)。
  • 测试覆盖:C 测例 main.c 使用 CHECK 宏覆盖了四个关键语义,断言失败时打印文件名+行号+errno,便于定位。test_framework.hcommon/test_framework.h 内容一致,遵循现有每个测试自持副本的模式。

验证结果

检查项 结果
cargo fmt --check(本地) ✅ PASS
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings(本地) ✅ PASS,0 warnings
CI: Check formatting / run_host ✅ SUCCESS
CI: Run sync-lint / run_container ✅ SUCCESS
CI: Test starry *_qemu / run_container(四架构) 🔄 进行中(截至提交时无失败)

CI 状态说明

  • 格式化和 sync-lint 已通过。
  • Starry QEMU run_container 四架构(x86_64 / aarch64 / riscv64 / loongarch64)正在执行中。run_host 矩阵因运行环境限制被跳过属正常。PR 作者已报告四架构单核 QEMU 全系统组均 STARRY_GROUPED_TESTS_PASSED
  • ArceOS / axvisor / board 等无关测试被路径过滤器跳过,属预期行为。

重复与重叠分析

  • base 分支检查origin/devpseudofs/dev/mod.rsRootBlk / vda / rdev 相关代码,无重复。
  • 结论:本 PR 是独立的增量功能,不与任何 open PR 冲突或重复。

现有评审

此前 mai-team-app[bot] 已提交 APPROVE 评审,该评审结论合理,无遗留阻塞性问题。

遗留问题

无阻塞性问题。代码质量、安全性、测试覆盖均满足合并标准。


补充建议(非阻塞):后续可考虑在 /dev 下同时暴露 /dev/root 符号链接(部分 Linux 发行版惯例),但这不是本 PR 的范围。

Powered by deepseek-v4-pro

@Lfan-ke Lfan-ke changed the title feat(starry): expose root block device /dev/vda for busybox rdev feat(starry): expose root block device /dev/vda + strengthen busybox applet tests Jun 10, 2026
@Lfan-ke

Lfan-ke commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

已 force-push:把原 rdev commit 与一个空的 CI 重触发 commit 合并为单 commit,并补入我们负责的六个 busybox applet(resize / remove-shell / rdev / setlogcons / killall5 / fdflush)的真实行为 sh 测例强化(apps/starry/qemu/busybox/sh/busybox-tests.sh,原为弱测;新增缺失的 remove-shell)。

本地实测:aarch64 / riscv64 / loongarch64 busybox app-qemu 各 PASS: 320 FAIL: 0(SUCCESS PATTERN MATCHED),六条 applet 测全部 PASS;x86_64 经 CI(本地 x86 app-qemu 受 PVH 加载器阻挡)。resize 因 stdio 控制台暂不支持 TCSETS raw-mode 而无法打印 size 尾,测例改为正向兼容(接受打尾或干净非零退出,拒绝静默 stub 与丢失 applet),控制台 TCSETS 根因留待单独修。

@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.

审查结论:APPROVE ✅

本审阅基于对 PR #1213 当前 head (54e44ba) 的独立代码审查。此前 mai-team-app[bot] 已对旧 head (d3b915c) 提交了两份 APPROVE 评审;当前 head 在原有内核 feature 基础上新增了 C 回归测例和六个 busybox applet 的 sh 测例强化,经审查无阻塞性问题。

改动概要

本 PR 包含两部分:

内核层面 — 在 pseudofs/dev 中新增占位块设备节点 /dev/vdaRootBlk 结构体),其 st_rdev == DeviceId::new(0, 1).0 == 1,与根文件系统挂载点的 st_devDEVICE_COUNTER 起始值 = 1)一致,使 busybox rdev 能解析出 /dev/vda /RootBlk::read_at/write_at 始终返回 EIO,确保不会伪装成可用磁盘。

测例层面 — 新增内核回归测例 syscall-test-rdev-vda(6 项断言:节点存在、S_ISBLK、rdev 匹配、read → EIO),并强化 busybox-tests.sh 中六个 applet 的 sh 测例(rdev / fdflush / killall5 / setlogcons / resize / remove-shell),从弱断言(rc≠124-h usage)升级为真实行为验证。

共修改 5 个文件,+242 / −13 行。

实现逻辑评估

  • DeviceId 计算正确DeviceId::new(0, 1) 编码后的 raw value 为 1,恰好等于 DEVICE_COUNTER 起始值(第一个挂载点通过 fetch_add(1) 取得 1),st_rdev == st_dev 断言成立。major=0 / minor=1 属于 Linux 惯例中的 unnamed 设备号区间,不会与真实块设备冲突。
  • 占位语义安全read_at / write_at 返回 AxError::Io(对应 Linux EIO),不会为 dd / blkid / fsck 静默冒充工作磁盘。与同文件中的 Null / Zero / Full / CpuDmaLatency 等占位设备模式完全一致。
  • 代码风格RootBlk 结构体、DeviceOps impl、builder() 注册方式均与已有模式保持一致,中英文注释充分说明用途和限制。
  • 测试覆盖:C 测例 syscall-test-rdev-vda 使用 CHECK 宏覆盖了四个关键语义(节点存在、S_ISBLK、rdev 匹配、EIO),test_framework.h 遵循项目现有模式(每测例自持副本),并额外提供了 CHECK_RET / CHECK_ERR 宏。
  • busybox sh 测例:六个 applet 测例从弱断言升级为真实行为验证,新增 remove-shell 测例。fdflush / killall5 / setlogcons / resize 均增加了 "applet not found" 拒绝逻辑,防止未注册 applet 靠裸非零退出蒙混。resize 的双分支判定(完整 trailer 或干净非零退出)具备正向兼容性。
  • [patch.crates-io]:本 PR 不涉及 Cargo.toml 或依赖元数据变更。

验证结果

检查项 结果
cargo fmt --check(本地) ✅ PASS
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings(本地) ✅ PASS,0 warnings
[patch.crates-io] 检查 ✅ 无
CI: Check formatting / run_host ✅ SUCCESS
CI: Run sync-lint / run_container ✅ SUCCESS
CI: Test starry *_qemu / run_container(四架构) 🔄 进行中(x86_64 / aarch64 / riscv64 / loongarch64)

CI 状态说明

  • 格式化和 sync-lint 已通过。
  • Starry QEMU run_container 四架构(x86_64 / aarch64 / riscv64 / loongarch64)正在执行中。run_host 矩阵因环境限制被跳过属正常。PR 作者已报告四架构单核 QEMU 全系统组均 STARRY_GROUPED_TESTS_PASSED,且 syscall-test-rdev-vda 各 6/6 PASS。
  • ArceOS / axvisor / board 等无关测试被路径过滤器跳过,属预期行为。

重复与重叠分析

  • base 分支检查origin/devpseudofs/dev/mod.rsRootBlk / vda / rdev 相关代码;test-suit/starryos/qemu-smp1/system/syscall-test-rdev-vda 目录;busybox sh 测例中对应 applet 为旧弱版本,本 PR 强化之并新增 remove-shell。无重复。
  • 相关 open PR 检查:搜索 pseudofs/devrdevbusybox-tests.sh 等关键词,当前 open PR 中无触及相同文件或相同功能的 PR。PR 作者确认 pseudofs/dev 无其它 open PR 触及。
  • 结论:本 PR 是独立的增量功能,不与任何 open PR 冲突或重复。

测试发现验证

  • 新增测例 syscall-test-rdev-vda 位于 test-suit/starryos/qemu-smp1/system/ 下,父 CMakeLists.txt 使用 file(GLOB ... CONFIGURE_DEPENDS "*") 自动发现子目录。测例目录含有效 CMakeLists.txtinstall(TARGETS test-rdev-vda RUNTIME DESTINATION usr/bin/starry-test-suit) 安装至正确路径。
  • QEMU 测试 wrapper(qemu-*.toml 中的 test_commands)对 /usr/bin/starry-test-suit/* 做通配执行,新二进制自动被覆盖。success_regex / fail_regex 正确配置,STARRY_GROUPED_TESTS_PASSED / STARRY_GROUPED_TEST_FAILED 标记完备。

遗留问题

无阻塞性问题。


建议(非阻塞):后续可考虑在 /dev 下同时暴露 /dev/root 符号链接(部分 Linux 发行版惯例),但这不是本 PR 的范围。

Powered by deepseek-v4-pro

@mai-team-app
mai-team-app Bot requested review from ZCShou and luodeb June 10, 2026 17:54

@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.

审查结论:APPROVE ✅

本审阅基于对 PR #1213 当前 head (8a3089f) 的独立代码审查。此前 mai-team-app[bot] 已对旧 head 提交了三份 APPROVE 评审,结论合理。当前 head 无阻塞性问题。

改动概要

本 PR 包含两部分:

内核层面 — 在 pseudofs/dev 中新增占位块设备节点 /dev/vdaRootBlk 结构体),其 st_rdev == DeviceId::new(0, 1).0 == 1,与根文件系统挂载点的 st_devDEVICE_COUNTER 起始值 = 1)一致,使 busybox rdev 能解析出 /dev/vda /RootBlk::read_at/write_at 始终返回 EIO,确保不会伪装成可用磁盘。

测例层面 — 新增内核回归测例 syscall-test-rdev-vda(6 项断言:节点存在、S_ISBLK、rdev 匹配、read → EIO),并强化 busybox-tests.sh 中六个 applet 的 sh 测例(rdev / fdflush / killall5 / setlogcons / resize / remove-shell),从弱断言升级为真实行为验证。

共修改 5 个文件,+242 / −13 行。

实现逻辑评估

  • DeviceId 计算正确DeviceId::new(0, 1) 编码后的 raw value 为 1(major=0 → 0,minor=1 → 1),恰好等于 DEVICE_COUNTER 起始值(AtomicU64::new(1)),第一个挂载点通过 fetch_add(1) 取得值 1。因此 st_rdev == st_dev 断言成立。major=0 / minor=1 属于 Linux 惯例中的 unnamed 设备号区间,不会与真实块设备冲突。
  • 占位语义安全read_at / write_at 返回 AxError::Io(对应 Linux EIO),不会为 dd / blkid / fsck 静默冒充工作磁盘。与同文件中的 Null / Zero / Full / CpuDmaLatency 等占位设备模式完全一致。
  • 代码风格RootBlk 结构体、DeviceOps impl、builder() 注册方式均与已有模式保持一致,中英文注释充分说明用途和限制。
  • 测试覆盖:C 测例 syscall-test-rdev-vda 使用 CHECK 宏覆盖了四个关键语义,test_framework.h 遵循项目现有模式(每测例自持副本),并额外提供了 CHECK_RET / CHECK_ERR 宏。CMakeLists.txt 安装路径正确(usr/bin/starry-test-suit),父目录的 file(GLOB ... CONFIGURE_DEPENDS "*") 自动发现子目录。
  • busybox sh 测例:六个 applet 测例从弱断言升级为真实行为验证,新增 remove-shell 测例。所有测例均增加了 "applet not found" 拒绝逻辑,防止未注册 applet 靠裸非零退出蒙混。resize 的双分支判定(完整 trailer 或干净非零退出)具备正向兼容性。
  • [patch.crates-io]:本 PR 不涉及 Cargo.toml 或依赖元数据变更。

验证结果

检查项 结果
cargo fmt --check(本地) ✅ PASS
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings(本地) ✅ PASS,0 warnings
[patch.crates-io] 检查 ✅ 无
CI: Check formatting / run_host ✅ SUCCESS(前次 head)
CI: Run sync-lint / run_container ✅ SUCCESS(前次 head)
CI(当前 head) 🔄 进行中(刚 push,Detect changed paths 运行中)

CI 状态说明

  • 当前 head 的 CI 刚启动(push 时间 17:59),Detect changed paths 正在运行。
  • 此前 head (d3b915c54e44ba) 的格式化、sync-lint 均通过,Starry QEMU 四架构测试正在进行。
  • PR 作者已报告四架构单核 QEMU 全系统组均 STARRY_GROUPED_TESTS_PASSEDsyscall-test-rdev-vda 各 6/6 PASS,busybox app-qemu 三架构 PASS: 320 FAIL: 0

重复与重叠分析

  • base 分支检查origin/devpseudofs/dev/mod.rsRootBlk / vda 相关代码;test-suit/starryos/qemu-smp1/system/syscall-test-rdev-vda 目录;busybox sh 测例中对应 applet 为旧弱版本。无重复。
  • 相关 open PR 检查:搜索 pseudofs / busybox-tests 等关键词。#1114(pseudofs osrelease/ostype 等,同作者但不同文件)与本 PR 无重叠;#1156(cgroupfs)无重叠。
  • 结论:本 PR 是独立的增量功能,不与任何 open PR 冲突或重复。

遗留问题

无阻塞性问题。代码质量、安全性、测试覆盖均满足合并标准。


建议(非阻塞):后续可考虑在 /dev 下同时暴露 /dev/root 符号链接(部分 Linux 发行版惯例),但这不是本 PR 的范围。

Powered by deepseek-v4-pro

…applet tests

This is the busybox unit for the six applets we own (resize · remove-shell ·
rdev · setlogcons · killall5 · fdflush): one kernel feature (rdev's root block
node) plus real-behavior regression tests for all six.

## Kernel: /dev/vda root block device (for busybox rdev)

busybox `rdev` (reports the device mounted at `/`) stats `"/"`, takes its
`st_dev`, then scans `/dev` for a block node whose `st_rdev` matches and prints
`<node> /`. starry has no real block backend for the root mount, so `/dev` had
no such node and `rdev` resolved nothing.

Expose a placeholder block node `/dev/vda` whose `rdev` equals the root
filesystem's `st_dev` (the root mount is the first mount, device id 1 =
`DeviceId::new(0, 1)`), so `rdev` resolves `/dev/vda /`. It is a **resolver
placeholder, not a usable disk**: `RootBlk`'s `read_at`/`write_at` return `EIO`
rather than silently succeeding, so it never masquerades as a working disk for
`dd`/`blkid`/`fsck`.

Kernel-side regression (test-suit/starryos/qemu-smp1/system/syscall-test-rdev-vda):
`stat "/"`; `/dev/vda` exists and is `S_ISBLK`; `/dev/vda` `st_rdev ==` root
`st_dev` (busybox rdev's resolution premise); `open` then `read` returns `EIO`
(placeholder, no fake disk I/O). x86_64 / aarch64 / riscv64 / loongarch64 each
6/6 PASS.

## App: strengthen the six busybox applet sh tests

apps/starry/qemu/busybox/sh/busybox-tests.sh carried weak smoke tests (bare
`rc != 124` or `-h` usage) for our applets. Replace them with carpet-coverage
real-behavior cases — every invocation form / option / edge per applet — and add
the missing `remove-shell`. The app-qemu busybox harness aborts on the first
`^FAIL:`, so every case must pass; assertions stay tolerant where StarryOS lacks
a kernel feature (forward-compatible) while still rejecting stubs / "applet not
found". 15 cases across the six applets:

- **rdev**: require exactly one `^/dev/<no-space> /$` line (with /dev/vda above,
  prints `/dev/vda /`) — was `rc != 124`.
- **fdflush** (×3): missing device → file/ioctl diagnostic; no-operand → usage
  error (it requires DEVICE); `/dev/null` → FDFLUSH ioctl error on a non-floppy.
  All reject "applet not found".
- **killall5**: reject "applet not found"; the real SIGSTOP/SIGCONT job control
  it relies on is covered safely (forked child, no effect on this suite) by the
  dedicated test-job-control-stop case — running a session-wide SIGSTOP inside
  this suite would risk stopping the test harness itself.
- **setlogcons** (×3): real TIOCLINUX for `setlogcons 0`, no-arg (default 0), and
  console 1; accept rc=0 or a `/dev/tty0`/console diagnostic; reject "applet not
  found".
- **resize** (×3): the size probe (accept the full `COLUMNS=;LINES=;export`
  trailer OR a clean non-zero exit — the stdio console does not yet honor the
  TCSETS raw-mode ioctl, so the cursor probe can't complete; forward-compatible
  once it does), applet-registered, and redirected-stdin (stays bounded). Reject
  silent exit-0 stub / "applet not found".
- **remove-shell** (×4, new): single remove, multi-remove (survivors kept),
  remove-absent (no-op, file intact), and no-arg (no-op rc=0 leaving the file
  intact, or usage error) — real `/etc/shells` edits, not `-h`.

Verified: aarch64 / riscv64 / loongarch64 busybox app-qemu each
`PASS: 329  FAIL: 0` (SUCCESS PATTERN MATCHED), all applet cases PASS;
x86_64 via CI (local x86 app-qemu is blocked by the PVH ELF-note loader).

> 把困困投入生产后更名 `智慧集群`(Smart Cluster)

Signed-off-by: Smart Agents Cluster <haxxorbunny@qq.com>
Signed-off-by: 林晨 (Leo Cheng) <chengkelfan@qq.com>

@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.

审查结论:APPROVE ✅

本审阅基于对 PR #1213 当前 head (2873ecdb) 的独立代码审查。此前 mai-team-app[bot] 已提交四份 APPROVE 评审,结论合理。经独立审查,无阻塞性问题。

改动概要

本 PR 包含两部分:

内核层面 — 在 pseudofs/dev 中新增占位块设备节点 /dev/vdaRootBlk 结构体),其 st_rdev 与根文件系统挂载点的 st_dev 一致(均为 1),使 busybox rdev 能解析出 /dev/vda /RootBlk::read_at/write_at 始终返回 EIO,确保不会伪装成可用磁盘。

测例层面 — 新增内核回归测例 syscall-test-rdev-vda(6 项断言:节点存在、S_ISBLK、rdev 匹配、open 成功、read → EIO),并强化 busybox-tests.sh 中六个 applet 的 sh 测例(rdev / fdflush / killall5 / setlogcons / resize / remove-shell),从弱断言(rc≠124-h usage)升级为真实行为验证。

共修改 5 个文件,+343 / −13 行。

实现逻辑评估

  • DeviceId 计算正确DeviceId::new(0, 1) 编码后的 raw value 为 1(major=0 → (0 & 0xffff_f000) << 32 | (0 & 0x0000_0fff) << 8 = 0,minor=1 → (1 & 0xffff_ff00) << 12 | (1 & 0x0000_00ff) = 1)。DEVICE_COUNTER 起始值为 1(AtomicU64::new(1)),第一个挂载点(根挂载)通过 fetch_add(1) 取得值 1。因此 st_rdev == st_dev 断言成立。major=0 / minor=1 属于 Linux 惯例中的 unnamed 设备号区间,不会与真实块设备冲突。
  • 占位语义安全read_at / write_at 返回 AxError::Io(对应 Linux EIO),不会为 dd / blkid / fsck 静默冒充工作磁盘。与同文件中的 Null / Zero / Full / CpuDmaLatency 等占位设备模式完全一致。
  • 代码风格RootBlk 结构体、DeviceOps impl、builder() 注册方式均与已有模式保持一致。中英文注释充分说明用途和限制。
  • 测试覆盖:C 测例 syscall-test-rdev-vda 使用 CHECK 宏覆盖了四个关键语义,test_framework.h 遵循项目现有模式(每测例自持副本),并额外提供了 CHECK_RET / CHECK_ERR 宏供未来测例使用。CMakeLists.txt 安装路径正确(usr/bin/starry-test-suit),父目录的 file(GLOB ... CONFIGURE_DEPENDS "*") 自动发现子目录,QEMU wrapper 的 test_commands/usr/bin/starry-test-suit/* 通配执行,新二进制自动被覆盖。
  • busybox sh 测例:六个 applet 测例从弱断言升级为真实行为验证,新增 remove-shell 测例及其子变体(multi / absent / noarg)。所有测例均增加了 "applet not found" 拒绝逻辑,防止未注册 applet 靠裸非零退出蒙混。resize 的双分支判定(完整 trailer 或干净非零退出)具备正向兼容性——控制台一旦支持 TCSETS 即走完整 trailer 路径。
  • [patch.crates-io]:本 PR 不涉及 Cargo.toml 或依赖元数据变更,rg '\[patch\.crates-io\]' -g 'Cargo.toml' 零匹配。

验证结果

检查项 结果
cargo fmt --check(本地) ✅ PASS
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings(本地) ✅ PASS,0 warnings
[patch.crates-io] 检查 ✅ 无
CI: Detect changed paths ✅ SUCCESS
CI: Cancel stale CI runs ✅ SUCCESS
CI: Check formatting / run_host ✅ SUCCESS
CI: Run sync-lint / run_container 🔄 IN_PROGRESS(截至提交时)

CI 状态说明

  • 格式化检查已通过(run_host)。
  • sync-lint / run_container 正在执行中。格式化通过、clippy 本地 0 warning 表明 Rust 侧无 lint 问题。
  • ArceOS / axvisor / board 等无关测试因路径过滤器跳过(skipped),属预期行为。Publish 类 job 因非主分支跳过,也属预期。
  • PR 作者已报告四架构单核 QEMU 全系统组均 STARRY_GROUPED_TESTS_PASSEDsyscall-test-rdev-vda 各 6/6 PASS,busybox app-qemu 三架构 PASS: 320 FAIL: 0

重复与重叠分析

  • base 分支检查git grep -n 'RootBlk\|rdev_vda' origin/devos/StarryOS/kernel/src/pseudofs/dev/test-suit/ 零匹配。base 分支无重复实现。
  • 相关 open PR 搜索:以 pseudofs / busybox-tests / rdev / RootBlk 搜索 open PR,仅命中本 PR #1213。同作者 PR #1114(pseudofs osrelease/ostype,不同文件)无重叠;#1156(cgroupfs)、#1211(pip-uv app test)均无关。
  • 结论:本 PR 是独立的增量功能,不与任何 open PR 冲突或重复。

现有评审

此前 mai-team-app[bot] 已提交四份 APPROVE 评审(针对旧 head d3b915c54e44ba8a3089f),均无遗留阻塞性问题,无未解决的 review 对话线程。

遗留问题

无阻塞性问题。代码质量、安全性、测试覆盖均满足合并标准。


建议(非阻塞):后续可考虑在 /dev 下同时暴露 /dev/root 符号链接(部分 Linux 发行版惯例),但这不是本 PR 的范围。

Powered by deepseek-v4-pro

@ZR233
ZR233 merged commit 4e9a82a into rcore-os:dev Jun 11, 2026
50 checks passed
@github-actions github-actions Bot mentioned this pull request Jun 10, 2026
luodeb pushed a commit that referenced this pull request Jun 30, 2026
…applet tests (#1213)

This is the busybox unit for the six applets we own (resize · remove-shell ·
rdev · setlogcons · killall5 · fdflush): one kernel feature (rdev's root block
node) plus real-behavior regression tests for all six.

## Kernel: /dev/vda root block device (for busybox rdev)

busybox `rdev` (reports the device mounted at `/`) stats `"/"`, takes its
`st_dev`, then scans `/dev` for a block node whose `st_rdev` matches and prints
`<node> /`. starry has no real block backend for the root mount, so `/dev` had
no such node and `rdev` resolved nothing.

Expose a placeholder block node `/dev/vda` whose `rdev` equals the root
filesystem's `st_dev` (the root mount is the first mount, device id 1 =
`DeviceId::new(0, 1)`), so `rdev` resolves `/dev/vda /`. It is a **resolver
placeholder, not a usable disk**: `RootBlk`'s `read_at`/`write_at` return `EIO`
rather than silently succeeding, so it never masquerades as a working disk for
`dd`/`blkid`/`fsck`.

Kernel-side regression (test-suit/starryos/qemu-smp1/system/syscall-test-rdev-vda):
`stat "/"`; `/dev/vda` exists and is `S_ISBLK`; `/dev/vda` `st_rdev ==` root
`st_dev` (busybox rdev's resolution premise); `open` then `read` returns `EIO`
(placeholder, no fake disk I/O). x86_64 / aarch64 / riscv64 / loongarch64 each
6/6 PASS.

## App: strengthen the six busybox applet sh tests

apps/starry/qemu/busybox/sh/busybox-tests.sh carried weak smoke tests (bare
`rc != 124` or `-h` usage) for our applets. Replace them with carpet-coverage
real-behavior cases — every invocation form / option / edge per applet — and add
the missing `remove-shell`. The app-qemu busybox harness aborts on the first
`^FAIL:`, so every case must pass; assertions stay tolerant where StarryOS lacks
a kernel feature (forward-compatible) while still rejecting stubs / "applet not
found". 15 cases across the six applets:

- **rdev**: require exactly one `^/dev/<no-space> /$` line (with /dev/vda above,
  prints `/dev/vda /`) — was `rc != 124`.
- **fdflush** (×3): missing device → file/ioctl diagnostic; no-operand → usage
  error (it requires DEVICE); `/dev/null` → FDFLUSH ioctl error on a non-floppy.
  All reject "applet not found".
- **killall5**: reject "applet not found"; the real SIGSTOP/SIGCONT job control
  it relies on is covered safely (forked child, no effect on this suite) by the
  dedicated test-job-control-stop case — running a session-wide SIGSTOP inside
  this suite would risk stopping the test harness itself.
- **setlogcons** (×3): real TIOCLINUX for `setlogcons 0`, no-arg (default 0), and
  console 1; accept rc=0 or a `/dev/tty0`/console diagnostic; reject "applet not
  found".
- **resize** (×3): the size probe (accept the full `COLUMNS=;LINES=;export`
  trailer OR a clean non-zero exit — the stdio console does not yet honor the
  TCSETS raw-mode ioctl, so the cursor probe can't complete; forward-compatible
  once it does), applet-registered, and redirected-stdin (stays bounded). Reject
  silent exit-0 stub / "applet not found".
- **remove-shell** (×4, new): single remove, multi-remove (survivors kept),
  remove-absent (no-op, file intact), and no-arg (no-op rc=0 leaving the file
  intact, or usage error) — real `/etc/shells` edits, not `-h`.

Verified: aarch64 / riscv64 / loongarch64 busybox app-qemu each
`PASS: 329  FAIL: 0` (SUCCESS PATTERN MATCHED), all applet cases PASS;
x86_64 via CI (local x86 app-qemu is blocked by the PVH ELF-note loader).

> 把困困投入生产后更名 `智慧集群`(Smart Cluster)

Signed-off-by: Smart Agents Cluster <haxxorbunny@qq.com>
Signed-off-by: 林晨 (Leo Cheng) <chengkelfan@qq.com>
Co-authored-by: Smart Agents Cluster <haxxorbunny@qq.com>
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.

2 participants