RustROS · 2026-10-25 · 主线 d27fb4d · 发布 2026.10.25.3

M2 报告:文件系统

M2 做完了:files 分区能自动扩大,也能在使用中缩小;新的 VFS 模块把所有文件访问统一起来,可以热替换;用户态进程有了文件系统调用和 execve。2026.10.25.3 已发布并部署到两台机器。下一个里程碑 M3 需要你确认后再开始,另有四个评估结论等你决定。

回归测试(KVM 测试机)44 项全部通过新增 file_test、files_grow_test;单元测试 ext4 26 个、vfs 8 个
转发(最近一轮)19.1 / 19.0 Gbit/sTCP 单流 / 4 流;64 B 单流 324(371 / 324 / 302)、16 流 360 kpps
线上机器2 台,2026.10.25.3阿里云(slot b)、第二台生产机(slot b),全部模块重装,rustros.com 200
接口有变化模块要全部重装;ext4 需要 vfs,pkg 会一起装

M2做了什么

步骤内容验证
M2.1ext4 原地扩大:新块组的元数据先写好,描述符和超级块作为一次日志事务提交单元测试;e2fsck 检查扩大后的镜像
M2.2files 分区的规则:从 1 GiB 开始,结束在下一个整 GiB 之前;剩余少于十分之一或 100 MiB、或者写不下时自动加长一步;可以关掉自动扩大;控制台 files grow [max]files_grow_test:150 MiB 的分区按规则扩大,文件都在,e2fsck 干净
M2.3在使用中缩小(files shrink <MiB>):主循环空闲时一小步一小步地搬块、给 inode 换号、切掉块组,最后改短分区;日志在新结尾之后时先搬到前面(这部分是你写的),新做的日志放在最前面2175 MiB 缩到 1024 MiB,其间照常上传和读取;断电测试;e2fsck
M2.4VFS 模块:挂载表、路径查找(符号链接、..、挂载点、调用者自己的根目录)、打开的文件、名字缓存、权限位;删除时仍打开的文件保留到最后一次关闭;热替换时交接挂载和打开的文件。文件系统驱动改为按 inode 工作,应用的文件调用全部经过 VFS8 个单元测试(真实 ext4 驱动跑在内存盘上);hot_test 在下载过程中替换 vfs 和 ext4
M2.5进程的文件系统调用:open、read/write、stat 一族、getdents64、dup/fcntl、mkdir/unlink/rename/link/symlink 及 *at 形式、chmod/chown、truncate、chdir/getcwd/chroot、umask,以及从文件加载程序的 execve。描述符表、根目录、工作目录在内核的进程表里,fork 时共享,进程结束时关闭tests/user/filetest 66 项检查全部通过
M2.6热替换和断电:一个进程打开着已删除的文件时,依次替换 vfs、ext4、linux 三个模块,进程照常读写;打开着已删除的文件时断电,下次启动释放它file_test;e2fsck 干净
M2.7评估(只评估,不改代码),见下文文档 docs/m2-evaluation.md
M2.8收尾:ext4 按路径的整文件调用只剩测试在用,移进测试专用的文件全套测试通过

修复测试中发现的问题

线上发布和部署

机器做了什么结果
rustros.com发布 2026.10.25.3(内核、全部模块、镜像、签名清单);报告改放在 rustros.com/reports/,源文件在 git 的 site/reports/清单里有 vfs,ext4 写明需要 vfs
阿里云新内核试启动并确认(slot b);先装 vfs、ext4(这台以前没装,这次也装上,19 GiB 的 files 分区挂上了),再装其余模块和 netstack、linux,重启一次全部运行,没有崩溃记录
第二台生产机同样的步骤,vfs、ext4、sites 最先装rustros.com 首页、发布页、报告页、清单都是 200

评估需要你决定的四件事

  1. 哪些应用改成 ring 3 进程:包处理模块和服务留在 ring 0;sites、proxy、anytls 是第一批,但要先有套接字(M4)和进程的最低 CPU 份额(满负荷转发时进程现在几乎拿不到 CPU);panel、webadmin 还要一个有权限检查的管理通道。
  2. WebAssembly 运行时:现在没有任何生产用途,只跑测试应用;它不在启动镜像里。建议冻结,等第一个应用作为进程上线后删除(发布文件少 871 KiB,代码也少一块)。
  3. TLS 重复了四份:shell、sites、panel、anytls 各自带一整套 TLS(rustls 加根证书),每个模块 0.7–0.9 MB。做成共享的服务模块,发布文件约少 1.8 MB,TLS 的安全修复只发一个模块;不依赖 M4,可以先做。
  4. 网络工具:ping、curl 和以后的 traceroute / mtr 等 M4 之后做成 ring 3 程序,从 shell 拆出去。

遗留问题

问题影响打算
sites 上传 60 MiB 的文件会被断开(20 MiB 正常)大文件上传不了;可能是整个请求体放在内存里上传改为边收边写进文件
info 里 linux 模块显示“not running”只是显示:系统调用模块在状态列表里没有条目,实际已启动补上状态条目
开机时 ext4 比 vfs 先启动日志里先出现一条“vfs 没装”的提示,随后 vfs 挂上;分区还多卸下、挂上一次开机阶段不报这条提示;查清多出的一次重新挂载
64 B 转发在嵌套测试机上波动大单流三次是 371、324、302 kpps;测试机上同时有别的负载时发包端也变慢包路径的代码在 M2 没有改动;需要时在空闲时段单独复测
进程还不能映射文件、运行 #! 脚本,没有管道、信号、终端动态链接的程序和 shell 脚本还跑不了M3 兼容层、M5 终端

M3下一步:Linux 兼容层

按已确认的顺序,下一个是 M3:让容器里的程序需要的系统调用跑起来(文件映射 mmap、管道、信号、poll/epoll、时间和睡眠、进程组等),先能跑 Debian 的静态和动态链接程序(ld.so、glibc),用 LTP 和观察到的行为验证;之后是 M4 网络系统调用。

请你确认

1. 上面四个评估结论各怎么定(特别是 TLS 共享模块要不要在 M3 之前先做)。

2. M3 的范围是否合适;确认后我再开始 M3。