使用 PowerShell 从专用磁盘创建 Windows VM

通过将专用托管磁盘附加为 OS 磁盘来创建新 VM。 专用磁盘是包含原始 VM 中的用户帐户、应用程序和其他状态数据的现有 VM 中虚拟硬盘 (VHD) 的副本。

使用专用 VHD 创建新 VM 时,新 VM 将保留原始 VM 的计算机名。 还会保留其他计算机特定信息,在某些情况下,这种重复信息可能会导致问题。 复制 VM 时,请注意应用程序依赖哪些类型的计算机特定信息。

有几种选项:

还可以使用 Azure 门户从专用 VHD 创建新 VM

本文介绍如何使用托管磁盘。 如果有需要使用存储帐户的旧版部署,请参阅从存储帐户中的专用 VHD 创建 VM

准备阶段

若要使用 PowerShell,请确保使用最新版本的 AzureRM.Compute PowerShell 模块。

Install-Module AzureRM -RequiredVersion 6.0.0

有关详细信息,请参阅 Azure PowerShell

选项 1:使用现有磁盘

如果你的 VM 已删除,并想要重用 OS 磁盘创建新 VM,请使用 Get-AzureRmDisk

$resourceGroupName = 'myResourceGroup'
$osDiskName = 'myOsDisk'
$osDisk = Get-AzureRmDisk `
-ResourceGroupName $resourceGroupName `
-DiskName $osDiskName

现在可以将此磁盘作为 OS 磁盘附加到新 VM

选项 2:上传专用 VHD

可从使用本地虚拟化工具(如 Hyper-V)创建的专用 VM 或从另一个云导出的 VM 上传 VHD。

准备 VM

使用原始 VHD 创建新的 VM。

  • 准备好要上传到 Azure 的 Windows VHD不要使用 Sysprep 通用化 VM。
  • 删除 VM 上安装的所有来宾虚拟化工具和代理(例如 VMware 工具)。
  • 确保 VM 配置为从 DHCP 获取 IP 地址和 DNS 设置。 这可以确保服务器在启动时获得虚拟网络中的 IP 地址。

获取存储帐户

Azure 中需要有一个存储帐户用于存储上传的 VHD。 可以使用现有存储帐户,也可以创建新存储帐户。

显示可用的存储帐户。

Get-AzureRmStorageAccount

若要使用现有存储帐户,请转到上传 VHD 部分。

创建存储帐户。

  1. 需要使用要在其中创建存储帐户的资源组的名称。 使用 Get-AzureRmResourceGroup 查看订阅中的所有资源组。

    Get-AzureRmResourceGroup
    

    在“中国北部”区域中创建名为 myResourceGroup 的资源组。

    New-AzureRmResourceGroup `
       -Name myResourceGroup `
       -Location "China North"
    
  2. 使用 New-AzureRmStorageAccount cmdlet 在新资源组中创建名为 mystorageaccount 的存储帐户。

    New-AzureRmStorageAccount `
       -ResourceGroupName myResourceGroup `
       -Name mystorageaccount `
       -Location "China North" `
       -SkuName "Standard_LRS" `
       -Kind "Storage"
    

将 VHD 上传到存储帐户

使用 Add-AzureRmVhd cmdlet 将 VHD 上传到存储帐户中的容器。 本示例将文件 myVHD.vhd 从 "C:\Users\Public\Documents\Virtual hard disks" 上传到 myResourceGroup 资源组中名为 mystorageaccount 的存储帐户。 该文件存储在名为 mycontainer 的容器中,新文件名为 myUploadedVHD.vhd

$resourceGroupName = "myResourceGroup"
$urlOfUploadedVhd = "https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myUploadedVHD.vhd"
Add-AzureRmVhd -ResourceGroupName $resourceGroupName `
   -Destination $urlOfUploadedVhd `
   -LocalFilePath "C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd"

如果该命令成功,则会显示类似于下面的响应:

MD5 hash is being calculated for the file C:\Users\Public\Documents\Virtual hard disks\myVHD.vhd.
MD5 hash calculation is completed.
Elapsed time for the operation: 00:03:35
Creating new page blob of size 53687091712...
Elapsed time for upload: 01:12:49

LocalFilePath           DestinationUri
-------------           --------------
C:\Users\Public\Doc...  https://mystorageaccount.blob.core.chinacloudapi.cn/mycontainer/myUploadedVHD.vhd

根据网络连接速度和 VHD 文件的大小,可能需要一段时间才能完成此命令。

从 VHD 创建托管磁盘

使用 New-AzureRMDisk,从存储帐户的专用 VHD 创建托管磁盘。 此示例使用“myOSDisk1”作为磁盘名称,将磁盘放置在“Standard_LRS”存储中,并使用 https://storageaccount.blob.core.chinacloudapi.cn/vhdcontainer/osdisk.vhd 作为源 VHD 的 URI。

创建适用于新 VM 的新资源组。

$destinationResourceGroup = 'myDestinationResourceGroup'
New-AzureRmResourceGroup -Location $location `
   -Name $destinationResourceGroup

