3. 虚拟机部署实战

在 Azure 中创建虚拟机,本质上是在一个资源组内组合计算、网络、存储与操作系统镜像四类资源。Portal 适合首次验证与可视化确认,CLI 与 PowerShell 适合可重复的批量操作,ARM/Bicep 模板则把整套资源声明为代码,用于版本化与自动化流水线。本节以一台 Windows Server 2022 与一台 Ubuntu 22.04 LTS 为例,走通四种部署方式,并重点配置启动诊断与串行控制台这两个排障入口。

一、部署前需要确定的参数

无论用哪种方式,创建虚拟机前都要先固定以下输入,否则后续排障会缺少参照:资源组 rg-vm-lab、区域 eastasia、虚拟网络 vnet-lab(地址空间 10.10.0.0/16)、子网 snet-app(10.10.1.0/24)、网络安全组 nsg-app、虚拟机规格 Standard_B2s(2 vCPU / 4 GiB)、系统盘 Premium_LRS 127 GiB、管理员用户名 azureuser。Windows 与 Linux 使用同一套网络参数,仅镜像与认证方式不同:Windows 使用密码认证,Linux 使用 SSH 公钥认证。

二、Portal 部署:先看清资源依赖

在 Portal 中搜索“虚拟机”→“创建”→“Azure 虚拟机”,按向导填写:订阅与资源组选 rg-vm-lab,虚拟机名 vm-win-01,区域 East Asia,可用性选项选“无需基础结构冗余”,映像选 Windows Server 2022 Datacenter: Azure Edition - x64 Gen2,大小选 Standard_B2s。管理员账户填 azureuser 与符合复杂度要求的密码。在“入站端口规则”中选择“允许选定的端口”,勾选 RDP 3389。磁盘页把 OS 磁盘类型改为 Premium SSD。网络页确认虚拟网络为 vnet-lab、子网为 snet-app、公共 IP 为“新建”。

关键一步在“管理”页:勾选“启用启动诊断”,存储账户选择“启用托管存储账户(推荐)”,这样无需自建存储账户即可保存串行日志;同时确认“启用 OS 来宾诊断”按需开启。创建完成后,进入虚拟机“帮助”→“串行控制台”,即可看到 SAC(特殊管理控制台)提示符。Portal 的价值在于把依赖关系可视化,但每次点击都难以复现,因此生产环境应转向命令行或模板。

三、Azure CLI 部署:一条命令完成组合

CLI 用 az vm create 一次性创建 NIC、公共 IP、NSG 与磁盘。先创建基础网络:

az group create -n rg-vm-lab -l eastasia
az network vnet create -g rg-vm-lab -n vnet-lab \
  --address-prefix 10.10.0.0/16 \
  --subnet-name snet-app --subnet-prefix 10.10.1.0/24
az network nsg create -g rg-vm-lab -n nsg-app
az network nsg rule create -g rg-vm-lab --nsg-name nsg-app \
  -n allow-rdp --priority 1000 --direction Inbound \
  --access Allow --protocol Tcp --destination-port-ranges 3389

随后创建 Windows 虚拟机,并显式打开启动诊断:

az vm create -g rg-vm-lab -n vm-win-01 \
  --image Win2022AzureEditionCore \
  --size Standard_B2s \
  --vnet-name vnet-lab --subnet snet-app --nsg nsg-app \
  --admin-username azureuser --admin-password 'LabP@ssw0rd2024!' \
  --os-disk-size-gb 127 --storage-sku Premium_LRS \
  --boot-diagnostics-storage "" \
  --public-ip-sku Standard

其中 --boot-diagnostics-storage "" 表示使用托管存储账户保存启动诊断,这是当前推荐做法。Linux 虚拟机只需替换镜像与认证参数:

az vm create -g rg-vm-lab -n vm-linux-01 \
  --image Ubuntu2204 --size Standard_B2s \
  --vnet-name vnet-lab --subnet snet-app --nsg nsg-app \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_rsa.pub \
  --boot-diagnostics-storage ""

创建完成后,CLI 会返回 publicIpAddress 与 powerState。用 az vm boot-diagnostics get-boot-log -g rg-vm-lab -n vm-win-01 可直接读取串行日志,这是判断虚拟机是否真正进入操作系统的第一手证据。

四、PowerShell 部署:适合 Windows 管理员的路径

在已安装 Az 模块的 PowerShell 中,先 Connect-AzAccount,再执行:

