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 平台在虚拟机启动时抓取串行输出与屏幕截图,保存到托管存储账户或指定存储账户。启用后,即使虚拟机没有公共 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 provisioningState | Succeeded |
| 电源状态 | az vm get-instance-view -g rg-vm-lab -n vm-win-01 --query instanceView.statuses | PowerState/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 模板固化标准配置并纳入代码评审。把启动诊断与串行控制台作为默认开启项,可以在虚拟机无法通过网络访问时保留一条可靠的带外排障通道。