RustROS · 2026-10-25 · 主线 d33e7a1 · 发布 2026.10.25.2

M2 之前的总报告

按 2026-10-24 的约定,转发优化 F0–F5、智能流控 S1、启动计划 P1–P6(含发布和线上部署)做完后统一汇报一次。这三部分都已完成:两台线上机器都已不用 GRUB,跑的是第一个不带 GRUB 的版本。M2 的范围在文末,请你确认后再开始。

回归测试(KVM 测试机)全部通过约 40 项 KVM 测试 + 148 个单元测试,P6 之后的失败项已修复并单独重跑
转发(最近一轮)19.0 / 18.7 Gbit/sTCP 单流 / 4 流;64 B 单流 397 kpps,16 流 385 kpps
线上机器2 台,2026.10.25.2Aliyun(UEFI)、第二台生产机(BIOS),都由 RustROS 自己的启动程序启动
许可新版无 GPL镜像里不再有 GRUB;旧版本的 GRUB 源码按要求保留

F0–F5转发优化

基线(KVM 测试机,三次取中位数):TCP 单流 ≥ 17.5、4 流 ≥ 15.0 Gbit/s;64 字节单流和 16 流 ≥ 385 kpps。每一步都在整套测试通过后提交。

阶段做了什么结果
F0测量:每包的通知次数、发送环满时的等待和丢包;固定速率下的每包 CPU 周期基准:64 B 约 4,450 周期/包,约 17,000 次通知/秒
F1支持 event_idx;每轮每队列最多通知一次;接收环够用时不补充通知TCP 4 流 15.5 → 18.6 Gbit/s
F2发送环满时用软件队列,不忙等;只在队列也满时丢包并计数64 B 约 2,100 周期/包;通知约 3,500 次/秒
F3大段转发:池化的大缓冲区(F3a)。零拷贝描述符链(F3b)实测更慢,已放弃TCP 单流 19.3–19.8 Gbit/s
F4出口钩子只调用有出口处理的模块;路由器按批缓存路由和邻居查找(接口变更,全部模块重装)64 B 约 1,850 周期/包
F5单 CPU 时只用一个队列对(4 对在 16 流时只有 197 kpps);发布 2026.10.24.4 并部署到两台机器多队列不再拖慢转发

S1智能流控(攻击识别与公平限速)

部分内容
S1.1 协议栈自保半开连接表满时用 SYN cookie;半开连接约 7 秒放弃;对本机的 SYN-ACK、RST、ping 回复按来源和总量限速;SYN 洪水每分钟记录一次。转发路径零开销。
S1.2 smartflow 模块包路径上的第一个模块;关 / 自动 / 开三种模式(关闭 24 小时后自动回到“自动”);按来源 IP / MAC / 网卡 / VLAN / 子网统计;可热替换、热开关。
S1.3 入站 SYN 防护按目标统计 SYN,被攻击时对转发的连接做 SYN 代理(cookie + 序号转换),超量来源丢弃;只在有代理连接时才挂出口钩子。
S1.4 出站扫描和泛洪扫描检测 → 降级(最低档)→ 封禁;新建连接速率、并发上限;NAT 表满时只淘汰超额的主机;默认封出站 25 端口;UDP 目标数和 ICMP 限速。
S1.5 CAKE三档优先级(管理、DNS、SSH、ACK 优先);带宽 + pps 双上限(每包按 max(长度, 带宽 / pps) 计费);按主机公平和按主机限速;ACK 过滤。
S1.6 自动模式和界面预设(网站 / 游戏 / 邮件),整机触发与释放,每次触发和释放都记录;网页管理“智能流控”页;配置可编程。
S1.7 测试SYN 洪水(本机、转发)、扫描、SMTP/UDP/ICMP 上限、pps 上限、模式切换和热替换都进了回归测试。自动模式下检测开销约 70 周期/包,转发不受影响。

P1–P6启动计划:去掉 GRUB

阶段结果
P1内核文件改为 PE32+(固件可直接启动),加 64 位入口;启动状态的格式和规则(boot/bootstate,两份副本,带序号和 CRC)。
P2UEFI 启动程序 efiboot(\EFI\BOOT\BOOTX64.EFI):读启动状态、选槽、链式加载。你随后写了 kernel/src/uefi.rs:固件启动项 RustROS A / B,试启动用 BootNext。
P3BIOS 启动程序:第一级在 MBR,第二级(你写的)在 EFI 分区的保留扇区,两份带 CRC。
P41 MiB 镜像,只有一个 EFI 分区;内核槽是 FAT 文件,大小可变,FAT 写入器按“数据 → FAT 链 → 目录项 → 启动状态提交 → 释放旧簇”的顺序写;空间不够时 EFI 分区原地扩大(512 MiB 以内);数据分区 512 MiB 起,没有缓存分区(你的决定),开机日志放在数据分区里;安装器和发布脚本跟着改。
P5迁移工具 rustros-update.py migrate(UEFI;--bios 还换 MBR 的引导代码),先在 KVM 上演练(含中途断电),再迁移两台线上机器。
P6删掉 GRUB:镜像、grubenv、esp-grow / slots-grow、ELF 内核、许可说明里的 GPL。发布 2026.10.25.2。

测试覆盖

线上发布和两台机器

时间事件
10-242026.10.24.4(转发优化)部署到两台机器。
10-252026.10.25.1(P1–P5)发布;两台机器先在 GRUB 下升级,再迁移:Aliyun(UEFI,\NvVars 一起带过去),第二台生产机(BIOS,MBR 换成我们的第一级,旧 MBR 和旧 ESP 都有备份)。
10-252026.10.25.2(第一个不带 GRUB 的版本)部署到两台机器。发布时 rustros.com 的 files 分区(104 MiB)满了,按你的同意删掉 7 个旧版本(58.8 MiB)后补完发布。

两台机器现在都跑 2026.10.25.2,在线更新(PE 内核、试启动、确认)在两台真机上都验证过;rustros.com 一直返回 200。

偏差和原计划不一样的地方

遗留问题和风险

事项影响建议
rustros.com 的 files 分区只有 104 MiB现在 41.9 MiB,大约还能放五六个版本定一个“只保留最近 N 个版本”的规则;或者先做 ext4 在线扩容(M2 正好要重写 ext4)
Aliyun 真机停机再开机已在 KVM 上模拟通过,但没在真机上做过你方便时在阿里云控制台做一次,我来检查
EFI 分区跨 FAT 类型扩容FAT12 原地最大约 16 MiB,目前内核 304 KiB内核接近几 MiB 时再做
只认 MBR 活动分区的老 BIOS 实体机没遇到;虚拟机和 第二台生产机 不在乎遇到时在安装器里加开关
新安装器没在真实 VPS 上跑过只在 KVM 上按安装器的做法生成镜像并启动过下次有空闲 VPS 时实测一次
TCP 单流 20 Gbit/s 目标差 2–5%需要新办法(例如更大的接收缓冲区),暂不处理
第二台生产机 通知次数对比F5 的收尾检查运行几小时后只读地取一次数

M2下一步:VFS 和 ext4

按 10-23 确认的顺序,下一步是 M2(VFS 和 POSIX 级的 ext4),它是容器运行时(M3 兼容层、M6 镜像、M7 运行时)的基础。我的初步范围:

请你确认

1. 上面的 M2 范围是否合适,要加什么、减什么。

2. rustros.com 发布空间的处理:定一个“只保留最近几个版本”的规则,还是放进 M2 做 ext4 在线扩容?

确认后我再开始 M2;这期间不动代码。