$rg = "rg-vm-lab"
$cred = Get-Credential -UserName azureuser
New-AzVm -ResourceGroupName $rg -Name "vm-win-02" `
  -Location "eastasia" -Image "Win2022AzureEditionCore" `
  -Size "Standard_B2s" -Credential $cred `
  -VirtualNetworkName "vnet-lab" -SubnetName "snet-app" `
  -SecurityGroupName "nsg-app" -PublicIpAddressName "pip-win-02" `
  -BootDiagnosticsStorageUri $null -OpenPorts 3389

-BootDiagnosticsStorageUri $null 同样表示启用托管启动诊断。PowerShell 的优势在于可把参数写入变量、循环创建多台虚拟机,并与现有 Windows 运维脚本集成。

五、ARM/Bicep 模板:把部署变成代码

Bicep 是 ARM 模板的声明式简化语法,编译后生成标准 ARM JSON。下面片段声明虚拟机、NIC 与启动诊断:

param location string = 'eastasia'
param adminUser string = 'azureuser'
@secure()
param adminPassword string

resource nic 'Microsoft.Network/networkInterfaces@2023-09-01' = {
  name: 'nic-win-03'
  location: location
  properties: {
    ipConfigurations: [{
      name: 'ipconfig1'
      properties: {
        subnet: { id: resourceId('rg-vm-lab','Microsoft.Network/virtualNetworks/subnets','vnet-lab','snet-app') }
        privateIPAllocationMethod: 'Dynamic'
      }
    }]
  }
}

resource vm 'Microsoft.Compute/virtualMachines@2023-09-01' = {
  name: 'vm-win-03'
  location: location
  properties: {
    hardwareProfile: { vmSize: 'Standard_B2s' }
    osProfile: {
      computerName: 'vm-win-03'
      adminUsername: adminUser
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: '2022-datacenter-azure-edition'
        version: 'latest'
      }
      osDisk: { createOption: 'FromImage', managedDisk: { storageAccountType: 'Premium_LRS' } }
    }
    networkProfile: { networkInterfaces: [{ id: nic.id }] }
    diagnosticsProfile: {
      bootDiagnostics: { enabled: true }
    }
  }
}

用 az deployment group create -g rg-vm-lab --template-file main.bicep --parameters adminPassword='...' 部署。模板方式的最大价值是可评审、可回滚、可参数化,适合把 Windows 与 Linux 的差异抽成参数,用同一份模板批量生成。

四种部署入口 → 同一套 Azure 资源 → 两个排障通道 Portal 向导 可视化 · 首次验证 Azure CLI az vm create · 可脚本化 PowerShell New-AzVm · Windows 运维 ARM / Bicep 声明式 · 可评审回滚 资源组 rg-vm-lab vnet-lab / snet-app / nsg-app vm-win-01 · Win2022 · B2s vm-linux-01 · Ubuntu2204 · B2s OS 盘 Premium_LRS 127 GiB 启动诊断 Boot Diagnostics 托管存储账户 · 串行日志 + 截图 az vm boot-diagnostics get-boot-log 串行控制台 Serial Console Windows SAC / Linux ttyS0 无需网络即可登录排障 结果判读路径 ProvisioningState: Succeeded PowerState: VM running 启动日志出现内核/引导信息 说明已进入 OS 引导阶段 日志停在 UEFI / 无输出 检查镜像、磁盘、NSG 与配额 串行控制台可登录 网络不通时仍能定位系统层问题

六、启动诊断与串行控制台的配置要点

启动诊断由 Azure 平台在虚拟机启动时抓取串行输出与屏幕截图,保存到托管存储账户或指定存储账户。启用后,即使虚拟机没有公共 IP、NSG 阻断全部入站,也能通过 Portal 的“启动诊断”→“串行日志”查看引导过程。判断标准很直接:日志中出现 Windows 引导管理器或 Linux 内核解压信息,说明已进入操作系统引导;若长时间只有 UEFI 或空白,应检查镜像 SKU、系统盘类型与区域容量配额。

串行控制台则提供交互式登录。Windows 虚拟机进入 SAC 后,可用 cmd 或 powershell 切换通道,执行 ipconfig、sfc /scannow 等命令;Linux 虚拟机通过 ttyS0 提供控制台,可在 SSH 不可用时修复网络配置或重置密码。两者配合使用:启动诊断回答“系统有没有起来”,串行控制台回答“起来后能不能进去修”。

建议在创建虚拟机时统一启用托管启动诊断,并在模板中把 diagnosticsProfile.bootDiagnostics.enabled 设为 true,避免事后补配导致早期启动日志缺失。
串行控制台依赖虚拟机内的串行端口与平台代理,若自定义镜像未启用相应服务,控制台可能无输出;此时应优先用启动诊断截图确认引导阶段,再检查镜像内的串行控制台配置。

七、部署后的验证清单

检查项命令或入口期望结果
资源创建状态az vm show -g rg-vm-lab -n vm-win-01 --query provisioningStateSucceeded
电源状态az vm get-instance-view -g rg-vm-lab -n vm-win-01 --query instanceView.statusesPowerState/running
启动日志az vm boot-diagnostics get-boot-log -g rg-vm-lab -n vm-win-01出现引导或内核信息
串行控制台Portal → 帮助 → 串行控制台Windows 显示 SAC,Linux 显示登录提示
连通性RDP 3389 或 SSH 22可建立会话

四种方式最终落到同一组资源上,差异只在可重复性与治理能力。实际工程中常见做法是:用 Portal 做首次验证,用 CLI 或 PowerShell 做日常快速创建,用 Bicep 模板固化标准配置并纳入代码评审。把启动诊断与串行控制台作为默认开启项,可以在虚拟机无法通过网络访问时保留一条可靠的带外排障通道。