Azure Local离线模式VM 管理(系列篇十二)

Azure Local VM 管理(离线 / Disconnected 模式)

文档体例说明:本节采用三栏组织------

  • 官方要求(Official Requirement)------ 微软 Learn 原文支撑的事实
  • 🔍 技术分析(Technical Analysis)------ 官方没明说但可从架构/脚本推断的原理
  • 💡 企业最佳实践(Best Practice)------ 工程建议、风险提示、扩展性考量

关键架构分层(贯穿全文):

  • Azure Local = HCI + Hyper-V + SDN 底座
  • Arc Resource Provider = Azure 控制面扩展
  • stack-hci-vm CLI extension = 管理 API 客户端(不是 runtime)

因此"Azure Local VM"严格说应是 "Azure Local Arc-enabled VM(通过 stack-hci-vm CLI / Arc API 调用)"


0. 三层架构(理解整篇文档的入口)

关键边界

  • CLI 不等于 runtime ------stack-hci-vm extension 只是 API 客户端
  • VM 不等于 Azure IaaS VM------HA/resize/migration 模型都是 Hyper-V 层语义
  • Portal 不等于 control plane------Portal 是 ARM façade

1. Guest OS 支持矩阵

✅ 官方要求

Azure Local VM 在 disconnected / Arc-enabled 场景下支持以下 Guest OS:

  • Windows Server 2019 / 2022 / 2025
  • Windows 10 / Windows 11 Enterprise(部分场景)
  • Ubuntu 20.04 / 22.04 / 24.04 LTS(取决于版本)
🔍 技术分析

Azure Local VM 基于 Hyper-V + Arc VM 管理平面。Guest OS 支持取决于:

  • Hyper-V Integration Services(集成服务)
  • Arc VM Agent 兼容性矩阵

