私网环境 VMware → 华为云 ECS 迁移 Skill
概述
在私网环境下将 VMware 虚拟机迁移到华为云 ECS,适用于源端和目的端位于不同网络段、通过 VPN 打通的场景。
核心特性:无公网 IP/EIP、VPN 打通、代理 ECS 部署 squid+GOST+rsync 实现代理/转发/文件同步。
| 通道 | 路径 | 说明 |
|---|---|---|
| 控制流代理 | SMS Agent → 云API:443 | 通过 squid HTTP 代理 |
| 数据流转发 | SMS Agent → 目标ECS:22/8899/8900 | 通过 GOST 转发 |
| 管理通道 | 操作端 → 源端SSH:22 | 直接 SSH 管理 |
支持范围与限制
⚠️ 重要声明:本 Skill 仅支持以下迁移场景,超出范围不支持:
| 维度 | 支持范围 | 说明 |
|---|---|---|
| 网络环境 | 仅私网(Private Network) | 源端与目的端位于不同网络段,通过 VPN 打通;不支持公网直连模式 |
| 操作系统 | 仅 Linux | 不支持 Windows 主机迁移 |
| CPU 架构 | 仅 x86_64(amd64) | 不支持 ARM(aarch64/arm64)架构迁移 |
| 源端平台 | VMware 虚拟机 | 通过 SMS Agent 实现块级数据同步 |
| 目标平台 | 华为云 ECS | 自动创建目标 ECS 并执行迁移 |
不支持 ARM 架构的技术原因:
- ECS 规格选择:代码主动排除所有 ARM 规格(kc/ac/ai/kai/kx/ki/ah/as/at/sn 前缀),仅匹配 x86 规格
- 目标镜像:镜像映射表仅包含 x86_64 公共镜像 ID,无 ARM 镜像
- rsync 二进制:预编译包仅提供 x86_64 版本(源码编译兜底可适配 ARM,但未正式验证)
触发词
私网迁移、私网环境迁移、VPN迁移、内网迁移、无公网迁移、VMware私网迁移、VMware内网迁移、代理ECS迁移、GOST迁移、private network migration、VPN migration、offline migration
前置条件
网络环境
- 源端 VMware 环境与华为云 VPC 已通过 VPN 打通
- 代理 ECS 可达源端 SSH(22) 和华为云内网 API
- 操作端可通过 SSH 连接代理 ECS
源端环境
- VMware 环境已安装 SMS Agent(或可通过代理安装)
- 源端 SSH 可达,已知 root 密码或密钥
hcloud CLI 与 obsutil 凭证配置
- hcloud CLI 版本要求:>= 7.2.2,运行
hcloud version验证,运行hcloud configure list检查配置 - 如未安装或版本过低,参考安装指南:https://github.com/huaweicloud/huaweicloud-skills/blob/master/skills/bss/billing/huawei-cloud-billing-scout/references/cli-installation-guide.md
- hcloud 配置永久 AK/SK:
hcloud configure init(参考:https://support.huaweicloud.com/usermanual-hcli/hcli_03_002.html) - obsutil 凭证配置(需独立安装 obsutil):
obsutil config -i=<YourAK> -k=<YourSK> -e=obs.<Region>.myhuaweicloud.com- 常见端点:cn-north-1→obs.cn-north-1.myhuaweicloud.com、cn-north-4→obs.cn-north-4.myhuaweicloud.com、cn-east-3→obs.cn-east-3.myhuaweicloud.com、cn-south-1→obs.cn-south-1.myhuaweicloud.com、cn-southwest-2→obs.cn-southwest-2.myhuaweicloud.com
🚨 AK/SK 凭证配置(最高优先级强制规则)
AI 违反以下任何一条即为严重错误,应立即停止并重新执行配置流程:
- 学习完本 skill 后,第一件事必须是向用户提示配置永久 AK/SK,绝不允许跳过、延后或自行判断
- AI 严禁自行检查凭证缓存(
~/.migration_skill/.cred_cache)、hcloud 配置等已有状态并假设配置已完成 — 即使发现已有缓存,也必须先询问用户由用户选择- AI 严禁代替用户决策 — 不能自行选择使用缓存、跳过验证、假设凭证有效
- 只有用户明确确认(如"使用已有缓存"、"我已配置完成"或已设置环境变量)后,才能进入下一步
- 任何绕过此环节直接执行后续操作的行为均为严重错误
配置流程(用户确认配置后执行):
- 用户设置环境变量:
export migration_Access_Key='你的AK'、export migration_Secret_Access_Key='你的SK'、export HW_ACCESS_KEY='你的永久AK'、export HW_SECRET_KEY='你的永久SK',以及 Excel 中${...}占位符引用的环境变量(如export migration_password='主机密码') - AI 从环境变量读取 AK/SK 并调用
verify_credentials()验证(hcloud IAM KeystoneListAuthDomains 只读 API,超时 30 秒) - 验证通过 → AES-256-GCM 加密缓存到
~/.migration_skill/.cred_cache(权限 600);验证失败 → 提示重新设置(最多重试 3 次) - 检测临时凭证:HST 前缀→拒绝(临时凭证),HPUA 前缀→放行(永久凭证)
安全规范:
- 环境变量获取:AK/SK 通过环境变量读取,不经过命令行明文
- 本地缓存:AES-256-GCM 加密缓存,权限 600
- 禁止临时凭证:HST 前缀临时凭证全面禁止(包括中间操作),永久凭证验证通过后清除临时环境变量
- 变更检测:AK/SK 变更时提示用户确认 (yes/no),确认后联动重新配置 hcloud CLI、SMS Agent、obsutil
- 脱敏显示:日志中 AK 脱敏(如
HPUA****YPQY),SK 完全隐藏 - 信息安全:AK/SK 仅脱敏显示,禁止明文输出;禁止上传到非业务存储或公网
- 禁止操作:临时凭证用于任何操作、命令行明文 AK/SK、IAM 创建/删除 AK/SK
- 主机密码:Sheet1 密码列支持通用占位符
${env_var_name}(如${migration_password}),从环境变量读取;明文值直接使用(向后兼容);Sheet2 代理密码保持 Excel 直接读取,不走环境变量
Excel 输入文件结构
迁移任务通过 Excel 文件(.xlsx)批量配置,2 个 Sheet 页:
Sheet1: 主机信息(源端主机,每行一个迁移任务)
| 列 | 字段 | 说明 | 必填 |
|---|---|---|---|
| A | 主机名 | 源端 VM 名称 | ✅ |
| B | 内网IP | 源端 VMware VM IP | ✅ |
| C | 端口号 | SSH 端口(默认 22) | ❌ |
| D | 用户名 | SSH 用户名(默认 root) | ✅ |
| E | 密码 | SSH 密码(支持 ${env_var_name} 占位符或明文) |
✅ |
| F | region_id | 华为云区域 ID | ✅ |
| G | region_name | 区域名称 | ❌ |
| H | project_id | 项目 ID | ✅ |
| I | project_name | 项目名称 | ❌ |
| J | os_type | OS 类型(默认 Linux) | ❌ |
| K | use_public_ip | 是否使用公网 IP(FALSE=私网模式) | ❌ |
| L | target_image_id | 目标镜像 ID(空=与源端一致) | ❌ |
| M | target_AZ | 可用区(空=随机) | ❌ |
Sheet2: 代理主机信息(跳板机)
| 列 | 字段 | 说明 | 必填 |
|---|---|---|---|
| A | 主机名称 | 代理 ECS 名称 | ✅ |
| B | 公网IP | 代理 ECS 公网 IP | ✅ |
| C | 私网IP | 代理 ECS 私网 IP | ✅ |
| D | 端口 | SSH 端口(默认 22) | ❌ |
| E | 用户名 | SSH 用户名(默认 root) | ✅ |
| F | 密码 | SSH 密码(Excel 直接读取) | ✅ |
密码占位符规则:Sheet1 密码列支持通用 ${env_var_name} 占位符,扫描所有字段值,从环境变量解析替换;运行前自动校验全部占位符环境变量已配置,缺失则报错退出;Sheet2 代理密码不走占位符解析。
迁移流程
1. 准备阶段
- 配置 AK/SK(见前置条件,🚨 必须首先执行)
- 准备 Excel 迁移任务文件
- 验证 VPN 连通性
2. 代理 ECS 部署
- 创建代理 ECS(需公网 IP 或通过 NAT 网关访问外网)
- 部署 squid 代理(控制流代理,端口 3128)
- 部署 GOST 转发(数据流转发,端口 8899/8900)
- 部署 rsync(文件同步)
3. 批量迁移执行
# 首次运行 (设置环境变量后,自动读取并缓存)
export migration_Access_Key='你的AK'
export migration_Secret_Access_Key='你的SK'
export migration_password='主机密码' # Excel 中 ${migration_password} 占位符引用
python scripts/batch_migrate.py tasks.xlsx \
--proxy-ip <代理ECS_IP> --proxy-user root --proxy-password <代理密码>
# 后续使用 (本地加密缓存,无需再次设置环境变量)
python scripts/batch_migrate.py tasks.xlsx --cred-cache \
--proxy-ip <代理ECS_IP> --proxy-user root --proxy-password <代理密码>
流程:读取 Excel → 生成迁移任务列表 → 对每个任务执行 migrate_worker.py → 记录结果并输出汇总报告
4. 单机迁移流程(migrate_worker.py)
- 校验目标 ECS 名称:检查 target_name 是否符合命名规则
- 防重复检查:按所属权标签查找已有目标 ECS
- 找到 ACTIVE/STOPPED 的 ECS → 直接复用
- 找到异常状态的 ECS → 提示用户确认后删除重建
- 未找到 → 创建新 ECS
- 创建目标 ECS:调用
ecs_ops.create_target_ecs(),校验命名规则、创建 ECS、打所属权标签 - 配置代理转发:在代理 ECS 上配置 GOST 转发规则
- 安装 SMS Agent:通过代理在源端安装 SMS Agent
- 执行迁移:启动 SMS 迁移任务
- 验证迁移:检查目标 ECS 状态
所属权管理与防重复创建
所属权标签
通过 ECS 标签实现资源所属权管理:
| 标签键 | 标签值 | 说明 |
|---|---|---|
migration-skill |
vmware-ecs-private |
标识由本 skill 创建 |
source-ip |
源端 IP | 溯源标识 |
source-name |
源端 VM 名称 | 溯源标识 |
migration-time |
时间戳 | 迁移时间记录 |
防重复创建逻辑
- 按
migration-skill=vmware-ecs-private+source-ip=<源IP>标签查找已有 ECS - 找到且状态为 ACTIVE/STOPPED → 复用,跳过创建
- 找到且状态为 ERROR/其他 → 提示用户确认后删除重建
- 未找到 → 创建新 ECS 并打标签
权限校验
- 删除/停止/重启 ECS 前,校验
migration-skill标签 - 非本 skill 创建的 ECS,拒绝操作并抛出
PermissionError - 只能操作带自己所属权标签的 ECS
文件结构
huawei-cloud-migration-vmware-ecs-private/
├── SKILL.md # Skill 文档
├── README.md # 使用说明文档
├── scripts/
│ ├── batch_migrate.py # 批量迁移入口 (1634行)
│ ├── migrate_worker.py # 单机迁移逻辑 (1540行)
│ ├── step_tracker.py # 步骤追踪器 (250行, 耗时/阻塞/问题)
│ ├── ecs_ops.py # ECS 操作封装 (1303行)
│ ├── excel_reader.py # Excel 读取解析 (525行, 2 Sheet)
│ ├── ownership_utils.py # 所属权标签管理 (217行)
│ ├── hcloud_wrapper.py # hcloud CLI 封装/脱敏日志 (1102行)
│ ├── credential_manager.py # AK/SK 凭证管理 (775行, 环境变量+AES缓存)
│ ├── proxy_ecs_ops.py # 代理 ECS 部署 (680行)
│ ├── gost_ops.py # GOST 转发配置 (889行)
│ ├── squid_ops.py # squid 代理配置 (367行)
│ ├── sms_ops.py # SMS 迁移任务操作 (508行)
│ ├── sms_agent_push.py # SMS Agent 安装/推送 (1541行)
│ ├── ssh_utils.py # SSH 远程操作封装 (670行)
│ ├── network_ops.py # 网络资源操作 (899行)
│ ├── safety_checker.py # 安全检查 (433行)
│ ├── skill_logger.py # 日志管理 (263行)
│ ├── retry_utils.py # 重试工具 (186行)
│ ├── report.py # 迁移报告生成 (344行, 含步骤追踪)
│ ├── error_reporter.py # 错误报告 (161行)
│ ├── post_migration_verify.py # 迁移后验证 (1065行)
│ ├── smoke_test_server_id.py # 冒烟测试 (272行)
│ ├── task_name_utils.py # 任务名称工具 (128行)
│ ├── vpn_check.py # VPN 连通性检查 (347行)
│ └── agent_state_check.sh # Agent 状态检查脚本 (299行)
└── templates/
├── generate_template.py # Excel 模板生成脚本
├── 私网迁移源主机Linux相关信息1.0.xlsx # Excel 模板示例文件
└── 迁移网络设计图.png # 迁移网络架构设计图
使用方法
快速开始
- 配置 AK/SK(🚨 必须首先执行):设置环境变量
migration_Access_Key、migration_Secret_Access_Key、HW_ACCESS_KEY、HW_SECRET_KEY,以及 Excel 中${...}占位符引用的环境变量。配置 hcloud CLI(hcloud configure init)和 obsutil(obsutil config -i=<AK> -k=<SK> -e=obs.<Region>.myhuaweicloud.com,需独立安装 obsutil)。AI 验证通过后缓存。必须收到用户明确确认后才能继续 - 准备 Excel 任务文件(参考模板,2 Sheet 页;Sheet1 密码列可填
${env_var_name}占位符或明文) - 部署代理 ECS 并安装 squid+GOST+rsync
- 执行批量迁移:
python scripts/batch_migrate.py tasks.xlsx --proxy-ip <IP> --proxy-user root --proxy-password <代理密码> - 后续使用缓存:加
--cred-cache参数 - 后台运行(推荐):加
-b参数,进程通过 nohup 后台运行,终端关闭不会被杀死。日志→migration.log,PID→migration.pid,查看进度:tail -f migration.log
命令参数
| 参数 | 说明 | 必填 |
|---|---|---|
excel |
Excel 任务文件路径 (2 Sheet 页) | ✅ |
--cred-cache |
使用本地加密缓存中的凭证 | 缓存模式 |
--region |
华为云 region(默认 cn-north-4) | ❌ |
--project-id |
华为云 project ID | ❌ |
--proxy-ip |
代理 ECS IP(覆盖 Excel Sheet2) | ✅ |
--proxy-port |
代理 ECS SSH 端口(默认 22) | ❌ |
--proxy-user |
代理 ECS SSH 用户(默认 root) | ✅ |
--proxy-pass |
代理 ECS SSH 密码 | ✅ |
--vpc-id |
已有 VPC ID(不传则自动创建) | ❌ |
--subnet-id |
已有子网 ID(不传则自动创建) | ❌ |
--sg-id |
已有安全组 ID(不传则自动创建) | ❌ |
--max-workers |
最大并发数(默认 20,支持 100 台并发) | ❌ |
--max-workers-prepare |
Phase A 准备阶段并发数 | ❌ |
--max-workers-migrate |
Phase B 迁移阶段并发数 | ❌ |
--max-retries |
最大重试次数(默认 2) | ❌ |
--retry-delay |
重试间隔秒数(默认 10) | ❌ |
--task-timeout |
单任务超时秒数(默认 10800=3小时) | ❌ |
--security-token |
临时凭证安全令牌(HST 前缀 AK 必须提供) | ❌ |
--dry-run |
仅校验不执行 | ❌ |
--deep-verify |
深度验证模式 | ❌ |
--force-update |
强制更新 Agent | ❌ |
--output |
结果输出路径(默认 migration-results.json) | ❌ |
--log-dir |
日志目录(默认 /var/log/migration-private) | ❌ |
--rsync-binary |
rsync 二进制路径 | ❌ |
--background, -b |
后台运行 (nohup) | ❌ |
--log-file |
后台运行日志文件(默认 migration.log) | ❌ |
--pid-file |
后台运行 PID 文件(默认 migration.pid) | ❌ |
环境变量(首次运行必须设置):
| 环境变量 | 说明 |
|---|---|
migration_Access_Key |
永久 AK(HPUA 前缀) |
migration_Secret_Access_Key |
永久 SK |
HW_ACCESS_KEY |
华为云永久 AK(供 hcloud/obsutil 凭证配置使用) |
HW_SECRET_KEY |
华为云永久 SK(供 hcloud/obsutil 凭证配置使用) |
${...} 占位符变量 |
Excel 中任意 ${env_var_name} 占位符引用的环境变量,运行前自动校验全部已配置 |
安全组规则
迁移所需的安全组规则(自动创建或使用已有安全组):
| 方向 | 协议 | 端口 | 源/目的 | 说明 |
|---|---|---|---|---|
| 入方向 | TCP | 22 | 0.0.0.0/0 | SSH 管理 |
| 入方向 | TCP | 8899 | 0.0.0.0/0 | GOST 数据通道 |
| 入方向 | TCP | 8900 | 0.0.0.0/0 | GOST 数据通道 |
| 入方向 | TCP | 3128 | 0.0.0.0/0 | squid 代理 |
故障排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| SSH 连接超时 | VPN 未打通 / 安全组未放行 | 检查 VPN 连通性、安全组规则 |
| hcloud 认证失败 | AK/SK 无效或临时凭证 | 重新设置永久 AK/SK 环境变量,运行验证 |
| SMS Agent 安装失败 | 代理不通 / 源端 SSH 不可达 | 检查代理 ECS squid/GOST 配置、源端 SSH |
| GOST 转发失败 | 端口冲突 / 防火墙 | 检查 8899/8900 端口占用、防火墙规则 |
| 目标 ECS 创建失败 | 配额不足 / 镜像无效 | 检查 ECS 配额、镜像 ID |
| 迁移任务超时 | 大磁盘 / 网络带宽不足 | 调整 --task-timeout,检查网络带宽 |
| 凭证缓存损坏 | 缓存文件被篡改 | 删除 ~/.migration_skill/.cred_cache,重新设置环境变量 |
| 密码占位符未解析 | 环境变量未设置 | 检查 Excel 中 ${...} 占位符对应的环境变量是否已 export |
日志
- 日志目录:
/var/log/migration-private/(可通过--log-dir修改) - 后台运行:
tail -f migration.log查看进度,cat migration.pid获取 PID - 结果文件:
migration-results.json(可通过--output修改) - AK 脱敏:日志中 AK 显示为
HPUA****YPQY格式,SK 完全隐藏
