M0 到 M7b 的容器计划收尾:你定下的每一条容器要求都成了回归套件里经 docker 实际运行的测试;容器的智能流控(S2)补上;验收中找到并修好了四个问题(nat 替换时连接断、边读边删目录会漏、名字缓存记着已删目录、测试服务器连接数用尽);实例的文件系统准备从内核移到 VFS 模块。
| 要求 | 测试 | 结果 |
|---|---|---|
| compose up -d 起 Debian 13(sleep infinity),exec -it bash 里 apt update、apt install -y curl,curl 访问外部网站;down 清理,up 再起 | docker_test | 通过 |
| 自己的根目录和进程号空间 | instance_test、docker_test | 通过 |
| 两个容器都监听 80,映射到两个宿主地址的 80(测试里是 8080)同时可达 | docker_test | 通过 |
| 运行中改映射:服务不中断,新映射立刻生效 | docker_test(compose 只改端口:1 号进程不变,服务一直在,新地址能连,旧地址不再接受新连接) | 通过 |
| 和路由器端口转发、宿主机服务端口冲突的映射被拒绝 | docker_test(dstnat 转发上的 docker run -p;updater 的 9000) | 通过 |
| 宿主网络配置定时回滚后容器映射照常 | docker_test(net apply 不确认,回滚后两个服务都能连) | 通过 |
| 防火墙规则拒绝容器访问宿主端口(默认允许) | docker_test(容器里探测 9000:默认通,规则后不通,删规则后又通) | 通过 |
| 热更新:替换模块不影响运行中的容器 | docker_test:在跑着的 compose 服务下依次替换 linux、vfs、netstack、containers、nat、ctnet,每次之后经映射的已有连接照常收发,exec -it 会话照常 | 通过 |
| 容器的智能流控(S2):对容器的 SYN 洪水、容器发起的扫描 | s2_test:洪水下真实客户端 5/5 连上,另一个容器 5/5;扫描的容器按名字报出(ct3 s2/scan)、降级、封禁、NAT 表不被填满、平静后解除 | 通过 |
| 删除干净 | docker_test 末尾:没有实例、设置、映射,磁盘上没有容器目录和记录,e2fsck 干净 | 通过 |
| 回归套件通过,转发不低于基线 | 整套 | 通过 |
Module::handover / take_over),nat 交出端口转发与容器映射的连接、动态 NAT 的会话,外部端口不变。tty 显示 “not a tty”:进入实例的进程带着的终端现在在实例的 /dev/pts 里也看得到。Vfs::instance_root、instance_mounts、instance_unroot),以后这部分的改动不用换内核。Module::handover / take_over(应用的热替换交接);Net::nic_label;Vfs::tty_share 和上面三个实例调用;VFS 交接格式 7。M8 是否发布:内核改了,部署时重启一次,所有模块重装,docker 程序重装。按你定的顺序,之后是 IPv6(J);“稳定的服务接口”(内核评估第 4 条)建议排在 IPv6 之后单独做。