Linux 并不"被禁止",而是:

  • 无 Azure 官方 image pipeline
  • 需用户自建 VHDX(Gen2 + hv drivers

关于 RHEL / SLES

  • 技术上可运行
  • 不在官方验证矩阵
  • Arc guest management 支持可能受限
💡 企业最佳实践
  • 优先选择
    • Windows Server 2022 / 2025
    • Ubuntu LTS(22.04 / 24.04)
  • RHEL / SLES 仅建议用于:
    • 自建镜像
    • 自主补丁体系
    • 非强依赖 Arc guest management 的场景

2. VM 功能与限制清单

2.1 VM 镜像管理

✅ 官方要求

VM 镜像必须来源:

  • Cluster Shared Volume(CSV)
  • 本地路径导入 VHD/VHDX

不支持

  • Azure Marketplace
  • Azure Storage 直接挂载
  • 远程 image streaming
🔍 技术分析
  • Azure Local VM 没有 ARM image pull capability
  • 所有 image 必须:
    • 本地 block storage 可访问
    • Hyper-V compatible VHD/VHDX
💡 企业最佳实践
  • 建立 内部 golden image library
  • 标准化 VHDX pipeline(CI/CD)

2.2 网络与 NIC

✅ 官方要求
  • NIC 通过 CLI 创建
  • 依赖 logical network(lnet)
  • IP 必须来自预定义 IP pool
🔍 技术分析
  • Arc VM networking 依赖 Azure Local SDN abstraction layer
  • Portal 支持有限 :可查看,不适合复杂配置(static IP / custom logical network 基本仍依赖 CLI)
💡 企业最佳实践
  • 网络全部 CLI IaC 化(Bicep / PowerShell / Terraform)
  • Portal 仅用于观测

2.3 Trusted Launch(安全启动)

✅ 官方要求
  • 支持 Trusted Launch(视版本而定,Preview / GA depending version)
  • 包括:
    • Secure Boot(稳定支持)
    • vTPM(支持)
🔍 技术分析(重要约束)

Trusted Launch 在 Azure Local:

  • ✔ Secure Boot:稳定支持
  • ✔ vTPM:支持
  • Measured Boot不等价 Azure public VM
  • Defender for Cloud attestation :通常不可用(disconnected + Azure 端 attestation 链路不完整)

关键约束

Trusted Launch 在 Azure Local 上主要用于本地 Hyper-V security enforcement,不等同 Azure IaaS VM 的完整 attestation pipeline

也就是说------开了 Secure Boot + vTPM 不等于你获得了 Azure public cloud 那套 attestation / compliance report 能力。

💡 企业最佳实践
  • 生产环境开启 Secure Boot + vTPM
  • 安全审计仍需结合
    • 外部 SIEM
    • Defender for Endpoint(Guest OS 内)
    • 不依赖 Defender for Cloud attestation(不可用)

2.4 Proxy 行为

✅ 官方要求
  • VM 自身不提供 Azure 管理的 outbound proxy 功能
  • Azure Local 本地控制面 (Appliance / Arc Resource Bridge)支持 且通常必须 配置 Outbound Proxy(通过 FullEnvironment.json 或本地网络环境注入)
🔍 技术分析(关键区分)

|----------------------------------------|----------------|-----------------------------------------------------------------------|
| 层级 | 是否提供 proxy | 说明 |
| Azure 公有云控制面 | ❌ 不提供 | VM 跟公有云之间的 proxy 不归 Azure 管 |
| Azure Local 本地控制面(Appliance / ARB) | ✔ 支持 | 通过 FullEnvironment.json 或环境变量注入;仅在断网模式下关闭外发链路------组件本身具备代理感知能力 |
| Guest OS 网络 | ✔ 支持 | OS-level / transparent / NAT 随意 |

重要澄清

  • 之前表述 ❌ "Azure 控制面不提供 proxy" → 不准确
  • 准确版本:"Azure 公有云控制面(VM ↔ ARM)不提供 proxy"
  • Azure Local 本地控制面(Appliance ↔ Outbound)支持 proxy,仅在完全断网(True Disconnected)时才关闭外发链路
💡 企业最佳实践
  • VM ↔ Guest 外网 用:
    • OS-level proxy
    • Enterprise transparent proxy
    • Firewall NAT
  • Appliance ↔ Outbound 配置:
    • FullEnvironment.json 提前声明
    • 否则部署期会失败或反复重试

2.5 Portal 与 CLI 支持

✅ 官方要求
  • VM lifecycle 管理以 CLI / Arc API 为主
  • Portal 支持有限
🔍 技术分析
  • Portal = ARM façade(门户只是 UI 外壳)
  • 实际控制面 = Azure Arc resource provider
  • VM 创建入口通过 Azure Arc enabled VM resource provider不是传统 Azure VM portal)
💡 企业最佳实践
  • CLI + GitOps(强烈推荐)
  • Portal 仅用于观测

3. VM 创建流程(CLI 流水)

3.1 前置准备

复制代码
# 1. 安装支持的 CLI + 扩展
# ⚠️ extension 名随版本变化:
#    - stack-hci-vm(旧)
#    - azurestackhci / az stack-hci(新版组合)
# ⚠️ 版本号必须对齐 Azure Local release train(不是 Azure CLI 本身的版本)
az extension add -n stack-hci-vm

# 2. 登录(disconnected 模式已切到 local cloud)
az login
🔍 技术分析
  • extension 用于:Azure Local VM resource provider binding
  • disconnected 模式:仍依赖本地 control plane metadata

3.2 变量配置

复制代码
# ⚠️ 变量大小写必须统一------$subscriptionId 和 $SubscriptionId 混用会导致脚本静默失败
$subscriptionId = "<SubscriptionId>"
$resource_group = "disconnected-test-rg"
$customloc_name = "s-cluster-customlocation"
$location = "autonomous"

# Custom Location ID 拼接
$customLocationID = "/subscriptions/$subscriptionId/resourceGroups/$resource_group/providers/Microsoft.ExtendedLocation/customLocations/$customloc_name"

3.3 创建 Storage Path

复制代码
az stack-hci-vm storagepath create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --path "C:\\ClusterStorage\\UserStorage_1\\VMPath" `
    --name "New_StoragePath"

$storagePathID = (az stack-hci-vm storagepath show `
    --name "New_StoragePath" `
    --resource-group $resource_group `
    --query id -o tsv)

3.4 创建 VM Image(VHDX)