从上传的 VHD 创建新 OS 磁盘。

$sourceUri = 'https://storageaccount.blob.core.chinacloudapi.cn/vhdcontainer/osdisk.vhd'
$osDiskName = 'myOsDisk'
$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
    (New-AzureRmDiskConfig -AccountType Standard_LRS  `
    -Location $location -CreateOption Import `
    -SourceUri $sourceUri) `
    -ResourceGroupName $destinationResourceGroup

选项 3:复制现有 Azure VM

通过创建 VM 快照来创建使用托管磁盘的 VM 副本,然后使用该快照创建一个新的托管磁盘和一个新 VM。

拍摄 OS 磁盘快照

可创建整个 VM(包括所有磁盘)的快照或仅创建单个磁盘的快照。 以下步骤说明如何使用 New-AzureRmSnapshot cmdlet 仅创建 VM OS 磁盘的快照。

首先设置一些参数。

$resourceGroupName = 'myResourceGroup' 
$vmName = 'myVM'
$location = 'chinanorth' 
$snapshotName = 'mySnapshot'  

获取 VM 对象。

$vm = Get-AzureRmVM -Name $vmName `
   -ResourceGroupName $resourceGroupName

获取 OS 磁盘名称。

$disk = Get-AzureRmDisk -ResourceGroupName $resourceGroupName `
  -DiskName $vm.StorageProfile.OsDisk.Name

创建快照配置。

$snapshotConfig =  New-AzureRmSnapshotConfig `
  -SourceUri $disk.Id `
  -OsType Windows `
  -CreateOption Copy `
  -Location $location 

创建快照。

$snapShot = New-AzureRmSnapshot `
   -Snapshot $snapshotConfig `
   -SnapshotName $snapshotName `
   -ResourceGroupName $resourceGroupName

若要使用快照创建高性能的 VM,请将 -AccountType Premium_LRS 参数添加到 New-AzureRmSnapshot 命令。 此参数将创建快照,以便将其存储为高级托管磁盘。 高级托管磁盘的费用比标准托管磁盘更高,因此,在使用该参数之前,请确认需要高级托管磁盘。

从快照创建新磁盘

使用 New-AzureRMDisk 从快照创建托管磁盘。 此示例使用“myOSDisk”作为磁盘名称。

创建适用于新 VM 的新资源组。

