RustROS · 2026-10-26 · 主线 d343e9b

M5 报告:终端和作业控制

进程现在可以在伪终端上运行:交互式 bash、Ctrl-C、Ctrl-Z、jobs、fg 都和 Linux 上一样,apt 经终端显示 dpkg 的输出。管理端可以从开发机直接在机器上开一个终端运行程序(rustros-update.py run -t),以后的 docker exec -it 走同一条路。终端在可热替换的 VFS 模块里,会话进行中替换 vfs 和 linux 模块,bash 照常。

回归测试(KVM 测试机)47 项全部通过hot 测试按新的挂载数(多了 /dev/pts)改了期望后重跑通过;file 测试加了 ptytest,Debian 测试加了交互式 bash
Debian 里的交互式 bash14 项全过tty、窗口大小、^Z / jobs / fg / ^C、后台任务、^D、apt 经终端、会话中替换模块、退出状态
LTP286 项通过和 M4 相同的一组;已知未过的不变
这次更新要重启一次内核加了进程停止 / 继续的机制(见下文)

M5做了什么

步骤内容验收
M5.1VFS 里的伪终端:打开 /dev/ptmx 得到一对,从端在 /dev/pts/N(VFS 自己的 devpts,可以挂在容器的根目录里);行规程:规范模式的编辑(退格、删行、删词、^V、^D)、回显、^C ^\ ^Z 产生信号、^S ^Q、CR / NL 转换、非规范模式的 VMIN / VTIME、输出时 NL 变 CR NL;窗口大小(改了发 SIGWINCH);状态交接格式 416 个 VFS 单元测试(新增终端一项:行规程、信号、/dev/tty、挂断、交接)
M5.2作业控制:会话和控制终端、前台进程组(tcsetpgrp);后台进程读终端收到 SIGTTIN 而停下,改设置收到 SIGTTOU;进程停止和继续(内核);wait 的 WUNTRACED / WCONTINUED、waitid;主端关闭时挂断(SIGHUP);/proc 里的 tty_nr;linux 模块的终端 ioctlptytest:解锁、ttyname、规范模式、回显、窗口大小、VTIME 超时;一个会话里:后台读被停下、设为前台并继续后读到输入、^C 结束前台任务、^Z 停下(waitid 看到)、SIGKILL 结束停下的进程、主端关闭时会话首进程被挂断
M5.3管理端在终端里运行程序:updater 的新命令(之后双向是加密、带 MAC、按方向计数的帧),内核的 Admin::spawn_tty / tty_io / tty_resize / tty_close;rustros-update.py run -t 把本地终端接上去(窗口大小跟着变,Ctrl-] 挂断)测试用同一个客户端(Term)驱动 Debian 的 bash
M5.4Debian 里的交互式 bash(按用户打字的方式驱动)tty 是 /dev/pts/N;stty size 先 24 80,改窗口后 30 100;sleep 30 后 ^Z 显示 Stopped,jobs -l 列出,fg 后 ^C,$? 是 130;后台任务和 wait;cat 读到输入、^D 结束;apt 重装 curl 不再报 posix_openpt 失败;会话进行中替换 vfs 和 linux,bash 照常;exit 后状态 0
M5.5顺路的内核瘦身:控制台的命令处理查过:命令处理已经在 rescue 和 shell 模块里,内核只剩按键解码和屏幕输出(设备机制),这次没有可移的

用法(开发机上):

tools/rustros-update.py HOST run -t build/user/chrootrun -- /debian /bin/bash -i

程序是本地的静态 ELF 文件(这里是在 /debian 根目录里执行 bash 的小程序);容器运行时(M7)以后按容器启动。

内核这次内核改了什么(按新规则报告)

遗留还没有的

缺口打算
所有 devpts 挂载看到同一组终端(容器各自的终端编号空间)M7a 容器隔离时
/proc/<pid>/fd 的链接不是真实路径(ttyname 退回到扫 /dev/pts,能用)按需
终端的 packet 模式(TIOCPKT)、硬件流控、波特率伪终端用不到;按需
物理控制台还不是终端(不能在串口上交互运行进程)需要时把控制台做成终端的主端
updater 被替换时终端会话断开(程序收到 SIGHUP)updater 在引导镜像里,随内核更新

请你确认

是否发布 M5 并更新两台机器:内核变了,按老流程上传内核、重装所有模块、重启一次。之后按顺序是 M6(镜像:先导入 docker save 的 tar 和 OCI 布局,层解到 ext4 上;从仓库拉取在后)。