复制代码
# 1. 下载 / 拷贝 VHDX 到 cluster storage
curl.exe -o "C:\\ClusterStorage\\UserStorage_1\\testimage.vhdx" "<VHDX_URL>"

# 2. 创建 image 元数据
az stack-hci-vm image create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --storage-path-id $storagePathID `
    --image-path "C:\\ClusterStorage\\UserStorage_1\\testimage.vhdx" `
    --name "test-gallery-image" `
    --os-type "Windows"
🔍 技术分析
  • image create 只创建元数据 + VHDX 引用
  • 不上传到 Azure storage------是本地元数据
⚠️ Ubuntu 镜像关键提示

Ubuntu 在 Azure Local VM 上不能直接用 cloud image------必须:

  • Hyper-V Gen2 compatible VHDX
  • 已安装 hv_vmbus drivers(部分版本)

3.5 创建 Logical Network

复制代码
# ⚠️ PowerShell 会把 `()` 当子表达式解析,必须用单引号嵌套双引号包裹 switch name
az stack-hci-vm network lnet create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --name "arcvm-lnet-static" `
    --vm-switch-name '"ConvergedSwitch(managementcomputestorage)"' `
    --ip-allocation-method "Static" `
    --address-prefixes "192.168.200.0/24" `
    --ip-pool-start "192.168.200.180" `
    --ip-pool-end "192.168.200.190" `
    --gateway "192.168.200.1" `
    --dns-servers "192.168.200.222"
⚠️ Switch name 不是固定字符串

vm-switch-name 必须从部署时生成的 FullEnvironment.json 获取 ------不存在标准固定命名

变化来源

  • 不同 appliance → Network Intent 命名约定可能不同
  • 不同 OEM → 参考架构不同
  • 不同 SDN profile → storage / management / compute 分离 vs 融合

必须HostNetwork.Intents.Name / DeploymentData.InfrastructureNetwork 段读取实际 switch 名称。


3.6 创建 NIC

复制代码
# ⚠️ HCI extension 里该参数是复数形式 `--subnet-ids`(即使只有一个子网也用复数)
# IP 必须在 lnet 的 ip-pool 区间内
az stack-hci-vm network nic create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --name "arcvm-vnic" `
    --subnet-ids "arcvm-lnet-static" `
    --ip-address "192.168.200.185"

3.7 创建 VM