$destinationResourceGroup = 'myDestinationResourceGroup'
New-AzureRmResourceGroup -Location $location `
   -Name $destinationResourceGroup

设置 OS 磁盘名称。

$osDiskName = 'myOsDisk'

创建托管磁盘。

$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
    (New-AzureRmDiskConfig  -Location $location -CreateOption Copy `
    -SourceResourceId $snapshot.Id) `
    -ResourceGroupName $destinationResourceGroup

创建新 VM

创建新 VM 使用的网络和其他 VM 资源。

创建子网和虚拟网络

为 VM 创建虚拟网络和子网。

  1. 创建子网。 本示例在资源组“myDestinationResourceGroup”中创建名为“mySubNet”的子网,并将子网地址前缀设置为 10.0.0.0/24。

    $subnetName = 'mySubNet'
    $singleSubnet = New-AzureRmVirtualNetworkSubnetConfig `
       -Name $subnetName `
       -AddressPrefix 10.0.0.0/24
    
  2. 创建虚拟网络。 本示例将虚拟网络名称设置为 myVnetName,将位置设置为“中国北部”,将虚拟网络的地址前缀设置为 10.0.0.0/16

    $vnetName = "myVnetName"
    $vnet = New-AzureRmVirtualNetwork `
       -Name $vnetName -ResourceGroupName $destinationResourceGroup `
       -Location $location `
       -AddressPrefix 10.0.0.0/16 `
       -Subnet $singleSubnet
    

创建网络安全组和 RDP 规则

若要使用远程桌面协议 (RDP) 登录到 VM,需要创建一个允许在端口 3389 上进行 RDP 访问的安全规则。 在本示例中,由于新 VM 的 VHD 是从现有专用 VM 创建的,因此,可将源虚拟机中的帐户用于 RDP。

本示例将网络安全组 (NSG) 名称设置为 myNsg,将 RDP 规则名称设置为 myRdpRule

$nsgName = "myNsg"

$rdpRule = New-AzureRmNetworkSecurityRuleConfig -Name myRdpRule -Description "Allow RDP" `
    -Access Allow -Protocol Tcp -Direction Inbound -Priority 110 `
    -SourceAddressPrefix Internet -SourcePortRange * `
    -DestinationAddressPrefix * -DestinationPortRange 3389
$nsg = New-AzureRmNetworkSecurityGroup `
   -ResourceGroupName $destinationResourceGroup `
   -Location $location `
   -Name $nsgName -SecurityRules $rdpRule

有关终结点和 NSG 规则的详细信息,请参阅使用 PowerShell 在 Azure 中打开 VM 端口

创建公共 IP 地址和 NIC

若要与虚拟网络中的虚拟机通信,需要一个 公共 IP 地址和网络接口。

  1. 创建公共 IP。 在此示例中,公共 IP 地址名称设置为 myIP

    $ipName = "myIP"
    $pip = New-AzureRmPublicIpAddress `
       -Name $ipName -ResourceGroupName $destinationResourceGroup `
       -Location $location `
       -AllocationMethod Dynamic
    
  2. 创建 NIC。 在此示例中,NIC 名称设置为 myNicName

    $nicName = "myNicName"
    $nic = New-AzureRmNetworkInterface -Name $nicName `
       -ResourceGroupName $destinationResourceGroup `
       -Location $location -SubnetId $vnet.Subnets[0].Id `
       -PublicIpAddressId $pip.Id `
       -NetworkSecurityGroupId $nsg.Id
    

设置 VM 名称和大小

此示例将 VM 名称设置为“myVM”,将 VM 大小设置为“Standard_A2”。

$vmName = "myVM"
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize "Standard_A2"

添加 NIC

$vm = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id

添加 OS 磁盘

使用 Set-AzureRmVMOSDisk 向配置添加 OS 磁盘。 此示例将磁盘大小设置为 128 GB 并附加托管磁盘作为 Windows OS 磁盘。

$vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -StorageAccountType Standard_LRS `
    -DiskSizeInGB 128 -CreateOption Attach -Windows

完成该 VM

使用刚刚创建的 New-AzureRMVM 配置创建 VM。

New-AzureRmVM -ResourceGroupName $destinationResourceGroup -Location $location -VM $vm

如果此命令成功,则会显示类似于下面的输出:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK   

验证是否已创建 VM

应会在 Azure 门户的“浏览” > “虚拟机”下看到新建的 VM,也可以使用以下 PowerShell 命令查看该 VM。

$vmList = Get-AzureRmVM -ResourceGroupName $destinationResourceGroup
$vmList.Name

后续步骤

登录新虚拟机。 有关详细信息,请参阅 How to connect and log on to an Azure virtual machine running Windows(如何连接并登录到运行 Windows 的 Azure 虚拟机)。