RustROS · 2026-10-29 · 托管 H2 发布、H4 节点接口

托管报告:H2 已发布部署,H4 面板接口完成

H2(用官方 LXC cloud 镜像建客户容器)随 2026.10.29.5 发布,部署到全部六台机器。H4 做完了:每台容器主机上一个 node 模块,面板通过 HTTPS JSON 接口(端口 9443,钉住自签证书)认领主机、加载镜像、创建 / 启动 / 停止 / 重启 / 重装 / 删除容器、改密码和限制。按设计文档没有新的内核接口,这次更新不用重启。

回归测试(KVM 测试机)0 失败单元测试 255 项;整套跑一遍有 2 个失败:docker(负载下 apt 超时,老问题)和 cake(洪水下 ping 延迟),都与这次改动无关,单独重跑通过。转发 TCP 18.4 Gbit/s,64 B 352 kpps,和之前一样
新测试node_test从认领到删除,全程走 HTTPS 接口,用真实的 Debian 13 cloud 镜像
内核没改模块接口(api)也没改
这次更新不用重启新模块 node;vfs、images、rustros-init 热更新

H2已发布:2026.10.29.5

H4节点接口(面板调用的)

端点 POST https://<主机的底层网络地址>:9443/v1/op,请求体是 {"op": "...", ...},回答 {"ok": true, ...} 或 {"ok": false, "error": {"code", "message"}}。完整字段见 docs/hosting-design.md 的 H4 一节。

接入一台主机

  1. 在主机上设监听地址:cfg node listen <底层网络地址>(不设就不监听)。
  2. 在控制台运行 mod node claim,或在管理机上运行 rustros-update.py HOST mod node claim:得到 8 位认领码(10 分钟有效,错 5 次就关闭)和证书的 SHA-256。
  3. 面板发 node.claim {"code": "1234-5678", "pubkey": ..., "comment": ...},带上它自己的 Ed25519 公钥(私钥只在面板),主机把它记进授权密钥列表。以后每个请求都用这把私钥签名:Authorization: RR-Ed25519 ts=...,nonce=...,sig=...,签的是 rustros-op-v1、证书指纹、时间、随机数、请求体的 SHA-256 五行。主机检查时间差不超过 60 秒、随机数 120 秒内没用过、签名属于列表里的某把密钥。面板同时钉住证书指纹。证书第一次启动时生成,换模块、换内核都不变;mod node cert renew 换新证书。
  4. 授权密钥像 ssh 的 authorized_keys:可以有好几把(比如正式和测试面板各一把)。面板用签名的 key.add / key.delete 轮换(先加新的,用新的发一次请求,再删旧的),最后一把不能删(last_key);控制台上 mod node keys、mod node key add / delete,mod node reset 清空后要重新认领。这个方案是面板那边定的(替换了我原来的令牌方式)。

操作

操作做什么
key.list / add / delete授权密钥:列出(注释、权限、添加和最后使用时间)、添加、删除
node.info版本、CPU、已分配给容器的内存、磁盘总量和剩余、容器数
image.load / list / delete按 URL 和 SHA-256 下载镜像并导入(后台进行,状态 loading → ready / failed);正在用的镜像不能删
ct.create名字、镜像、IPv4(routed /32)、限制(cpu、mem_mib、disk_gib、procs)、SSH 公钥、root 密码,可选 dns、apt_proxy;同样的请求再发一次答 ok,字段不同答 conflict,地址被占答 conflict
ct.get / list状态 creating / running / stopped / failed,uuid、创建时间、启动时间、限制、用量(CPU 核数、内存、磁盘、进程数)
ct.start / stop / restart停止先发 SIGTERM,超过 timeout_s(默认 30 秒)再强制结束
ct.reinstall换镜像重装:旧文件全部清掉,名字、uuid、地址、限制保留,公钥和密码可以重新给
ct.set_limits运行中直接生效,不重启
ct.set_password运行中直接生效,不重启(在容器里运行一次 rustros-init apply)
ct.set_addr换地址:容器会重建(重启一次)
ct.delete停止、删掉容器和它的全部数据

node_test 测到的:认领(没开窗口、错码、码只能用一次)、签名(没签名、陌生密钥、时间差 120 秒、重放的随机数都被拒;按主机时间重签就通过;换模块后随机数记录还在)、加第二把密钥再删第一把、最后一把不能删、证书钉住;镜像下载、校验、导入;创建后用公钥和密码 SSH 登录;改密码不重启、旧密码失效;内存限制在容器里马上看得到(/proc/meminfo);停止 / 启动 / 重启;换掉 node 模块后令牌、证书、容器都还在;重装后旧文件没了、新密码可用;幂等和冲突;删除后数据清掉。

和设计文档不同、或者暂时做不到的

修复做的过程中发现并修好的

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

请你确认

1. 是否发布并部署:不用重启。各台机器上已有的模块热更新(vfs 带修复);112、113 再装上 node 模块,并把 listen 设为它们的底层网络地址。

2. 认领:面板那边准备好以后,在 112 / 113 上运行 mod node claim,把认领码交给面板;也可以由我运行后把码给你。

3. 下一步:设计文档里的顺序是 H3(主机把各容器的 /32 路由自动报给路由器);另外还有两件待定:网关的里程碑顺序(docs/gateway-design.md),以及“内核放到高半区”(让 Debian 的 python3、Go 默认编译的程序这类固定地址程序能跑)是否单独作为一个里程碑。