按 2026-10-24 的约定,转发优化 F0–F5、智能流控 S1、启动计划 P1–P6(含发布和线上部署)做完后统一汇报一次。这三部分都已完成:两台线上机器都已不用 GRUB,跑的是第一个不带 GRUB 的版本。M2 的范围在文末,请你确认后再开始。
基线(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.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 | 内核文件改为 PE32+(固件可直接启动),加 64 位入口;启动状态的格式和规则(boot/bootstate,两份副本,带序号和 CRC)。 |
| P2 | UEFI 启动程序 efiboot(\EFI\BOOT\BOOTX64.EFI):读启动状态、选槽、链式加载。你随后写了 kernel/src/uefi.rs:固件启动项 RustROS A / B,试启动用 BootNext。 |
| P3 | BIOS 启动程序:第一级在 MBR,第二级(你写的)在 EFI 分区的保留扇区,两份带 CRC。 |
| P4 | 1 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。 |
\NvVars 里时(和 Aliyun 一样),停机再开机后启动项仍在。| 时间 | 事件 |
|---|---|
| 10-24 | 2026.10.24.4(转发优化)部署到两台机器。 |
| 10-25 | 2026.10.25.1(P1–P5)发布;两台机器先在 GRUB 下升级,再迁移:Aliyun(UEFI,\NvVars 一起带过去),第二台生产机(BIOS,MBR 换成我们的第一级,旧 MBR 和旧 ESP 都有备份)。 |
| 10-25 | 2026.10.25.2(第一个不带 GRUB 的版本)部署到两台机器。发布时 rustros.com 的 files 分区(104 MiB)满了,按你的同意删掉 7 个旧版本(58.8 MiB)后补完发布。 |
两台机器现在都跑 2026.10.25.2,在线更新(PE 内核、试启动、确认)在两台真机上都验证过;rustros.com 一直返回 200。
docs/boot-todo.md,并负责测试和合入。apps boot crates docs kernel modules site tests tools wasm。| 事项 | 影响 | 建议 |
|---|---|---|
| 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 的收尾检查 | 运行几小时后只读地取一次数 |
按 10-23 确认的顺序,下一步是 M2(VFS 和 POSIX 级的 ext4),它是容器运行时(M3 兼容层、M6 镜像、M7 运行时)的基础。我的初步范围:
linux 模块里):open / read / write / close / lseek / stat / fstat / getdents64 / mkdir / unlink / rename / chdir / readlink 等,每个进程有自己的根目录(为容器隔离做准备)。tests/user 里自己的静态程序跑文件操作,以及热替换时文件不断。1. 上面的 M2 范围是否合适,要加什么、减什么。
2. rustros.com 发布空间的处理:定一个“只保留最近几个版本”的规则,还是放进 M2 做 ext4 在线扩容?
确认后我再开始 M2;这期间不动代码。