复制代码
# ⚠️ 以下两个错误必须避免:
#  1. Azure Local 不支持 `vm-size="Custom"`,该参数在 HCI extension 中不存在
#  2. `processors` / `memory-mb` 不是 `--hardware-profile` 里的键值对,而是顶级参数
#  3. 引用本地自建 image 元数据时参数名是 `--image-name`(不是 `--image`)
az stack-hci-vm create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --nics "arcvm-vnic" `
    --storage-path-id $storagePathID `
    --computer-name "test-machine" `
    --admin-username "admin" `
    --admin-password "<StrongPassword!>" `
    --image-name "test-gallery-image" `
    --name "test-vm" `
    --processors 4 `
    --memory-mb 8192 `
    --enable-agent true
🔍 技术分析:什么是 --enable-agent true

不是推测 --------enable-agentArc VM Agent onboarding flag(明确开关):

  • 自动部署 Azure Arc VM agent
  • 启用以下 Guest 能力:
  • Guest management
  • Policy
  • Extension management
⚠️ 密码安全

文档示例中的 "example"弱密码 ------生产务必换强密码(密码复杂度满足 AD / 域策略要求)。


3.8 Trusted Launch(Preview)

复制代码
az stack-hci-vm create `
    --resource-group $resource_group `
    --custom-location $customLocationID `
    --location $location `
    --nics "arcvm-vnic" `
    --storage-path-id $storagePathID `
    --computer-name "test-machine" `
    --admin-username "admin" `
    --admin-password "<StrongPassword!>" `
    --image-name "test-gallery-image" `
    --name "test-vm-tl" `
    --processors 4 `
    --memory-mb 8192 `
    --security-type "TrustedLaunch" `
    --enable-secure-boot true `
    --enable-vtpm true `
    --enable-agent true

4. 架构级补充(官方未显式说明)

4.1 Arc VM Agent(--enable-agent

🔍 技术分析

自动部署 Azure Arc VM agent,用于:

  • Guest management
  • Policy
  • Extensions

4.2 Monitoring(监控)

🔍 技术分析

|------------------------------|--------------------------------------------------------------------------------------------|
| 监控源 | Disconnected 模式可用性 |
| Azure Monitor Agent(AMA) | ✔ 可部署 ,但 disconnected 模式下无 Azure ingestion endpoint ------无法完成数据上传链路,仅保留本地运行能力 |
| Log Analytics | ❌ Disconnected 不可用 |
| 本地 SIEM / Syslog | ✔ 推荐 |
| Prometheus / Grafana | ✔ 推荐 |
| SCOM 管理包 | ✔ 可用(但需 SCOM 基础设施) |

生产建议 :统一 SIEM 接入,不依赖 Azure Monitor(disconnected 模式下无法上传)。

不要混用表述 :AMA "可装但不可用"------准确的工程描述是"可部署但无数据上传链路"。

4.3 Image Lifecycle(镜像生命周期)

🔍 技术分析
  • Azure Local VM ≠ Azure VM
  • 没有 ARM image gallery pipeline
  • 只能:
    • 手工 VHDX
    • 企业 golden image
    • CI/CD pipeline 构建

4.4 VM 生命周期能力(语义边界)

🔍 技术分析

|--------------------|----------|--------------------------------------------------------------------------------|
| 操作 | 支持情况 | 关键限制 |
| resize | ✔ 支持 | 依赖 VM stop/start------不支持热调整 vCPU/内存 |
| live migration | ✔ 支持 | 仅 cluster 内(不是跨 cluster / 跨 region) |
| HA | ✔ 支持 | 依赖 Failover Cluster ------不具备 Azure Region SLA 语义,也不是 Availability Set |
| 快照 | ✔ 支持 | Hyper-V checkpoint |
| extension | ✔ 支持 | 通过 Arc VM agent(--enable-agent true) |

关键差异(必须理解)

Azure Local VM 的 HA 属于 Hyper-V Failover Cluster 模型,不具备 Azure Region SLA 语义

也就是说------Azure Local VM 故障转移 ≠ Azure IaaS VM 的 SLA 99.99%。不要把 Azure Local VM 的 HA 跟 Azure IaaS VM SLA 混为一谈

4.5 删除存储路径的级联约束(顺序敏感)

删除顺序至关重要 ------错误顺序会留下 Arc 控制面的孤立镜像元数据 ,导致 Storage Path 永久无法解绑

💡 正确删除顺序
  1. 删除 VM(先停后删)
  2. 删除磁盘(data disk / OS disk)
  3. 优先删除 image 元数据这一步最常被忽略
  4. 最后删除 Storage Path
⚠️ 反面教训

绝对不要绕过 Arc 控制面,直接通过底层 Hyper-V cmdlet 删除物理 VHDX 文件:

  • Arc 控制面持有的 image 元数据不会自动消失
  • 该元数据仍然引用已经不存在的 VHDX 文件路径
  • 结果:Storage Path 永远无法解绑------只能用强制清理脚本
🔧 反向修补(如果已经走错)
  • 不能通过 Portal / CLI 直接解绑
  • 需要:
    • 手动清理 Appliance 上的吊桶引用
    • 或重新部署 Appliance(最坏情况

5. 企业级最佳实践总结

🏗 架构建议

  • VM 镜像统一 golden image 管理
  • CLI IaC 化(GitOps)
  • VM metadata 全部纳入 CMDB

🔐 安全建议

  • 必须启用
    • Secure Boot
    • vTPM
  • 密码策略必须企业级(禁止示例弱密码)
  • 关键 VM 集成 Defender for Endpoint

🌐 网络建议

  • 所有 IP pool 预规划
  • DNS / gateway 固定化(写进 lnet 配置)
  • 网络全 CLI 化,不依赖 Portal 复杂配置

📊 运维建议

  • 统一 SIEM(非依赖 Azure Monitor)
  • Arc agent 统一版本管理
  • VM metadata 变更走 PR + GitOps 流程

🔄 升级与兼容

  • 升级前:查看 Azure Local release notes
  • 升级顺序:CLI → extension → OperationsModule → Appliance------逐项验证
  • VM resize / HA / 迁移能力应与连网模式对齐(基本无差异)

6. Disconnected vs Connected 关键差异表

企业最关心的维度------同一份 VM 配置在两种模式下的实际差异。

|------------------------|----------------------------------|-------------------------------------------|---------------------------|
| 维度 | Connected 模式 | Disconnected 模式 | 影响 |
| VM lifecycle 管理入口 | Portal + CLI + API | CLI + API 为主,Portal 有限 | 自动化优先 |
| VM image 来源 | Azure Marketplace + 自建 | 仅自建 VHDX(CSV) | 需内部 golden image pipeline |
| Arc VM Agent | 自动 + 持续上报 | 自动部署,无 Azure 端上报 | 失去云端 Guest 监控 |
| Azure Monitor | ✔ 上报到 Log Analytics | ❌ 无 ingestion endpoint | 必须本地 SIEM |
| Defender for Cloud | ✔ Attestation + 策略 | ⚠ 组件可装,attestation 不可用 | 安全合规需本地替代 |
| Trusted Launch | ✔ 完整 attestation | ⚠ Secure Boot + vTPM,measured boot 有限 | 不等价 Azure IaaS |
| Marketplace 同步 | ✔ 自动 | ❌ | 离线镜像库必须自建 |
| Patch / Update | ✔ Windows Update / apt via Azure | ⚠ 必须本地 WSUS / 离线 apt mirror | 需自建补丁源 |
| HA 模型 | Azure Region SLA | Hyper-V Failover Cluster | 不等价 SLA |
| Live Migration | 跨 region / 跨订阅 | 仅 cluster 内 | 不能跨 cluster 迁移 |
| Backup | Azure Backup | 第三方 / 本地 Veeam 等 | 无 Azure 原生备份 |
| Disaster Recovery | Azure Site Recovery | 第三方 / 业务连续性方案 | 需自建 DR |
| Cost 模型 | 按 vCPU / GB-hour | 预付费 / 容量承诺 | 计费模型不同 |

核心结论

  • API 兼容 ------同一份 az stack-hci-vm 脚本在两种模式下基本都能跑
  • 能力不等价------很多"在 connected 模式可用"的功能在 disconnected 模式下只是"组件在但数据不通"
  • 企业替代方案------必须自建补丁 / 监控 / 备份 / DR

7. CLI vs Portal vs API Capability Matrix

企业选型必看------决定自动化与运维策略。

|------------------------|-----------------------------------|-----------------|--------------|
| 能力 | CLI( stack-hci-vm | Portal(Arc) | REST API |
| VM 创建 | ✔ 完整 | ⚠ 基础 | ✔ 完整 |
| VM resize | ✔ 完整 | ✔ 基础 | ✔ 完整 |
| VM 删除 | ✔ 完整 | ✔ | ✔ 完整 |
| VM 启动 / 停止 | ✔ 完整 | ✔ | ✔ 完整 |
| VHDX image 创建 | ✔ 完整 | ❌ | ✔ 完整 |
| VHDX image 删除 | ✔ 完整 | ❌ | ✔ 完整 |
| Storage path 管理 | ✔ 完整 | ❌ | ✔ 完整 |
| Logical network 创建 | ✔ 完整 | ⚠ 查看为主 | ✔ 完整 |
| NIC 创建(static IP) | ✔ 完整 | ❌ | ✔ 完整 |
| Trusted Launch 配置 | ✔ 完整 | ⚠ 部分 | ✔ 完整 |
| Arc VM Agent 启用 | ✔ 完整 | ✔ | ✔ 完整 |
| Extension 部署 | ✔ 完整 | ⚠ 部分 | ✔ 完整 |
| Monitoring 查看 | ⚠ 需 AMA + 本地 | ✔ 基础 | ✔ 完整 |
| Live migration | ❌(cluster 层) | ❌ | ❌ |
| HA 配置 | ❌(cluster 层) | ❌ | ❌ |
| 快照 / Checkpoint | ⚠ 通过 Hyper-V cmdlet | ❌ | ⚠ |

图例

  • ✔ = 完整支持
  • ⚠ = 部分支持 / 受限
  • ❌ = 不支持

企业建议

  • 日常 lifecycle:CLI + IaC(GitOps)
  • Portal 仅用于:临时观测、故障定位
  • REST API 用于:CI/CD、自动化平台对接
  • Cluster 层操作 (HA / live migration):用 Failover Cluster Manager / Hyper-V cmdlet------走 Arc API

8. 工程级原则(Rule of Thumb)

这些原则是从微软架构推断的工程铁律------脱离这些会出现"明明文档说能,为啥跑不通"的问题。

8.1 CLI extension 必须对齐 release train

CLI extension version must align with Azure Local release train (not Azure CLI version).

  • Azure CLI 自身版本(如 2.81.0)跟 Azure Local 兼容性是间接关系
  • stack-hci-vm / azurestackhci extension 版本才是直接绑定的
  • 不要装"最新版 Azure CLI + 最新版 extension"------可能跨 release train
  • 应该:看 Azure Local release notes → 找该 release 对应的 extension 版本
🔍 落地抓手:操作前必跑清查命令
复制代码
# 操作前必须跑:列出所有可用 extension 版本,显式核对
az extension list-available -o table

# 具体要核对:
#   - azurestackhci 或 stack-hci-vm 的版本号
#   - 是否在 OEM 硬件厂商提供的白名单内(Dell / Lenovo / HPE 通常有 version matrix)
#   - 是否与 Appliance build 、Operations Module 版本一致

三方一致性原则(操作前必须检查):

|---------------------------|--------------------------------------------|
| 组件 | 核对来源 |
| Azure Local release | OEM release notes / Azure Local catalog |
| CLI extension version | az extension list-available -o table |
| Appliance build | Get-Module -Name Az.Local -ListAvailable |

任意一项不匹配:先把版本对齐,再继续操作。

8.2 能力 ≠ 完整

Azure Local VM 的 很多功能是 Hyper-V 层语义,不是 Azure IaaS 语义:

  • HA = Failover Cluster,不是 SLA 99.99%
  • resize = stop/start,不是 热调整
  • live migration = cluster 内,不是 跨 cluster
  • Trusted Launch = 本地 enforcement,不是 Azure attestation

8.3 "组件在 ≠ 数据通"

Disconnected 模式下:

  • AMA 可装 ≠ 数据能上传
  • Defender 可装 ≠ attestation 可用
  • Arc Agent 可装 ≠ Guest 能上报 Azure

凡是"需要 Azure 端 ingestion / attestation / 同步"的功能,组件装好只是第一步Azure 端不可达就失去完整能力

8.4 镜像管理是本地工程

  • 没有 Marketplace = 必须内部 golden image pipeline
  • 没有自动 patch = 必须本地 WSUS / 离线 apt mirror
  • 没有 ARM image pull = 所有 VHDX 必须落 CSV
  • 这三件事没有官方托管方案------必须企业自建
相关推荐
XUHUOJUN2 小时前
Azure Local离线模式节点准备(系列篇之八)
microsoft·azure local
XUHUOJUN5 小时前
Azure Local离线模式采购(系列篇之七)
azure local
XUHUOJUN5 小时前
Azure Local 离线模式 Azure CLI 配置(系列篇十一)
azure local
XUHUOJUN6 小时前
Azure Local离线模式注册(系列篇之十)
dell·azure local
XUHUOJUN1 天前
Azure Local离线模式PKI规划(系列篇之五)
microsoft·azure local
编码者卢布2 天前
【Azure Storage Account】跨存储账号复制 Blob 会产生大量网络流量费用吗?
microsoft·flask·azure
诺未科技_NovaTech18 天前
上海诺未携手惠灵顿中国,基于微软 Azure 打造 AI 教育生态标杆
人工智能·microsoft·azure·ai教育
编码者卢布19 天前
【Azure AI Search】Index的字段使用默认Analyzer(standard.lucene) 和 en.microsoft 有什么不同?
microsoft·lucene·azure
weixin_3077791321 天前
在 Azure 上构建数据库路由与异构整合层:原理、方案与最佳实践
数据库·人工智能·后端·云计算·azure