275 lines
5.9 KiB
Markdown
275 lines
5.9 KiB
Markdown
# WSL Runtime 改造设计 2026-04-22
|
||
|
||
## 1. 背景
|
||
|
||
当前 `ISCE2` 与 `Gamma/PyINT` 的 WSL 执行存在三个根问题:
|
||
|
||
1. 执行边界仍是 shell 字符串,后端直接把命令交给 `wsl.exe ... bash -lc`。
|
||
2. `.env` 直接持有 WSL Python、pipeline、Gamma 环境脚本等执行型配置,配置权和执行权耦合。
|
||
3. WSL 内的 conda 环境没有被定义成正式运行时资产,实际运行依赖“当前机器上碰巧可用的环境”。
|
||
|
||
这会带来四类风险:
|
||
|
||
- 参数或路径一旦逃逸 quote,直接进入 shell 解释边界。
|
||
- 引擎服务自己拼命令,执行治理无法集中落地。
|
||
- `ISCE2` 和 `Gamma/PyINT` 虽然物理上可以共用一套 WSL/conda,但逻辑上没有独立运行时标识,审计和迁移困难。
|
||
- WSL 环境漂移无法被健康检查和运维流程正式识别。
|
||
|
||
## 2. 目标
|
||
|
||
本次改造采用:
|
||
|
||
- 单 WSL distro
|
||
- 单共享 conda env
|
||
- 双逻辑 runtime
|
||
- 单一 WSL broker 出口
|
||
|
||
目标形态:
|
||
|
||
```text
|
||
业务服务
|
||
-> Engine Adapter
|
||
-> WslBroker
|
||
-> RuntimeRegistry
|
||
-> JobManifest
|
||
-> WSL Runner
|
||
-> shared conda env: insar_wsl_v1
|
||
```
|
||
|
||
其中:
|
||
|
||
- `ISCE2` 使用 `isce2_runtime_v1`
|
||
- `Gamma/PyINT` 使用 `gamma_pyint_runtime_v1`
|
||
|
||
二者可以共用:
|
||
|
||
- `WSL_DISTRO=Ubuntu-24.04`
|
||
- `WSL_SHARED_CONDA_ENV=insar_wsl_v1`
|
||
|
||
但不能共用“逻辑运行时定义”。
|
||
|
||
## 3. 运行时模型
|
||
|
||
### 3.1 共享运行时
|
||
|
||
共享运行时负责:
|
||
|
||
- distro 选择
|
||
- 共享 conda env 名称
|
||
- 共享 Python 路径
|
||
- broker 作业落盘目录
|
||
|
||
建议配置:
|
||
|
||
```env
|
||
WSL_DISTRO=Ubuntu-24.04
|
||
WSL_SHARED_CONDA_ENV=insar_wsl_v1
|
||
WSL_SHARED_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
|
||
WSL_BROKER_JOB_ROOT=<backend/runtime/wsl_jobs>
|
||
```
|
||
|
||
### 3.2 逻辑 runtime
|
||
|
||
每个逻辑 runtime 固定:
|
||
|
||
- `runtime_id`
|
||
- `engine_code`
|
||
- `runner`
|
||
- `allowed_operations`
|
||
- 固定 profile 路径
|
||
- 固定审计标识
|
||
|
||
当前规划:
|
||
|
||
| runtime_id | engine | runner | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `isce2_runtime_v1` | `isce2` | `deploy/wsl/runners/isce2_runner.py` | LT-1 条带 D-InSAR |
|
||
| `gamma_pyint_runtime_v1` | `pyint` | `deploy/wsl/runners/gamma_pyint_runner.py` | Gamma / PyINT |
|
||
|
||
Gamma 固定 profile:
|
||
|
||
- `deploy/wsl/profiles/gamma_env.sh`
|
||
|
||
注意:Gamma profile 属于部署资产,不再建议继续由 `.env` 动态指定脚本路径。
|
||
|
||
## 4. 执行模型
|
||
|
||
### 4.1 Broker
|
||
|
||
Broker 负责:
|
||
|
||
- 解析 `runtime_id`
|
||
- 写入结构化 `job manifest`
|
||
- 生成固定 `argv`
|
||
- 通过 `wsl.exe --exec` 执行 runner
|
||
|
||
禁止的旧模式:
|
||
|
||
- 服务层直接拼 `bash -lc "..."`
|
||
- 服务层直接决定 `source` 哪个环境脚本
|
||
- 服务层直接把 `.env` 中的 Python 绝对路径当成执行入口
|
||
|
||
### 4.2 Manifest
|
||
|
||
建议 manifest 固定包含:
|
||
|
||
- `job_id`
|
||
- `runtime_id`
|
||
- `engine_code`
|
||
- `operation`
|
||
- `created_at`
|
||
- `payload`
|
||
|
||
payload 中再放:
|
||
|
||
- 输入路径
|
||
- 工作路径
|
||
- 输出路径
|
||
- 参数
|
||
- 操作人
|
||
- 引擎内部业务上下文
|
||
|
||
### 4.3 Runner
|
||
|
||
Runner 是 WSL 内的固定可信入口。
|
||
|
||
阶段划分:
|
||
|
||
1. V1:只承担 manifest 读取、参数校验和 dry-run 输出
|
||
2. V2:接入实际 pipeline / PyINT / Gamma
|
||
3. V3:补齐固定 profile、版本指纹、错误分类与审计摘要
|
||
|
||
## 5. Conda 环境治理
|
||
|
||
### 5.1 基本原则
|
||
|
||
- 不原地继续污染旧环境
|
||
- 先冻结现有环境
|
||
- 再建立共享正式环境 `insar_wsl_v1`
|
||
- 旧环境只保留回滚用途
|
||
|
||
### 5.2 版本资产
|
||
|
||
`deploy/wsl/conda/` 下至少维护:
|
||
|
||
- `insar_wsl_v1.environment.yml`
|
||
- `insar_wsl_v1.explicit.lock`
|
||
- `insar_wsl_v1.fingerprint.json`
|
||
|
||
说明:
|
||
|
||
- `environment.yml` 用于人工维护和审阅
|
||
- `explicit.lock` 用于精确重建
|
||
- `fingerprint.json` 用于健康检查、审计和漂移检测
|
||
|
||
### 5.3 Gamma
|
||
|
||
Gamma 通常不作为 conda 包管理。
|
||
|
||
因此建议:
|
||
|
||
- Gamma 以固定安装路径存在于 WSL
|
||
- 由 `deploy/wsl/profiles/gamma_env.sh` 统一注入环境变量
|
||
- 不再由 `.env` 直接提供动态 profile 路径
|
||
|
||
## 6. 配置迁移策略
|
||
|
||
### 6.1 新增配置
|
||
|
||
新增统一配置:
|
||
|
||
```env
|
||
WSL_DISTRO=Ubuntu-24.04
|
||
WSL_SHARED_CONDA_ENV=insar_wsl_v1
|
||
WSL_SHARED_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
|
||
WSL_BROKER_JOB_ROOT=...
|
||
ISCE2_RUNTIME_ID=isce2_runtime_v1
|
||
PYINT_RUNTIME_ID=gamma_pyint_runtime_v1
|
||
```
|
||
|
||
### 6.2 旧配置处理
|
||
|
||
旧配置短期保留,用于兼容现有业务链路:
|
||
|
||
- `ISCE2_PYTHON`
|
||
- `PYINT_WSL_PYTHON`
|
||
- `PYINT_GAMMA_ENV_SCRIPT`
|
||
- `ISCE2_WSL_DISTRO`
|
||
- `PYINT_WSL_DISTRO`
|
||
|
||
但应逐步降级为:
|
||
|
||
- 历史兼容字段
|
||
- 启动检查告警来源
|
||
- 回滚开关
|
||
|
||
而不再是长期正式执行入口。
|
||
|
||
## 7. 目录规划
|
||
|
||
新增目录:
|
||
|
||
```text
|
||
deploy/wsl/
|
||
conda/
|
||
profiles/
|
||
runners/
|
||
backend/app/services/
|
||
wsl_runtime_registry.py
|
||
wsl_broker.py
|
||
```
|
||
|
||
运行时作业目录:
|
||
|
||
```text
|
||
backend/runtime/wsl_jobs/<runtime_id>/<operation>/<job_id>.json
|
||
```
|
||
|
||
## 8. 实施阶段
|
||
|
||
### Phase 1
|
||
|
||
- 新增 `WSL shared runtime` 配置
|
||
- 新增 `RuntimeRegistry`
|
||
- 新增 `WslBroker`
|
||
- 新增 runner/profile/conda 目录落点
|
||
|
||
### Phase 2
|
||
|
||
- 迁移 `ISCE2` 到 `runtime_id + manifest + broker`
|
||
- 去掉服务层 shell 字符串拼接
|
||
|
||
### Phase 3
|
||
|
||
- 迁移 `Gamma/PyINT`
|
||
- 把 `PYINT_GAMMA_ENV_SCRIPT` 收敛到固定 profile
|
||
|
||
### Phase 4
|
||
|
||
- 增加环境指纹校验
|
||
- 健康检查显示 runtime 漂移
|
||
- 审计日志记录 runtime_id / fingerprint / runner / manifest
|
||
|
||
## 9. 本轮代码落点
|
||
|
||
本轮先完成 V1 骨架:
|
||
|
||
- `backend/app/services/wsl_service.py`
|
||
- 新增 `run_wsl_exec()`,支持 `wsl.exe --exec`
|
||
- `backend/app/services/wsl_runtime_registry.py`
|
||
- 新增共享 runtime 与双逻辑 runtime 定义
|
||
- `backend/app/services/wsl_broker.py`
|
||
- 新增 manifest staging 与 broker 执行骨架
|
||
- `deploy/wsl/runners/*`
|
||
- 新增 runner scaffold
|
||
- `deploy/wsl/profiles/gamma_env.sh`
|
||
- 固定 profile 落点
|
||
- `deploy/wsl/conda/README.md`
|
||
- 约束 conda 环境治理落点
|
||
|
||
下一步迁移优先级建议:
|
||
|
||
1. `ISCE2`
|
||
2. `Gamma/PyINT`
|
||
3. 健康检查与审计
|