You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell通过Custom Image创建Azure VM时磁盘配置不符的解决方法

基于自定义镜像创建Azure VM时匹配磁盘配置的PowerShell解决方案

问题说明

使用PowerShell基于包含OS Disk和Data Disk配置的自定义镜像创建Azure VM后,VM部署成功但磁盘配置与预期不符。需要调整代码,确保创建的OS Disk和Data Disk完全匹配自定义镜像的配置或指定要求。

原代码问题分析

原代码仅引用镜像定义($imageDefinition),未显式处理磁盘配置:

  • 默认情况下Azure会继承镜像中的磁盘配置,但如果镜像版本包含多磁盘信息,仅用Set-AzVMSourceImage可能无法正确加载所有数据盘配置
  • 若需自定义磁盘SKU(如Premium_LRS)、大小、加密设置等,必须显式声明参数

修改后的PowerShell代码

# 定义参数
$resourceGroup = "RG-Test2"
$location = "West US3"
$vnetName = "MYvNET"
$vmName = "MyTestVM"
$galleryname = "mygallery"
$ImageDefinitionName = "windowsimage1"

# 安装AZ模块并登录Azure(仅首次运行需要,可注释已安装的场景)
# Install-Module -Name Az -AllowClobber -Scope CurrentUser -Force
Connect-AzAccount

# 获取镜像定义及最新镜像版本
$imageDefinition = Get-AzGalleryImageDefinition `
   -GalleryName $galleryname `
   -ResourceGroupName $resourceGroup `
   -Name $ImageDefinitionName
$imageVersion = Get-AzGalleryImageVersion `
   -GalleryImageDefinitionName $imageDefinition.Name `
   -GalleryName $galleryname `
   -ResourceGroupName $resourceGroup | Sort-Object PublishedDate -Descending | Select-Object -First 1

# 创建VM登录凭据
do {
    $cred = Get-Credential -Message "输入VM的用户名和密码"
    $password = $cred.GetNetworkCredential().Password
    if ($password.Length -lt 8) {
        Write-Host "密码长度至少8位,请重新输入"
    }
    else {
        break
    }
} while ($true)

# 创建NSG及RDP规则
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig `
              -Name myNSGRuleRDP `
              -Protocol Tcp `
              -Direction Inbound `
              -Priority 1000 `
              -SourceAddressPrefix * `
              -SourcePortRange * `
              -DestinationAddressPrefix * `
              -DestinationPortRange 3389 `
              -Access Allow
$nsg = New-AzNetworkSecurityGroup `
       -ResourceGroupName $resourceGroup `
       -Location $location `
       -Name myNetworkSecurityGroup `
       -SecurityRules $nsgRuleRDP

# 创建网卡
$vnet = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroup
$nic = New-AzNetworkInterface `
         -Name myNic `
         -ResourceGroupName $resourceGroup `
         -Location $location `
         -SubnetId $vnet.Subnets[0].Id `
         -NetworkSecurityGroupId $nsg.Id

# 创建VM配置并关联镜像
$vmConfig = New-AzVMConfig `
   -VMName $vmName `
   -VMSize Standard_D2s_v3 | `
   Set-AzVMSecurityProfile -SecurityType "TrustedLaunch" | `
   Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
   Set-AzVMSourceImage -Id $imageVersion.Id

# 1. 显式配置OS Disk(可继承镜像配置或自定义)
$osDiskConfig = New-AzVMOSDisk `
   -Name "$vmName-osdisk" `
   -Caching ReadWrite `
   -StorageAccountType Premium_LRS ` # 可根据需求修改为Standard_LRS等
   -CreateOption FromImage
$vmConfig = Add-AzVMOSDisk -VM $vmConfig -Disk $osDiskConfig

# 2. 批量添加Data Disk(从镜像版本中读取配置,或自定义参数)
$dataDiskIndex = 1
foreach ($disk in $imageVersion.StorageProfile.DataDiskImages) {
    $dataDiskConfig = New-AzVMDataDisk `
       -Name "$vmName-datadisk-$dataDiskIndex" `
       -Caching $disk.HostCaching `
       -StorageAccountType Premium_LRS `
       -DiskSizeInGB $disk.DiskSizeGB `
       -Lun $dataDiskIndex `
       -CreateOption FromImage
    $vmConfig = Add-AzVMDataDisk -VM $vmConfig -Disk $dataDiskConfig
    $dataDiskIndex++
}

# 添加网卡并创建VM
$vmConfig = Add-AzVMNetworkInterface -Id $nic.Id -VM $vmConfig
$vm = New-AzVM `
   -ResourceGroupName $resourceGroup `
   -Location $location `
   -VM $vmConfig

# 验证部署结果
if ($vm) {
    Write-Host "VM '$vmName' 创建成功"
} else {
    Write-Host "VM 创建失败"
}

关键修改说明

  1. 获取镜像版本:使用Get-AzGalleryImageVersion获取具体镜像版本,而非仅镜像定义,确保能读取到镜像中包含的所有磁盘配置细节
  2. 显式配置OS Disk:通过New-AzVMOSDisk和Add-AzVMOSDisk自定义OS盘的缓存策略、存储SKU、名称等参数,完全匹配预期配置
  3. 批量加载Data Disk:遍历镜像版本中的数据盘信息,自动创建对应的数据盘,继承镜像的磁盘大小、缓存策略,也可直接修改参数覆盖原有配置
  4. 灵活定制:若需调整磁盘规格,直接修改New-AzVMOSDisk或New-AzVMDataDisk的参数即可(如调整磁盘大小、存储类型)

内容的提问来源于stack exchange,提问作者Lokesh M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:27:11